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.
This commit is contained in:
Lyuma 2023-05-26 00:46:41 -07:00
parent 2eec9a67d5
commit 5ae311e577

View File

@ -609,8 +609,8 @@ void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory
if (is_rest_changed) { if (is_rest_changed) {
// Fix skin. // Fix skin.
{ {
HashSet<Ref<Skin>> mutated_skins;
TypedArray<Node> nodes = p_base_scene->find_children("*", "ImporterMeshInstance3D"); TypedArray<Node> nodes = p_base_scene->find_children("*", "ImporterMeshInstance3D");
int skin_idx = 0;
while (nodes.size()) { while (nodes.size()) {
ImporterMeshInstance3D *mi = Object::cast_to<ImporterMeshInstance3D>(nodes.pop_back()); ImporterMeshInstance3D *mi = Object::cast_to<ImporterMeshInstance3D>(nodes.pop_back());
ERR_CONTINUE(!mi); ERR_CONTINUE(!mi);
@ -619,6 +619,10 @@ void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory
if (skin.is_null()) { if (skin.is_null()) {
continue; continue;
} }
if (mutated_skins.has(skin)) {
continue;
}
mutated_skins.insert(skin);
Node *node = mi->get_node(mi->get_skeleton_path()); Node *node = mi->get_node(mi->get_skeleton_path());
ERR_CONTINUE(!node); 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->set_bind_pose(i, adjust_transform * skin->get_bind_pose(i));
} }
} }
skin_idx++;
} }
nodes = src_skeleton->get_children(); nodes = src_skeleton->get_children();
while (nodes.size()) { while (nodes.size()) {