Selaa lähdekoodia

Fixed nested iteration count

Krzysztof Krysiński 1 kuukausi sitten
vanhempi
commit
2f546ae3e9

+ 27 - 11
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Utility/RepeatNodeStart.cs

@@ -27,7 +27,7 @@ public class RepeatNodeStart : Node, IPairNode
     {
         Iterations = CreateInput<int>("Iterations", "ITERATIONS", 1);
         Input = CreateInput<object>("Input", "INPUT", null);
-        CurrentIteration = CreateOutput<int>("CurrentIteration", "CURRENT_ITERATION", 0);
+        CurrentIteration = CreateOutput<int>("CurrentIteration", "CURRENT_ITERATION", 1);
         Output = CreateOutput<object>("Output", "OUTPUT", null);
     }
 
@@ -105,7 +105,7 @@ public class RepeatNodeStart : Node, IPairNode
         for (int i = 0; i < iterations - 1; i++)
         {
             var mapping = new Dictionary<Guid, Node>();
-            CloneNodes(lastQueue, mapping, virtualSessionId, context);
+            CloneNodes(lastQueue, mapping, virtualSessionId, context, i + 2);
             connectPreviousTo =
                 ReplaceConnections(connectToNextStart, connectPreviousTo, mapping, virtualSessionId, context);
             connectToNextStart = mapping[connectToNextStart.Node.Id].OutputProperties
@@ -120,8 +120,9 @@ public class RepeatNodeStart : Node, IPairNode
 
         connectToNextStart.VirtualConnectTo(endNode.Input, virtualSessionId, context);
 
-        return GraphUtils.CalculateExecutionQueue(endNode, true, true,
+        var finalQueue = GraphUtils.CalculateExecutionQueue(endNode, true, true,
             property => property.Connection?.Node != this);
+        return finalQueue;
     }
 
     private List<IInputProperty> SetIterationConstants(Dictionary<Guid, Node> mapping,
@@ -137,6 +138,7 @@ public class RepeatNodeStart : Node, IPairNode
                     mappedNode.InputProperties.FirstOrDefault(i =>
                         i.InternalPropertyName == input.InternalPropertyName);
 
+                if (mappedInput == null) continue;
                 mappedInput.SetVirtualNonOverridenValue(iteration, virtualConnectionId, context);
                 iterationInputs.Add(mappedInput);
             }
@@ -172,7 +174,8 @@ public class RepeatNodeStart : Node, IPairNode
         return connectPreviousToMapped;
     }
 
-    private void CloneNodes(Queue<IReadOnlyNode> originalQueue, Dictionary<Guid, Node> mapping, Guid virtualSession, RenderContext context)
+    private void CloneNodes(Queue<IReadOnlyNode> originalQueue, Dictionary<Guid, Node> mapping, Guid virtualSession,
+        RenderContext context, int i)
     {
         foreach (var node in originalQueue)
         {
@@ -183,10 +186,11 @@ public class RepeatNodeStart : Node, IPairNode
             mapping[node.Id] = clonedNode;
         }
 
-        ConnectRelatedNodes(originalQueue, mapping, virtualSession, context);
+        ConnectRelatedNodes(originalQueue, mapping, virtualSession, context, i);
     }
 
-    private void ConnectRelatedNodes(Queue<IReadOnlyNode> originalQueue, Dictionary<Guid, Node> mapping, Guid virtualSession, RenderContext context)
+    private void ConnectRelatedNodes(Queue<IReadOnlyNode> originalQueue, Dictionary<Guid, Node> mapping,
+        Guid virtualSession, RenderContext context, int i1)
     {
         foreach (var node in originalQueue)
         {
@@ -206,12 +210,24 @@ public class RepeatNodeStart : Node, IPairNode
                             i.InternalPropertyName == input.InternalPropertyName);
                         output.ConnectTo(inputProp); // No need for virtual connection as it is a cloned node anyway
                     }
-                } // TODO: Handle external connections
-                /*else if(input.Connection != null && input.Connection.Node != this) // External property connection, keep it
+                }
+                // Leaving this in case external connections are not working as intended. It might help, but no guarantees.
+                /*else if (input.Connection != null)
                 {
-                    var inputProp = clonedNode.InputProperties.FirstOrDefault(i =>
-                        i.InternalPropertyName == input.InternalPropertyName);
-                    input.Connection.VirtualConnectTo(inputProp, virtualSession, context);
+                    var clonedInput =
+                        clonedNode.InputProperties.FirstOrDefault(i =>
+                            i.InternalPropertyName == input.InternalPropertyName);
+                    if (clonedInput is { Connection: null } && input.Connection != Output &&
+                        !mapping.TryGetValue(input.Connection.Node.Id, out _))
+                    {
+                        if (input.Connection == CurrentIteration)
+                        {
+                            clonedInput.SetVirtualNonOverridenValue(i1, virtualSession, context);
+                            continue;
+                        }
+
+                        input.Connection.VirtualConnectTo(clonedInput, virtualSession, context);
+                    }
                 }*/
             }
         }