You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Fix animation blending for value track DISCRETE/TRIGGER mode
This commit is contained in:
@@ -589,6 +589,7 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) {
|
|||||||
track_value->object = child;
|
track_value->object = child;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
track_value->is_discrete = anim->value_track_get_update_mode(i) == Animation::UPDATE_DISCRETE || anim->value_track_get_update_mode(i) == Animation::UPDATE_TRIGGER;
|
||||||
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;
|
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;
|
||||||
|
|
||||||
track_value->subpath = leftover_path;
|
track_value->subpath = leftover_path;
|
||||||
@@ -796,6 +797,7 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) {
|
|||||||
} else if (track_cache_type == Animation::TYPE_VALUE) {
|
} else if (track_cache_type == Animation::TYPE_VALUE) {
|
||||||
// If it has at least one angle interpolation, it also uses angle interpolation for blending.
|
// If it has at least one angle interpolation, it also uses angle interpolation for blending.
|
||||||
TrackCacheValue *track_value = memnew(TrackCacheValue);
|
TrackCacheValue *track_value = memnew(TrackCacheValue);
|
||||||
|
track_value->is_discrete |= anim->value_track_get_update_mode(i) == Animation::UPDATE_DISCRETE || anim->value_track_get_update_mode(i) == Animation::UPDATE_TRIGGER;
|
||||||
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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1691,6 +1693,10 @@ void AnimationTree::_process_graph(double p_delta) {
|
|||||||
case Animation::TYPE_VALUE: {
|
case Animation::TYPE_VALUE: {
|
||||||
TrackCacheValue *t = static_cast<TrackCacheValue *>(track);
|
TrackCacheValue *t = static_cast<TrackCacheValue *>(track);
|
||||||
|
|
||||||
|
if (t->is_discrete) {
|
||||||
|
break; // Don't overwrite the value set by UPDATE_DISCRETE or UPDATE_TRIGGER.
|
||||||
|
}
|
||||||
|
|
||||||
if (t->init_value.get_type() == Variant::BOOL) {
|
if (t->init_value.get_type() == Variant::BOOL) {
|
||||||
t->object->set_indexed(t->subpath, t->value.operator real_t() >= 0.5);
|
t->object->set_indexed(t->subpath, t->value.operator real_t() >= 0.5);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ private:
|
|||||||
Variant init_value;
|
Variant init_value;
|
||||||
Variant value;
|
Variant value;
|
||||||
Vector<StringName> subpath;
|
Vector<StringName> subpath;
|
||||||
|
bool is_discrete = false;
|
||||||
bool is_using_angle = false;
|
bool is_using_angle = false;
|
||||||
TrackCacheValue() { type = Animation::TYPE_VALUE; }
|
TrackCacheValue() { type = Animation::TYPE_VALUE; }
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user