Переглянути джерело

Fixed pointer data not passing

Krzysztof Krysiński 2 тижнів тому
батько
коміт
fe0c851ac2
24 змінених файлів з 103 додано та 60 видалено
  1. 1 1
      src/Drawie
  2. 1 3
      src/PixiEditor.ChangeableDocument/Changeables/Brushes/BrushData.cs
  3. 11 6
      src/PixiEditor.ChangeableDocument/Changeables/Brushes/BrushEngine.cs
  4. 11 6
      src/PixiEditor.ChangeableDocument/Changes/Drawing/LineBasedPen_UpdateableChange.cs
  5. 1 0
      src/PixiEditor.Extensions/UI/Overlays/OverlayPointerArgs.cs
  6. 5 5
      src/PixiEditor/Models/Controllers/InputDevice/MouseInputFilter.cs
  7. 4 2
      src/PixiEditor/Models/Controllers/InputDevice/MouseOnCanvasEventArgs.cs
  8. 26 3
      src/PixiEditor/Models/DocumentModels/ChangeExecutionController.cs
  9. 3 3
      src/PixiEditor/Models/DocumentModels/Public/DocumentEventsModule.cs
  10. 2 1
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/BrightnessToolExecutor.cs
  11. 4 3
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/ColorPickerToolExecutor.cs
  12. 4 3
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/EraserToolExecutor.cs
  13. 2 1
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/FloodFillToolExecutor.cs
  14. 2 1
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LassoToolExecutor.cs
  15. 4 3
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/PenToolExecutor.cs
  16. 2 1
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SelectToolExecutor.cs
  17. 4 4
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SimpleShapeToolExecutor.cs
  18. 2 2
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/UpdateableChangeExecutor.cs
  19. 2 2
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorPathToolExecutor.cs
  20. 3 3
      src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorTextToolExecutor.cs
  21. 2 2
      src/PixiEditor/ViewModels/SubViewModels/IoViewModel.cs
  22. 4 3
      src/PixiEditor/Views/Main/ViewportControls/Viewport.axaml.cs
  23. 1 1
      src/PixiEditor/Views/Overlays/TransformOverlay/TransformOverlay.cs
  24. 2 1
      src/PixiEditor/Views/Rendering/Scene.cs

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit 906b76246cfd8e252fb8cf9f7659780053bd9cae
+Subproject commit bd525be43b3c9cdf40eea60bb8ac1f3d9e3142dd

+ 1 - 3
src/PixiEditor.ChangeableDocument/Changeables/Brushes/BrushData.cs

@@ -2,6 +2,7 @@
 using Drawie.Backend.Core.Surfaces;
 using PixiEditor.ChangeableDocument.Changeables.Graph;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.ChangeableDocument.Rendering.ContextData;
 
 namespace PixiEditor.ChangeableDocument.Changeables.Brushes;
 
@@ -13,9 +14,6 @@ public struct BrushData
     public float Spacing { get; set; }
     public float StrokeWidth { get; set; }
 
-    public bool FitToStrokeSize { get; set; } = true;
-
-    public float Pressure { get; set; } = 1f;
     public BlendMode BlendMode { get; set; } = BlendMode.SrcOver;
 
 

+ 11 - 6
src/PixiEditor.ChangeableDocument/Changeables/Brushes/BrushEngine.cs

@@ -10,17 +10,20 @@ using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Brushes;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
 using PixiEditor.ChangeableDocument.Rendering;
