From 7b32e96f3dde86a1c5832918fde3d2ba59e63b3d Mon Sep 17 00:00:00 2001 From: "Silc Lizard (Tokage) Renew" <61938263+TokageItLab@users.noreply.github.com> Date: Sun, 15 Sep 2024 01:41:39 +0900 Subject: [PATCH] Fix syncing PhysicalBone internal poses individually (cherry picked from commit 2b3cf2451f1dae92d98b7ba05c895d31f6ad3bcb) --- scene/3d/physical_bone_simulator_3d.cpp | 8 +++++++- scene/3d/physical_bone_simulator_3d.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/scene/3d/physical_bone_simulator_3d.cpp b/scene/3d/physical_bone_simulator_3d.cpp index 510d887c831..8874c9cfc6e 100644 --- a/scene/3d/physical_bone_simulator_3d.cpp +++ b/scene/3d/physical_bone_simulator_3d.cpp @@ -73,10 +73,15 @@ void PhysicalBoneSimulator3D::_pose_updated() { } ERR_FAIL_COND(skeleton->get_bone_count() != bones.size()); for (int i = 0; i < skeleton->get_bone_count(); i++) { - bones.write[i].global_pose = skeleton->get_bone_global_pose(i); + _bone_pose_updated(skeleton, i); } } +void PhysicalBoneSimulator3D::_bone_pose_updated(Skeleton3D *p_skeleton, int p_bone_id) { + ERR_FAIL_INDEX(p_bone_id, bones.size()); + bones.write[p_bone_id].global_pose = p_skeleton->get_bone_global_pose(p_bone_id); +} + void PhysicalBoneSimulator3D::_set_active(bool p_active) { if (!Engine::get_singleton()->is_editor_hint()) { _reset_physical_bones_state(); @@ -363,6 +368,7 @@ void PhysicalBoneSimulator3D::_process_modification() { continue; } if (bones[i].physical_bone->is_simulating_physics() == false) { + _bone_pose_updated(skeleton, i); bones[i].physical_bone->reset_to_rest_position(); } else if (simulating) { skeleton->set_bone_global_pose(i, bones[i].global_pose); diff --git a/scene/3d/physical_bone_simulator_3d.h b/scene/3d/physical_bone_simulator_3d.h index ddc9cd569a3..24136be2b81 100644 --- a/scene/3d/physical_bone_simulator_3d.h +++ b/scene/3d/physical_bone_simulator_3d.h @@ -73,6 +73,7 @@ protected: void _bone_list_changed(); void _pose_updated(); + void _bone_pose_updated(Skeleton3D *skeleton, int p_bone_id); virtual void _process_modification() override;