[Bf-blender-cvs] [6e78ef3ce5f] functions: initial support for reroutes in the ui

Jacques Lucke noreply at git.blender.org
Tue Apr 2 12:36:01 CEST 2019


Commit: 6e78ef3ce5fb08cb6cda35e5f919c4cea7319265
Author: Jacques Lucke
Date:   Tue Apr 2 11:29:31 2019 +0200
Branches: functions
https://developer.blender.org/rB6e78ef3ce5fb08cb6cda35e5f919c4cea7319265

initial support for reroutes in the ui

===================================================================

M	release/scripts/startup/function_nodes/declaration/pack_list.py
M	release/scripts/startup/function_nodes/declaration/variadic.py
M	release/scripts/startup/function_nodes/update.py

===================================================================

diff --git a/release/scripts/startup/function_nodes/declaration/pack_list.py b/release/scripts/startup/function_nodes/declaration/pack_list.py
index ffa6e76bfeb..a3cd8855812 100644
--- a/release/scripts/startup/function_nodes/declaration/pack_list.py
+++ b/release/scripts/startup/function_nodes/declaration/pack_list.py
@@ -70,12 +70,15 @@ class PackListDecl(SocketDeclBase):
             props.prop_name = self.prop_name
             props.index = index
 
-    def operator_socket_call(self, own_socket, other_socket):
-        if not isinstance(other_socket, DataSocket):
+    def operator_socket_call(self, own_socket, linked_socket, connected_sockets):
+        if len(connected_sockets) != 1:
+            return
+        connected_socket = next(iter(connected_sockets))
+        if not isinstance(connected_socket, DataSocket):
             return
 
         is_output = own_socket.is_output
-        data_type = other_socket.data_type
+        data_type = connected_socket.data_type
 
         if type_infos.is_base(data_type):
             if data_type != self.base_type:
@@ -97,7 +100,7 @@ class PackListDecl(SocketDeclBase):
 
         identifier = item.identifier_prefix + self.identifier_suffix
         new_socket = self.node.find_socket(identifier, is_output)
-        self.node.tree.new_link(other_socket, new_socket)
+        self.node.tree.new_link(linked_socket, new_socket)
 
     def amount(self):
         return len(self.get_collection()) + 1
diff --git a/release/scripts/startup/function_nodes/declaration/variadic.py b/release/scripts/startup/function_nodes/declaration/variadic.py
index 60ba6d292ff..3777be7ab9a 100644
--- a/release/scripts/startup/function_nodes/declaration/variadic.py
+++ b/release/scripts/startup/function_nodes/declaration/variadic.py
@@ -57,18 +57,22 @@ class AnyVariadicDecl(SocketDeclBase):
     def get_collection(self):
         return getattr(self.node, self.prop_name)
 
-    def operator_socket_call(self, own_socket, other_socket):
-        if not isinstance(other_socket, DataSocket):
+    def operator_socket_call(self, own_socket, linked_socket, connected_sockets):
+        connected_types = {s.data_type for s in connected_sockets if isinstance(s, DataSocket)}
+        if len(connected_types) != 1:
             return
 
+        connected_socket = next(iter(connected_sockets))
+        connected_type = next(iter(connected_types))
+
         is_output = own_socket.is_output
 
-        item = self.add_item(other_socket.data_type, other_socket.name)
+        item = self.add_item(connected_type, connected_socket.name)
         self.node.rebuild_and_try_keep_state()
 
         identifier = item.identifier_prefix + self.identifier_suffix
         new_socket = self.node.find_socket(identifier, is_output)
-        self.node.tree.new_link(other_socket, new_socket)
+        self.node.tree.new_link(linked_socket, new_socket)
 
     def add_item(self, data_type, display_name):
         collection = self.get_collection()
diff --git a/release/scripts/startup/function_nodes/update.py b/release/scripts/startup/function_nodes/update.py
index 7e6f06135af..4c25ebe6fe6 100644
--- a/release/scripts/startup/function_nodes/update.py
+++ b/release/scripts/startup/function_nodes/update.py
@@ -2,7 +2,7 @@ import bpy
 from collections import defaultdict
 from contextlib import contextmanager
 
-from . base import DataSocket
+from . base import DataSocket, BaseNode
 from . types import type_infos
 from . sockets import OperatorSocket
 from . function_tree import FunctionTree
@@ -44,31 +44,33 @@ def update_function_trees():
                 update_function_tree(tree)
 
 def update_function_tree(tree):
-    run_socket_operators(tree)
-    inference_decisions(tree)
-    remove_invalid_links(tree)
+    run_socket_operators(TreeData(tree))
+    inference_decisions(TreeData(tree))
+    remove_invalid_links(TreeData(tree))
 
 
 # Socket Operators
 #####################################
 
-def run_socket_operators(tree):
+def run_socket_operators(tree_data):
     while True:
-        for link in tree.links:
+        for link in tree_data.iter_blinks():
             if isinstance(link.to_socket, OperatorSocket):
-                node = link.to_node
+                own_node = link.to_node
                 own_socket = link.to_socket
-                other_socket = link.from_socket
+                linked_socket = link.from_socket
+                connected_sockets = list(tree_data.iter_connected_origins(own_socket))
             elif isinstance(link.from_socket, OperatorSocket):
-                node = link.from_node
+                own_node = link.from_node
                 own_socket = link.from_socket
-                other_socket = link.to_socket
+                linked_socket = link.to_socket
+                connected_sockets = list(tree_data.iter_connected_targets(own_socket))
             else:
                 continue
 
-            tree.links.remove(link)
-            decl = node.decl_map.get_decl_by_socket(own_socket)
-            decl.operator_socket_call(own_socket, other_socket)
+            tree_data.tree.links.remove(link)
+            decl = own_socket.get_decl(own_node)
+            decl.operator_socket_call(own_socket, linked_socket, connected_sockets)
         else:
             return
 
@@ -81,13 +83,11 @@ from collections import namedtuple
 DecisionID = namedtuple("DecisionID", ("node", "group", "prop_name"))
 LinkSocket = namedtuple("LinkSocket", ("node", "socket"))
 
-def inference_decisions(tree):
-    linked_sockets = get_linked_sockets_dict(tree)
-
+def inference_decisions(tree_data):
     decisions = dict()
-    list_decisions = make_list_decisions(tree, linked_sockets)
+    list_decisions = make_list_decisions(tree_data)
     decisions.update(list_decisions)
-    decisions.update(make_pack_list_decisions(tree, linked_sockets, list_decisions))
+    decisions.update(make_pack_list_decisions(tree_data, list_decisions))
 
     nodes_to_rebuild = set()
 
@@ -102,24 +102,15 @@ def rebuild_nodes(nodes):
     for node in nodes:
         node.rebuild_and_try_keep_state()
 
-def get_linked_sockets_dict(tree):
-    linked_sockets = defaultdict(set)
-    for link in tree.links:
-        origin = LinkSocket(link.from_node, link.from_socket)
-        target = LinkSocket(link.to_node, link.to_socket)
-        linked_sockets[link.from_socket].add(target)
-        linked_sockets[link.to_socket].add(origin)
-    return linked_sockets
-
-def make_list_decisions(tree, linked_sockets):
-    decision_users = get_list_decision_ids_with_users(tree)
-    decision_links = get_list_decision_links(tree)
+def make_list_decisions(tree_data):
+    decision_users = get_list_decision_ids_with_users(tree_data)
+    decision_links = get_list_decision_links(tree_data)
 
     decisions = dict()
 
     for component in iter_connected_components(decision_users.keys(), decision_links):
         possible_types = set(iter_possible_list_component_types(
-            component, decision_users, linked_sockets))
+            component, decision_users, tree_data))
 
         if len(possible_types) == 1:
             base_type = next(iter(possible_types))
@@ -128,10 +119,10 @@ def make_list_decisions(tree, linked_sockets):
 
     return decisions
 
-def get_list_decision_ids_with_users(tree):
+def get_list_decision_ids_with_users(tree_data):
     decision_users = defaultdict(lambda: {"BASE": [], "LIST": []})
 
-    for node in tree.nodes:
+    for node in tree_data.iter_nodes():
         for decl, sockets in node.decl_map.iter_decl_with_sockets():
             if isinstance(decl, ListSocketDecl):
                 decision_id = DecisionID(node, node, decl.prop_name)
@@ -139,25 +130,27 @@ def get_list_decision_ids_with_users(tree):
 
     return decision_users
 
-def get_list_decision_links(tree):
+def get_list_decision_links(tree_data):
     linked_decisions = defaultdict(set)
 
-    for link in tree.links:
-        from_decl = link.from_socket.get_decl(link.from_node)
-        to_decl = link.to_socket.get_decl(link.to_node)
+    for from_socket, to_socket in tree_data.iter_connections():
+        from_node = tree_data.get_node(from_socket)
+        to_node = tree_data.get_node(to_socket)
+        from_decl = from_socket.get_decl(from_node)
+        to_decl = to_socket.get_decl(to_node)
         if isinstance(from_decl, ListSocketDecl) and isinstance(to_decl, ListSocketDecl):
             if from_decl.list_or_base == to_decl.list_or_base:
-                from_decision_id = DecisionID(link.from_node, link.from_node, from_decl.prop_name)
-                to_decision_id = DecisionID(link.to_node, link.to_node, to_decl.prop_name)
+                from_decision_id = DecisionID(from_node, from_node, from_decl.prop_name)
+                to_decision_id = DecisionID(to_node, to_node, to_decl.prop_name)
                 linked_decisions[from_decision_id].add(to_decision_id)
                 linked_decisions[to_decision_id].add(from_decision_id)
 
     return linked_decisions
 
-def iter_possible_list_component_types(component, decision_users, linked_sockets):
+def iter_possible_list_component_types(component, decision_users, tree_data):
     for decision_id in component:
         for socket in decision_users[decision_id]["LIST"]:
-            for other_node, other_socket in linked_sockets[socket]:
+            for other_node, other_socket in tree_data.iter_connected_sockets_with_nodes(socket):
                 other_decl = other_socket.get_decl(other_node)
                 if data_sockets_are_static(other_decl):
                     data_type = other_socket.data_type
@@ -166,7 +159,7 @@ def iter_possible_list_component_types(component, decision_users, linked_sockets
                 elif isinstance(other_decl, PackListDecl):
                     yield other_decl.base_type
         for socket in decision_users[decision_id]["BASE"]:
-            for other_node, other_socket in linked_sockets[socket]:
+            for other_node, other_socket in tree_data.iter_connected_sockets_with_nodes(socket):
                 other_decl = other_socket.get_decl(other_node)
                 if data_sockets_are_static(other_decl):
                     data_type = other_socket.data_type
@@ -175,18 +168

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list