+using PixiEditor.ChangeableDocument.Rendering.ContextData;
 
 namespace PixiEditor.ChangeableDocument.Changeables.Brushes;
 
 internal class BrushEngine
 {
-    public void ExecuteBrush(ChunkyImage target, BrushData brushData, VecI point, KeyFrameTime frameTime)
+    public void ExecuteBrush(ChunkyImage target, BrushData brushData, VecI point, KeyFrameTime frameTime, ColorSpace cs, SamplingOptions samplingOptions, PointerInfo pointerInfo)
     {
-        ExecuteVectorShapeBrush(target, brushData, point, frameTime);
+        ExecuteVectorShapeBrush(target, brushData, point, frameTime, cs, samplingOptions, pointerInfo);
     }
 
-    private void ExecuteVectorShapeBrush(ChunkyImage target, BrushData brushData, VecI point, KeyFrameTime frameTime)
+    private void ExecuteVectorShapeBrush(ChunkyImage target, BrushData brushData, VecI point, KeyFrameTime frameTime,
+        ColorSpace colorSpace, SamplingOptions samplingOptions,
+        PointerInfo pointerInfo)
     {
         var brushNode = brushData.BrushGraph.AllNodes.FirstOrDefault(x => x is BrushOutputNode) as BrushOutputNode;
         if (brushNode == null)
@@ -31,7 +34,8 @@ internal class BrushEngine
         VecI size = new VecI((int)float.Ceiling(brushData.StrokeWidth));
         using var texture = Texture.ForDisplay(size);
         RenderContext context = new RenderContext(texture.DrawingSurface, frameTime, ChunkResolution.Full, size, size,
-            ColorSpace.CreateSrgbLinear());
+            colorSpace, samplingOptions) { PointerInfo = pointerInfo };
+
         brushData.BrushGraph.Execute(brushNode, context);
 
         var vectorShape = brushNode.VectorShape.Value;
@@ -52,7 +56,7 @@ internal class BrushEngine
         path.Offset(vectorShape.TransformedAABB.Pos - vectorShape.GeometryAABB.Pos);
         path.Offset(rect.Center - path.Bounds.Center);
 
-        if (brushData.FitToStrokeSize)
+        if (brushNode.FitToStrokeSize.Value)
         {
             VecD scale = new VecD(rect.Size.X / (float)path.Bounds.Width, rect.Size.Y / (float)path.Bounds.Height);
             if (scale.IsNaNOrInfinity())
@@ -65,7 +69,8 @@ internal class BrushEngine
                 (float)rect.Center.Y));
         }
 
-        Matrix3X3 pressureScale = Matrix3X3.CreateScale(brushData.Pressure, brushData.Pressure, (float)rect.Center.X,
+        var pressure = brushNode.Pressure.Value;
+        Matrix3X3 pressureScale = Matrix3X3.CreateScale(pressure, pressure, (float)rect.Center.X,
             (float)rect.Center.Y);
         path.Transform(pressureScale);
 

+ 11 - 6
src/PixiEditor.ChangeableDocument/Changes/Drawing/LineBasedPen_UpdateableChange.cs

@@ -1,4 +1,5 @@
-using ChunkyImageLib.Operations;
+using System.Reflection;
+using ChunkyImageLib.Operations;
 using Drawie.Backend.Core;
 using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.ColorsImpl.Paintables;
@@ -13,6 +14,7 @@ using PixiEditor.ChangeableDocument.Changeables.Graph;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Brushes;
 using PixiEditor.ChangeableDocument.Rendering;
+using PixiEditor.ChangeableDocument.Rendering.ContextData;
 
 namespace PixiEditor.ChangeableDocument.Changes.Drawing;
 
@@ -38,6 +40,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
     private VecF lastPos;
     private int lastAppliedPointIndex = -1;
     private BrushOutputNode? brushOutputNode;
+    private PointerInfo pointerInfo;
 
     [GenerateUpdateableChangeActions]
     public LineBasedPen_UpdateableChange(Guid memberGuid, Color color, VecI pos, float strokeWidth, bool erasing,
@@ -45,7 +48,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
         float hardness,
         float spacing,
         Guid brushOutputGuid,
-        bool drawOnMask, int frame)
+        bool drawOnMask, int frame, PointerInfo pointerInfo)
     {
         this.memberGuid = memberGuid;
         this.color = color;
@@ -58,6 +61,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
         this.spacing = spacing;
         points.Add(pos);
         this.frame = frame;
+        this.pointerInfo = pointerInfo;
 
         srcPaint.Shader?.Dispose();
         srcPaint.Shader = null;
@@ -77,7 +81,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
     }
 
     [UpdateChangeMethod]
-    public void Update(VecI pos, float strokeWidth)
+    public void Update(VecI pos, float strokeWidth, PointerInfo pointerInfo)
     {
         if (points.Count > 0)
         {
@@ -86,6 +90,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
         }
 
         this.strokeWidth = strokeWidth;
+        this.pointerInfo = pointerInfo;
         UpdateBrushData();
     }
 
