From 96eb16a3651b7347c0ab8998a915ca261436aa3f Mon Sep 17 00:00:00 2001 From: Lyuma Date: Thu, 20 Jul 2023 12:45:54 +0200 Subject: [PATCH] Avoid doubly mutating the same Skin in rest fixer Fixes a regression from #77123 that was caused by removal of ibm_diffs variable. This replaced idempotent code with code that applied an offset each time. If the same Skin was visited multiple times, this caused an incorrect result. (cherry picked from commit 5ae311e577b508629712fe25e34b03c6d942e3cb) --- editor/import/post_import_plugin_skeleton_rest_fixer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/editor/import/post_import_plugin_skeleton_rest_fixer.cpp b/editor/import/post_import_plugin_skeleton_rest_fixer.cpp index 82d9cfc2743..bffc100faf1 100644 --- a/editor/import/post_import_plugin_skeleton_rest_fixer.cpp +++ b/editor/import/post_import_plugin_skeleton_rest_fixer.cpp @@ -609,8 +609,8 @@ void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory if (is_rest_changed) { // Fix skin. { + HashSet> mutated_skins; TypedArray nodes = p_base_scene->find_children("*", "ImporterMeshInstance3D"); - int skin_idx = 0; while (nodes.size()) { ImporterMeshInstance3D *mi = Object::cast_to(nodes.pop_back()); ERR_CONTINUE(!mi); @@ -619,6 +619,10 @@ void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory if (skin.is_null()) { continue; } + if (mutated_skins.has(skin)) { + continue; + } + mutated_skins.insert(skin); Node *node = mi->get_node(mi->get_skeleton_path()); ERR_CONTINUE(!node); @@ -638,8 +642,6 @@ void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory skin->set_bind_pose(i, adjust_transform * skin->get_bind_pose(i)); } } - - skin_idx++; } nodes = src_skeleton->get_children(); while (nodes.size()) {