Browse Source

Disallow rendering previews when graph is in use

flabbet 7 months ago
parent
commit
ad4bf10b8e

+ 17 - 2
src/PixiEditor.ChangeableDocument/Rendering/DocumentRenderer.cs

@@ -1,4 +1,5 @@
-using PixiEditor.ChangeableDocument.Changeables.Animations;
+using System.Collections.Concurrent;
+using PixiEditor.ChangeableDocument.Changeables.Animations;
 using PixiEditor.ChangeableDocument.Changeables.Graph;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
@@ -19,7 +20,7 @@ public class DocumentRenderer : IPreviewRenderable
     };
 
     private Texture renderTexture;
-
+    
     public DocumentRenderer(IReadOnlyDocument document)
     {
         Document = document;
@@ -83,6 +84,20 @@ public class DocumentRenderer : IPreviewRenderable
         node.RenderForOutput(context, renderOn, null);
         IsBusy = false;
     }
+    
+    public void RenderNodePreview(IPreviewRenderable previewRenderable, DrawingSurface renderOn, RenderContext context, string elementToRenderName)
+    {
+        if (IsBusy)
+        {
+            return;
+        }
+        
+        IsBusy = true;
+        
+        previewRenderable.RenderPreview(renderOn, context, elementToRenderName);
+        
+        IsBusy = false;
+    }
 
     public static IReadOnlyNodeGraph ConstructMembersOnlyGraph(IReadOnlyNodeGraph fullGraph)
     {

+ 6 - 5
src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

@@ -70,7 +70,7 @@ internal class MemberPreviewUpdater
         var previewSize = StructureHelpers.CalculatePreviewSize(internals.Tracker.Document.Size);
         float scaling = (float)previewSize.X / doc.SizeBindable.X;
 
-        doc.PreviewPainter = new PreviewPainter(doc.Renderer, doc.AnimationHandler.ActiveFrameTime,
+        doc.PreviewPainter = new PreviewPainter(doc.Renderer, doc.Renderer, doc.AnimationHandler.ActiveFrameTime,
             doc.SizeBindable, internals.Tracker.Document.ProcessingColorSpace);
         doc.PreviewPainter.Repaint();
     }
@@ -91,7 +91,7 @@ internal class MemberPreviewUpdater
                         continue;
 
                     structureMemberHandler.PreviewPainter =
-                        new PreviewPainter(previewRenderable,
+                        new PreviewPainter(doc.Renderer, previewRenderable,
                             doc.AnimationHandler.ActiveFrameTime, doc.SizeBindable,
                             internals.Tracker.Document.ProcessingColorSpace);
                     structureMemberHandler.PreviewPainter.Repaint();
@@ -145,7 +145,7 @@ internal class MemberPreviewUpdater
         if (internals.Tracker.Document.AnimationData.TryFindKeyFrame(cel.Id, out KeyFrame _))
         {
             KeyFrameTime frameTime = doc.AnimationHandler.ActiveFrameTime;
-            cel.PreviewPainter = new PreviewPainter(AnimationKeyFramePreviewRenderer, frameTime, doc.SizeBindable,
+            cel.PreviewPainter = new PreviewPainter(doc.Renderer, AnimationKeyFramePreviewRenderer, frameTime, doc.SizeBindable,
                 internals.Tracker.Document.ProcessingColorSpace, cel.Id.ToString());
             cel.PreviewPainter.Repaint();
         }
@@ -161,7 +161,7 @@ internal class MemberPreviewUpdater
             VecI documentSize = doc.SizeBindable;
 
             groupHandler.PreviewPainter =
-                new PreviewPainter(AnimationKeyFramePreviewRenderer, frameTime, documentSize, processingColorSpace,
+                new PreviewPainter(doc.Renderer, AnimationKeyFramePreviewRenderer, frameTime, documentSize, processingColorSpace,
                     groupHandler.Id.ToString());
             groupHandler.PreviewPainter.Repaint();
         }
@@ -181,6 +181,7 @@ internal class MemberPreviewUpdater
                     continue;
 
                 structureMemberHandler.MaskPreviewPainter = new PreviewPainter(
+                    doc.Renderer,
                     previewRenderable,
                     doc.AnimationHandler.ActiveFrameTime,
                     doc.SizeBindable,
@@ -221,7 +222,7 @@ internal class MemberPreviewUpdater
             {
                 if (nodeVm.ResultPainter == null)
                 {
-                    nodeVm.ResultPainter = new PreviewPainter(renderable, doc.AnimationHandler.ActiveFrameTime,
+                    nodeVm.ResultPainter = new PreviewPainter(doc.Renderer, renderable, doc.AnimationHandler.ActiveFrameTime,
                         doc.SizeBindable, internals.Tracker.Document.ProcessingColorSpace);
                     nodeVm.ResultPainter.Repaint();
                 }

+ 4 - 2
src/PixiEditor/Models/Rendering/PreviewPainter.cs

@@ -19,16 +19,18 @@ public class PreviewPainter
     public event Action RequestRepaint;
     public KeyFrameTime FrameTime { get; set; }
     public VecI DocumentSize { get; set; }
+    public DocumentRenderer Renderer { get; set; }
     
     private Texture renderTexture;
     
-    public PreviewPainter(IPreviewRenderable previewRenderable, KeyFrameTime frameTime, VecI documentSize, ColorSpace processingColorSpace, string elementToRenderName = "")
+    public PreviewPainter(DocumentRenderer renderer, IPreviewRenderable previewRenderable, KeyFrameTime frameTime, VecI documentSize, ColorSpace processingColorSpace, string elementToRenderName = "")
     {
         PreviewRenderable = previewRenderable;
         ElementToRenderName = elementToRenderName;
         ProcessingColorSpace = processingColorSpace;
         FrameTime = frameTime;
         DocumentSize = documentSize;
+        Renderer = renderer;
     }
 
     public void Paint(DrawingSurface renderOn, VecI boundsSize, Matrix3X3 matrix) 
@@ -51,7 +53,7 @@ public class PreviewPainter
         
         RenderContext context = new(renderTexture.DrawingSurface, FrameTime, ChunkResolution.Full, DocumentSize, ProcessingColorSpace);
 
-        PreviewRenderable.RenderPreview(renderTexture.DrawingSurface, context, ElementToRenderName);
+        Renderer.RenderNodePreview(PreviewRenderable, renderTexture.DrawingSurface, context, ElementToRenderName);
         renderTexture.DrawingSurface.Canvas.Restore();
         
         renderOn.Canvas.DrawSurface(renderTexture.DrawingSurface, 0, 0);