Browse Source

Improved raster line drawing

flabbet 11 months ago
parent
commit
66aff29da1

+ 26 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/RasterLineToolExecutor.cs

@@ -16,22 +16,45 @@ internal class RasterLineToolExecutor : LineExecutor<ILineToolHandler>
 
 
     protected override IAction DrawLine(VecD pos)
     protected override IAction DrawLine(VecD pos)
     {
     {
-        return new DrawRasterLine_Action(memberId, (VecI)startDrawingPos.Floor(), (VecI)pos.Floor(), StrokeWidth,
+        VecD dir = GetSignedDirection(startDrawingPos, pos);
+        VecD oppositeDir = new VecD(-dir.X, -dir.Y);
+        return new DrawRasterLine_Action(memberId, ToPixelPos(startDrawingPos, oppositeDir), ToPixelPos(pos, dir), StrokeWidth,
             StrokeColor, StrokeCap.Butt, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
             StrokeColor, StrokeCap.Butt, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
     }
     }
 
 
     protected override IAction TransformOverlayMoved(VecD start, VecD end)
     protected override IAction TransformOverlayMoved(VecD start, VecD end)
     {
     {
-        return new DrawRasterLine_Action(memberId, (VecI)start, (VecI)end,
+        VecD dir = GetSignedDirection(start, end);
+        VecD oppositeDir = new VecD(-dir.X, -dir.Y);
+        return new DrawRasterLine_Action(memberId, ToPixelPos(start, oppositeDir), ToPixelPos(end, dir), 
             StrokeWidth, StrokeColor, StrokeCap.Butt, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
             StrokeWidth, StrokeColor, StrokeCap.Butt, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
     }
     }
 
 
     protected override IAction SettingsChange()
     protected override IAction SettingsChange()
     {
     {
-        return new DrawRasterLine_Action(memberId, (VecI)startDrawingPos.Floor(), (VecI)curPos.Floor(), StrokeWidth,
+        VecD dir = GetSignedDirection(startDrawingPos, curPos);
+        VecD oppositeDir = new VecD(-dir.X, -dir.Y);
+        return new DrawRasterLine_Action(memberId, ToPixelPos(startDrawingPos, oppositeDir), ToPixelPos(curPos, dir), StrokeWidth,
             StrokeColor, StrokeCap.Butt, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
             StrokeColor, StrokeCap.Butt, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
     }
     }
 
 
+    private VecI ToPixelPos(VecD pos, VecD dir)
+    {
+        double xAdjustment = dir.X > 0 ? 0.5 : -0.5;
+        double yAdjustment = dir.Y > 0 ? 0.5 : -0.5;
+        
+        VecD adjustment = new VecD(xAdjustment, yAdjustment);
+        
+        VecI finalPos = (VecI)(pos - adjustment);
+
+        return finalPos;
+    }
+    
+    private VecD GetSignedDirection(VecD start, VecD end)
+    {
+        return new VecD(Math.Sign(end.X - start.X), Math.Sign(end.Y - start.Y));
+    }
+
     protected override IAction EndDraw()
     protected override IAction EndDraw()
     {
     {
         return new EndDrawRasterLine_Action();
         return new EndDrawRasterLine_Action();

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

@@ -138,7 +138,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor
         AddMemberToSnapping();
         AddMemberToSnapping();
         HighlightSnapping(null, null);
         HighlightSnapping(null, null);
     }
     }
-
+    
     public override void ForceStop()
     public override void ForceStop()
     {
     {
         StopMode(activeMode);
         StopMode(activeMode);

+ 6 - 0
src/PixiEditor/ViewModels/Tools/ShapeTool.cs

@@ -1,4 +1,5 @@
 using Avalonia.Input;
 using Avalonia.Input;
+using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.Views.Overlays.BrushShapeOverlay;
 using PixiEditor.Views.Overlays.BrushShapeOverlay;
@@ -18,4 +19,9 @@ internal abstract class ShapeTool : ToolViewModel, IShapeToolHandler
         Cursor = new Cursor(StandardCursorType.Cross);
         Cursor = new Cursor(StandardCursorType.Cross);
         Toolbar = new BasicShapeToolbar();
         Toolbar = new BasicShapeToolbar();
     }
     }
+
+    public override void OnDeselecting()
+    {
+        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
+    }
 }
 }

+ 5 - 8
src/PixiEditor/ViewModels/Tools/Tools/VectorLineToolViewModel.cs

@@ -65,10 +65,12 @@ internal class VectorLineToolViewModel : ShapeTool, IVectorLineToolHandler
         var layer = document.SelectedStructureMember;
         var layer = document.SelectedStructureMember;
         if (layer is IVectorLayerHandler vectorLayer)
         if (layer is IVectorLayerHandler vectorLayer)
         {
         {
-            IReadOnlyLineData? lineVectorData = vectorLayer.GetShapeData(document.AnimationDataViewModel.ActiveFrameTime) as IReadOnlyLineData;
+            IReadOnlyLineData? lineVectorData =
+                vectorLayer.GetShapeData(document.AnimationDataViewModel.ActiveFrameTime) as IReadOnlyLineData;
             if (lineVectorData is null) return;
             if (lineVectorData is null) return;
-            
-            document.LineToolOverlayViewModel.Show(lineVectorData.TransformedStart, lineVectorData.TransformedEnd, false);
+
+            document.LineToolOverlayViewModel.Show(lineVectorData.TransformedStart, lineVectorData.TransformedEnd,
+                false);
         }
         }
 
 
         document.Tools.UseVectorLineTool();
         document.Tools.UseVectorLineTool();
@@ -79,9 +81,4 @@ internal class VectorLineToolViewModel : ShapeTool, IVectorLineToolHandler
         OnDeselecting();
         OnDeselecting();
         OnSelected();
         OnSelected();
     }
     }
-
-    public override void OnDeselecting()
-    {
-        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.Operations.TryStopToolLinkedExecutor();
-    }
 }
 }