@@ -149,7 +154,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
             brushData.Spacing = spacing;
             brushData.StrokeWidth = strokeWidth;
 
-            engine.ExecuteBrush(image, brushData, point, frame);
+            engine.ExecuteBrush(image, brushData, point, frame, target.ProcessingColorSpace, SamplingOptions.Default, pointerInfo);
 
             /*if (brushData.VectorShape == null)
             {
@@ -200,7 +205,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
             var rect = new RectI(points[0] - new VecI((int)(strokeWidth / 2f)), new VecI((int)strokeWidth));
             finalPaintable = color;
 
-            engine.ExecuteBrush(targetImage, brushData, points[0], frameTime);
+            engine.ExecuteBrush(targetImage, brushData, points[0], frameTime, targetImage.ProcessingColorSpace, SamplingOptions.Default, pointerInfo);
 
             return;
         }
@@ -218,7 +223,7 @@ internal class LineBasedPen_UpdateableChange : UpdateableChange
             var rect = new RectI(points[i] - new VecI((int)(strokeWidth / 2f)), new VecI((int)strokeWidth));
             finalPaintable = color;
 
-            engine.ExecuteBrush(targetImage, brushData, points[i], frameTime);
+            engine.ExecuteBrush(targetImage, brushData, points[i], frameTime, targetImage.ProcessingColorSpace, SamplingOptions.Default, pointerInfo);
         }
     }
 

+ 1 - 0
src/PixiEditor.Extensions/UI/Overlays/OverlayPointerArgs.cs

@@ -12,4 +12,5 @@ public class OverlayPointerArgs
     public IOverlayPointer Pointer { get; set; }
     public bool Handled { get; set; }
     public int ClickCount { get; set; }
+    public PointerPointProperties Properties { get; set; }
 }

+ 5 - 5
src/PixiEditor/Models/Controllers/InputDevice/MouseInputFilter.cs

@@ -9,7 +9,7 @@ namespace PixiEditor.Models.Controllers.InputDevice;
 internal class MouseInputFilter
 {
     public EventHandler<MouseOnCanvasEventArgs> OnMouseDown;
-    public EventHandler<VecD> OnMouseMove;
+    public EventHandler<MouseOnCanvasEventArgs> OnMouseMove;
     public EventHandler<MouseOnCanvasEventArgs> OnMouseUp;
     public EventHandler<ScrollOnCanvasEventArgs> OnMouseWheel;
 
@@ -35,7 +35,7 @@ internal class MouseInputFilter
         OnMouseDown?.Invoke(this, args);
     }
 
-    public void MouseMoveInlet(object args) => OnMouseMove?.Invoke(this, ((MouseOnCanvasEventArgs)args).PositionOnCanvas);
+    public void MouseMoveInlet(object args) => OnMouseMove?.Invoke(this, ((MouseOnCanvasEventArgs)args));
     public void MouseUpInlet(object args) => MouseUpInlet(((MouseOnCanvasEventArgs)args));
     public void MouseUpInlet(object? sender, Point p, MouseButton button) => MouseUpInlet(button);
     public void MouseUpInlet(MouseOnCanvasEventArgs args)
@@ -53,13 +53,13 @@ internal class MouseInputFilter
 
     public void DeactivatedInlet(object? sender, EventArgs e)
     {
-        MouseOnCanvasEventArgs argsLeft = new(MouseButton.Left, VecD.Zero, KeyModifiers.None, 0);
+        MouseOnCanvasEventArgs argsLeft = new(MouseButton.Left, VecD.Zero, KeyModifiers.None, 0, PointerPointProperties.None);
         MouseUpInlet(argsLeft);
         
-        MouseOnCanvasEventArgs argsMiddle = new(MouseButton.Middle, VecD.Zero, KeyModifiers.None, 0);
+        MouseOnCanvasEventArgs argsMiddle = new(MouseButton.Middle, VecD.Zero, KeyModifiers.None, 0, PointerPointProperties.None);
         MouseUpInlet(argsMiddle);
         
-        MouseOnCanvasEventArgs argsRight = new(MouseButton.Right, VecD.Zero, KeyModifiers.None, 0);
+        MouseOnCanvasEventArgs argsRight = new(MouseButton.Right, VecD.Zero, KeyModifiers.None, 0, PointerPointProperties.None);
         MouseUpInlet(argsRight);
     }
 }

+ 4 - 2
src/PixiEditor/Models/Controllers/InputDevice/MouseOnCanvasEventArgs.cs

@@ -10,14 +10,16 @@ internal class MouseOnCanvasEventArgs : EventArgs
     public VecD PositionOnCanvas { get; }
     public KeyModifiers KeyModifiers { get; }
     public bool Handled { get; set; }
-    
     public int ClickCount { get; set; } = 1;
+    public PointerPointProperties Properties { get; }
 
-    public MouseOnCanvasEventArgs(MouseButton button, VecD positionOnCanvas, KeyModifiers keyModifiers, int clickCount)
+    public MouseOnCanvasEventArgs(MouseButton button, VecD positionOnCanvas, KeyModifiers keyModifiers, int clickCount,
+        PointerPointProperties properties)
     {
         Button = button;
         PositionOnCanvas = positionOnCanvas;
         KeyModifiers = keyModifiers;
         ClickCount = clickCount;
+        Properties = properties;
     }
 }

+ 26 - 3
src/PixiEditor/Models/DocumentModels/ChangeExecutionController.cs

@@ -9,6 +9,7 @@ using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
 using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Rendering.ContextData;
 using PixiEditor.Models.Controllers.InputDevice;
 using PixiEditor.Views.Overlays.SymmetryOverlay;
 
@@ -20,6 +21,7 @@ internal class ChangeExecutionController
     public ShapeCorners LastTransformState { get; private set; }
     public VecI LastPixelPosition => lastPixelPos;
     public VecD LastPrecisePosition => lastPrecisePos;
+    public PointerInfo LastPointerInfo => lastPointerInfo;
     public bool IsBlockingChangeActive => currentSession is not null && currentSession.BlocksOtherActions;
 
     public event Action ToolSessionFinished;
@@ -30,6 +32,9 @@ internal class ChangeExecutionController
 
     private VecI lastPixelPos;
     private VecD lastPrecisePos;
+    private PointerInfo pointerInfo;
+    private VecD lastDirCalculationPoint;
+    private PointerInfo lastPointerInfo;
 
     private UpdateableChangeExecutor? currentSession = null;
 
@@ -158,8 +163,9 @@ internal class ChangeExecutionController
         currentSession?.OnConvertedKeyUp(key);
     }
 
-    public void MouseMoveInlet(VecD newCanvasPos)
+    public void MouseMoveInlet(MouseOnCanvasEventArgs args)
     {
+        VecD newCanvasPos = args.PositionOnCanvas;
         //update internal state
         VecI newPixelPos = (VecI)newCanvasPos.Floor();
         bool pixelPosChanged = false;
@@ -171,12 +177,14 @@ internal class ChangeExecutionController
 
         lastPrecisePos = newCanvasPos;
 
+        lastPointerInfo = ConstructPointerInfo(newCanvasPos, args.Properties);
+
         //call session events
         if (currentSession is not null)
         {
             if (pixelPosChanged)
-                currentSession.OnPixelPositionChange(newPixelPos);
-            currentSession.OnPrecisePositionChange(newCanvasPos);
+                currentSession.OnPixelPositionChange(newPixelPos, args);
+            currentSession.OnPrecisePositionChange(args);
         }
     }
 
@@ -321,4 +329,19 @@ internal class ChangeExecutionController
             quickToolSwitchable.OnQuickToolSwitch();
         }
     }
+
+
+    private PointerInfo ConstructPointerInfo(VecD currentPoint, PointerPointProperties properties)
+    {
+        if (VecD.Distance(lastDirCalculationPoint, currentPoint) > 20)
+        {
+            lastDirCalculationPoint = lastDirCalculationPoint.Lerp(currentPoint, 0.5f);
+        }
+
+        VecD dir = lastDirCalculationPoint - currentPoint;
+        VecD vecDir = new VecD(dir.X, dir.Y);
+        VecD dirNormalized = vecDir.Length > 0 ? vecDir.Normalize() : lastPointerInfo.MovementDirection;
+        return new PointerInfo(currentPoint, properties.Pressure, properties.Twist,
+            new VecD(properties.XTilt, properties.YTilt), dirNormalized);
+    }
 }

+ 3 - 3
src/PixiEditor/Models/DocumentModels/Public/DocumentEventsModule.cs

@@ -35,10 +35,10 @@ internal class DocumentEventsModule
     }
 
     public void OnCanvasLeftMouseButtonDown(MouseOnCanvasEventArgs args) => Internals.ChangeController.LeftMouseButtonDownInlet(args);
-    public void OnCanvasMouseMove(VecD newPos)
+    public void OnCanvasMouseMove(MouseOnCanvasEventArgs args)
     {
-        DocumentsHandler.CoordinatesString = $"X: {(int)newPos.X} Y: {(int)newPos.Y}";
-        Internals.ChangeController.MouseMoveInlet(newPos);
+        DocumentsHandler.CoordinatesString = $"X: {(int)args.PositionOnCanvas.X} Y: {(int)args.PositionOnCanvas.Y}";
+        Internals.ChangeController.MouseMoveInlet(args);
     }
     public void OnCanvasLeftMouseButtonUp(VecD argsPositionOnCanvas) => Internals.ChangeController.LeftMouseButtonUpInlet(argsPositionOnCanvas);
     public void OnOpacitySliderDragStarted() => Internals.ChangeController.OpacitySliderDragStartedInlet();

+ 2 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/BrightnessToolExecutor.cs

@@ -6,6 +6,7 @@ using PixiEditor.Models.Handlers.Toolbars;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.Models.Controllers.InputDevice;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 #nullable enable
@@ -39,7 +40,7 @@ internal class BrightnessToolExecutor : UpdateableChangeExecutor
         return ExecutionState.Success;
     }
 
-    public override void OnPixelPositionChange(VecI pos)
+    public override void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args)
     {
         ChangeBrightness_Action action = new(guidValue, pos, correctionFactor, toolSize, squareBrush, repeat, document!.AnimationHandler.ActiveFrameBindable);
         internals!.ActionAccumulator.AddActions(action);

+ 4 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/ColorPickerToolExecutor.cs

@@ -3,6 +3,7 @@ using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.Models.Controllers.InputDevice;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 
@@ -36,7 +37,7 @@ internal class ColorPickerToolExecutor : UpdateableChangeExecutor
         return ExecutionState.Success;
     }
 
-    public override void OnPrecisePositionChange(VecD pos)
+    public override void OnPrecisePositionChange(MouseOnCanvasEventArgs args)
     {
         if (!includeReference)
             return;
@@ -44,10 +45,10 @@ internal class ColorPickerToolExecutor : UpdateableChangeExecutor
         string? customOutput = windowHandler?.ActiveWindow is IViewport viewport ? viewport.RenderOutputName : null;
         customOutput = customOutput == "DEFAULT" ? null : customOutput;
 
-        colorsViewModel.PrimaryColor = document.PickColor(pos, scope, includeReference, includeCanvas, document.AnimationHandler.ActiveFrameBindable, document.ReferenceLayerHandler.IsTopMost, customOutput);
+        colorsViewModel.PrimaryColor = document.PickColor(args.PositionOnCanvas, scope, includeReference, includeCanvas, document.AnimationHandler.ActiveFrameBindable, document.ReferenceLayerHandler.IsTopMost, customOutput);
     }
 
-    public override void OnPixelPositionChange(VecI pos)
+    public override void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args)
     {
         string? customOutput = windowHandler?.ActiveWindow is IViewport viewport ? viewport.RenderOutputName : null;
         customOutput = customOutput == "DEFAULT" ? null : customOutput;

+ 4 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/EraserToolExecutor.cs

@@ -9,6 +9,7 @@ using PixiEditor.Models.Handlers.Toolbars;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.Models.Controllers.InputDevice;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 
@@ -51,15 +52,15 @@ internal class EraserToolExecutor : UpdateableChangeExecutor
 
         colorsHandler.AddSwatch(new PaletteColor(color.R, color.G, color.B));
         IAction? action = new LineBasedPen_Action(guidValue, Colors.White, controller!.LastPixelPosition, (float)eraserTool.ToolSize, true,
-            antiAliasing, hardness, spacing, Guid.Empty, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
+            antiAliasing, hardness, spacing, Guid.Empty, drawOnMask, document!.AnimationHandler.ActiveFrameBindable, controller.LastPointerInfo);
         internals!.ActionAccumulator.AddActions(action);
 
         return ExecutionState.Success;
     }
 
-    public override void OnPixelPositionChange(VecI pos)
+    public override void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args)
     {
-        IAction? action = new LineBasedPen_Action(guidValue, Colors.White, pos, (float)toolSize, true, antiAliasing, hardness, spacing, Guid.Empty, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
+        IAction? action = new LineBasedPen_Action(guidValue, Colors.White, pos, (float)toolSize, true, antiAliasing, hardness, spacing, Guid.Empty, drawOnMask, document!.AnimationHandler.ActiveFrameBindable, controller.LastPointerInfo);
         internals!.ActionAccumulator.AddActions(action);
     }
 

+ 2 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/FloodFillToolExecutor.cs

@@ -7,6 +7,7 @@ using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.Models.Controllers.InputDevice;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 #nullable enable
@@ -45,7 +46,7 @@ internal class FloodFillToolExecutor : UpdateableChangeExecutor
         return ExecutionState.Success;
     }
 
-    public override void OnPixelPositionChange(VecI pos)
+    public override void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args)
     {
         internals!.ActionAccumulator.AddActions(new FloodFill_Action(memberGuid, pos, color, considerAllLayers, tolerance, drawOnMask, document!.AnimationHandler.ActiveFrameBindable));
     }

+ 2 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LassoToolExecutor.cs

@@ -4,6 +4,7 @@ using Drawie.Backend.Core.Numerics;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.Models.Controllers.InputDevice;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 
@@ -23,7 +24,7 @@ internal sealed class LassoToolExecutor : UpdateableChangeExecutor
         return ExecutionState.Success;
     }
 
-    public override void OnPixelPositionChange(VecI pos) => AddStartAction(pos);
+    public override void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args) => AddStartAction(pos);
 
     public override void OnLeftMouseButtonUp(VecD argsPositionOnCanvas)
     {

+ 4 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/PenToolExecutor.cs

@@ -9,6 +9,7 @@ using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
 using PixiEditor.ChangeableDocument.Changeables.Brushes;
+using PixiEditor.Models.Controllers.InputDevice;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 #nullable enable
@@ -62,7 +63,7 @@ internal class PenToolExecutor : UpdateableChangeExecutor
         transparentErase = color.A == 0;
         IAction? action = pixelPerfect switch
         {
-            false => new LineBasedPen_Action(guidValue, color, controller!.LastPixelPosition, (float)ToolSize, transparentErase, antiAliasing, hardness, spacing, brushOutputGuid, drawOnMask, document!.AnimationHandler.ActiveFrameBindable),
+            false => new LineBasedPen_Action(guidValue, color, controller!.LastPixelPosition, (float)ToolSize, transparentErase, antiAliasing, hardness, spacing, brushOutputGuid, drawOnMask, document!.AnimationHandler.ActiveFrameBindable, controller.LastPointerInfo),
             true => new PixelPerfectPen_Action(guidValue, controller!.LastPixelPosition, color, drawOnMask, document!.AnimationHandler.ActiveFrameBindable)
         };
         internals!.ActionAccumulator.AddActions(action);
@@ -70,11 +71,11 @@ internal class PenToolExecutor : UpdateableChangeExecutor
         return ExecutionState.Success;
     }
 
-    public override void OnPixelPositionChange(VecI pos)
+    public override void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args)
     {
         IAction? action = pixelPerfect switch
         {
-            false => new LineBasedPen_Action(guidValue, color, pos, (float)ToolSize, transparentErase, antiAliasing, hardness, spacing, brushOutputGuid, drawOnMask, document!.AnimationHandler.ActiveFrameBindable),
+            false => new LineBasedPen_Action(guidValue, color, pos, (float)ToolSize, transparentErase, antiAliasing, hardness, spacing, brushOutputGuid, drawOnMask, document!.AnimationHandler.ActiveFrameBindable, controller.LastPointerInfo),
             true => new PixelPerfectPen_Action(guidValue, pos, color, drawOnMask, document!.AnimationHandler.ActiveFrameBindable)
         };
         internals!.ActionAccumulator.AddActions(action);

+ 2 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SelectToolExecutor.cs

@@ -7,6 +7,7 @@ using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
+using PixiEditor.Models.Controllers.InputDevice;
 using PixiEditor.Views.Overlays.SelectionOverlay;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
@@ -51,7 +52,7 @@ internal class SelectToolExecutor : UpdateableChangeExecutor
         _ => throw new NotImplementedException(),
     };
 
-    public override void OnPixelPositionChange(VecI pos)
+    public override void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args)
     {
         IAction action = CreateUpdateAction(selectShape, RectI.FromTwoPixels(startPos, pos), selectMode);
         internals!.ActionAccumulator.AddActions(action);

+ 4 - 4
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SimpleShapeToolExecutor.cs

@@ -133,19 +133,19 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
         restoreSnapping = DisableSelfSnapping(memberId, document);
     }
 
-    public override void OnPrecisePositionChange(VecD pos)
+    public override void OnPrecisePositionChange(MouseOnCanvasEventArgs args)
     {
         if (ActiveMode == ShapeToolMode.Preview)
         {
-            PrecisePositionChangePreviewMode(pos);
+            PrecisePositionChangePreviewMode(args.PositionOnCanvas);
         }
         else if (ActiveMode == ShapeToolMode.Drawing)
         {
-            PrecisePositionChangeDrawingMode(pos);
+            PrecisePositionChangeDrawingMode(args.PositionOnCanvas);
         }
         else if (ActiveMode == ShapeToolMode.Transform)
         {
-            PrecisePositionChangeTransformMode(pos);
+            PrecisePositionChangeTransformMode(args.PositionOnCanvas);
         }
     }
 

+ 2 - 2
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/UpdateableChangeExecutor.cs

@@ -47,8 +47,8 @@ internal abstract class UpdateableChangeExecutor
 
     public abstract ExecutionState Start();
     public abstract void ForceStop();
-    public virtual void OnPixelPositionChange(VecI pos) { }
-    public virtual void OnPrecisePositionChange(VecD pos) { }
+    public virtual void OnPixelPositionChange(VecI pos, MouseOnCanvasEventArgs args) { }
+    public virtual void OnPrecisePositionChange(MouseOnCanvasEventArgs args) { }
     public virtual void OnLeftMouseButtonDown(MouseOnCanvasEventArgs args) { }
     public virtual void OnLeftMouseButtonUp(VecD pos) { }
     public virtual void OnOpacitySliderDragStarted() { }

+ 2 - 2
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorPathToolExecutor.cs

@@ -119,7 +119,7 @@ internal class VectorPathToolExecutor : UpdateableChangeExecutor, IPathExecutorF
         return ExecutionState.Success;
     }
 
-    public override void OnPrecisePositionChange(VecD pos)
+    public override void OnPrecisePositionChange(MouseOnCanvasEventArgs args)
     {
         if (mouseDown)
         {
@@ -127,7 +127,7 @@ internal class VectorPathToolExecutor : UpdateableChangeExecutor, IPathExecutorF
         }
 
         VecD mouseSnap =
-            document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis,
+            document.SnappingHandler.SnappingController.GetSnapPoint(args.PositionOnCanvas, out string snapXAxis,
                 out string snapYAxis);
         HighlightSnapping(snapXAxis, snapYAxis);
 

+ 3 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorTextToolExecutor.cs

@@ -148,14 +148,14 @@ internal class VectorTextToolExecutor : UpdateableChangeExecutor, ITextOverlayEv
             }, false);
     }
 
-    public override void OnPrecisePositionChange(VecD pos)
+    public override void OnPrecisePositionChange(MouseOnCanvasEventArgs args)
     {
         if (document.TextOverlayHandler.IsActive && internals.ChangeController.LeftMousePressed && string.IsNullOrEmpty(lastText))
         {
-            double distance = Math.Abs(clickPos.Y - pos.Y);
+            double distance = Math.Abs(clickPos.Y - args.PositionOnCanvas.Y);
             if (!wasDrawingSize && distance < 10) return;
             wasDrawingSize = true;
-            position = new VecD(position.X, pos.Y);
+            position = new VecD(position.X, args.PositionOnCanvas.Y);
             document.TextOverlayHandler.Position = position;
             document.TextOverlayHandler.PreviewSize = true;
             var textData = ConstructTextData(lastText);

+ 2 - 2
src/PixiEditor/ViewModels/SubViewModels/IoViewModel.cs

@@ -341,12 +341,12 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
         Owner.ToolsSubViewModel.SetActiveTool<MoveViewportToolViewModel>(true);
     }
 
-    private void OnMouseMove(object? sender, VecD pos)
+    private void OnMouseMove(object? sender, MouseOnCanvasEventArgs args)
     {
         DocumentViewModel? activeDocument = Owner.DocumentManagerSubViewModel.ActiveDocument;
         if (activeDocument is null)
             return;
-        activeDocument.EventInlet.OnCanvasMouseMove(pos);
+        activeDocument.EventInlet.OnCanvasMouseMove(args);
     }
 
     private void OnMouseUp(object? sender, MouseOnCanvasEventArgs args)

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

@@ -534,7 +534,8 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
         var pos = e.GetPosition(Scene);
         VecD scenePos = Scene.ToZoomboxSpace(new VecD(pos.X, pos.Y));
         MouseOnCanvasEventArgs? parameter =
-            new MouseOnCanvasEventArgs(mouseButton, scenePos, e.KeyModifiers, e.ClickCount);
+            new MouseOnCanvasEventArgs(mouseButton, scenePos, e.KeyModifiers, e.ClickCount,
+                e.GetCurrentPoint(this).Properties);
 
         if (MouseDownCommand.CanExecute(parameter))
             MouseDownCommand.Execute(parameter);
@@ -549,7 +550,7 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
 
         MouseButton mouseButton = e.GetMouseButton(this);
 
-        MouseOnCanvasEventArgs parameter = new(mouseButton, conv, e.KeyModifiers, 0);
+        MouseOnCanvasEventArgs parameter = new(mouseButton, conv, e.KeyModifiers, 0, e.GetCurrentPoint(this).Properties);
 
         if (MouseMoveCommand.CanExecute(parameter))
             MouseMoveCommand.Execute(parameter);
@@ -562,7 +563,7 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
 
         Point pos = e.GetPosition(Scene);
         VecD conv = Scene.ToZoomboxSpace(new VecD(pos.X, pos.Y));
-        MouseOnCanvasEventArgs parameter = new(e.InitialPressMouseButton, conv, e.KeyModifiers, 0);
+        MouseOnCanvasEventArgs parameter = new(e.InitialPressMouseButton, conv, e.KeyModifiers, 0, e.GetCurrentPoint(this).Properties);
         if (MouseUpCommand.CanExecute(parameter))
             MouseUpCommand.Execute(parameter);
     }

+ 1 - 1
src/PixiEditor/Views/Overlays/TransformOverlay/TransformOverlay.cs

@@ -667,7 +667,7 @@ internal class TransformOverlay : Overlay
 
         if (!isRotating && !actuallyMoved && pressedWithinBounds)
         {
-            MouseOnCanvasEventArgs args = new(MouseButton.Left, e.Point, e.Modifiers, lastClickCount);
+            MouseOnCanvasEventArgs args = new(MouseButton.Left, e.Point, e.Modifiers, lastClickCount, e.Properties);
             PassthroughPointerPressedCommand?.Execute(args);
             lastClickCount = 0;
         }

+ 2 - 1
src/PixiEditor/Views/Rendering/Scene.cs

@@ -340,7 +340,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
         DrawOverlays(renderTexture.DrawingSurface, bounds, OverlayRenderSorting.Background);
         try
         {
-            SceneRenderer.RenderScene(renderTexture.DrawingSurface, CalculateResolution(), CalculateSampling(), lastPointerInfo,
+            SceneRenderer.RenderScene(renderTexture.DrawingSurface, CalculateResolution(), lastPointerInfo, CalculateSampling(),
                 renderOutput);
         }
         catch (Exception e)
@@ -669,6 +669,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
                 ? released.InitialPressMouseButton
                 : MouseButton.None,
             ClickCount = e is PointerPressedEventArgs pressed ? pressed.ClickCount : 0,
+            Properties = e.GetCurrentPoint(this).Properties,
         };
     }