From 6924be003e2b1ceca57bf7b07293dedb6ed4c022 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 17 Dec 2024 15:28:57 +0100 Subject: [PATCH] Fix #101615: node group pulls in unnecessary data-blocks when linked The issue here was sometimes an output socket of a `Group Input` node has a reference to a data-block. The value stored on these output sockets are never used, and thus is not exposed in the UI which made it impossible for the user to find that there still is a data-block reference. The root cause for this seems to have been fixed a few releases ago. I can reproduce that the pointer was set in 3.3, but not in 3.6. This patch only adds some versioning to remove the unnecessary data-block references to fix old files that might have this issue (e.g. the file from the report). Pull Request: https://projects.blender.org/blender/blender/pulls/131900 --- .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_400.cc | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 60bd56c0050..b79ce55ab53 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -31,7 +31,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 13 +#define BLENDER_FILE_SUBVERSION 14 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and cancel loading the file, showing a warning to diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 2e1dde10132..6cecf33fe01 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -3290,6 +3290,39 @@ static void version_node_locations_to_global(bNodeTree &ntree) } } +/** + * Clear unnecessary pointers to data blocks on output sockets group input nodes. + * These values should never have been set in the first place. They are not harmful on their own, + * but can pull in additional data-blocks when the node group is linked/appended. + */ +static void version_group_input_socket_data_block_reference(bNodeTree &ntree) +{ + LISTBASE_FOREACH (bNode *, node, &ntree.nodes) { + if (node->type != NODE_GROUP_INPUT) { + continue; + } + LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) { + switch (socket->type) { + case SOCK_OBJECT: + socket->default_value_typed()->value = nullptr; + break; + case SOCK_IMAGE: + socket->default_value_typed()->value = nullptr; + break; + case SOCK_COLLECTION: + socket->default_value_typed()->value = nullptr; + break; + case SOCK_TEXTURE: + socket->default_value_typed()->value = nullptr; + break; + case SOCK_MATERIAL: + socket->default_value_typed()->value = nullptr; + break; + } + } + } +} + void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) { if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 1)) { @@ -5265,6 +5298,12 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } } + if (!MAIN_VERSION_FILE_ATLEAST(bmain, 404, 14)) { + LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) { + version_group_input_socket_data_block_reference(*ntree); + } + } + /* Always run this versioning; meshes are written with the legacy format which always needs to * be converted to the new format on file load. Can be moved to a subversion check in a larger * breaking release. */