You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Make backward be parameter of the AnimationTree in the NodeAnimation
This commit is contained in:
@@ -44,6 +44,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
|
|||||||
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;
|
||||||
@@ -153,13 +166,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);
|
||||||
}
|
}
|
||||||
@@ -172,7 +185,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) {
|
||||||
@@ -267,6 +280,8 @@ AnimationNode::NodeTimeInfo AnimationNodeAnimation::_process(const AnimationMixe
|
|||||||
blend_animation(animation, pi);
|
blend_animation(animation, pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_parameter(backward, cur_backward);
|
||||||
|
|
||||||
return nti;
|
return nti;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,11 +298,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_advance_on_start(bool p_advance_on_start) {
|
void AnimationNodeAnimation::set_advance_on_start(bool p_advance_on_start) {
|
||||||
|
|||||||
@@ -36,6 +36,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 advance_on_start = false;
|
bool advance_on_start = 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().
|
||||||
|
|
||||||
@@ -100,7 +103,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)
|
||||||
|
|||||||
Reference in New Issue
Block a user