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
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.
-rw-r--r--source/blender/blenloader/intern/versioning_290.c28
-rw-r--r--source/blender/blenloader/intern/versioning_common.cc60
-rw-r--r--source/blender/blenloader/intern/versioning_common.h8
3 files changed, 69 insertions, 27 deletions
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index def14768ec6..f82b7970a60 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -605,34 +605,8 @@ void do_versions_after_linking_290(Main *bmain, ReportList *UNUSED(reports))
*
* To play safe we move all the inputs beyond 18 to their rightful new place.
* In case users are doing unexpected things with not-really supported keyframeable channels.
- *
- * The for loop for the input ids is at the top level otherwise we lose the animation
- * keyframe data.
*/
- for (int input_id = 21; input_id >= 18; input_id--) {
- FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
- if (ntree->type == NTREE_SHADER) {
- LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
- if (node->type != SH_NODE_BSDF_PRINCIPLED) {
- 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 = 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);
-
- BKE_animdata_fix_paths_rename_all_ex(
- bmain, id, rna_path_prefix, NULL, NULL, input_id, input_id + 1, false);
- MEM_freeN(rna_path_prefix);
- MEM_freeN(node_name_escaped);
- }
- }
- }
- FOREACH_NODETREE_END;
- }
+ version_node_socket_index_animdata(bmain, NTREE_SHADER, SH_NODE_BSDF_PRINCIPLED, 18, 1, 22);
}
/* Convert all Multires displacement to Catmull-Clark subdivision limit surface. */
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;
+ }
+}
diff --git a/source/blender/blenloader/intern/versioning_common.h b/source/blender/blenloader/intern/versioning_common.h
index 8697e8e2639..396927229c6 100644
--- a/source/blender/blenloader/intern/versioning_common.h
+++ b/source/blender/blenloader/intern/versioning_common.h
@@ -52,6 +52,14 @@ void version_node_output_socket_name(struct bNodeTree *ntree,
const char *old_name,
const char *new_name);
+void version_node_socket_index_animdata(
+ Main *bmain,
+ int node_tree_type, /* NTREE_....., e.g. NTREE_SHADER */
+ int node_type, /* SH_NODE_..., e.g. SH_NODE_BSDF_PRINCIPLED */
+ int socket_index_lowest_modified,
+ int socket_index_offset,
+ int total_number_of_sockets);
+
void version_node_id(struct bNodeTree *ntree, const int node_type, const char *new_name);
#ifdef __cplusplus