From 7fd6c7f3718a1a7db5924366d5f8f2d03902bf74 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 4 Mar 2021 12:50:23 +0100 Subject: Fix T86204: support multiple group inputs in node group Note that this still does not work when in the node group directly referenced by the modifier, only in sub-node-groups. This limitation will be removed at some point. --- source/blender/nodes/intern/derived_node_tree.cc | 31 ++++++++++++------------ 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'source/blender/nodes/intern/derived_node_tree.cc') diff --git a/source/blender/nodes/intern/derived_node_tree.cc b/source/blender/nodes/intern/derived_node_tree.cc index f5a0e14f18b..7934104f84b 100644 --- a/source/blender/nodes/intern/derived_node_tree.cc +++ b/source/blender/nodes/intern/derived_node_tree.cc @@ -187,16 +187,11 @@ BLI_NOINLINE void DerivedNodeTree::relink_group_inputs(const NodeTreeRef &group_ if (node_refs.size() == 0) { return; } - /* TODO: Pick correct group input node if there are more than one. */ - const NodeRef &input_node_ref = *node_refs[0]; - DNode &input_node = *nodes_by_id[input_node_ref.id()]; int input_amount = group_node.inputs().size(); - BLI_assert(input_amount == input_node_ref.outputs().size() - 1); for (int input_index : IndexRange(input_amount)) { DInputSocket *outside_group = group_node.inputs_[input_index]; - DOutputSocket *inside_group = input_node.outputs_[input_index]; for (DOutputSocket *outside_connected : outside_group->linked_sockets_) { outside_connected->linked_sockets_.remove_first_occurrence_and_reorder(outside_group); @@ -206,21 +201,27 @@ BLI_NOINLINE void DerivedNodeTree::relink_group_inputs(const NodeTreeRef &group_ outside_connected->linked_sockets_.remove_first_occurrence_and_reorder(outside_group); } - for (DInputSocket *inside_connected : inside_group->linked_sockets_) { - inside_connected->linked_sockets_.remove_first_occurrence_and_reorder(inside_group); + for (const NodeRef *input_node_ref : node_refs) { + DNode &input_node = *nodes_by_id[input_node_ref->id()]; + DOutputSocket *inside_group = input_node.outputs_[input_index]; - for (DOutputSocket *outside_connected : outside_group->linked_sockets_) { - inside_connected->linked_sockets_.append(outside_connected); - outside_connected->linked_sockets_.append(inside_connected); - } + for (DInputSocket *inside_connected : inside_group->linked_sockets_) { + inside_connected->linked_sockets_.remove_first_occurrence_and_reorder(inside_group); - for (DGroupInput *outside_connected : outside_group->linked_group_inputs_) { - inside_connected->linked_group_inputs_.append(outside_connected); - outside_connected->linked_sockets_.append(inside_connected); + for (DOutputSocket *outside_connected : outside_group->linked_sockets_) { + inside_connected->linked_sockets_.append(outside_connected); + outside_connected->linked_sockets_.append(inside_connected); + } + + for (DGroupInput *outside_connected : outside_group->linked_group_inputs_) { + inside_connected->linked_group_inputs_.append(outside_connected); + outside_connected->linked_sockets_.append(inside_connected); + } } + + inside_group->linked_sockets_.clear(); } - inside_group->linked_sockets_.clear(); outside_group->linked_sockets_.clear(); outside_group->linked_group_inputs_.clear(); } -- cgit v1.2.3