[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