From f8da9460c1e1eccabde863785abcb1a4d3a1fbda Mon Sep 17 00:00:00 2001 From: "Silc Lizard (Tokage) Renew" <61938263+TokageItLab@users.noreply.github.com> Date: Sat, 16 Dec 2023 09:42:48 +0900 Subject: [PATCH] Make default blend_left consider current blend amount --- scene/animation/animation_player.cpp | 23 +++++++++++++---------- scene/animation/animation_player.h | 2 ++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index b7bed59c0003..36f1cd01f497 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -241,6 +241,16 @@ void AnimationPlayer::_process_playback_data(PlaybackData &cd, double p_delta, f make_animation_instance(cd.from->name, pi); } +float AnimationPlayer::get_current_blend_amount() { + Playback &c = playback; + float blend = 1.0; + for (List::Element *E = c.blend.front(); E; E = E->next()) { + Blend &b = E->get(); + blend = blend - b.blend_left; + } + return MAX(0, blend); +} + void AnimationPlayer::_blend_playback_data(double p_delta, bool p_started) { Playback &c = playback; @@ -250,16 +260,8 @@ void AnimationPlayer::_blend_playback_data(double p_delta, bool p_started) { c.seeked = false; } - // First, calc all blends weight. - float blend = 1.0; - for (List::Element *E = c.blend.front(); E; E = E->next()) { - Blend &b = E->get(); - blend = MAX(0, blend - b.blend_left); - b.blend_left = MAX(0, b.blend_left - Math::absf(speed_scale * p_delta) / b.blend_time); - } - // Second, process current animation to check if the animation end reached. - _process_playback_data(c.current, p_delta, blend, seeked, p_started, true); + _process_playback_data(c.current, p_delta, get_current_blend_amount(), seeked, p_started, true); // Finally, if not end the animation, do blending. if (end_reached) { @@ -269,6 +271,7 @@ void AnimationPlayer::_blend_playback_data(double p_delta, bool p_started) { List::Element *> to_erase; for (List::Element *E = c.blend.front(); E; E = E->next()) { Blend &b = E->get(); + b.blend_left = MAX(0, b.blend_left - Math::absf(speed_scale * p_delta) / b.blend_time); if (b.blend_left <= 0) { to_erase.push_back(E); b.blend_left = CMP_EPSILON; // May want to play last frame. @@ -405,7 +408,7 @@ void AnimationPlayer::play(const StringName &p_name, double p_custom_blend, floa if (blend_time > 0) { Blend b; b.data = c.current; - b.blend_left = 1.0; + b.blend_left = get_current_blend_amount(); b.blend_time = blend_time; c.blend.push_back(b); } else { diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index 74f9323e2b66..16bca45d4b7b 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -113,6 +113,8 @@ class AnimationPlayer : public AnimationMixer { void _stop_internal(bool p_reset, bool p_keep_state); void _check_immediately_after_start(); + float get_current_blend_amount(); + bool playing = false; protected: