Loop Nodes #4
40
nodes.py
40
nodes.py
@ -93,7 +93,7 @@ class RigNodesNodeTree(bpy.types.NodeTree):
|
|||||||
depsgraph: bpy.types.Depsgraph,
|
depsgraph: bpy.types.Depsgraph,
|
||||||
to_visit: deque["AbstractRigNodesNode"],
|
to_visit: deque["AbstractRigNodesNode"],
|
||||||
depth: int = 1,
|
depth: int = 1,
|
||||||
) -> None:
|
) -> deque['AbstractRigNodesNode']:
|
||||||
"""Run one iteration of a loop.
|
"""Run one iteration of a loop.
|
||||||
|
|
||||||
:return: Node(s) to visit next."""
|
:return: Node(s) to visit next."""
|
||||||
cgtinker marked this conversation as resolved
|
|||||||
@ -103,28 +103,42 @@ class RigNodesNodeTree(bpy.types.NodeTree):
|
|||||||
|
|
||||||
input_node = node
|
input_node = node
|
||||||
output_node = node._get_connection_node()
|
output_node = node._get_connection_node()
|
||||||
|
visited: Set["AbstractRigNodesNode"] = set()
|
||||||
|
|
||||||
while to_visit:
|
while to_visit:
|
||||||
node = to_visit.popleft()
|
node = to_visit.popleft()
|
||||||
|
|
||||||
nested_loop: Optional[deque[AbstractRigNodesNode]] = None
|
|
||||||
if isinstance(node, LoopInputNode) and node != input_node:
|
if isinstance(node, LoopInputNode) and node != input_node:
|
||||||
# Run nested loop.
|
# Find the nested loop.
|
||||||
nested_output_node = node._get_connection_node()
|
nested_output_node = node._get_connection_node()
|
||||||
nested_loop = deque(nested_output_node._get_nodes_between(node))
|
nested_loop = deque(nested_output_node._get_nodes_between(node))
|
||||||
nested_loop.append(nested_output_node)
|
nested_loop.append(nested_output_node)
|
||||||
self._run_loop(node, depsgraph, nested_loop, depth+1)
|
|
||||||
# continue
|
|
||||||
|
|
||||||
print(f"{indent}\t-{node}")
|
# Don't revisit nested nodes in the parent loop.
|
||||||
|
for nested_node in nested_loop:
|
||||||
|
visited.add(nested_node)
|
||||||
|
|
||||||
|
# Run the nested loop using the current inputs.
|
||||||
|
for _ in range(node.num_socks):
|
||||||
|
self._run_loop(node, depsgraph, nested_loop.copy(), depth+1)
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
if node in visited:
|
||||||
|
# Nested nodes are added to visited nodes as they get executed in advance.
|
||||||
|
# A Node can alsp be visited when a node has inputs from two different
|
||||||
|
# nodes; both of those will list this node as 'successor'.
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(f"{indent}\tRunning: {node}, remaining runs: {node.iterations}")
|
||||||
|
visited.add(node)
|
||||||
node.run(depsgraph)
|
node.run(depsgraph)
|
||||||
# if node.iterations > 0:
|
|
||||||
# # Add output node for future iterations.
|
|
||||||
# to_visit.append(node)
|
|
||||||
|
|
||||||
if node == output_node:
|
if node == output_node:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
return to_visit
|
||||||
|
|
||||||
|
|
||||||
def _run_from_node(
|
def _run_from_node(
|
||||||
self, depsgraph: bpy.types.Depsgraph, start_node: "AbstractRigNodesNode"
|
self, depsgraph: bpy.types.Depsgraph, start_node: "AbstractRigNodesNode"
|
||||||
@ -136,7 +150,7 @@ class RigNodesNodeTree(bpy.types.NodeTree):
|
|||||||
print(f"\033[38;5;214mRunning tree {self.name}\033[0m")
|
print(f"\033[38;5;214mRunning tree {self.name}\033[0m")
|
||||||
while to_visit:
|
while to_visit:
|
||||||
node: AbstractRigNodesNode = to_visit[0]
|
node: AbstractRigNodesNode = to_visit[0]
|
||||||
print(f"\t- {node}")
|
print(f"\t- Visiting {node}")
|
||||||
|
|
||||||
nodes_before = list(node.exec_order_prerequisites())
|
nodes_before = list(node.exec_order_prerequisites())
|
||||||
if nodes_before:
|
if nodes_before:
|
||||||
@ -146,7 +160,10 @@ class RigNodesNodeTree(bpy.types.NodeTree):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if isinstance(node, LoopInputNode):
|
if isinstance(node, LoopInputNode):
|
||||||
# Run one iteration if the found loop (recursive if nested).
|
# Run all iterations if the found loop (recursive if nested).
|
||||||
|
# nested_output_node = node._get_connection_node()
|
||||||
|
# nested_loop = deque(nested_output_node._get_nodes_between(node))
|
||||||
|
# nested_loop.append(nested_output_node)
|
||||||
self._run_loop(node, depsgraph, to_visit)
|
self._run_loop(node, depsgraph, to_visit)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -161,6 +178,7 @@ class RigNodesNodeTree(bpy.types.NodeTree):
|
|||||||
continue
|
continue
|
||||||
visited.add(node)
|
visited.add(node)
|
||||||
|
|
||||||
|
print(f"\tRunning: {node}")
|
||||||
node.run(depsgraph)
|
node.run(depsgraph)
|
||||||
|
|
||||||
# Queue up the next nodes.
|
# Queue up the next nodes.
|
||||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user
Formatting: when writing multi-line docstrings, the closing
"""
should be on a line of its own (see PEP 257)Sorry, still stumbling.