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
             ShapeCorners? newCorners = TransformUpdateHelper.UpdateShapeFromCorner
             ((Anchor)capturedAnchor, CornerFreedom, InternalState.ProportionalAngle1,
             ((Anchor)capturedAnchor, CornerFreedom, InternalState.ProportionalAngle1,
                 InternalState.ProportionalAngle2, cornersOnStartAnchorDrag, targetPos, SnappingController, out string snapX, out string snapY);
                 InternalState.ProportionalAngle2, cornersOnStartAnchorDrag, targetPos, SnappingController, out string snapX, out string snapY);
+            
             HighlightSnappedAxis(snapX, snapY);
             HighlightSnappedAxis(snapX, snapY);
 
 
             if (newCorners is not null)
             if (newCorners is not null)
@@ -752,7 +753,7 @@ 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;
+            SnapData snapped = new SnapData();
 
 
             if (SideFreedom is TransformSideFreedom.Shear or TransformSideFreedom.Free)
             if (SideFreedom is TransformSideFreedom.Shear or TransformSideFreedom.Free)
             {
             {
@@ -771,7 +772,7 @@ internal class TransformOverlay : Overlay
                     snapped = TrySnapAnchor(adjacentPos + rawDelta);
                     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 rotation is almost cardinal, projecting snapping points result in extreme values when perpendicular to the axis
                 if (!TransformHelper.RotationIsAlmostCardinal(cornersOnStartAnchorDrag.RectRotation))
                 if (!TransformHelper.RotationIsAlmostCardinal(cornersOnStartAnchorDrag.RectRotation))
@@ -796,9 +797,13 @@ internal class TransformOverlay : Overlay
 
 
             ShapeCorners? newCorners = TransformUpdateHelper.UpdateShapeFromSide
             ShapeCorners? newCorners = TransformUpdateHelper.UpdateShapeFromSide
             ((Anchor)capturedAnchor, SideFreedom, InternalState.ProportionalAngle1,
             ((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)
             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);
                 desiredPos = desiredPos.ProjectOntoLine(oppositePos, targetPos);
                 VecD direction = (targetPos - oppositePos);
                 VecD direction = (targetPos - oppositePos);
-                
+
                 if (snappingController is not null)
                 if (snappingController is not null)
                 {
                 {
                     desiredPos = snappingController.GetSnapPoint(desiredPos, direction, out snapX, out snapY);
                     desiredPos = snappingController.GetSnapPoint(desiredPos, direction, out snapX, out snapY);
@@ -59,7 +59,7 @@ internal static class TransformUpdateHelper
                 if (snappingController is not null)
                 if (snappingController is not null)
                 {
                 {
                     desiredPos = snappingController.GetSnapPoint(desiredPos, out snapX, out snapY);
                     desiredPos = snappingController.GetSnapPoint(desiredPos, out snapX, out snapY);
-                } 
+                }
             }
             }
 
 
             // find neighboring corners
             // find neighboring corners
@@ -151,11 +151,13 @@ internal static class TransformUpdateHelper
 
 
     public static ShapeCorners? UpdateShapeFromSide
     public static ShapeCorners? UpdateShapeFromSide
     (Anchor targetSide, TransformSideFreedom freedom, double propAngle1, double propAngle2, ShapeCorners corners,
     (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))
         if (!TransformHelper.IsSide(targetSide))
             throw new ArgumentException($"{targetSide} is not a side");
             throw new ArgumentException($"{targetSide} is not a side");
 
 
+        snapX = snapY = "";
+
         if (freedom == TransformSideFreedom.Locked)
         if (freedom == TransformSideFreedom.Locked)
             return corners;
             return corners;
 
 
@@ -167,9 +169,15 @@ internal static class TransformUpdateHelper
 
 
             desiredPos = desiredPos.ProjectOntoLine(targetPos, oppositePos);
             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))
             if (!double.IsNormal(scalingFactor))
                 return corners;
                 return corners;