Explorar o código

Use WithUpdatedUniforms for Voronoi shader

Jakub Ciemała hai 3 semanas
pai
achega
750c1559ef

+ 23 - 6
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/NoiseNode.cs

@@ -21,6 +21,8 @@ public class NoiseNode : RenderNode
     private VoronoiFeature previousVoronoiFeature = Nodes.VoronoiFeature.F1;
     private double previousRandomness = double.NaN;
     private double previousAngleOffset = double.NaN;
+    
+    private Shader voronoiShader;
 
     private Paint paint = new();
 
@@ -86,7 +88,10 @@ public class NoiseNode : RenderNode
                 return;
             }
 
-            paint?.Shader?.Dispose();
+            if (paint.Shader != voronoiShader)
+            {
+                paint?.Shader?.Dispose();
+            }
             paint.Shader = shader;
 
             // Define a grayscale color filter to apply to the image
@@ -124,8 +129,11 @@ public class NoiseNode : RenderNode
         {
             return false;
         }
-        
-        paint?.Shader?.Dispose();
+
+        if (paint.Shader != voronoiShader)
+        {
+            paint?.Shader?.Dispose();
+        }
         paint.Shader = shader;
         paint.ColorFilter = grayscaleFilter;
         
@@ -146,14 +154,14 @@ public class NoiseNode : RenderNode
                 (float)(1d / Scale.Value),
                 (float)(1d / Scale.Value),
                 octaves, (float)Seed.Value),
-            Nodes.NoiseType.Voronoi => CreateVoronoiShader((float)Seed.Value, (float)(1d / (Scale.Value)), octaves, (float)Randomness.Value, (int)VoronoiFeature.Value, (float)AngleOffset.Value),
+            Nodes.NoiseType.Voronoi => GetVoronoiShader((float)(1d / (Scale.Value)), octaves, (float)Seed.Value, (int)VoronoiFeature.Value, (float)Randomness.Value, (float)AngleOffset.Value),
             _ => null
         };
 
         return shader;
     }
 
-    private Shader CreateVoronoiShader(float seed, float frequency, int octaves, float randomness, int feature, float angleOffset)
+    private Shader GetVoronoiShader(float frequency, int octaves, float seed, int feature, float randomness, float angleOffset)
     {
         string voronoiShaderCode = """
                                    uniform float iSeed;
@@ -259,8 +267,17 @@ public class NoiseNode : RenderNode
         uniforms.Add("iRandomness", new Uniform("iRandomness", randomness));
         uniforms.Add("iFeature", new Uniform("iFeature", feature));
         uniforms.Add("iAngleOffset", new Uniform("iAngleOffset", angleOffset));
+
+        if (voronoiShader == null)
+        {
+            voronoiShader = Shader.Create(voronoiShaderCode, uniforms, out _);
+        }
+        else
+        {
+            voronoiShader = voronoiShader.WithUpdatedUniforms(uniforms);
+        }
         
-        return Shader.Create(voronoiShaderCode, uniforms, out _);
+        return voronoiShader;
     }
 
     public override Node CreateCopy() => new NoiseNode();