Forráskód Böngészése

Brush shape working, reference wip

Krzysztof Krysiński 1 éve
szülő
commit
f73f054e99

+ 5 - 5
src/PixiEditor.AvaloniaUI/Views/Main/ViewportControls/Viewport.axaml

@@ -191,20 +191,20 @@
                                         ReferenceLayer="{Binding Document.ReferenceLayerViewModel}"
                                         ReferenceLayerScale="{Binding ReferenceLayerScale}"
                                         FadeOut="{Binding Source={viewModels:ToolVM ColorPickerToolViewModel}, Path=!PickFromReferenceLayer, Mode=OneWay}"
-                                        RenderTransformOrigin="0, 0" RenderTransform="{Binding #zoombox.CanvasTransform}"/>
+                                        RenderTransformOrigin="0, 0" RenderTransform="{Binding #scene.CanvasTransform}"/>
 
         <!--Brush shape overlay is rendered separately, so it doesn't trigger rerender each mouse movement to scene-->
         <!--I didn't measure it, but I thought that could impact performance-->
         <brushShapeOverlay:BrushShapeOverlay
             DataContext="{Binding ElementName=vpUc}"
-            RenderTransformOrigin="0, 0" RenderTransform="{Binding #zoombox.CanvasTransform}"
+            RenderTransform="{Binding #scene.CanvasTransform}"
+            RenderTransformOrigin="0, 0"
             Name="brushShapeOverlay"
             Focusable="False" ZIndex="6"
             IsHitTestVisible="False"
             IsVisible="{Binding !Document.TransformViewModel.TransformActive}"
-            ZoomScale="{Binding #zoombox.Scale}"
-            MouseEventSource="{Binding #vpUc.BackgroundGrid, Mode=OneTime}"
-            MouseReference="{Binding #vpUc.MainImage, Mode=OneTime}"
+            ZoomScale="{Binding #scene.Scale}"
+            Scene="{Binding #scene, Mode=OneTime}"
             BrushSize="{Binding ToolsSubViewModel.ActiveBasicToolbar.ToolSize, Source={viewModels:MainVM}}"
             BrushShape="{Binding ToolsSubViewModel.ActiveTool.BrushShape, Source={viewModels:MainVM}, FallbackValue={x:Static brushShapeOverlay:BrushShape.Hidden}}"
             FlowDirection="LeftToRight" />

+ 0 - 3
src/PixiEditor.AvaloniaUI/Views/Main/ViewportControls/Viewport.axaml.cs

@@ -307,7 +307,6 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
     }
 
     public Scene Scene => scene;
