[Bf-blender-cvs] [7c5cf3fd79d] functions: vectorized output sockets don't need a property

Jacques Lucke noreply at git.blender.org
Sat Apr 6 18:47:14 CEST 2019


Commit: 7c5cf3fd79daed6fc519e827da802d1a249c2a4d
Author: Jacques Lucke
Date:   Sat Apr 6 14:58:29 2019 +0200
Branches: functions
https://developer.blender.org/rB7c5cf3fd79daed6fc519e827da802d1a249c2a4d

vectorized output sockets don't need a property

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

M	release/scripts/startup/function_nodes/declaration/vectorized.py
M	release/scripts/startup/function_nodes/inferencing.py
M	release/scripts/startup/function_nodes/nodes/combine_vector.py
M	release/scripts/startup/function_nodes/nodes/separate_vector.py
M	release/scripts/startup/function_nodes/socket_builder.py

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

diff --git a/release/scripts/startup/function_nodes/declaration/vectorized.py b/release/scripts/startup/function_nodes/declaration/vectorized.py
index 8acd89275fe..5d745ac2819 100644
--- a/release/scripts/startup/function_nodes/declaration/vectorized.py
+++ b/release/scripts/startup/function_nodes/declaration/vectorized.py
@@ -27,13 +27,10 @@ class VectorizedDeclBase:
         return StringProperty(default="BASE")
 
     def get_type_and_name(self):
-        stored = getattr(self.node, self.prop_name)
-        if stored == "BASE":
-            return self.base_type, self.base_name
-        elif stored == "LIST":
+        if self.is_vectorized():
             return self.list_type, self.list_name
         else:
-            assert False
+            return self.base_type, self.base_name
 
 
 class VectorizedInputDecl(VectorizedDeclBase, SocketDeclBase):
@@ -49,18 +46,31 @@ class VectorizedInputDecl(VectorizedDeclBase, SocketDeclBase):
         self.base_type = base_type
         self.list_type = type_infos.to_list(base_type)
 
+    def is_vectorized(self):
+        stored = getattr(self.node, self.prop_name)
+        if stored == "BASE":
+            return False
+        elif stored == "LIST":
+            return True
+        else:
+            assert False
+
 
 class VectorizedOutputDecl(VectorizedDeclBase, SocketDeclBase):
     def __init__(self,
-            node, identifier, prop_name, input_prop_names,
+            node, identifier, input_prop_names,
             base_name, list_name,
             base_type):
-        assert prop_name not in input_prop_names
         self.node = node
         self.identifier = identifier
-        self.prop_name = prop_name
         self.input_prop_names = input_prop_names
         self.base_name = base_name
         self.list_name = list_name
         self.base_type = base_type
         self.list_type = type_infos.to_list(base_type)
+
+    def is_vectorized(self):
+        for prop_name in self.input_prop_names:
+            if getattr(self.node, prop_name) == "LIST":
+                return True
+        return False
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/inferencing.py b/release/scripts/startup/function_nodes/inferencing.py
index e48faba8b89..c5be7b5683c 100644
--- a/release/scripts/startup/function_nodes/inferencing.py
+++ b/release/scripts/startup/function_nodes/inferencing.py
@@ -109,12 +109,12 @@ def iter_possible_list_component_types(component, decision_users, tree_data):
 ########################################
 
 def make_vector_decisions(tree_data, list_decisions):
-    graph, socket_by_decision_id = get_vector_decisions_graph(tree_data)
+    graph, input_sockets, output_sockets = get_vector_decisions_graph(tree_data)
 
     decisions = dict()
     decision_ids_with_collision = set()
 
-    for initial_decision_id, decision in iter_obligatory_vector_decisions(graph, socket_by_decision_id, tree_data, list_decisions):
+    for initial_decision_id, decision in iter_obligatory_vector_decisions(graph, input_sockets, output_sockets, tree_data, list_decisions):
         for decision_id in graph.reachable(initial_decision_id):
             if decision_id in decisions:
                 if decisions[decision_id] != decision:
@@ -142,21 +142,17 @@ def get_vector_decisions_graph(tree_data):
     '''
     from . graph import DirectedGraphBuilder
     builder = DirectedGraphBuilder()
-    socket_by_decision_id = dict()
+    input_sockets = set()
+    output_sockets = set()
 
     for node in tree_data.iter_nodes():
         for decl, sockets in node.decl_map.iter_decl_with_sockets():
             if isinstance(decl, VectorizedInputDecl):
                 decision_id = DecisionID(node, node, decl.prop_name)
                 builder.add_vertex(decision_id)
-                socket_by_decision_id[decision_id] = sockets[0]
+                input_sockets.add(sockets[0])
             elif isinstance(decl, VectorizedOutputDecl):
-                decision_id = DecisionID(node, node, decl.prop_name)
-                builder.add_vertex(decision_id)
-                socket_by_decision_id[decision_id] = sockets[0]
-                for input_prop_name in decl.input_prop_names:
-                    input_decision_id = DecisionID(node, node, input_prop_name)
-                    builder.add_directed_edge(input_decision_id, decision_id)
+                output_sockets.add(sockets[0])
 
     for from_socket, to_socket in tree_data.iter_connections():
         from_node = tree_data.get_node(from_socket)
@@ -166,16 +162,18 @@ def get_vector_decisions_graph(tree_data):
         to_decl = to_socket.get_decl(to_node)
 
         if isinstance(from_decl, VectorizedOutputDecl) and isinstance(to_decl, VectorizedInputDecl):
-            from_decision_id = DecisionID(from_node, from_node, from_decl.prop_name)
-            to_decision_id = DecisionID(to_node, to_node, to_decl.prop_name)
-            builder.add_directed_edge(from_decision_id, to_decision_id)
+            for prop_name in from_decl.input_prop_names:
+                from_decision_id = DecisionID(from_node, from_node, prop_name)
+                to_decision_id = DecisionID(to_node, to_node, to_decl.prop_name)
+                builder.add_directed_edge(from_decision_id, to_decision_id)
 
-    return builder.build(), socket_by_decision_id
+    return builder.build(), input_sockets, output_sockets
 
-def iter_obligatory_vector_decisions(graph, socket_by_decision_id, tree_data, list_decisions):
-    for decision_id in graph.V:
-        socket = socket_by_decision_id[decision_id]
-        decl = socket.get_decl(decision_id.node)
+def iter_obligatory_vector_decisions(graph, input_sockets, output_sockets, tree_data, list_decisions):
+    for socket in input_sockets:
+        node = tree_data.get_node(socket)
+        decl = socket.get_decl(node)
+        decision_id = DecisionID(node, node, decl.prop_name)
 
         for other_node, other_socket in tree_data.iter_connected_sockets_with_nodes(socket):
             other_decl = other_socket.get_decl(other_node)
@@ -185,8 +183,6 @@ def iter_obligatory_vector_decisions(graph, socket_by_decision_id, tree_data, li
                     yield decision_id, "BASE"
                 elif other_data_type == decl.list_type:
                     yield decision_id, "LIST"
-            elif isinstance(other_decl, PackListDecl):
-                pass
             elif isinstance(other_decl, ListSocketDecl):
                 list_decision_id = DecisionID(other_node, other_node, other_decl.prop_name)
                 if list_decision_id in list_decisions:
@@ -200,6 +196,31 @@ def iter_obligatory_vector_decisions(graph, socket_by_decision_id, tree_data, li
                     elif old_data_type == decl.list_type:
                         yield decision_id, "LIST"
 
+    for socket in output_sockets:
+        node = tree_data.get_node(socket)
+        decl = socket.get_decl(node)
+        decision_ids = [DecisionID(node, node, p) for p in decl.input_prop_names]
+
+        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):
+                other_data_type = other_socket.data_type
+                if other_data_type == decl.base_type:
+                    for decision_id in decision_ids:
+                        yield decision_id, "BASE"
+            elif isinstance(other_decl, ListSocketDecl):
+                if other_decl.list_or_base == "BASE":
+                    list_decision_id = DecisionID(other_node, other_node, other_decl.prop_name)
+                    if list_decision_id in list_decisions:
+                        other_base_type = list_decisions[list_decision_id]
+                        if other_base_type == decl.base_type:
+                            for decision_id in decision_ids:
+                                yield decision_id, "BASE"
+                    else:
+                        old_data_type = other_socket.data_type
+                        if old_data_type == decl.base_type:
+                            for decision_id in decision_ids:
+                                yield decision_id, "BASE"
 
 
 # Inference pack list decisions
@@ -242,9 +263,12 @@ def make_pack_list_decisions(tree_data, list_decisions, vector_decisions):
         elif isinstance(origin_decl, VectorizedOutputDecl):
             other_base_type = origin_decl.base_type
             if other_base_type == decl.base_type:
-                vector_decision_id = DecisionID(origin_node, origin_node, origin_decl.prop_name)
-                if vector_decision_id in vector_decisions:
-                    decisions[decision_id] = vector_decisions[vector_decision_id]
+                for input_prop_name in origin_decl.input_prop_names:
+                    input_decision_id = DecisionID(origin_node, origin_node, input_prop_name)
+                    if input_decision_id in vector_decisions:
+                        if vector_decisions[input_decision_id] == "LIST":
+                            decisions[decision_id] = "LIST"
+                            break
                 else:
                     decisions[decision_id] = "BASE"
             else:
diff --git a/release/scripts/startup/function_nodes/nodes/combine_vector.py b/release/scripts/startup/function_nodes/nodes/combine_vector.py
index 872d145eeca..88fc0da0036 100644
--- a/release/scripts/startup/function_nodes/nodes/combine_vector.py
+++ b/release/scripts/startup/function_nodes/nodes/combine_vector.py
@@ -9,7 +9,6 @@ class CombineVectorNode(bpy.types.Node, FunctionNode):
     use_list__x: SocketBuilder.VectorizedInputProperty()
     use_list__y: SocketBuilder.VectorizedInputProperty()
     use_list__z: SocketBuilder.VectorizedInputProperty()
-    use_list__vector: SocketBuilder.VectorizedOutputProperty()
 
     def declaration(self, builder):
         builder.vectorized_input(
@@ -23,6 +22,5 @@ class CombineVectorNode(bpy.types.Node, FunctionNode):
             "Z", "Z", "Float")
 
         builder.vectorized_output(
-            "vector", "use_list__vector",
-            ["use_list__x", "use_list__y", "use_list__z"],
+ 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list