Browse Source

Inifnity fix

flabbet 8 months ago
parent
commit
14899a10d2
1 changed files with 26 additions and 12 deletions
  1. 26 12
      src/PixiEditor/Views/Overlays/TransformOverlay/TransformUpdateHelper.cs

+ 26 - 12
src/PixiEditor/Views/Overlays/TransformOverlay/TransformUpdateHelper.cs

@@ -212,17 +212,7 @@ internal static class TransformUpdateHelper
 
                 if (scaleFromCenter)
                 {
-                    VecD currentCenter = corners.RectCenter;
-                    float targetPosToCenter = (float)(targetPos - currentCenter).Length;
-                    
-                    VecD reflectedDesiredPos = desiredPos.ReflectAcrossLine(currentCenter, targetPos);
-                    
-                    float desiredPosToCenter = (float)(reflectedDesiredPos - currentCenter).Length;
-                    
-                    float scaling = desiredPosToCenter / targetPosToCenter;
-
-                    corners = corners.AsScaled(scaling);
-                    return corners;
+                    return ScaleEvenlyToPos(corners, desiredPos, targetPos);
                 }
 
                 var (leftCorn, rightCorn) = TransformHelper.GetCornersOnSide(targetSide);
@@ -260,6 +250,12 @@ internal static class TransformUpdateHelper
             }
 
             fallback:
+
+            if (scaleFromCenter)
+            {
+                return ScaleEvenlyToPos(corners, desiredPos, targetPos);
+            }
+
             corners.TopLeft = (corners.TopLeft - oppositePos) * scalingFactor + oppositePos;
             corners.BottomRight = (corners.BottomRight - oppositePos) * scalingFactor + oppositePos;
             corners.TopRight = (corners.TopRight - oppositePos) * scalingFactor + oppositePos;
@@ -305,7 +301,7 @@ internal static class TransformUpdateHelper
 
                 if (snappingController is not null)
                 {
-                    VecD direction = corners.RectCenter - desiredPos;
+                    VecD direction = desiredPos - targetPos;
                     desiredPos = snappingController.GetSnapPoint(desiredPos, direction, out snapX, out snapY);
                 }
             }
@@ -335,6 +331,24 @@ internal static class TransformUpdateHelper
         throw new ArgumentException($"Freedom degree {freedom} is not supported");
     }
 
+    private static ShapeCorners ScaleEvenlyToPos(ShapeCorners corners, VecD desiredPos, VecD targetPos)
+    {
+        VecD currentCenter = corners.RectCenter;
+        float targetPosToCenter = (float)(targetPos - currentCenter).Length;
+        
+        if(targetPosToCenter < epsilon)
+            return corners;
+
+        VecD reflectedDesiredPos = desiredPos.ReflectAcrossLine(currentCenter, targetPos);
+
+        float desiredPosToCenter = (float)(reflectedDesiredPos - currentCenter).Length;
+
+        float scaling = desiredPosToCenter / targetPosToCenter;
+
+        corners = corners.AsScaled(scaling);
+        return corners;
+    }
+
     public static ShapeCorners UpdateShapeFromRotation(ShapeCorners corners, VecD origin, double angle)
     {
         corners.TopLeft = corners.TopLeft.Rotate(angle, origin);