Fix jumpy token dragging and resizing #4946
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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
andPointerTool
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