RPTools / maptool

Virtual Tabletop for playing roleplaying games with remote players or face to face.
http://rptools.net
GNU Affero General Public License v3.0
787 stars 259 forks source link

Fix jumpy token dragging and resizing #4946

Closed kwvanderlinde closed 2 days ago

kwvanderlinde commented 2 days ago

Identify the Bug or Feature request

Fixes #4855 Fixes #4365 Fixes #4844

Description of the Change

This fixes the jumps that happens when dragging tokens and resizing stamps in different situations.

Drag fixes. The key difference in dragging is that the drag is measured as displacement of the starting drag anchor (formerly called "drag offset" in code). This keeps things consistent whether snap-while-drag is enabled, whether the token is snap-to-grid, and regardless of the layout and rotation of the token. SelectionSet is also changed to accept points rather than working with offsets, since offsets require too much knowledge about the token layout to be very useful in that context. The drag anchor calculation had to be tweaked to properly account for the token layout.

Resize fixes. There were a few issues with resizing, including an incorrect calculation of the new dimensions for snap-to-grid stamps and incorrectly accounting for the token layout. It also lacked the ability to preserve the aspect ratio if the token was at all rotated. These have all been fixed by projecting the resize drag information into the token's rotated reference frame. A nice perk is that the logic is simpler while doing more, since it boils down to a couple key vector operations.

Both StampTool and PointerTool were refactored to encapsulate the drag and resize operations into inner classes (TokenDragOp, TokenResizeOp) so that extra state could conveniently be kept around. New debug rendering was also added to diagnose issues with dragging, and a new developer option was added to enable it.

Possible Drawbacks

None

Documentation Notes

N/A

Release Notes


This change is Reviewable