Skip to content

Commit f1eb2f9

Browse files
committed
Merge pull request #100039 from TokageItLab/ping-pong-param
Make `backward` be parameter of the `AnimationTree` in the `AnimationNodeAnimation`
2 parents f08fe52 + 652db79 commit f1eb2f9

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

scene/animation/animation_blend_tree.cpp

+22-7
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ Vector<String> (*AnimationNodeAnimation::get_editable_animation_list)() = nullpt
4444

4545
void AnimationNodeAnimation::get_parameter_list(List<PropertyInfo> *r_list) const {
4646
AnimationNode::get_parameter_list(r_list);
47+
r_list->push_back(PropertyInfo(Variant::BOOL, backward, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE));
48+
}
49+
50+
Variant AnimationNodeAnimation::get_parameter_default_value(const StringName &p_parameter) const {
51+
Variant ret = AnimationNode::get_parameter_default_value(p_parameter);
52+
if (ret != Variant()) {
53+
return ret;
54+
}
55+
if (p_parameter == backward) {
56+
return false;
57+
}
58+
return 0;
4759
}
4860

4961
AnimationNode::NodeTimeInfo AnimationNodeAnimation::get_node_time_info() const {
@@ -97,7 +109,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::process(const AnimationMixer
97109
pi.delta = get_node_time_info().position - p_playback_info.time;
98110
}
99111
} else {
100-
pi.time = get_node_time_info().position + (backward ? -p_playback_info.delta : p_playback_info.delta);
112+
pi.time = get_node_time_info().position + (get_parameter(backward) ? -p_playback_info.delta : p_playback_info.delta);
101113
}
102114

103115
NodeTimeInfo nti = _process(pi, p_test_only);
@@ -130,6 +142,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
130142
double cur_len = cur_nti.length;
131143
double cur_time = p_playback_info.time;
132144
double cur_delta = p_playback_info.delta;
145+
bool cur_backward = get_parameter(backward);
133146

134147
Animation::LoopMode cur_loop_mode = cur_nti.loop_mode;
135148
double prev_time = cur_nti.position;
@@ -153,13 +166,13 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
153166
if (!Math::is_zero_approx(cur_len)) {
154167
cur_time = Math::fposmod(cur_time, cur_len);
155168
}
156-
backward = false;
169+
cur_backward = false;
157170
} else {
158171
if (!Math::is_zero_approx(cur_len)) {
159172
if (Animation::is_greater_or_equal_approx(prev_time, 0) && Animation::is_less_approx(cur_time, 0)) {
160-
backward = !backward;
173+
cur_backward = !cur_backward;
161174
} else if (Animation::is_less_or_equal_approx(prev_time, cur_len) && Animation::is_greater_approx(cur_time, cur_len)) {
162-
backward = !backward;
175+
cur_backward = !cur_backward;
163176
}
164177
cur_time = Math::pingpong(cur_time, cur_len);
165178
}
@@ -172,7 +185,7 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
172185
cur_delta += cur_time - cur_len;
173186
cur_time = cur_len;
174187
}
175-
backward = false;
188+
cur_backward = false;
176189
// If ended, don't progress AnimationNode. So set delta to 0.
177190
if (!Math::is_zero_approx(cur_delta)) {
178191
if (play_mode == PLAY_MODE_FORWARD) {
@@ -267,6 +280,8 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
267280
blend_animation(animation, pi);
268281
}
269282

283+
set_parameter(backward, cur_backward);
284+
270285
return nti;
271286
}
272287

@@ -283,11 +298,11 @@ AnimationNodeAnimation::PlayMode AnimationNodeAnimation::get_play_mode() const {
283298
}
284299

285300
void AnimationNodeAnimation::set_backward(bool p_backward) {
286-
backward = p_backward;
301+
set_parameter(backward, p_backward);
287302
}
288303

289304
bool AnimationNodeAnimation::is_backward() const {
290-
return backward;
305+
return get_parameter(backward);
291306
}
292307

293308
void AnimationNodeAnimation::set_advance_on_start(bool p_advance_on_start) {

scene/animation/animation_blend_tree.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
class AnimationNodeAnimation : public AnimationRootNode {
3737
GDCLASS(AnimationNodeAnimation, AnimationRootNode);
3838

39+
StringName backward = "backward"; // Only used by pingpong animation.
40+
3941
StringName animation;
4042

4143
bool advance_on_start = false;
@@ -56,6 +58,7 @@ class AnimationNodeAnimation : public AnimationRootNode {
5658
};
5759

5860
void get_parameter_list(List<PropertyInfo> *r_list) const override;
61+
virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
5962

6063
virtual NodeTimeInfo get_node_time_info() const override; // Wrapper of get_parameter().
6164

@@ -100,7 +103,6 @@ class AnimationNodeAnimation : public AnimationRootNode {
100103

101104
private:
102105
PlayMode play_mode = PLAY_MODE_FORWARD;
103-
bool backward = false; // Only used by pingpong animation.
104106
};
105107

106108
VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode)

0 commit comments

Comments
 (0)