Skip to content

Commit

Permalink
Merge pull request #100039 from TokageItLab/ping-pong-param
Browse files Browse the repository at this point in the history
Make `backward` be parameter of the `AnimationTree` in the `AnimationNodeAnimation`
  • Loading branch information
akien-mga committed Dec 17, 2024
2 parents f08fe52 + 652db79 commit f1eb2f9
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 8 deletions.
29 changes: 22 additions & 7 deletions scene/animation/animation_blend_tree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@ Vector<String> (*AnimationNodeAnimation::get_editable_animation_list)() = nullpt

void AnimationNodeAnimation::get_parameter_list(List<PropertyInfo> *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 {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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);
}
Expand All @@ -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) {
Expand Down Expand Up @@ -267,6 +280,8 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
blend_animation(animation, pi);
}

set_parameter(backward, cur_backward);

return nti;
}

Expand All @@ -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) {
Expand Down
4 changes: 3 additions & 1 deletion scene/animation/animation_blend_tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -56,6 +58,7 @@ class AnimationNodeAnimation : public AnimationRootNode {
};

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().

Expand Down Expand Up @@ -100,7 +103,6 @@ class AnimationNodeAnimation : public AnimationRootNode {

private:
PlayMode play_mode = PLAY_MODE_FORWARD;
bool backward = false; // Only used by pingpong animation.
};

VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode)
Expand Down

0 comments on commit f1eb2f9

Please sign in to comment.