Browse Source

Proper center viewport fix

flabbet 10 months ago
parent
commit
a531bf711c

+ 1 - 1
src/PixiEditor/Views/Main/ViewportControls/Viewport.axaml.cs

@@ -441,7 +441,7 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
 
 
     private void OnImageLoaded(object sender, EventArgs e)
     private void OnImageLoaded(object sender, EventArgs e)
     {
     {
-        scene.CenterContent(Document.SizeBindable);
+        scene.CenterContent();
     }
     }
 
 
     private void OnMainImageSizeChanged(object? sender, SizeChangedEventArgs e)
     private void OnMainImageSizeChanged(object? sender, SizeChangedEventArgs e)

+ 4 - 80
src/PixiEditor/Views/Rendering/Scene.cs

@@ -121,6 +121,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
         AllOverlaysProperty.Changed.AddClassHandler<Scene>(ActiveOverlaysChanged);
         AllOverlaysProperty.Changed.AddClassHandler<Scene>(ActiveOverlaysChanged);
         DefaultCursorProperty.Changed.AddClassHandler<Scene>(DefaultCursorChanged);
         DefaultCursorProperty.Changed.AddClassHandler<Scene>(DefaultCursorChanged);
         ChannelsProperty.Changed.AddClassHandler<Scene>(ChannelsChanged);
         ChannelsProperty.Changed.AddClassHandler<Scene>(ChannelsChanged);
+        DocumentProperty.Changed.AddClassHandler<Scene>(DocumentChanged);
     }
     }
 
 
     private static void ChannelsChanged(Scene scene, AvaloniaPropertyChangedEventArgs args)
     private static void ChannelsChanged(Scene scene, AvaloniaPropertyChangedEventArgs args)
@@ -466,11 +467,11 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
         }
         }
     }
     }
 
 
-    private static void SurfaceChanged(Scene scene, AvaloniaPropertyChangedEventArgs e)
+    private static void DocumentChanged(Scene scene, AvaloniaPropertyChangedEventArgs e)
     {
     {
-        if (e.NewValue is Texture surface)
+        if (e.NewValue is DocumentViewModel documentViewModel)
         {
         {
-            scene.ContentDimensions = surface.Size;
+            scene.ContentDimensions = documentViewModel.SizeBindable;
         }
         }
     }
     }
 
 
@@ -564,83 +565,6 @@ internal class DrawSceneOperation : SkiaDrawOperation
         }
         }
     }
     }
 
 
-    private ShapeCorners ViewportToSurface(RectI viewportRect, float scale)
-    {
-        return new ShapeCorners()
-        {
-            TopLeft = ViewportToSurface(viewportRect.TopLeft, scale),
-            TopRight = ViewportToSurface(viewportRect.TopRight, scale),
-            BottomLeft = ViewportToSurface(viewportRect.BottomLeft, scale),
-            BottomRight = ViewportToSurface(viewportRect.BottomRight, scale),
-        };
-    }
-
-    private ShapeCorners SurfaceToViewport(RectI viewportRect, float scale)
-    {
-        return new ShapeCorners()
-        {
-            TopLeft = SurfaceToViewport(viewportRect.TopLeft, scale),
-            TopRight = SurfaceToViewport(viewportRect.TopRight, scale),
-            BottomLeft = SurfaceToViewport(viewportRect.BottomLeft, scale),
-            BottomRight = SurfaceToViewport(viewportRect.BottomRight, scale),
-        };
-    }
-
-    private VecD SurfaceToViewport(VecI surfacePoint, float scale)
-    {
-        VecD unscaledPoint = surfacePoint * scale;
-
-        float angle = (float)Angle;
-        if (FlipX)
-        {
-            unscaledPoint.X = -unscaledPoint.X;
-            angle = 360 - angle;
-        }
-
-        if (FlipY)
-        {
-            unscaledPoint.Y = -unscaledPoint.Y;
-            angle = 360 - angle;
-        }
-
-        VecD offseted = unscaledPoint + ContentPosition;
-
-        float angleRadians = (float)(angle * Math.PI / 180);
-        VecD rotated = offseted.Rotate(angleRadians, ContentPosition);
-
-        return rotated;
-    }
-
-    private VecI ViewportToSurface(VecD viewportPoint, float scale)
-    {
-        float angle = (float)Angle;
-        if (FlipX)
-        {
-            angle = 360 - angle;
-        }
-
-        if (FlipY)
-        {
-            angle = 360 - angle;
-        }
-
-        float angleRadians = (float)(angle * Math.PI / 180);
-        VecD rotatedViewportPoint = (viewportPoint).Rotate(-angleRadians, ContentPosition);
-
-        VecD unscaledPoint = rotatedViewportPoint - ContentPosition;
-
-        if (FlipX)
-            unscaledPoint.X = -unscaledPoint.X;
-        if (FlipY)
-            unscaledPoint.Y = -unscaledPoint.Y;
-
-        VecI pos = new VecI(
-            (int)Math.Round(unscaledPoint.X / scale),
-            (int)Math.Round(unscaledPoint.Y / scale));
-
-        return pos;
-    }
-
     public override bool Equals(ICustomDrawOperation? other)
     public override bool Equals(ICustomDrawOperation? other)
     {
     {
         return false;
         return false;