|
@@ -693,6 +693,9 @@ bool AnimationMixer::_update_caches() {
|
|
|
track_value->init_value = anim->track_get_key_value(i, 0);
|
|
|
track_value->init_value.zero();
|
|
|
|
|
|
+ // Can't interpolate them, need to convert.
|
|
|
+ track_value->is_variant_interpolatable = Animation::is_variant_interpolatable(track_value->init_value);
|
|
|
+
|
|
|
// If there is a Reset Animation, it takes precedence by overwriting.
|
|
|
if (has_reset_anim) {
|
|
|
int rt = reset_anim->find_track(path, track_src_type);
|
|
@@ -1414,7 +1417,7 @@ 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 (!is_discrete || force_continuous) {
|
|
|
+ if (t->is_variant_interpolatable && (!is_discrete || force_continuous)) {
|
|
|
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()) {
|
|
@@ -1727,7 +1730,7 @@ void AnimationMixer::_blend_apply() {
|
|
|
case Animation::TYPE_VALUE: {
|
|
|
TrackCacheValue *t = static_cast<TrackCacheValue *>(track);
|
|
|
|
|
|
- if (callback_mode_discrete == ANIMATION_CALLBACK_MODE_DISCRETE_DOMINANT && t->use_discrete) {
|
|
|
+ if (!t->is_variant_interpolatable || (callback_mode_discrete == ANIMATION_CALLBACK_MODE_DISCRETE_DOMINANT && t->use_discrete)) {
|
|
|
break; // Don't overwrite the value set by UPDATE_DISCRETE.
|
|
|
}
|
|
|
|