Selaa lähdekoodia

Fixed some preview issues

Krzysztof Krysiński 1 viikko sitten
vanhempi
sitoutus
29a5f3daec

+ 4 - 0
src/PixiEditor.ChangeableDocument/Changeables/Brushes/BrushEngine.cs

@@ -43,6 +43,10 @@ public class BrushEngine : IDisposable
     public void ResetState()
     {
         lastAppliedPointIndex = -1;
+        lastAppliedHistoryIndex = -1;
+        lastPos = VecD.Zero;
+        lastPressure = 1.0;
+        startPos = VecD.Zero;
         drawnOnce = false;
         pointsHistory.Clear();
     }

+ 8 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Brushes/BrushOutputNode.cs

@@ -240,6 +240,8 @@ public class BrushOutputNode : Node
         const int spacing = 10;
         const int marginEdges = 30;
         VecD pos = VecD.Zero;
+        previewEngine.ResetState();
+
         for (var i = 0; i < sizes.Length; i++)
         {
             var size = sizes[i];
@@ -253,6 +255,7 @@ public class BrushOutputNode : Node
                 new KeyboardInfo(),
                 new EditorData(Colors.White, Colors.Black));
         }
+        previewChunkyImage.CommitChanges();
 
         DrawStrokePreview(previewChunkyImage, context, maxSize);
 
@@ -272,6 +275,8 @@ public class BrushOutputNode : Node
         float pressure;
         VecD pos;
         List<RecordedPoint> points = new();
+        previewEngine.ResetState();
+
         while (offset <= target.CommittedSize.X)
         {
             pressure = (float)Math.Sin((offset / target.CommittedSize.X) * Math.PI);
@@ -303,6 +308,8 @@ public class BrushOutputNode : Node
         float offset = 0;
         float pressure;
         VecD pos;
+        previewEngine.ResetState();
+
         while (offset <= target.CommittedSize.X)
         {
             pressure = (float)Math.Sin((offset / target.CommittedSize.X) * Math.PI);
@@ -322,6 +329,7 @@ public class BrushOutputNode : Node
 
     public void DrawPointPreview(ChunkyImage img, RenderContext context, int size, VecD pos)
     {
+        previewEngine.ResetState();
         previewEngine.ExecuteBrush(img,
             new BrushData(context.Graph, Id) { StrokeWidth = size, AntiAliasing = true },
             pos, context.FrameTime, context.ProcessingColorSpace, context.DesiredSamplingOptions,

+ 6 - 2
src/PixiEditor/Views/Input/BrushItem.axaml.cs

@@ -4,6 +4,7 @@ using Avalonia.Controls;
 using Avalonia.Controls.Metadata;
 using Avalonia.Input;
 using Avalonia.Markup.Xaml;
+using Avalonia.Rendering.Composition;
 using Avalonia.Threading;
 using ChunkyImageLib;
 using ChunkyImageLib.DataHolders;
@@ -11,6 +12,7 @@ using Drawie.Backend.Core;
 using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.ImageData;
+using Drawie.Backend.Core.Surfaces.PaintImpl;
 using Drawie.Numerics;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Brushes;
 using PixiEditor.ChangeableDocument.Rendering;
@@ -128,7 +130,8 @@ internal partial class BrushItem : UserControl
         DrawingStrokeTexture = previewTexture;
 
         previewTexture.DrawingSurface.Canvas.Clear();
-        previewImage.CancelChanges();
+        previewImage.EnqueueClear();
+        previewImage.CommitChanges();
         enumerator = brushNode.DrawStrokePreviewEnumerable(previewImage, CreateContext(),
             BrushOutputNode.StrokePreviewSizeY / 2,
             new VecD(0, BrushOutputNode.YOffsetInPreview)).GetEnumerator();
@@ -158,11 +161,12 @@ internal partial class BrushItem : UserControl
                     return false;
                 }
 
+                using Paint srcOver = new() { BlendMode = BlendMode.Src, Style = PaintStyle.Fill };
                 previewImage.DrawMostUpToDateRegionOn(
                     new RectI(0, 0, previewImage.CommittedSize.X, previewImage.CommittedSize.Y),
                     ChunkResolution.Full,
                     previewTexture.DrawingSurface.Canvas,
-                    VecI.Zero, null, SamplingOptions.Bilinear);
+                    VecI.Zero, srcOver);
 
                 StrokePreviewControl.QueueNextFrame();
             }