diff options
| author | Rémi Verschelde <rverschelde@gmail.com> | 2024-06-17 10:58:57 +0200 |
|---|---|---|
| committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-06-17 10:58:57 +0200 |
| commit | ab91c3638ccd40fc73e28a36ad82b525886814cf (patch) | |
| tree | 391871a7b9b05815b01a0f19510c2a42e3f599c8 | |
| parent | 47d778e143523418fe055f4f2ed66ca37a92e550 (diff) | |
| parent | 049c1a569957a129ca25cd3a7453b53db5f287ea (diff) | |
| download | redot-engine-ab91c3638ccd40fc73e28a36ad82b525886814cf.tar.gz | |
Merge pull request #93185 from TokageItLab/fix-force-continuous
Fix force continuous with un-interpolatable value is not applied correctly
| -rw-r--r-- | scene/animation/animation_mixer.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/scene/animation/animation_mixer.cpp b/scene/animation/animation_mixer.cpp index 5074145168..afd292e552 100644 --- a/scene/animation/animation_mixer.cpp +++ b/scene/animation/animation_mixer.cpp @@ -1426,13 +1426,32 @@ void AnimationMixer::_blend_process(double p_delta, bool p_update_only) { bool is_value = ttype == Animation::TYPE_VALUE; bool is_discrete = is_value && a->value_track_get_update_mode(i) == Animation::UPDATE_DISCRETE; bool force_continuous = callback_mode_discrete == ANIMATION_CALLBACK_MODE_DISCRETE_FORCE_CONTINUOUS; - if (t->is_variant_interpolatable && (!is_discrete || force_continuous)) { + if (!is_discrete || force_continuous) { t->use_continuous = true; - Variant value = is_value ? a->value_track_interpolate(i, time, is_discrete && force_continuous ? backward : false) : Variant(a->bezier_track_interpolate(i, time)); - value = post_process_key_value(a, i, value, t->object_id); - if (value == Variant()) { + + Variant value; + if (t->is_variant_interpolatable) { + value = is_value ? a->value_track_interpolate(i, time, is_discrete && force_continuous ? backward : false) : Variant(a->bezier_track_interpolate(i, time)); + value = post_process_key_value(a, i, value, t->object_id); + if (value == Variant()) { + continue; + } + } else { + // Discrete track sets the value in the current _blend_process() function, + // but Force Continuous track does not set the value here because the value must be set in the _blend_apply() function later. + int idx = a->track_find_key(i, time, Animation::FIND_MODE_NEAREST, false, backward); + if (idx < 0) { + continue; + } + value = a->track_get_key_value(i, idx); + value = post_process_key_value(a, i, value, t->object_id); + if (value == Variant()) { + continue; + } + t->value = value; continue; } + // Special case for angle interpolation. if (t->is_using_angle) { // For blending consistency, it prevents rotation of more than 180 degrees from init_value. |
