Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2021-12-24 14:34:04 +0300
committerJacques Lucke <jacques@blender.org>2021-12-24 14:34:04 +0300
commitba4b7b43195c17436beaba95956087be4fb746a9 (patch)
treea644a2dac2129ca06b878721f677dd21fb192a76 /source/blender/nodes/intern
parentc0db8a9a3beed8cae7f4f138f46a9efcaff7b054 (diff)
Fix T94162: incorrect handling when there are multiple group outputs
Typically a node group should only have a single Group Output node. However, currently Blender already supports having multiple group outputs, one of which is active. This wasn't handled correctly by geometry nodes. Differential Revision: https://developer.blender.org/D13611
Diffstat (limited to 'source/blender/nodes/intern')
-rw-r--r--source/blender/nodes/intern/derived_node_tree.cc3
-rw-r--r--source/blender/nodes/intern/node_tree_ref.cc16
2 files changed, 19 insertions, 0 deletions
diff --git a/source/blender/nodes/intern/derived_node_tree.cc b/source/blender/nodes/intern/derived_node_tree.cc
index dc223f07a26..449c6598307 100644
--- a/source/blender/nodes/intern/derived_node_tree.cc
+++ b/source/blender/nodes/intern/derived_node_tree.cc
@@ -270,6 +270,9 @@ void DOutputSocket::foreach_target_socket(ForeachTargetSocketFn target_fn,
}
}
else if (linked_node->is_group_output_node()) {
+ if (linked_node.node_ref() != context_->tree().group_output_node()) {
+ continue;
+ }
if (context_->is_root()) {
/* This is a group output in the root node group. */
path_info.sockets.append(linked_socket);
diff --git a/source/blender/nodes/intern/node_tree_ref.cc b/source/blender/nodes/intern/node_tree_ref.cc
index ffe0edb9762..bc78533d45c 100644
--- a/source/blender/nodes/intern/node_tree_ref.cc
+++ b/source/blender/nodes/intern/node_tree_ref.cc
@@ -117,6 +117,22 @@ NodeTreeRef::NodeTreeRef(bNodeTree *btree) : btree_(btree)
const bNodeType *nodetype = node->bnode_->typeinfo;
nodes_by_type_.add(nodetype, node);
}
+
+ const Span<const NodeRef *> group_output_nodes = this->nodes_by_type("NodeGroupOutput");
+ if (group_output_nodes.is_empty()) {
+ group_output_node_ = nullptr;
+ }
+ else if (group_output_nodes.size() == 1) {
+ group_output_node_ = group_output_nodes.first();
+ }
+ else {
+ for (const NodeRef *group_output : group_output_nodes) {
+ if (group_output->bnode_->flag & NODE_DO_OUTPUT) {
+ group_output_node_ = group_output;
+ break;
+ }
+ }
+ }
}
NodeTreeRef::~NodeTreeRef()