From 3272410db002e948d248aae41e65a917e213f4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Tue, 30 May 2023 11:41:38 +0200 Subject: [PATCH 1/3] Fix #108376: Copy from geometry to other node tree types resets shapes. Socket shapes are used in geometry nodes to indicate field types. In other tree types (e.g. shaders) the socket shape is not touched at all. Since nodes can be copied from geometry node trees, we need to reset the socket shape when copying to a shader, compositor, or texture tree. --- source/blender/blenkernel/intern/node_tree_update.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index c60785bcde4..e421f690de2 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -477,6 +477,9 @@ class NodeTreeMainUpdater { result.interface_changed = true; } } + else if (ELEM(ntree.type, NTREE_SHADER, NTREE_COMPOSIT, NTREE_TEXTURE)) { + this->reset_socket_shapes(ntree); + } result.output_changed = this->check_if_output_changed(ntree); @@ -704,6 +707,13 @@ class NodeTreeMainUpdater { blender::bke::node_preview_remove_unused(&ntree); } + void reset_socket_shapes(bNodeTree &ntree) + { + for (bNodeSocket *socket : ntree.all_sockets()) { + socket->display_shape = SOCK_DISPLAY_SHAPE_CIRCLE; + } + } + void propagate_runtime_flags(const bNodeTree &ntree) { ntree.ensure_topology_cache(); -- 2.30.2 From c022afdc20423e9b4cd8052be6edecff11ea3fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Mon, 12 Jun 2023 12:24:12 +0200 Subject: [PATCH 2/3] More restricted socket shape reset in the copy operator. --- source/blender/blenkernel/intern/node.cc | 3 +++ source/blender/blenkernel/intern/node_tree_update.cc | 10 ---------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 5e26a43f1b1..48c6c481aa7 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -2432,6 +2432,9 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src, MEM_dupallocN(sock_src->default_attribute_name)); sock_dst->stack_index = 0; + + /* Reset socket shape in case a node is copied to a different tree type. */ + sock_dst->display_shape = SOCK_DISPLAY_SHAPE_CIRCLE; } bNode *node_copy_with_mapping(bNodeTree *dst_tree, diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index 136335a53f0..1264de7952f 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -477,9 +477,6 @@ class NodeTreeMainUpdater { result.interface_changed = true; } } - else if (ELEM(ntree.type, NTREE_SHADER, NTREE_COMPOSIT, NTREE_TEXTURE)) { - this->reset_socket_shapes(ntree); - } result.output_changed = this->check_if_output_changed(ntree); @@ -702,13 +699,6 @@ class NodeTreeMainUpdater { blender::bke::node_preview_remove_unused(&ntree); } - void reset_socket_shapes(bNodeTree &ntree) - { - for (bNodeSocket *socket : ntree.all_sockets()) { - socket->display_shape = SOCK_DISPLAY_SHAPE_CIRCLE; - } - } - void propagate_runtime_flags(const bNodeTree &ntree) { ntree.ensure_topology_cache(); -- 2.30.2 From d15610f76c1720f98620abbc33a9c53d67db54bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Mon, 12 Jun 2023 13:51:23 +0200 Subject: [PATCH 3/3] Reset socket shapes only when copying from clipboard. --- source/blender/blenkernel/intern/node.cc | 3 --- source/blender/editors/space_node/clipboard.cc | 7 +++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 48c6c481aa7..5e26a43f1b1 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -2432,9 +2432,6 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src, MEM_dupallocN(sock_src->default_attribute_name)); sock_dst->stack_index = 0; - - /* Reset socket shape in case a node is copied to a different tree type. */ - sock_dst->display_shape = SOCK_DISPLAY_SHAPE_CIRCLE; } bNode *node_copy_with_mapping(bNodeTree *dst_tree, diff --git a/source/blender/editors/space_node/clipboard.cc b/source/blender/editors/space_node/clipboard.cc index 5ed91cd4fbe..b3cdfbc3871 100644 --- a/source/blender/editors/space_node/clipboard.cc +++ b/source/blender/editors/space_node/clipboard.cc @@ -245,6 +245,13 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *op) { bNode *new_node = bke::node_copy_with_mapping( &tree, node, LIB_ID_COPY_DEFAULT, true, socket_map); + /* Reset socket shape in case a node is copied to a different tree type. */ + LISTBASE_FOREACH (bNodeSocket *, socket, &new_node->inputs) { + socket->display_shape = SOCK_DISPLAY_SHAPE_CIRCLE; + } + LISTBASE_FOREACH (bNodeSocket *, socket, &new_node->outputs) { + socket->display_shape = SOCK_DISPLAY_SHAPE_CIRCLE; + } node_map.add_new(&node, new_node); } else { -- 2.30.2