From 5d1a2a421685dbdcf0e77cb05a01eae79302d98f Mon Sep 17 00:00:00 2001 From: "Silc Lizard (Tokage) Renew" <61938263+TokageItLab@users.noreply.github.com> Date: Sat, 26 Oct 2024 06:31:51 +0900 Subject: [PATCH] Fix Skeleton doesn't update skin after deactivating modifiers --- scene/3d/skeleton_3d.cpp | 4 ++++ scene/3d/skeleton_3d.h | 1 + scene/3d/skeleton_modifier_3d.cpp | 16 ++++++++++++++++ scene/3d/skeleton_modifier_3d.h | 1 + 4 files changed, 22 insertions(+) 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);