Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@blender.org>2021-11-01 20:50:34 +0300
committerSybren A. Stüvel <sybren@blender.org>2021-11-01 20:51:55 +0300
commit4ed1e19d2f30f2b4ba4313feeaa7c4e56f96b891 (patch)
treeb4cd48b44600212b692c5cc1c8e539cc51c1b984 /source/blender/blenloader/intern/versioning_common.cc
parent2f667c2bc949b31e7e80a67905394e1e5a0bd762 (diff)
Cleanup: extract versioning code for remapping node socket animation
When node input sockets are animated, they target the socket by index. As a result, animation data needs to be updated whenever new sockets are added (except when they're added at the end of the list). The code for this is now extracted into its own versioning function, so that it can be used for other versioning steps as well. No functional changes.
Diffstat (limited to 'source/blender/blenloader/intern/versioning_common.cc')
-rw-r--r--source/blender/blenloader/intern/versioning_common.cc60
1 files changed, 60 insertions, 0 deletions
diff --git a/source/blender/blenloader/intern/versioning_common.cc b/source/blender/blenloader/intern/versioning_common.cc
index ecc944defba..745bb7e8222 100644
--- a/source/blender/blenloader/intern/versioning_common.cc
+++ b/source/blender/blenloader/intern/versioning_common.cc
@@ -28,8 +28,10 @@
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BKE_animsys.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
+#include "BKE_node.h"
#include "MEM_guardedalloc.h"
@@ -149,3 +151,61 @@ void version_node_id(bNodeTree *ntree, const int node_type, const char *new_name
}
}
}
+
+/**
+ * Adjust animation data for newly added node sockets.
+ *
+ * Node sockets are addressed by their index (in their RNA path, and thus FCurves/drivers), and
+ * thus when a new node is added in the middle of the list, existing animation data needs to be
+ * adjusted.
+ *
+ * Since this is about animation data, it only concerns input sockets.
+ *
+ * \param node_tree_type node tree type that has these nodes, for example NTREE_SHADER.
+ * \param node_type node type to adjust, for example SH_NODE_BSDF_PRINCIPLED.
+ * \param socket_index_orig the original index of the moved socket; when socket 4 moved to 6,
+ * pass 4 here.
+ * \param socket_index_offset the offset of the nodes, so when socket 4 moved to 6,
+ * pass 2 here.
+ * \param total_number_of_sockets the total number of sockets in the node.
+ */
+void version_node_socket_index_animdata(Main *bmain,
+ const int node_tree_type,
+ const int node_type,
+ const int socket_index_orig,
+ const int socket_index_offset,
+ const int total_number_of_sockets)
+{
+
+ /* The for loop for the input ids is at the top level otherwise we lose the animation
+ * keyframe data. Not sure what causes that, so I (Sybren) moved the code here from
+ * versioning_290.c as-is (structure-wise). */
+ for (int input_index = total_number_of_sockets - 1; input_index >= socket_index_orig;
+ input_index--) {
+ FOREACH_NODETREE_BEGIN (bmain, ntree, owner_id) {
+ if (ntree->type != node_tree_type) {
+ continue;
+ }
+
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type != node_type) {
+ continue;
+ }
+
+ const size_t node_name_length = strlen(node->name);
+ const size_t node_name_escaped_max_length = (node_name_length * 2);
+ char *node_name_escaped = (char *)MEM_mallocN(node_name_escaped_max_length + 1,
+ "escaped name");
+ BLI_str_escape(node_name_escaped, node->name, node_name_escaped_max_length);
+ char *rna_path_prefix = BLI_sprintfN("nodes[\"%s\"].inputs", node_name_escaped);
+
+ const int new_index = input_index + socket_index_offset;
+ BKE_animdata_fix_paths_rename_all_ex(
+ bmain, owner_id, rna_path_prefix, NULL, NULL, input_index, new_index, false);
+ MEM_freeN(rna_path_prefix);
+ MEM_freeN(node_name_escaped);
+ }
+ }
+ FOREACH_NODETREE_END;
+ }
+}