diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index e172286d05..8e86dbe414 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -44,6 +44,18 @@ Vector (*AnimationNodeAnimation::get_editable_animation_list)() = nullpt void AnimationNodeAnimation::get_parameter_list(List *r_list) const { AnimationNode::get_parameter_list(r_list); + r_list->push_back(PropertyInfo(Variant::BOOL, backward, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE)); +} + +Variant AnimationNodeAnimation::get_parameter_default_value(const StringName &p_parameter) const { + Variant ret = AnimationNode::get_parameter_default_value(p_parameter); + if (ret != Variant()) { + return ret; + } + if (p_parameter == backward) { + return false; + } + return 0; } AnimationNode::NodeTimeInfo AnimationNodeAnimation::get_node_time_info() const { @@ -97,7 +109,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::process(const AnimationMixer pi.delta = get_node_time_info().position - p_playback_info.time; } } else { - pi.time = get_node_time_info().position + (backward ? -p_playback_info.delta : p_playback_info.delta); + pi.time = get_node_time_info().position + (get_parameter(backward) ? -p_playback_info.delta : p_playback_info.delta); } NodeTimeInfo nti = _process(pi, p_test_only); @@ -130,6 +142,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe double cur_len = cur_nti.length; double cur_time = p_playback_info.time; double cur_delta = p_playback_info.delta; + bool cur_backward = get_parameter(backward); Animation::LoopMode cur_loop_mode = cur_nti.loop_mode; double prev_time = cur_nti.position; @@ -153,13 +166,13 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe if (!Math::is_zero_approx(cur_len)) { cur_time = Math::fposmod(cur_time, cur_len); } - backward = false; + cur_backward = false; } else { if (!Math::is_zero_approx(cur_len)) { if (Animation::is_greater_or_equal_approx(prev_time, 0) && Animation::is_less_approx(cur_time, 0)) { - backward = !backward; + cur_backward = !cur_backward; } else if (Animation::is_less_or_equal_approx(prev_time, cur_len) && Animation::is_greater_approx(cur_time, cur_len)) { - backward = !backward; + cur_backward = !cur_backward; } cur_time = Math::pingpong(cur_time, cur_len); } @@ -172,7 +185,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe cur_delta += cur_time - cur_len; cur_time = cur_len; } - backward = false; + cur_backward = false; // If ended, don't progress AnimationNode. So set delta to 0. if (!Math::is_zero_approx(cur_delta)) { if (play_mode == PLAY_MODE_FORWARD) { @@ -267,6 +280,8 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe blend_animation(animation, pi); } + set_parameter(backward, cur_backward); + return nti; } @@ -283,11 +298,11 @@ AnimationNodeAnimation::PlayMode AnimationNodeAnimation::get_play_mode() const { } void AnimationNodeAnimation::set_backward(bool p_backward) { - backward = p_backward; + set_parameter(backward, p_backward); } bool AnimationNodeAnimation::is_backward() const { - return backward; + return get_parameter(backward); } void AnimationNodeAnimation::set_advance_on_start(bool p_advance_on_start) { diff --git a/scene/animation/animation_blend_tree.h b/scene/animation/animation_blend_tree.h index 5c912f0095..7f7a00ea60 100644 --- a/scene/animation/animation_blend_tree.h +++ b/scene/animation/animation_blend_tree.h @@ -36,6 +36,8 @@ class AnimationNodeAnimation : public AnimationRootNode { GDCLASS(AnimationNodeAnimation, AnimationRootNode); + StringName backward = "backward"; // Only used by pingpong animation. + StringName animation; bool advance_on_start = false; @@ -56,6 +58,7 @@ public: }; void get_parameter_list(List *r_list) const override; + virtual Variant get_parameter_default_value(const StringName &p_parameter) const override; virtual NodeTimeInfo get_node_time_info() const override; // Wrapper of get_parameter(). @@ -100,7 +103,6 @@ protected: private: PlayMode play_mode = PLAY_MODE_FORWARD; - bool backward = false; // Only used by pingpong animation. }; VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode)