Browse Source

Merge pull request #101451 from TokageItLab/reset-retarget-in-the-child

Force update RetargetModifier3D's child skeletons on save
Rémi Verschelde 7 months ago
parent
commit
d79ff848fa
2 changed files with 18 additions and 0 deletions
  1. 14 0
      scene/3d/retarget_modifier_3d.cpp
  2. 4 0
      scene/3d/retarget_modifier_3d.h

+ 14 - 0
scene/3d/retarget_modifier_3d.cpp

@@ -213,6 +213,19 @@ void RetargetModifier3D::_reset_child_skeletons() {
 	child_skeletons.clear();
 	child_skeletons.clear();
 }
 }
 
 
+#ifdef TOOLS_ENABLED
+void RetargetModifier3D::_force_update_child_skeletons() {
+	for (const RetargetInfo &E : child_skeletons) {
+		Skeleton3D *c = Object::cast_to<Skeleton3D>(ObjectDB::get_instance(E.skeleton_id));
+		if (!c) {
+			continue;
+		}
+		c->force_update_all_dirty_bones();
+		c->emit_signal(SceneStringName(skeleton_updated));
+	}
+}
+#endif // TOOLS_ENABLED
+
 /// General functions
 /// General functions
 
 
 void RetargetModifier3D::add_child_notify(Node *p_child) {
 void RetargetModifier3D::add_child_notify(Node *p_child) {
@@ -455,6 +468,7 @@ void RetargetModifier3D::_notification(int p_what) {
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 		case NOTIFICATION_EDITOR_PRE_SAVE: {
 		case NOTIFICATION_EDITOR_PRE_SAVE: {
 			_reset_child_skeleton_poses();
 			_reset_child_skeleton_poses();
+			_force_update_child_skeletons();
 		} break;
 		} break;
 #endif // TOOLS_ENABLED
 #endif // TOOLS_ENABLED
 		case NOTIFICATION_EXIT_TREE: {
 		case NOTIFICATION_EXIT_TREE: {

+ 4 - 0
scene/3d/retarget_modifier_3d.h

@@ -70,6 +70,10 @@ private:
 	void _reset_child_skeleton_poses();
 	void _reset_child_skeleton_poses();
 	void _reset_child_skeletons();
 	void _reset_child_skeletons();
 
 
+#ifdef TOOLS_ENABLED
+	void _force_update_child_skeletons();
+#endif // TOOLS_ENABLED
+
 	void cache_rests_with_reset();
 	void cache_rests_with_reset();
 	void cache_rests();
 	void cache_rests();
 	Vector<RetargetBoneInfo> cache_bone_global_rests(Skeleton3D *p_skeleton);
 	Vector<RetargetBoneInfo> cache_bone_global_rests(Skeleton3D *p_skeleton);