From fbb37196fd5537633fc70e476c8d6262ee2f5880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Tue, 9 Feb 2021 21:41:48 +0100 Subject: Fix animation reset-on-save on inactive scene tabs --- scene/animation/animation_player.cpp | 13 +++++++------ scene/animation/animation_player.h | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index c6554462f7..8ea0c5e6e2 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -229,13 +229,13 @@ void AnimationPlayer::_notification(int p_what) { } } -void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim) { +void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim, Node *p_root_override) { // Already cached? if (p_anim->node_cache.size() == p_anim->animation->get_track_count()) { return; } - Node *parent = get_node(root); + Node *parent = p_root_override ? p_root_override : get_node(root); ERR_FAIL_COND(!parent); @@ -1497,13 +1497,13 @@ void AnimationPlayer::get_argument_options(const StringName &p_function, int p_i } #ifdef TOOLS_ENABLED -Ref AnimationPlayer::backup_animated_values() { +Ref AnimationPlayer::backup_animated_values(Node *p_root_override) { Ref backup; if (!playback.current.from) { return backup; } - _ensure_node_caches(playback.current.from); + _ensure_node_caches(playback.current.from, p_root_override); backup.instance(); for (int i = 0; i < playback.current.from->node_cache.size(); i++) { @@ -1560,10 +1560,11 @@ Ref AnimationPlayer::apply_reset(bool p_user_initiated) { AnimationPlayer *aux_player = memnew(AnimationPlayer); EditorNode::get_singleton()->add_child(aux_player); - aux_player->set_root(aux_player->get_path_to(root_node)); aux_player->add_animation("RESET", reset_anim); aux_player->set_assigned_animation("RESET"); - Ref old_values = aux_player->backup_animated_values(); + // Forcing the use of the original root because the scene where original player belongs may be not the active one + Node *root = get_node(get_root()); + Ref old_values = aux_player->backup_animated_values(root); aux_player->seek(0.0f, true); aux_player->queue_delete(); diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index c04eeeca68..f2774cb395 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -215,7 +215,7 @@ private: void _animation_process_animation(AnimationData *p_anim, float p_time, float p_delta, float p_interp, bool p_is_current = true, bool p_seeked = false, bool p_started = false); - void _ensure_node_caches(AnimationData *p_anim); + void _ensure_node_caches(AnimationData *p_anim, Node *p_root_override = nullptr); void _animation_process_data(PlaybackData &cd, float p_delta, float p_blend, bool p_seeked, bool p_started); void _animation_process2(float p_delta, bool p_started); void _animation_update_transforms(); @@ -319,7 +319,7 @@ public: void get_argument_options(const StringName &p_function, int p_idx, List *r_options) const override; #ifdef TOOLS_ENABLED - Ref backup_animated_values(); + Ref backup_animated_values(Node *p_root_override = nullptr); Ref apply_reset(bool p_user_initiated = false); bool can_apply_reset() const; #endif -- cgit v1.2.3