From 7faf56a98acae81c1bd9e6e041839c9ab38b9a89 Mon Sep 17 00:00:00 2001 From: Leon Schittek Date: Sun, 28 May 2023 15:57:01 +0200 Subject: [PATCH] Fix #108336: Treat node sockets with muted links as connected Prevent make links operator from connecting to sockets that are already linked to a muted link. The `SOCK_IS_LINKED` flag is used to check if there already is a link connecting to the socket but when the link is muted, the flag wasn't set leading to issues in parts of the code that used the flag to check for any type of connected link. This commit now also sets `SOCK_IS_LINKED` when links are muted and adds an additional check in places where different behavior is expected for muted links. --- source/blender/blenkernel/intern/node_tree_update.cc | 9 ++------- source/blender/editors/space_node/drawnode.cc | 5 +++-- source/blender/editors/space_node/node_edit.cc | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index c60785bcde4..ad98aa8da44 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -527,13 +527,8 @@ class NodeTreeMainUpdater { { tree.ensure_topology_cache(); for (bNodeSocket *socket : tree.all_sockets()) { - socket->flag &= ~SOCK_IS_LINKED; - for (const bNodeLink *link : socket->directly_linked_links()) { - if (!link->is_muted()) { - socket->flag |= SOCK_IS_LINKED; - break; - } - } + const bool socket_is_linked = !socket->directly_linked_links().is_empty(); + SET_FLAG_FROM_TEST(socket->flag, socket_is_linked, SOCK_IS_LINKED); } } diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index fbabfc21514..40ba4e1b450 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -1295,8 +1295,9 @@ static void std_node_socket_draw( return; } - if ((sock->in_out == SOCK_OUT) || (sock->flag & SOCK_IS_LINKED) || - (sock->flag & SOCK_HIDE_VALUE)) { + if ((sock->in_out == SOCK_OUT) || (sock->flag & SOCK_HIDE_VALUE) || + ((sock->flag & SOCK_IS_LINKED) && !(sock->link->is_muted()))) + { node_socket_button_label(C, layout, ptr, node_ptr, text); return; } diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index c9c9f7e79d7..77a6deb95ab 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -1098,7 +1098,7 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set) } } LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { - if (nodeCountSocketLinks(snode->edittree, sock) == 0) { + if ((sock->flag & SOCK_IS_LINKED) == 0) { sock->flag |= SOCK_HIDDEN; } } -- 2.30.2