Browse Source

Fixed chunks not rendering with shader node

flabbet 1 year ago
parent
commit
088c1e2483

+ 6 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/ICustomShaderNode.cs

@@ -0,0 +1,6 @@
+namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+
+public interface ICustomShaderNode
+{
+    
+}

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

@@ -16,7 +16,7 @@ namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 
 [NodeInfo("ModifyImageRight", "MODIFY_IMAGE_RIGHT_NODE", PickerName = "")]
 [PairNode(typeof(ModifyImageLeftNode), "ModifyImageZone")]
-public class ModifyImageRightNode : Node, IPairNodeEnd
+public class ModifyImageRightNode : Node, IPairNodeEnd, ICustomShaderNode
 {
     public Node StartNode { get; set; }
 

+ 20 - 5
src/PixiEditor/Models/Rendering/AffectedAreasGatherer.cs

@@ -5,6 +5,7 @@ using PixiEditor.ChangeableDocument;
 using PixiEditor.ChangeableDocument.Actions.Generated;
 using PixiEditor.ChangeableDocument.Changeables.Animations;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.ChangeableDocument.Changeables.Interfaces;
 using PixiEditor.ChangeableDocument.ChangeInfos;
 using PixiEditor.ChangeableDocument.ChangeInfos.Animation;
@@ -26,7 +27,7 @@ internal class AffectedAreasGatherer
     public AffectedArea MainImageArea { get; private set; } = new();
     public Dictionary<Guid, AffectedArea> ImagePreviewAreas { get; private set; } = new();
     public Dictionary<Guid, AffectedArea> MaskPreviewAreas { get; private set; } = new();
-    
+
     private KeyFrameTime ActiveFrame { get; set; }
 
     public AffectedAreasGatherer(KeyFrameTime activeFrame, DocumentChangeTracker tracker,
@@ -35,6 +36,16 @@ internal class AffectedAreasGatherer
         this.tracker = tracker;
         ActiveFrame = activeFrame;
         ProcessChanges(changes);
+        
+        var outputNode = tracker.Document.NodeGraph.OutputNode;
+        if (outputNode is null)
+            return;
+        
+        if (tracker.Document.NodeGraph.CalculateExecutionQueue(tracker.Document.NodeGraph.OutputNode)
+            .Any(x => x is ICustomShaderNode))
+        {
+            AddWholeCanvasToMainImage(); // Detecting what pixels shader might affect is very hard, so we just redraw everything
+        }
     }
 
     private void ProcessChanges(IReadOnlyList<IChangeInfo> changes)
@@ -63,7 +74,8 @@ internal class AffectedAreasGatherer
                     break;
                 case DeleteStructureMember_ChangeInfo info:
                     AddWholeCanvasToMainImage();
-                    AddWholeCanvasToImagePreviews(info.Id); // TODO: ParentGuid was here, make sure previews are updated correctly
+                    AddWholeCanvasToImagePreviews(info
+                        .Id); // TODO: ParentGuid was here, make sure previews are updated correctly
                     break;
                 case MoveStructureMember_ChangeInfo info:
                     AddAllToMainImage(info.Id, ActiveFrame);
@@ -112,6 +124,7 @@ internal class AffectedAreasGatherer
                         AddWholeCanvasToMainImage();
                         AddWholeCanvasToImagePreviews(info.TargetLayerGuid);
                     }
+
                     break;
                 case SetActiveFrame_PassthroughAction:
                     AddWholeCanvasToMainImage();
@@ -158,7 +171,7 @@ internal class AffectedAreasGatherer
                 AddWholeCanvasToImagePreviews(memberGuid, ignoreSelf);
                 return;
             }
-            
+
             var chunks = result.FindAllChunks();
             AddToImagePreviews(memberGuid, new AffectedArea(chunks), ignoreSelf);
         }
@@ -181,7 +194,7 @@ internal class AffectedAreasGatherer
                 AddWholeCanvasToMainImage();
                 return;
             }
-            
+
             var chunks = result.FindAllChunks();
             if (layer.Mask.Value is not null && layer.MaskIsVisible.Value && useMask)
                 chunks.IntersectWith(layer.Mask.Value.FindAllChunks());
@@ -202,6 +215,7 @@ internal class AffectedAreasGatherer
             var chunks = member.Mask.Value.FindAllChunks();
             AddToMaskPreview(memberGuid, new AffectedArea(chunks));
         }
+
         if (member is IReadOnlyFolderNode folder)
         {
             /*foreach (var child in folder.Children)
@@ -289,7 +303,7 @@ internal class AffectedAreasGatherer
 
     private void AddWholeCanvasToEveryMaskPreview()
     {
-        tracker.Document.ForEveryReadonlyMember((member) => 
+        tracker.Document.ForEveryReadonlyMember((member) =>
         {
             if (member.Mask.Value is not null)
                 AddWholeCanvasToMaskPreview(member.Id);
@@ -308,6 +322,7 @@ internal class AffectedAreasGatherer
                 area.Chunks.Add(new(i, j));
             }
         }
+
         area.GlobalArea = new RectI(VecI.Zero, tracker.Document.Size);
         return area;
     }