Make backward be parameter of the AnimationTree in the NodeAnimation

(cherry picked from commit 652db79421)
This commit is contained in:
Silc Lizard (Tokage) Renew
2024-12-05 20:42:04 +09:00
committed by Spartan322
parent 67e6d77274
commit 082a4c6698
2 changed files with 25 additions and 8 deletions

View File

@@ -46,6 +46,18 @@ Vector<String> (*AnimationNodeAnimation::get_editable_animation_list)() = nullpt
void AnimationNodeAnimation::get_parameter_list(List<PropertyInfo> *r_list) const { void AnimationNodeAnimation::get_parameter_list(List<PropertyInfo> *r_list) const {
AnimationNode::get_parameter_list(r_list); 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 { AnimationNode::NodeTimeInfo AnimationNodeAnimation::get_node_time_info() const {
@@ -97,7 +109,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::process(const AnimationMixer
if (p_playback_info.seeked) { if (p_playback_info.seeked) {
pi.delta = get_node_time_info().position - p_playback_info.time; pi.delta = get_node_time_info().position - p_playback_info.time;
} else { } 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); 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_len = cur_nti.length;
double cur_time = p_playback_info.time; double cur_time = p_playback_info.time;
double cur_delta = p_playback_info.delta; double cur_delta = p_playback_info.delta;
bool cur_backward = get_parameter(backward);
Animation::LoopMode cur_loop_mode = cur_nti.loop_mode; Animation::LoopMode cur_loop_mode = cur_nti.loop_mode;
double prev_time = cur_nti.position; double prev_time = cur_nti.position;
@@ -147,13 +160,13 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
if (!Math::is_zero_approx(cur_len)) { if (!Math::is_zero_approx(cur_len)) {
cur_time = Math::fposmod(cur_time, cur_len); cur_time = Math::fposmod(cur_time, cur_len);
} }
backward = false; cur_backward = false;
} else { } else {
if (!Math::is_zero_approx(cur_len)) { if (!Math::is_zero_approx(cur_len)) {
if (Animation::is_greater_or_equal_approx(prev_time, 0) && Animation::is_less_approx(cur_time, 0)) { 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)) { } 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); cur_time = Math::pingpong(cur_time, cur_len);
} }
@@ -166,7 +179,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
cur_delta += cur_time - cur_len; cur_delta += cur_time - cur_len;
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 ended, don't progress AnimationNode. So set delta to 0.
if (!Math::is_zero_approx(cur_delta)) { if (!Math::is_zero_approx(cur_delta)) {
if (play_mode == PLAY_MODE_FORWARD) { if (play_mode == PLAY_MODE_FORWARD) {
@@ -259,6 +272,8 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
blend_animation(animation, pi); blend_animation(animation, pi);
} }
set_parameter(backward, cur_backward);
return nti; return nti;
} }
@@ -275,11 +290,11 @@ AnimationNodeAnimation::PlayMode AnimationNodeAnimation::get_play_mode() const {
} }
void AnimationNodeAnimation::set_backward(bool p_backward) { void AnimationNodeAnimation::set_backward(bool p_backward) {
backward = p_backward; set_parameter(backward, p_backward);
} }
bool AnimationNodeAnimation::is_backward() const { bool AnimationNodeAnimation::is_backward() const {
return backward; return get_parameter(backward);
} }
void AnimationNodeAnimation::set_use_custom_timeline(bool p_use_custom_timeline) { void AnimationNodeAnimation::set_use_custom_timeline(bool p_use_custom_timeline) {

View File

@@ -38,6 +38,8 @@
class AnimationNodeAnimation : public AnimationRootNode { class AnimationNodeAnimation : public AnimationRootNode {
GDCLASS(AnimationNodeAnimation, AnimationRootNode); GDCLASS(AnimationNodeAnimation, AnimationRootNode);
StringName backward = "backward"; // Only used by pingpong animation.
StringName animation; StringName animation;
bool use_custom_timeline = false; bool use_custom_timeline = false;
@@ -56,6 +58,7 @@ public:
}; };
void get_parameter_list(List<PropertyInfo> *r_list) const override; void get_parameter_list(List<PropertyInfo> *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(). virtual NodeTimeInfo get_node_time_info() const override; // Wrapper of get_parameter().
@@ -97,7 +100,6 @@ protected:
private: private:
PlayMode play_mode = PLAY_MODE_FORWARD; PlayMode play_mode = PLAY_MODE_FORWARD;
bool backward = false; // Only used by pingpong animation.
}; };
VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode) VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode)