2
0
flabbet 7 сар өмнө
parent
commit
388e27a6a7

+ 42 - 6
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/CreateImageNode.cs

@@ -5,11 +5,12 @@ using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.ImageData;
 using Drawie.Backend.Core.Surfaces.ImageData;
 using Drawie.Numerics;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 
 
 namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 
 
 [NodeInfo("CreateImage")]
 [NodeInfo("CreateImage")]
-public class CreateImageNode : Node
+public class CreateImageNode : Node, IPreviewRenderable
 {
 {
     public OutputProperty<Texture> Output { get; }
     public OutputProperty<Texture> Output { get; }
 
 
@@ -22,7 +23,7 @@ public class CreateImageNode : Node
     public RenderOutputProperty RenderOutput { get; }
     public RenderOutputProperty RenderOutput { get; }
 
 
     private TextureCache textureCache = new();
     private TextureCache textureCache = new();
-    
+
     public CreateImageNode()
     public CreateImageNode()
     {
     {
         Output = CreateOutput<Texture>(nameof(Output), "IMAGE", null);
         Output = CreateOutput<Texture>(nameof(Output), "IMAGE", null);
@@ -39,6 +40,15 @@ public class CreateImageNode : Node
             return;
             return;
         }
         }
 
 
+        var surface = Render(context);
+
+        Output.Value = surface;
+
+        RenderOutput.ChainToPainterValue();
+    }
+
+    private Texture Render(RenderContext context)
+    {
         var surface = textureCache.RequestTexture(0, Size.Value, context.ProcessingColorSpace, false);
         var surface = textureCache.RequestTexture(0, Size.Value, context.ProcessingColorSpace, false);
 
 
         surface.DrawingSurface.Canvas.Clear(Fill.Value);
         surface.DrawingSurface.Canvas.Clear(Fill.Value);
@@ -51,10 +61,7 @@ public class CreateImageNode : Node
         Content.Value?.Paint(ctx, surface.DrawingSurface);
         Content.Value?.Paint(ctx, surface.DrawingSurface);
 
 
         surface.DrawingSurface.Canvas.RestoreToCount(saved);
         surface.DrawingSurface.Canvas.RestoreToCount(saved);
-        
-        Output.Value = surface;
-
-        RenderOutput.ChainToPainterValue();
+        return surface;
     }
     }
 
 
     private void OnPaint(RenderContext context, DrawingSurface surface)
     private void OnPaint(RenderContext context, DrawingSurface surface)
@@ -69,4 +76,33 @@ public class CreateImageNode : Node
         base.Dispose();
         base.Dispose();
         textureCache.Dispose();
         textureCache.Dispose();
     }
     }
+
+    public RectD? GetPreviewBounds(int frame, string elementToRenderName = "")
+    {
+        if (Size.Value.X <= 0 || Size.Value.Y <= 0)
+        {
+            return null;
+        }
+
+        return new RectD(0, 0, Size.Value.X, Size.Value.Y);
+    }
+
+    public bool RenderPreview(DrawingSurface renderOn, RenderContext context, string elementToRenderName)
+    {
+        if (Size.Value.X <= 0 || Size.Value.Y <= 0)
+        {
+            return false;
+        }
+
+        if (Output.Value == null)
+        {
+            return false;
+        }
+
+        var surface = Render(context);
+        
+        renderOn.Canvas.DrawSurface(surface.DrawingSurface, 0, 0);
+        
+        return true;
+    }
 }
 }

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/ModifyImageRightNode.cs

@@ -126,7 +126,7 @@ public class ModifyImageRightNode : RenderNode, IPairNode, ICustomShaderNode
     public override bool RenderPreview(DrawingSurface renderOn, RenderContext context, string elementToRenderName)
     public override bool RenderPreview(DrawingSurface renderOn, RenderContext context, string elementToRenderName)
     {
     {
         var startNode = FindStartNode();
         var startNode = FindStartNode();
-        if (drawingPaint != null && startNode != null && startNode.Image.Value != null)
+        if (drawingPaint != null && startNode is { Image.Value: not null })
         {
         {
             renderOn.Canvas.DrawRect(0, 0, startNode.Image.Value.Size.X, startNode.Image.Value.Size.Y, drawingPaint);
             renderOn.Canvas.DrawRect(0, 0, startNode.Image.Value.Size.X, startNode.Image.Value.Size.Y, drawingPaint);
 
 

+ 1 - 1
src/PixiEditor/Models/DocumentModels/ActionAccumulator.cs

@@ -114,7 +114,7 @@ internal class ActionAccumulator
                     undoBoundaryPassed || viewportRefreshRequest);
                     undoBoundaryPassed || viewportRefreshRequest);
             }
             }
 
 
