diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index cb96538ad81..573fa60f703 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -485,6 +485,7 @@ void nodeUpdateInternalLinks(struct bNodeTree *ntree, struct bNode *n void nodeSynchronizeID(struct bNode *node, bool copy_to_id); int nodeSocketIsHidden(struct bNodeSocket *sock); +void ntreeTagUsedSockets(struct bNodeTree *ntree); /* Node Clipboard */ void BKE_node_clipboard_init(struct bNodeTree *ntree); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 7414a8588ee..039af949d81 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -2881,6 +2881,32 @@ static void ntree_update_node_level(bNodeTree *ntree) } } +void ntreeTagUsedSockets(bNodeTree *ntree) +{ + bNode *node; + bNodeSocket *sock; + bNodeLink *link; + + /* first clear data */ + for (node = ntree->nodes.first; node; node = node->next) { + for (sock = node->inputs.first; sock; sock = sock->next) { + sock->flag &= ~SOCK_IN_USE; + } + for (sock = node->outputs.first; sock; sock = sock->next) { + sock->flag &= ~SOCK_IN_USE; + } + } + + for (link = ntree->links.first; link; link = link->next) { + /* link is unused if either side is disabled */ + if ((link->fromsock->flag & SOCK_UNAVAIL) || (link->tosock->flag & SOCK_UNAVAIL)) + continue; + + link->fromsock->flag |= SOCK_IN_USE; + link->tosock->flag |= SOCK_IN_USE; + } +} + static void ntree_update_link_pointers(bNodeTree *ntree) { bNode *node; @@ -2891,19 +2917,14 @@ static void ntree_update_link_pointers(bNodeTree *ntree) for (node = ntree->nodes.first; node; node = node->next) { for (sock = node->inputs.first; sock; sock = sock->next) { sock->link = NULL; - sock->flag &= ~SOCK_IN_USE; - } - for (sock = node->outputs.first; sock; sock = sock->next) { - sock->flag &= ~SOCK_IN_USE; } } for (link = ntree->links.first; link; link = link->next) { link->tosock->link = link; - - link->fromsock->flag |= SOCK_IN_USE; - link->tosock->flag |= SOCK_IN_USE; } + + ntreeTagUsedSockets(ntree); } static void ntree_validate_links(bNodeTree *ntree) diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 127e2d3a48e..16ad63bcafa 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -1133,6 +1133,9 @@ void node_update_nodetree(const bContext *C, bNodeTree *ntree) { bNode *node; + /* make sure socket "used" tags are correct, for displaying value buttons */ + ntreeTagUsedSockets(ntree); + /* update nodes front to back, so children sizes get updated before parents */ for (node = ntree->nodes.last; node; node = node->prev) { node_update(C, ntree, node);