Browse Source

Improved node previews

flabbet 1 year ago
parent
commit
9d96070fa0

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Interfaces/IReadOnlyNodeGraph.cs

@@ -11,4 +11,5 @@ public interface IReadOnlyNodeGraph
     public void RemoveNode(IReadOnlyNode node);
     public void RemoveNode(IReadOnlyNode node);
     public bool TryTraverse(Action<IReadOnlyNode> action);
     public bool TryTraverse(Action<IReadOnlyNode> action);
     public Texture? Execute(RenderingContext context);
     public Texture? Execute(RenderingContext context);
+    Queue<IReadOnlyNode> CalculateExecutionQueue(IReadOnlyNode endNode);
 }
 }

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

@@ -36,7 +36,7 @@ public class NodeGraph : IReadOnlyNodeGraph, IDisposable
         _nodes.Remove(node);
         _nodes.Remove(node);
     }
     }
 
 
-    private Queue<IReadOnlyNode> CalculateExecutionQueue(OutputNode outputNode)
+    public Queue<IReadOnlyNode> CalculateExecutionQueue(IReadOnlyNode outputNode)
     {
     {
         var finalQueue = new HashSet<IReadOnlyNode>();
         var finalQueue = new HashSet<IReadOnlyNode>();
         var queueNodes = new Queue<IReadOnlyNode>();
         var queueNodes = new Queue<IReadOnlyNode>();

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

@@ -124,7 +124,7 @@ public class ModifyImageRightNode : Node, IPairNodeEnd
         }
         }
         
         
         Output.Value = surface;
         Output.Value = surface;
-        return Output.Value;
+        return surface;
     }
     }
 
 
     private unsafe void ModifyImageInParallel(RenderingContext renderingContext, Pixmap targetPixmap, int width,
     private unsafe void ModifyImageInParallel(RenderingContext renderingContext, Pixmap targetPixmap, int width,

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

@@ -72,12 +72,17 @@ public abstract class Node : IReadOnlyNode, IDisposable
     public Texture? Execute(RenderingContext context)
     public Texture? Execute(RenderingContext context)
     {
     {
         var result = ExecuteInternal(context);
         var result = ExecuteInternal(context);
+        
+        if (result is null)
+        {
+            return null;
+        }
 
 
         var copy = new Texture(result);
         var copy = new Texture(result);
         return copy;
         return copy;
     }
     }
 
 
-    internal Texture ExecuteInternal(RenderingContext context)
+    internal Texture? ExecuteInternal(RenderingContext context)
     {
     {
         if(_isDisposed) throw new ObjectDisposedException("Node was disposed before execution.");
         if(_isDisposed) throw new ObjectDisposedException("Node was disposed before execution.");
         
         

+ 31 - 14
src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

@@ -581,7 +581,8 @@ internal class MemberPreviewUpdater
                 }
                 }
                 else
                 else
                 {
                 {
-                    rendered = doc.Renderer.RenderLayersChunk(chunk, ChunkResolution.Full, doc.AnimationHandler.ActiveFrameTime, layers,
+                    rendered = doc.Renderer.RenderLayersChunk(chunk, ChunkResolution.Full,
+                        doc.AnimationHandler.ActiveFrameTime, layers,
                         null);
                         null);
                 }
                 }
 
 
@@ -593,7 +594,8 @@ internal class MemberPreviewUpdater
                 }
                 }
                 else
                 else
                 {
                 {
-                    memberVM.PreviewSurface.DrawingSurface.Canvas.DrawRect(pos.X, pos.Y, ChunkResolution.Full.PixelSize(),
+                    memberVM.PreviewSurface.DrawingSurface.Canvas.DrawRect(pos.X, pos.Y,
+                        ChunkResolution.Full.PixelSize(),
                         ChunkResolution.Full.PixelSize(), ClearPaint);
                         ChunkResolution.Full.PixelSize(), ClearPaint);
                 }
                 }
             }
             }
