summaryrefslogtreecommitdiffstats
path: root/scene/animation/animation_mixer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/animation/animation_mixer.cpp')
-rw-r--r--scene/animation/animation_mixer.cpp27
1 files changed, 13 insertions, 14 deletions
diff --git a/scene/animation/animation_mixer.cpp b/scene/animation/animation_mixer.cpp
index 4240df9d27..87ac0bf5c8 100644
--- a/scene/animation/animation_mixer.cpp
+++ b/scene/animation/animation_mixer.cpp
@@ -661,13 +661,6 @@ bool AnimationMixer::_update_caches() {
Ref<Resource> resource;
Vector<StringName> leftover_path;
- if (!parent->has_node_and_resource(path)) {
- if (check_path) {
- WARN_PRINT_ED(mixer_name + ": '" + String(E) + "', couldn't resolve track: '" + String(path) + "'. This warning can be disabled in Project Settings.");
- }
- continue;
- }
-
Node *child = parent->get_node_and_resource(path, resource, leftover_path);
if (!child) {
if (check_path) {
@@ -872,13 +865,12 @@ bool AnimationMixer::_update_caches() {
}
} else if (track_cache_type == Animation::TYPE_VALUE) {
TrackCacheValue *track_value = static_cast<TrackCacheValue *>(track);
- if (track_value->init_value.is_string() && anim->value_track_get_update_mode(i) != Animation::UPDATE_DISCRETE) {
- WARN_PRINT_ONCE_ED(mixer_name + ": '" + String(E) + "', Value Track: '" + String(path) + "' blends String types. This is an experimental algorithm.");
- }
-
// If it has at least one angle interpolation, it also uses angle interpolation for blending.
bool was_using_angle = track_value->is_using_angle;
if (track_src_type == Animation::TYPE_VALUE) {
+ if (track_value->init_value.is_string() && anim->value_track_get_update_mode(i) != Animation::UPDATE_DISCRETE) {
+ WARN_PRINT_ONCE_ED(mixer_name + ": '" + String(E) + "', Value Track: '" + String(path) + "' blends String types. This is an experimental algorithm.");
+ }
track_value->is_using_angle |= anim->track_get_interpolation_type(i) == Animation::INTERPOLATION_LINEAR_ANGLE || anim->track_get_interpolation_type(i) == Animation::INTERPOLATION_CUBIC_ANGLE;
}
if (check_angle_interpolation && (was_using_angle != track_value->is_using_angle)) {
@@ -1419,10 +1411,11 @@ void AnimationMixer::_blend_process(double p_delta, bool p_update_only) {
continue; // Nothing to blend.
}
TrackCacheValue *t = static_cast<TrackCacheValue *>(track);
- bool is_discrete = a->value_track_get_update_mode(i) == Animation::UPDATE_DISCRETE;
+ 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) {
- Variant value = ttype == Animation::TYPE_VALUE ? a->value_track_interpolate(i, time, is_discrete && force_continuous ? backward : false) : Variant(a->bezier_track_interpolate(i, time));
+ 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()) {
continue;
@@ -1974,7 +1967,13 @@ void AnimationMixer::_build_backup_track_cache() {
TrackCacheValue *t = static_cast<TrackCacheValue *>(track);
Object *t_obj = ObjectDB::get_instance(t->object_id);
if (t_obj) {
- t->value = t_obj->get_indexed(t->subpath);
+ t->value = Animation::cast_to_blendwise(t_obj->get_indexed(t->subpath));
+ }
+ t->use_discrete = false;
+ if (t->init_value.is_array()) {
+ t->element_size = MAX(t->element_size.operator int(), (t->value.operator Array()).size());
+ } else if (t->init_value.is_string()) {
+ t->element_size = (real_t)(t->value.operator Array()).size();
}
} break;
case Animation::TYPE_AUDIO: {