Sfoglia il codice sorgente

Fix syncing PhysicalBone internal poses individually

(cherry picked from commit 2b3cf2451f1dae92d98b7ba05c895d31f6ad3bcb)
Silc Lizard (Tokage) Renew 1 anno fa
parent
commit
7b32e96f3d

+ 7 - 1
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);

+ 1 - 0
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;