-    public Grid BackgroundGrid => viewportGrid;
 
     private void ForceRefreshFinalImage()
     {
@@ -329,8 +328,6 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
 
     private void InitializeOverlays()
     {
-        brushShapeOverlay.MouseEventSource = BackgroundGrid;
-        brushShapeOverlay.MouseReference = Scene;
         brushShapeOverlay.Initialize();
     }
 

+ 20 - 27
src/PixiEditor.AvaloniaUI/Views/Overlays/BrushShapeOverlay/BrushShapeOverlay.cs

@@ -7,6 +7,7 @@ using Avalonia.Interactivity;
 using Avalonia.Media;
 using ChunkyImageLib.Operations;
 using PixiEditor.AvaloniaUI.Models.Controllers.InputDevice;
+using PixiEditor.AvaloniaUI.Views.Visuals;
 using PixiEditor.DrawingApi.Core.Numerics;
 
 namespace PixiEditor.AvaloniaUI.Views.Overlays.BrushShapeOverlay;
@@ -16,33 +17,24 @@ internal class BrushShapeOverlay : Overlay
     public static readonly StyledProperty<int> BrushSizeProperty =
         AvaloniaProperty.Register<BrushShapeOverlay, int>(nameof(BrushSize), defaultValue: 1);
 
-    public static readonly StyledProperty<Control?> MouseEventSourceProperty =
-        AvaloniaProperty.Register<BrushShapeOverlay, Control?>(nameof(MouseEventSource), defaultValue: null);
-
-    public static readonly StyledProperty<InputElement?> MouseReferenceProperty =
-        AvaloniaProperty.Register<BrushShapeOverlay, InputElement?>(nameof(MouseReference), defaultValue: null);
-
     public static readonly StyledProperty<BrushShape> BrushShapeProperty =
         AvaloniaProperty.Register<BrushShapeOverlay, BrushShape>(nameof(BrushShape), defaultValue: BrushShape.Circle);
 
-    public BrushShape BrushShape
-    {
-        get => (BrushShape)GetValue(BrushShapeProperty);
-        set => SetValue(BrushShapeProperty, value);
-    }
+    public static readonly StyledProperty<Scene> SceneProperty = AvaloniaProperty.Register<BrushShapeOverlay, Scene>(
+        nameof(Scene));
 
-    public InputElement? MouseReference
+    public Scene Scene
     {
-        get => (InputElement?)GetValue(MouseReferenceProperty);
-        set => SetValue(MouseReferenceProperty, value);
+        get => GetValue(SceneProperty);
+        set => SetValue(SceneProperty, value);
     }
 
-    public Control? MouseEventSource
+    public BrushShape BrushShape
     {
-        get => (Control?)GetValue(MouseEventSourceProperty);
-        set => SetValue(MouseEventSourceProperty, value);
+        get => (BrushShape)GetValue(BrushShapeProperty);
+        set => SetValue(BrushShapeProperty, value);
     }
-
+    
     public int BrushSize
     {
         get => (int)GetValue(BrushSizeProperty);
@@ -50,7 +42,7 @@ internal class BrushShapeOverlay : Overlay
     }
 
     private Pen whitePen = new Pen(Brushes.LightGray, 1);
-    private Point lastMousePos = new();
+    private VecD lastMousePos = new();
 
     private MouseUpdateController? mouseUpdateController;
 
@@ -67,25 +59,27 @@ internal class BrushShapeOverlay : Overlay
 
     private void ControlUnloaded(object? sender, RoutedEventArgs e)
     {
-        if (MouseEventSource is null)
+        if (Scene is null)
             return;
-        
+
         mouseUpdateController?.Dispose();
     }
 
     public void Initialize()
     {
-        if (MouseEventSource is null)
+        if (Scene is null)
             return;
 
-        mouseUpdateController = new MouseUpdateController(MouseEventSource, SourceMouseMove);
+        mouseUpdateController = new MouseUpdateController(Scene, SourceMouseMove);
     }
 
     private void SourceMouseMove(PointerEventArgs args)
     {
-        if (MouseReference is null || BrushShape == BrushShape.Hidden)
+        if (Scene is null || BrushShape == BrushShape.Hidden)
             return;
-        lastMousePos = args.GetPosition(MouseReference);
+
+        Point rawPoint = args.GetPosition(Scene);
+        lastMousePos = Scene.ToZoomboxSpace(new VecD(rawPoint.X, rawPoint.Y));
         InvalidateVisual();
     }
 
@@ -93,8 +87,7 @@ internal class BrushShapeOverlay : Overlay
     {
         var winRect = new Rect(
             (Point)(new Point(Math.Floor(lastMousePos.X), Math.Floor(lastMousePos.Y)) - new Point(BrushSize / 2, BrushSize / 2)),
-            new Size(BrushSize, BrushSize)
-            );
+            new Size(BrushSize, BrushSize));
         switch (BrushShape)
         {
             case BrushShape.Pixel:

+ 12 - 1
src/PixiEditor.AvaloniaUI/Views/Overlays/ReferenceLayerOverlay.cs

@@ -3,12 +3,14 @@ using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls.Metadata;
 using Avalonia.Controls.Primitives;
+using Avalonia.Media;
 using PixiEditor.AvaloniaUI.ViewModels.Document;
+using PixiEditor.AvaloniaUI.Views.Visuals;
 
 namespace PixiEditor.AvaloniaUI.Views.Overlays;
 
 [PseudoClasses(":showHighest", ":fadedOut")]
-internal class ReferenceLayerOverlay : TemplatedControl
+internal class ReferenceLayerOverlay : Overlay
 {
     public static readonly StyledProperty<ReferenceLayerViewModel> ReferenceLayerProperty = AvaloniaProperty.Register<ReferenceLayerOverlay, ReferenceLayerViewModel>(
         nameof(ReferenceLayerViewModel));
@@ -43,6 +45,15 @@ internal class ReferenceLayerOverlay : TemplatedControl
         FadeOutProperty.Changed.Subscribe(FadeOutChanged);
     }
 
+    public override void Render(DrawingContext context)
+    {
+        if (ReferenceLayer != null && ReferenceLayer.ReferenceBitmap != null)
+        {
+            Rect dirtyRect = new Rect(CanvasDirtyBounds.X, CanvasDirtyBounds.Y, CanvasDirtyBounds.Width, CanvasDirtyBounds.Height);
+            DrawSurfaceOperation drawOperation = new DrawSurfaceOperation(dirtyRect, ReferenceLayer.ReferenceBitmap, Stretch.Uniform, Opacity);
+        }
+    }
+
     private static void ReferenceLayerChanged(AvaloniaPropertyChangedEventArgs<ReferenceLayerViewModel> obj)
     {
         ReferenceLayerOverlay objSender = (ReferenceLayerOverlay)obj.Sender;