diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp index abece303d1c..b51d8a34387 100644 --- a/scene/3d/skeleton_3d.cpp +++ b/scene/3d/skeleton_3d.cpp @@ -1032,6 +1032,10 @@ Ref Skeleton3D::register_skin(const Ref &p_skin) { return skin_ref; } +void Skeleton3D::force_update_deferred() { + _make_dirty(); +} + void Skeleton3D::force_update_all_dirty_bones() { if (!dirty) { return; diff --git a/scene/3d/skeleton_3d.h b/scene/3d/skeleton_3d.h index 90902f71e2f..6c51c172afb 100644 --- a/scene/3d/skeleton_3d.h +++ b/scene/3d/skeleton_3d.h @@ -284,6 +284,7 @@ public: void force_update_all_dirty_bones(); void force_update_all_bone_transforms(); void force_update_bone_children_transforms(int bone_idx); + void force_update_deferred(); void set_modifier_callback_mode_process(ModifierCallbackModeProcess p_mode); ModifierCallbackModeProcess get_modifier_callback_mode_process() const; diff --git a/scene/3d/skeleton_modifier_3d.cpp b/scene/3d/skeleton_modifier_3d.cpp index d5c603112ea..e8a8e517a2e 100644 --- a/scene/3d/skeleton_modifier_3d.cpp +++ b/scene/3d/skeleton_modifier_3d.cpp @@ -75,6 +75,17 @@ void SkeletonModifier3D::_skeleton_changed(Skeleton3D *p_old, Skeleton3D *p_new) // } +void SkeletonModifier3D::_force_update_skeleton_skin() { + if (!is_inside_tree()) { + return; + } + Skeleton3D *skeleton = get_skeleton(); + if (!skeleton) { + return; + } + skeleton->force_update_deferred(); +} + /* Process */ void SkeletonModifier3D::set_active(bool p_active) { @@ -83,6 +94,7 @@ void SkeletonModifier3D::set_active(bool p_active) { } active = p_active; _set_active(active); + _force_update_skeleton_skin(); } bool SkeletonModifier3D::is_active() const { @@ -119,6 +131,10 @@ void SkeletonModifier3D::_notification(int p_what) { case NOTIFICATION_PARENTED: { _update_skeleton(); } break; + case NOTIFICATION_EXIT_TREE: + case NOTIFICATION_UNPARENTED: { + _force_update_skeleton_skin(); + } break; } } diff --git a/scene/3d/skeleton_modifier_3d.h b/scene/3d/skeleton_modifier_3d.h index d00a1e94a99..728b000ff52 100644 --- a/scene/3d/skeleton_modifier_3d.h +++ b/scene/3d/skeleton_modifier_3d.h @@ -50,6 +50,7 @@ protected: void _update_skeleton(); void _update_skeleton_path(); + void _force_update_skeleton_skin(); virtual void _skeleton_changed(Skeleton3D *p_old, Skeleton3D *p_new);