Browse Source

Fixed kernel filter, transform filter ui and chaining bug

flabbet 8 months ago
parent
commit
7cec37c267

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changeables/Graph/Filter.cs

@@ -26,7 +26,7 @@ public sealed class Filter : IDisposable
         }
 
         ImageFilter? image = ImageFilter;
-        if (imageFilter == null)
+        if (imageFilter != null)
         {
             image = ImageFilter == null ? imageFilter : ImageFilter.CreateCompose(imageFilter, ImageFilter);
         }

+ 7 - 8
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/FilterNodes/ApplyFilterNode.cs

@@ -25,30 +25,29 @@ public class ApplyFilterNode : RenderNode, IRenderInput
 
     protected override void OnPaint(RenderContext context, DrawingSurface surface)
     {
-        if (Background.Value == null || Filter.Value == null)
+        if (Background.Value == null)
             return;
-        
+
         _paint.SetFilters(Filter.Value);
-        var layer = surface.Canvas.SaveLayer(_paint);
-        
+        int layer = surface.Canvas.SaveLayer(_paint);
         Background.Value.Paint(context, surface);
-        
+
         surface.Canvas.RestoreToCount(layer);
     }
 
     public override RectD? GetPreviewBounds(int frame, string elementToRenderName = "")
     {
-        return PreviewUtils.FindPreviewBounds(Background.Connection, frame, elementToRenderName); 
+        return PreviewUtils.FindPreviewBounds(Background.Connection, frame, elementToRenderName);
     }
 
     public override bool RenderPreview(DrawingSurface renderOn, ChunkResolution resolution, int frame,
         string elementToRenderName)
     {
-        if(Background.Value == null)
+        if (Background.Value == null)
             return false;
 
         RenderContext context = new(renderOn, frame, ChunkResolution.Full, VecI.One);
-        
+
         int layer = renderOn.Canvas.SaveLayer(_paint);
         Background.Value.Paint(context, renderOn);
         renderOn.Canvas.RestoreToCount(layer);

+ 4 - 1
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/FilterNodes/KernelFilterNode.cs

@@ -25,6 +25,8 @@ public class KernelFilterNode : FilterNode
     private double lastGain;
     private double lastBias;
 
+    private float[] lastKernelValues = new float[9];
+
     public KernelFilterNode()
     {
         Kernel = CreateInput(nameof(Kernel), "KERNEL", Drawie.Numerics.Kernel.Identity(3, 3));
@@ -38,7 +40,7 @@ public class KernelFilterNode : FilterNode
     {
         var kernel = Kernel.Value;
         
-        if (kernel.Equals(lastKernel) && Tile.Value == lastTile && Gain.Value == lastGain && Bias.Value == lastBias)
+        if (kernel.AsSpan().SequenceEqual(lastKernelValues) && Tile.Value == lastTile && Gain.Value == lastGain && Bias.Value == lastBias)
             return filter;
         
         lastKernel = kernel;
@@ -51,6 +53,7 @@ public class KernelFilterNode : FilterNode
         var kernelOffset = new VecI(kernel.RadiusX, kernel.RadiusY);
         
         filter = ImageFilter.CreateMatrixConvolution(kernel, (float)Gain.Value, (float)Bias.Value, kernelOffset, Tile.Value, OnAlpha.Value);
+        lastKernelValues = kernel.AsSpan().ToArray();
         return filter;
     }
 

+ 5 - 1
src/PixiEditor/ViewModels/Nodes/NodePropertyViewModel.cs

@@ -36,8 +36,12 @@ internal abstract class NodePropertyViewModel : ViewModelBase, INodePropertyHand
         get => _value;
         set
         {
+            var oldValue = _value;
             ViewModelMain.Current.NodeGraphManager.UpdatePropertyValue((node, PropertyName, value));
-            //ValueChanged?.Invoke(this, new NodePropertyValueChangedArgs(oldValue, value));
+            if(SetProperty(ref _value, value))
+            {
+                ValueChanged?.Invoke(this, new NodePropertyValueChangedArgs(oldValue, value));
+            }
         }
     }
 

+ 0 - 1
src/PixiEditor/Views/Nodes/Properties/KernelPropertyView.axaml.cs

@@ -3,7 +3,6 @@ using Avalonia.Controls;
 using Avalonia.Markup.Xaml;
 
 namespace PixiEditor.Views.Nodes.Properties;
-
 public partial class KernelPropertyView : NodePropertyView
 {
     public KernelPropertyView()