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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-04-20 21:25:22 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-04-24 13:44:27 +0300
commitd730e512ac56bd68c75f8c44ff186b51010db4c7 (patch)
treedddf69daf78ac1627db7069ef3012b8ecb54017f /source/blender/nodes/intern/node_common.c
parent62421470ee09fb70f343eb9fd48b093316c8eea1 (diff)
Nodes: avoid slow and unecessary node group updates on file read
On file read we need to update group nodes in case the group they refer to has changed its inputs and outputs. This had O(n^2) time complexity and was updating all datablocks even if they did not change.
Diffstat (limited to 'source/blender/nodes/intern/node_common.c')
-rw-r--r--source/blender/nodes/intern/node_common.c76
1 files changed, 34 insertions, 42 deletions
diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c
index ed4cdde67f0..2b6a89d5e65 100644
--- a/source/blender/nodes/intern/node_common.c
+++ b/source/blender/nodes/intern/node_common.c
@@ -179,18 +179,16 @@ static void group_verify_socket_list(
}
/* make sure all group node in ntree, which use ngroup, are sync'd */
-void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id)
+void node_group_update(struct bNodeTree *ntree, struct bNode *node)
{
/* check inputs and outputs, and remove or insert them */
- if (id == node->id) {
- if (id == NULL) {
- nodeRemoveAllSockets(ntree, 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);
- }
+ if (node->id == NULL) {
+ nodeRemoveAllSockets(ntree, 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);
}
}
@@ -408,7 +406,7 @@ void BKE_node_tree_unlink_id(ID *id, struct bNodeTree *ntree)
static void node_group_input_init(bNodeTree *ntree, bNode *node)
{
- node_group_input_verify(ntree, node, (ID *)ntree);
+ node_group_input_update(ntree, node);
}
bNodeSocket *node_group_input_find_socket(bNode *node, const char *identifier)
@@ -422,19 +420,7 @@ bNodeSocket *node_group_input_find_socket(bNode *node, const char *identifier)
return NULL;
}
-void node_group_input_verify(bNodeTree *ntree, bNode *node, ID *id)
-{
- /* check inputs and outputs, and remove or insert them */
- if (id == (ID *)ntree) {
- /* 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__", "");
- }
-}
-
-static void node_group_input_update(bNodeTree *ntree, bNode *node)
+void node_group_input_update(bNodeTree *ntree, bNode *node)
{
bNodeSocket *extsock = node->outputs.last;
bNodeLink *link, *linknext, *exposelink;
@@ -480,7 +466,7 @@ static void node_group_input_update(bNodeTree *ntree, bNode *node)
gsock = ntreeAddSocketInterfaceFromSocket(ntree, exposelink->tonode, exposelink->tosock);
- node_group_input_verify(ntree, node, (ID *)ntree);
+ node_group_input_update(ntree, node);
newsock = node_group_input_find_socket(node, gsock->identifier);
/* redirect links from the extension socket */
@@ -490,6 +476,15 @@ static 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__", "");
+ }
}
void register_node_type_group_input(void)
@@ -500,7 +495,7 @@ void register_node_type_group_input(void)
node_type_base(ntype, NODE_GROUP_INPUT, "Group Input", NODE_CLASS_INTERFACE, 0);
node_type_size(ntype, 140, 80, 400);
node_type_init(ntype, node_group_input_init);
- node_type_update(ntype, node_group_input_update, node_group_input_verify);
+ node_type_update(ntype, node_group_input_update);
ntype->needs_free = 1;
nodeRegisterType(ntype);
@@ -508,7 +503,7 @@ void register_node_type_group_input(void)
static void node_group_output_init(bNodeTree *ntree, bNode *node)
{
- node_group_output_verify(ntree, node, (ID *)ntree);
+ node_group_output_update(ntree, node);
}
bNodeSocket *node_group_output_find_socket(bNode *node, const char *identifier)
@@ -522,19 +517,7 @@ bNodeSocket *node_group_output_find_socket(bNode *node, const char *identifier)
return NULL;
}
-void node_group_output_verify(bNodeTree *ntree, bNode *node, ID *id)
-{
- /* check inputs and outputs, and remove or insert them */
- if (id == (ID *)ntree) {
- /* 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__", "");
- }
-}
-
-static void node_group_output_update(bNodeTree *ntree, bNode *node)
+void node_group_output_update(bNodeTree *ntree, bNode *node)
{
bNodeSocket *extsock = node->inputs.last;
bNodeLink *link, *linknext, *exposelink;
@@ -581,7 +564,7 @@ static void node_group_output_update(bNodeTree *ntree, bNode *node)
/* XXX what if connecting virtual to virtual socket?? */
gsock = ntreeAddSocketInterfaceFromSocket(ntree, exposelink->fromnode, exposelink->fromsock);
- node_group_output_verify(ntree, node, (ID *)ntree);
+ node_group_output_update(ntree, node);
newsock = node_group_output_find_socket(node, gsock->identifier);
/* redirect links to the extension socket */
@@ -591,6 +574,15 @@ static 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__", "");
+ }
}
void register_node_type_group_output(void)
@@ -601,7 +593,7 @@ void register_node_type_group_output(void)
node_type_base(ntype, NODE_GROUP_OUTPUT, "Group Output", NODE_CLASS_INTERFACE, 0);
node_type_size(ntype, 140, 80, 400);
node_type_init(ntype, node_group_output_init);
- node_type_update(ntype, node_group_output_update, node_group_output_verify);
+ node_type_update(ntype, node_group_output_update);
ntype->needs_free = 1;
nodeRegisterType(ntype);