[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