浏览代码

Merge pull request #68993 from TokageItLab/fix-anim-blending-for-DISCRETE-mode

Fix animation blending for value track `UPDATE_DISCRETE` and `UPDATE_TRIGGER` mode
Rémi Verschelde 2 年之前
父节点
当前提交
a8a88194a5
共有 2 个文件被更改,包括 7 次插入0 次删除
  1. 6 0
      scene/animation/animation_tree.cpp
  2. 1 0
      scene/animation/animation_tree.h

+ 6 - 0
scene/animation/animation_tree.cpp

@@ -586,6 +586,7 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) {
 							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->subpath = leftover_path;
@@ -800,6 +801,7 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) {
 			} else if (track_cache_type == Animation::TYPE_VALUE) {
 				// If it has at least one angle interpolation, it also uses angle interpolation for blending.
 				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;
 			}
 
@@ -1658,6 +1660,10 @@ void AnimationTree::_process_graph(double p_delta) {
 				case Animation::TYPE_VALUE: {
 					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) {
 						t->object->set_indexed(t->subpath, t->value.operator real_t() >= 0.5);
 					} else {

+ 1 - 0
scene/animation/animation_tree.h

@@ -232,6 +232,7 @@ private:
 		Variant init_value;
 		Variant value;
 		Vector<StringName> subpath;
+		bool is_discrete = false;
 		bool is_using_angle = false;
 		TrackCacheValue() { type = Animation::TYPE_VALUE; }
 	};