-            previewUpdater.UpdatePreviews(true, affectedAreas.ImagePreviewAreas.Keys, affectedAreas.MaskPreviewAreas.Keys,
+            previewUpdater.UpdatePreviews(undoBoundaryPassed, affectedAreas.ImagePreviewAreas.Keys, affectedAreas.MaskPreviewAreas.Keys,
                 affectedAreas.ChangedNodes, affectedAreas.ChangedKeyFrames);
                 affectedAreas.ChangedNodes, affectedAreas.ChangedKeyFrames);
 
 
             // force refresh viewports for better responsiveness
             // force refresh viewports for better responsiveness

+ 13 - 8
src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

@@ -33,13 +33,10 @@ internal class MemberPreviewUpdater
         AnimationKeyFramePreviewRenderer = new AnimationKeyFramePreviewRenderer(internals);
         AnimationKeyFramePreviewRenderer = new AnimationKeyFramePreviewRenderer(internals);
     }
     }
 
 
-    public void UpdatePreviews(bool rerenderPreviews, IEnumerable<Guid> membersToUpdate,
+    public void UpdatePreviews(bool undoBoundaryPassed, IEnumerable<Guid> membersToUpdate,
         IEnumerable<Guid> masksToUpdate, IEnumerable<Guid> nodesToUpdate, IEnumerable<Guid> keyFramesToUpdate)
         IEnumerable<Guid> masksToUpdate, IEnumerable<Guid> nodesToUpdate, IEnumerable<Guid> keyFramesToUpdate)
     {
     {
-        if (!rerenderPreviews)
-            return;
-
-        UpdatePreviewPainters(membersToUpdate, masksToUpdate, nodesToUpdate, keyFramesToUpdate);
+        UpdatePreviewPainters(membersToUpdate, masksToUpdate, nodesToUpdate, keyFramesToUpdate, undoBoundaryPassed);
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -48,17 +45,22 @@ internal class MemberPreviewUpdater
     /// <param name="members">Members that should be rendered</param>
     /// <param name="members">Members that should be rendered</param>
     /// <param name="masksToUpdate">Masks that should be rendered</param>
     /// <param name="masksToUpdate">Masks that should be rendered</param>
     private void UpdatePreviewPainters(IEnumerable<Guid> members, IEnumerable<Guid> masksToUpdate,
     private void UpdatePreviewPainters(IEnumerable<Guid> members, IEnumerable<Guid> masksToUpdate,
-        IEnumerable<Guid> nodesToUpdate, IEnumerable<Guid> keyFramesToUpdate)
+        IEnumerable<Guid> nodesToUpdate, IEnumerable<Guid> keyFramesToUpdate, bool undoBoundaryPassed)
     {
     {
         Guid[] memberGuids = members as Guid[] ?? members.ToArray();
         Guid[] memberGuids = members as Guid[] ?? members.ToArray();
         Guid[] maskGuids = masksToUpdate as Guid[] ?? masksToUpdate.ToArray();
         Guid[] maskGuids = masksToUpdate as Guid[] ?? masksToUpdate.ToArray();
         Guid[] nodesGuids = nodesToUpdate as Guid[] ?? nodesToUpdate.ToArray();
         Guid[] nodesGuids = nodesToUpdate as Guid[] ?? nodesToUpdate.ToArray();
         Guid[] keyFramesGuids = keyFramesToUpdate as Guid[] ?? keyFramesToUpdate.ToArray();
         Guid[] keyFramesGuids = keyFramesToUpdate as Guid[] ?? keyFramesToUpdate.ToArray();
 
 
-        RenderWholeCanvasPreview();
+        if (undoBoundaryPassed)
+        {
+            RenderWholeCanvasPreview();
+        }
+
         RenderLayersPreview(memberGuids);
         RenderLayersPreview(memberGuids);
         RenderMaskPreviews(maskGuids);
         RenderMaskPreviews(maskGuids);
         RenderAnimationPreviews(memberGuids, keyFramesGuids);
         RenderAnimationPreviews(memberGuids, keyFramesGuids);
+
         RenderNodePreviews(nodesGuids);
         RenderNodePreviews(nodesGuids);
     }
     }
 
 
@@ -208,7 +210,10 @@ internal class MemberPreviewUpdater
         var executionQueue =
         var executionQueue =
             internals.Tracker.Document.NodeGraph
             internals.Tracker.Document.NodeGraph
                 .AllNodes; //internals.Tracker.Document.NodeGraph.CalculateExecutionQueue(outputNode);
                 .AllNodes; //internals.Tracker.Document.NodeGraph.CalculateExecutionQueue(outputNode);
-
+        
+        if(nodesGuids.Length == 0)
+            return;
+        
         foreach (var node in executionQueue)
         foreach (var node in executionQueue)
         {
         {
             if (node is null)
             if (node is null)