From 7302652ec4ec89d459f1c3212567593a9cbce829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Tue, 5 Sep 2023 13:02:18 +0200 Subject: [PATCH] Fix #111963: Copying sockets was not creating unique identifiers. Items in the node group interface need to have unique identifiers. Copying an item (socket or panel) was not doing this, so the node groups end up having sockets with the same identifier. Linking sockets was broken because copies could not be distinguished. --- .../blenkernel/intern/node_tree_interface.cc | 19 +++++++++++++++++++ .../makesdna/DNA_node_tree_interface_types.h | 5 ++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/node_tree_interface.cc b/source/blender/blenkernel/intern/node_tree_interface.cc index f11513a3a6d..52498a6b771 100644 --- a/source/blender/blenkernel/intern/node_tree_interface.cc +++ b/source/blender/blenkernel/intern/node_tree_interface.cc @@ -408,6 +408,23 @@ static void item_copy(bNodeTreeInterfaceItem &dst, } } +static void item_set_unique_identifier(const int uid, bNodeTreeInterfaceItem &item) +{ + switch (item.item_type) { + case NODE_INTERFACE_SOCKET: { + bNodeTreeInterfaceSocket &socket = reinterpret_cast(item); + MEM_SAFE_FREE(socket.identifier); + socket.identifier = BLI_sprintfN("Socket_%d", uid); + break; + } + case NODE_INTERFACE_PANEL: { + bNodeTreeInterfacePanel &panel = reinterpret_cast(item); + panel.identifier = uid; + break; + } + } +} + static void item_free(bNodeTreeInterfaceItem &item, const bool do_id_user) { switch (item.item_type) { @@ -1172,6 +1189,7 @@ bNodeTreeInterfaceItem *bNodeTreeInterface::add_item_copy(const bNodeTreeInterfa bNodeTreeInterfaceItem *citem = static_cast(MEM_dupallocN(&item)); item_types::item_copy(*citem, item, 0); + item_types::item_set_unique_identifier(next_uid++, *citem); parent->add_item(*citem); return citem; @@ -1196,6 +1214,7 @@ bNodeTreeInterfaceItem *bNodeTreeInterface::insert_item_copy(const bNodeTreeInte bNodeTreeInterfaceItem *citem = static_cast(MEM_dupallocN(&item)); item_types::item_copy(*citem, item, 0); + item_types::item_set_unique_identifier(next_uid++, *citem); parent->insert_item(*citem, position); return citem; diff --git a/source/blender/makesdna/DNA_node_tree_interface_types.h b/source/blender/makesdna/DNA_node_tree_interface_types.h index b1252ca1e96..00334842f02 100644 --- a/source/blender/makesdna/DNA_node_tree_interface_types.h +++ b/source/blender/makesdna/DNA_node_tree_interface_types.h @@ -159,7 +159,10 @@ typedef struct bNodeTreeInterfacePanel { */ bNodeTreeInterfacePanel *find_parent_recursive(const bNodeTreeInterfaceItem &item); - /** Create a copy of items in the span and add them to the interface. */ + /** + * Create a copy of items in the span and add them to the interface. + * \note This does not generate new identifiers for items, use only for identital copies. + */ void copy_from(blender::Span items_src, int flag); /** Remove all items from the panel. */ void clear(bool do_id_user); -- 2.30.2