@@ -729,20 +731,34 @@ internal class MemberPreviewUpdater
 
 
     private void RenderNodePreviews(List<IRenderInfo> infos)
     private void RenderNodePreviews(List<IRenderInfo> infos)
     {
     {
-        foreach (var node in internals.Tracker.Document.NodeGraph.AllNodes)
+        using RenderingContext previewContext = new(doc.AnimationHandler.ActiveFrameTime, VecI.Zero, ChunkResolution.Full, doc.SizeBindable);
+
+        var outputNode = internals.Tracker.Document.NodeGraph.OutputNode;
+        
+        if (outputNode is null)
+            return;
+        
+        var executionQueue = internals.Tracker.Document.NodeGraph.CalculateExecutionQueue(outputNode);
+        
+        foreach (var node in executionQueue) 
         {
         {
             if (node is null)
             if (node is null)
-                return;
+                continue;
 
 
-            if (node.CachedResult == null)
+            var nodeVm = doc.StructureHelper.FindNode<INodeHandler>(node.Id);
+
+            if (nodeVm == null)
             {
             {
-                return;
+                continue;
             }
             }
 
 
-            var nodeVm = doc.StructureHelper.FindNode<INodeHandler>(node.Id);
-            if (nodeVm == null)
+            Texture evaluated = node.Execute(previewContext);
+
+            if (evaluated == null)
             {
             {
-                return;
+                nodeVm.ResultPreview?.Dispose();
+                nodeVm.ResultPreview = null;
+                continue;
             }
             }
 
 
             if (nodeVm.ResultPreview == null)
             if (nodeVm.ResultPreview == null)
@@ -750,19 +766,20 @@ internal class MemberPreviewUpdater
                 nodeVm.ResultPreview =
                 nodeVm.ResultPreview =
                     new Texture(StructureHelpers.CalculatePreviewSize(internals.Tracker.Document.Size, 150));
                     new Texture(StructureHelpers.CalculatePreviewSize(internals.Tracker.Document.Size, 150));
             }
             }
-
-            float scalingX = (float)nodeVm.ResultPreview.Size.X / node.CachedResult.Size.X;
-            float scalingY = (float)nodeVm.ResultPreview.Size.Y / node.CachedResult.Size.Y;
+            
+            float scalingX = (float)nodeVm.ResultPreview.Size.X / evaluated.Size.X;
+            float scalingY = (float)nodeVm.ResultPreview.Size.Y / evaluated.Size.Y;
 
 
             QueueRender(() =>
             QueueRender(() =>
             {
             {
                 nodeVm.ResultPreview.DrawingSurface.Canvas.Save();
                 nodeVm.ResultPreview.DrawingSurface.Canvas.Save();
                 nodeVm.ResultPreview.DrawingSurface.Canvas.Scale(scalingX, scalingY);
                 nodeVm.ResultPreview.DrawingSurface.Canvas.Scale(scalingX, scalingY);
 
 
-                nodeVm.ResultPreview.DrawingSurface.Canvas.DrawSurface(node.CachedResult.DrawingSurface, 0, 0,
-                    ReplacingPaint);
+                nodeVm.ResultPreview.DrawingSurface.Canvas.DrawSurface(evaluated.DrawingSurface, 0, 0, ReplacingPaint);
 
 
                 nodeVm.ResultPreview.DrawingSurface.Canvas.Restore();
                 nodeVm.ResultPreview.DrawingSurface.Canvas.Restore();
+                
+                evaluated.Dispose();
             });
             });
 
 
             infos.Add(new NodePreviewDirty_RenderInfo(node.Id));
             infos.Add(new NodePreviewDirty_RenderInfo(node.Id));

+ 1 - 0
src/PixiEditor/Styles/Templates/KeyFrame.axaml

@@ -25,6 +25,7 @@
                     <Border IsVisible="{Binding !IsCollapsed, RelativeSource={RelativeSource TemplatedParent}}"
                     <Border IsVisible="{Binding !IsCollapsed, RelativeSource={RelativeSource TemplatedParent}}"
                             CornerRadius="{DynamicResource ControlCornerRadius}" Width="60" Height="60"
                             CornerRadius="{DynamicResource ControlCornerRadius}" Width="60" Height="60"
                             Margin="-30, 0, 0, 0"
                             Margin="-30, 0, 0, 0"
+                            ClipToBounds="True"
                             BorderThickness="1" VerticalAlignment="Center" IsHitTestVisible="True" Name="PreviewBorder"
                             BorderThickness="1" VerticalAlignment="Center" IsHitTestVisible="True" Name="PreviewBorder"
                             HorizontalAlignment="Left" BorderBrush="{DynamicResource ThemeBorderMidBrush}"
                             HorizontalAlignment="Left" BorderBrush="{DynamicResource ThemeBorderMidBrush}"
                             RenderOptions.BitmapInterpolationMode="None">
                             RenderOptions.BitmapInterpolationMode="None">

+ 1 - 0
src/PixiEditor/Styles/Templates/TimelineGroupHeader.axaml

@@ -13,6 +13,7 @@
                                   IsChecked="{Binding Item.IsVisible, RelativeSource={RelativeSource TemplatedParent}}" />
                                   IsChecked="{Binding Item.IsVisible, RelativeSource={RelativeSource TemplatedParent}}" />
                         <Border IsVisible="{Binding ElementName=PART_CollapseButton, Path=!IsChecked}" CornerRadius="{DynamicResource ControlCornerRadius}" Width="60" Height="60"
                         <Border IsVisible="{Binding ElementName=PART_CollapseButton, Path=!IsChecked}" CornerRadius="{DynamicResource ControlCornerRadius}" Width="60" Height="60"
                                 BorderThickness="1" VerticalAlignment="Center" IsHitTestVisible="True"
                                 BorderThickness="1" VerticalAlignment="Center" IsHitTestVisible="True"
+                                ClipToBounds="True"
                                 Name="PreviewBorder" Margin="5 0"
                                 Name="PreviewBorder" Margin="5 0"
                                 HorizontalAlignment="Left" BorderBrush="{DynamicResource ThemeBorderMidBrush}"
                                 HorizontalAlignment="Left" BorderBrush="{DynamicResource ThemeBorderMidBrush}"
                                 RenderOptions.BitmapInterpolationMode="None">
                                 RenderOptions.BitmapInterpolationMode="None">