Commit: fc5f7a1e2d5ec9a3a10b83ef09fdf5bb77cf18fd Author: Iliya Katueshenock Date: Fri Dec 9 15:35:38 2022 -0600 Branches: master https://developer.blender.org/rBfc5f7a1e2d5ec9a3a10b83ef09fdf5bb77cf18fd
Cleanup: Use topology cache of group output node Using a cache greatly simplifies access to the output node. I touched on the most common and understandable cases for me. The texture nodes were touched because it looked pretty generic. Differential Revision: https://developer.blender.org/D16699 =================================================================== M source/blender/blenkernel/intern/node_tree_update.cc M source/blender/nodes/shader/nodes/node_shader_common.cc M source/blender/nodes/texture/nodes/node_texture_common.cc =================================================================== diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index bb063dadb06..ef4076a9b6e 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -509,20 +509,15 @@ static void determine_group_output_states(const bNodeTree &tree, FieldInferencingInterface &new_inferencing_interface, const Span<SocketFieldState> field_state_by_socket_id) { - for (const bNode *group_output_node : tree.nodes_by_type("NodeGroupOutput")) { - /* Ignore inactive group output nodes. */ - if (!(group_output_node->flag & NODE_DO_OUTPUT)) { - continue; - } - /* Determine dependencies of all group outputs. */ - for (const bNodeSocket *group_output_socket : - group_output_node->input_sockets().drop_back(1)) { - OutputFieldDependency field_dependency = find_group_output_dependencies( - *group_output_socket, field_state_by_socket_id); - new_inferencing_interface.outputs[group_output_socket->index()] = std::move( - field_dependency); - } - break; + const bNode *group_output_node = tree.group_output_node(); + if (!group_output_node) { + return; + } + + for (const bNodeSocket *group_output_socket : group_output_node->input_sockets().drop_back(1)) { + OutputFieldDependency field_dependency = find_group_output_dependencies( + *group_output_socket, field_state_by_socket_id); + new_inferencing_interface.outputs[group_output_socket->index()] = std::move(field_dependency); } } diff --git a/source/blender/nodes/shader/nodes/node_shader_common.cc b/source/blender/nodes/shader/nodes/node_shader_common.cc index 613fa101d29..48937b1213b 100644 --- a/source/blender/nodes/shader/nodes/node_shader_common.cc +++ b/source/blender/nodes/shader/nodes/node_shader_common.cc @@ -43,19 +43,20 @@ static void group_gpu_copy_inputs(bNode *gnode, GPUNodeStack *in, bNodeStack *gs */ static void group_gpu_move_outputs(bNode *gnode, GPUNodeStack *out, bNodeStack *gstack) { - bNodeTree *ngroup = (bNodeTree *)gnode->id; + const bNodeTree &ngroup = *reinterpret_cast<bNodeTree *>(gnode->id); - for (bNode *node : ngroup->all_nodes()) { - if (node->type == NODE_GROUP_OUTPUT && (node->flag & NODE_DO_OUTPUT)) { - int a; - LISTBASE_FOREACH_INDEX (bNodeSocket *, sock, &node->inputs, a) { - bNodeStack *ns = node_get_socket_stack(gstack, sock); - if (ns) { - /* convert the node stack data result back to gpu stack */ - node_gpu_stack_from_data(&out[a], sock->type, ns); - } - } - break; /* only one active output node */ + ngroup.ensure_topology_cache(); + const bNode *group_output_node = ngroup.group_output_node(); + if (!group_output_node) { + return; + } + + int a; + LISTBASE_FOREACH_INDEX (bNodeSocket *, sock, &group_output_node->inputs, a) { + bNodeStack *ns = node_get_socket_stack(gstack, sock); + if (ns) { + /* convert the node stack data result back to gpu stack */ + node_gpu_stack_from_data(&out[a], sock->type, ns); } } } diff --git a/source/blender/nodes/texture/nodes/node_texture_common.cc b/source/blender/nodes/texture/nodes/node_texture_common.cc index 5302182a6f6..603e2d39046 100644 --- a/source/blender/nodes/texture/nodes/node_texture_common.cc +++ b/source/blender/nodes/texture/nodes/node_texture_common.cc @@ -84,24 +84,24 @@ static void group_copy_inputs(bNode *gnode, bNodeStack **in, bNodeStack *gstack) */ static void group_copy_outputs(bNode *gnode, bNodeStack **out, bNodeStack *gstack) { - bNodeTree *ngroup = (bNodeTree *)gnode->id; - bNode *node; - bNodeSocket *sock; - bNodeStack *ns; + const bNodeTree &ngroup = *reinterpret_cast<bNodeTree *>(gnode->id); + + ngroup.ensure_topology_cache(); + const bNode *group_output_node = ngroup.group_output_node(); + if (!group_output_node) { + return; + } + int a; + LISTBASE_FOREACH_INDEX (bNodeSocket *, sock, &group_output_node->inputs, a) { + if (!out[a]) { + /* shouldn't need to check this T36694. */ + continue; + } - for (node = static_cast<bNode *>(ngroup->nodes.first); node; node = node->next) { - if (node->type == NODE_GROUP_OUTPUT && (node->flag & NODE_DO_OUTPUT)) { - for (sock = static_cast<bNodeSocket *>(node->inputs.first), a = 0; sock; - sock = sock->next, a++) { - if (out[a]) { /* shouldn't need to check this T36694. */ - ns = node_get_socket_stack(gstack, sock); - if (ns) { - copy_stack(out[a], ns); - } - } - } - break; /* only one active output node */ + bNodeStack *ns = node_get_socket_stack(gstack, sock); + if (ns) { + copy_stack(out[a], ns); } } } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs