Browse Source

Side proportional snapping improved

flabbet 8 months ago
parent
commit
2e10d4cf7d

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

@@ -718,6 +718,7 @@ internal class TransformOverlay : Overlay
             ShapeCorners? newCorners = TransformUpdateHelper.UpdateShapeFromCorner
             ((Anchor)capturedAnchor, CornerFreedom, InternalState.ProportionalAngle1,
                 InternalState.ProportionalAngle2, cornersOnStartAnchorDrag, targetPos, SnappingController, out string snapX, out string snapY);
+            
             HighlightSnappedAxis(snapX, snapY);
 
             if (newCorners is not null)
@@ -752,7 +753,7 @@ internal class TransformOverlay : Overlay
             VecD anchorRelativeDelta = projected - originalAnchorPos;
 
             var adjacentAnchors = TransformHelper.GetAdjacentAnchors((Anchor)capturedAnchor);
-            SnapData snapped;
+            SnapData snapped = new SnapData();
 
             if (SideFreedom is TransformSideFreedom.Shear or TransformSideFreedom.Free)
             {
@@ -771,7 +772,7 @@ internal class TransformOverlay : Overlay
                     snapped = TrySnapAnchor(adjacentPos + rawDelta);
                 }
             }
-            else
+            else if(SideFreedom is not TransformSideFreedom.ScaleProportionally)
             {
                 // If rotation is almost cardinal, projecting snapping points result in extreme values when perpendicular to the axis
                 if (!TransformHelper.RotationIsAlmostCardinal(cornersOnStartAnchorDrag.RectRotation))
@@ -796,9 +797,13 @@ internal class TransformOverlay : Overlay
 
             ShapeCorners? newCorners = TransformUpdateHelper.UpdateShapeFromSide
             ((Anchor)capturedAnchor, SideFreedom, InternalState.ProportionalAngle1,
-                InternalState.ProportionalAngle2, cornersOnStartAnchorDrag, targetPos + snapped.Delta);
+                InternalState.ProportionalAngle2, cornersOnStartAnchorDrag, targetPos + snapped.Delta,
+                SnappingController, out string snapX, out string snapY);
 
-            HighlightSnappedAxis(snapped.SnapAxisXName, snapped.SnapAxisYName);
+            string finalSnapX = snapped.SnapAxisXName ?? snapX;
+            string finalSnapY = snapped.SnapAxisYName ?? snapY;
+            
+            HighlightSnappedAxis(finalSnapX, finalSnapY);
 
             if (newCorners is not null)
             {

+ 14 - 6
src/PixiEditor/Views/Overlays/TransformOverlay/TransformUpdateHelper.cs

@@ -48,7 +48,7 @@ internal static class TransformUpdateHelper
             {
                 desiredPos = desiredPos.ProjectOntoLine(oppositePos, targetPos);
                 VecD direction = (targetPos - oppositePos);
-                
+
                 if (snappingController is not null)
                 {
                     desiredPos = snappingController.GetSnapPoint(desiredPos, direction, out snapX, out snapY);
@@ -59,7 +59,7 @@ internal static class TransformUpdateHelper
                 if (snappingController is not null)
                 {
                     desiredPos = snappingController.GetSnapPoint(desiredPos, out snapX, out snapY);
-                } 
+                }
             }
 
             // find neighboring corners
@@ -151,11 +151,13 @@ internal static class TransformUpdateHelper
 
     public static ShapeCorners? UpdateShapeFromSide
     (Anchor targetSide, TransformSideFreedom freedom, double propAngle1, double propAngle2, ShapeCorners corners,
-        VecD desiredPos)
+        VecD desiredPos, SnappingController? snappingController, out string snapX, out string snapY)
     {
         if (!TransformHelper.IsSide(targetSide))
             throw new ArgumentException($"{targetSide} is not a side");
 
+        snapX = snapY = "";
+
         if (freedom == TransformSideFreedom.Locked)
             return corners;
 
@@ -167,9 +169,15 @@ internal static class TransformUpdateHelper
 
             desiredPos = desiredPos.ProjectOntoLine(targetPos, oppositePos);
 
-            VecD thing = targetPos - oppositePos;
-            thing = VecD.FromAngleAndLength(thing.Angle, 1 / thing.Length);
-            double scalingFactor = (desiredPos - oppositePos) * thing;
+            VecD direction = targetPos - oppositePos;
+            direction = VecD.FromAngleAndLength(direction.Angle, 1 / direction.Length);
+            
+            if (snappingController is not null)
+            {
+                desiredPos = snappingController.GetSnapPoint(desiredPos, direction, out snapX, out snapY);
+            }
+
+            double scalingFactor = (desiredPos - oppositePos) * direction;
             if (!double.IsNormal(scalingFactor))
                 return corners;