Browse Source

Fixed shear snapping

flabbet 11 months ago
parent
commit
7d7e860801

+ 1 - 1
src/ChunkyImageLib/DataHolders/ShapeCorners.cs

@@ -93,7 +93,7 @@ public struct ShapeCorners
             ? RectSize.CCWAngleTo(BottomRight - TopLeft)
             ? RectSize.CCWAngleTo(BottomRight - TopLeft)
             : RectSize.CCWAngleTo(BottomLeft - TopRight);
             : RectSize.CCWAngleTo(BottomLeft - TopRight);
 
 
-    public bool IsSnappedToPixels
+    public bool IsAlignedToPixels
     {
     {
         get
         get
         {
         {

+ 5 - 4
src/PixiEditor/ViewModels/Tools/Tools/VectorLineToolViewModel.cs

@@ -67,10 +67,11 @@ internal class VectorLineToolViewModel : ShapeTool, IVectorLineToolHandler
         {
         {
             IReadOnlyLineData? lineVectorData =
             IReadOnlyLineData? lineVectorData =
                 vectorLayer.GetShapeData(document.AnimationDataViewModel.ActiveFrameTime) as IReadOnlyLineData;
                 vectorLayer.GetShapeData(document.AnimationDataViewModel.ActiveFrameTime) as IReadOnlyLineData;
-            if (lineVectorData is null) return;
-
-            document.LineToolOverlayViewModel.Show(lineVectorData.TransformedStart, lineVectorData.TransformedEnd,
-                false);
+            if (lineVectorData is not null)
+            {
+                document.LineToolOverlayViewModel.Show(lineVectorData.TransformedStart, lineVectorData.TransformedEnd,
+                    false);
+            }
         }
         }
 
 
         document.Tools.UseVectorLineTool();
         document.Tools.UseVectorLineTool();

+ 30 - 9
src/PixiEditor/Views/Overlays/TransformOverlay/TransformOverlay.cs

@@ -492,7 +492,7 @@ internal class TransformOverlay : Overlay
     {
     {
         VecD delta = pos - mousePosOnStartMove;
         VecD delta = pos - mousePosOnStartMove;
 
 
-        if (Corners.IsSnappedToPixels)
+        if (Corners.IsAlignedToPixels)
             delta = delta.Round();
             delta = delta.Round();
 
 
         ShapeCorners rawCorners = new ShapeCorners()
         ShapeCorners rawCorners = new ShapeCorners()
@@ -608,7 +608,7 @@ internal class TransformOverlay : Overlay
             {
             {
                 bool shouldAlign =
                 bool shouldAlign =
                     (CornerFreedom is TransformCornerFreedom.ScaleProportionally or TransformCornerFreedom.Scale) &&
                     (CornerFreedom is TransformCornerFreedom.ScaleProportionally or TransformCornerFreedom.Scale) &&
-                    Corners.IsSnappedToPixels;
+                    Corners.IsAlignedToPixels;
 
 
                 Corners = shouldAlign
                 Corners = shouldAlign
                     ? TransformHelper.AlignToPixels((ShapeCorners)newCorners)
                     ? TransformHelper.AlignToPixels((ShapeCorners)newCorners)
@@ -629,11 +629,32 @@ internal class TransformOverlay : Overlay
             VecD anchorRelativeDelta = projected - originalAnchorPos;
             VecD anchorRelativeDelta = projected - originalAnchorPos;
 
 
             var adjacentAnchors = TransformHelper.GetAdjacentAnchors((Anchor)capturedAnchor);
             var adjacentAnchors = TransformHelper.GetAdjacentAnchors((Anchor)capturedAnchor);
-            SnapData snapped = FindProjectedAnchorSnap(projected);
-            
-            if (snapped.Delta == VecI.Zero)
+            SnapData snapped;
+
+            if (SideFreedom is TransformSideFreedom.Shear or TransformSideFreedom.Free)
+            {
+                VecD rawDelta = targetPos - originalAnchorPos;
+                VecD adjacentPos = TransformHelper.GetAnchorPosition(cornersOnStartAnchorDrag, adjacentAnchors.Item1);
+                snapped = TrySnapAnchor(adjacentPos + rawDelta);
+
+                if (snapped.Delta == VecD.Zero)
+                {
+                    snapped = TrySnapAnchor(targetPos);
+                }
+                
+                if (snapped.Delta == VecD.Zero)
+                {
+                    adjacentPos = TransformHelper.GetAnchorPosition(cornersOnStartAnchorDrag, adjacentAnchors.Item2);
+                    snapped = TrySnapAnchor(adjacentPos + rawDelta);
+                }
+            }
+            else
             {
             {
-                snapped = FindAdjacentCornersSnap(adjacentAnchors, anchorRelativeDelta);
+                snapped = FindProjectedAnchorSnap(projected);
+                if (snapped.Delta == VecI.Zero)
+                {
+                    snapped = FindAdjacentCornersSnap(adjacentAnchors, anchorRelativeDelta);
+                }
             }
             }
 
 
             ShapeCorners? newCorners = TransformUpdateHelper.UpdateShapeFromSide
             ShapeCorners? newCorners = TransformUpdateHelper.UpdateShapeFromSide
@@ -644,10 +665,10 @@ internal class TransformOverlay : Overlay
 
 
             if (newCorners is not null)
             if (newCorners is not null)
             {
             {
-                bool shouldSnap =
+                bool shouldAlign =
                     (SideFreedom is TransformSideFreedom.ScaleProportionally or TransformSideFreedom.Stretch) &&
                     (SideFreedom is TransformSideFreedom.ScaleProportionally or TransformSideFreedom.Stretch) &&
-                    Corners.IsSnappedToPixels;
-                Corners = shouldSnap
+                    Corners.IsAlignedToPixels;
+                Corners = shouldAlign
                     ? TransformHelper.AlignToPixels((ShapeCorners)newCorners)
                     ? TransformHelper.AlignToPixels((ShapeCorners)newCorners)
                     : (ShapeCorners)newCorners;
                     : (ShapeCorners)newCorners;
             }
             }