diff options
author | Jacques Lucke <jacques@blender.org> | 2022-05-31 21:43:53 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2022-05-31 21:43:53 +0300 |
commit | 0f47506cde50c4542a0a3c7863b0fb4e735bf8f0 (patch) | |
tree | a4ce2257f6387151758d66abb0374d125baa9ed2 /source/blender/nodes/intern/node_common.cc | |
parent | dc389a61529d335ebdcc28882c8961f78c7c3d0c (diff) |
Fix T98501: setting node socket default value is very slow
The issue was that the extend socket (the last empty socket in
Input/Output nodes) was repeatedly removed and added again,
which caused more updates than necessary. Now, the extend
socket is kept if it existed already.
Differential Revision: https://developer.blender.org/D15084
Diffstat (limited to 'source/blender/nodes/intern/node_common.cc')
-rw-r--r-- | source/blender/nodes/intern/node_common.cc | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/source/blender/nodes/intern/node_common.cc b/source/blender/nodes/intern/node_common.cc index abbfe4b823d..b7c5f9570e4 100644 --- a/source/blender/nodes/intern/node_common.cc +++ b/source/blender/nodes/intern/node_common.cc @@ -156,7 +156,8 @@ static void group_verify_socket_list(bNodeTree &node_tree, bNode &node, const ListBase &interface_sockets, ListBase &verify_lb, - const eNodeSocketInOut in_out) + const eNodeSocketInOut in_out, + const bool ensure_extend_socket_exists) { ListBase old_sockets = verify_lb; BLI_listbase_clear(&verify_lb); @@ -177,6 +178,17 @@ static void group_verify_socket_list(bNodeTree &node_tree, } } + if (ensure_extend_socket_exists) { + bNodeSocket *last_socket = static_cast<bNodeSocket *>(old_sockets.last); + if (last_socket != nullptr && STREQ(last_socket->identifier, "__extend__")) { + BLI_remlink(&old_sockets, last_socket); + BLI_addtail(&verify_lb, last_socket); + } + else { + nodeAddSocket(&node_tree, &node, in_out, "NodeSocketVirtual", "__extend__", ""); + } + } + /* Remove leftover sockets that didn't match the node group's interface. */ LISTBASE_FOREACH_MUTABLE (bNodeSocket *, unused_socket, &old_sockets) { nodeRemoveSocket(&node_tree, &node, unused_socket); @@ -195,8 +207,8 @@ void node_group_update(struct bNodeTree *ntree, struct bNode *node) } else { bNodeTree *ngroup = (bNodeTree *)node->id; - group_verify_socket_list(*ntree, *node, ngroup->inputs, node->inputs, SOCK_IN); - group_verify_socket_list(*ntree, *node, ngroup->outputs, node->outputs, SOCK_OUT); + group_verify_socket_list(*ntree, *node, ngroup->inputs, node->inputs, SOCK_IN, false); + group_verify_socket_list(*ntree, *node, ngroup->outputs, node->outputs, SOCK_OUT, false); } } @@ -484,15 +496,7 @@ void node_group_input_update(bNodeTree *ntree, bNode *node) } BLI_freelistN(&tmplinks); - - /* check inputs and outputs, and remove or insert them */ - { - /* value_in_out inverted for interface nodes to get correct socket value_property */ - group_verify_socket_list(*ntree, *node, ntree->inputs, node->outputs, SOCK_OUT); - - /* add virtual extension socket */ - nodeAddSocket(ntree, node, SOCK_OUT, "NodeSocketVirtual", "__extend__", ""); - } + group_verify_socket_list(*ntree, *node, ntree->inputs, node->outputs, SOCK_OUT, true); } void register_node_type_group_input() @@ -582,15 +586,7 @@ void node_group_output_update(bNodeTree *ntree, bNode *node) } BLI_freelistN(&tmplinks); - - /* check inputs and outputs, and remove or insert them */ - { - /* value_in_out inverted for interface nodes to get correct socket value_property */ - group_verify_socket_list(*ntree, *node, ntree->outputs, node->inputs, SOCK_IN); - - /* add virtual extension socket */ - nodeAddSocket(ntree, node, SOCK_IN, "NodeSocketVirtual", "__extend__", ""); - } + group_verify_socket_list(*ntree, *node, ntree->outputs, node->inputs, SOCK_IN, true); } void register_node_type_group_output() |