Browse Source

Make `backward` be parameter of the AnimationTree in the NodeAnimation

Silc Lizard (Tokage) Renew 8 months ago
parent
commit
652db79421
2 changed files with 25 additions and 8 deletions
  1. 22 7
      scene/animation/animation_blend_tree.cpp
  2. 3 1
      scene/animation/animation_blend_tree.h

+ 22 - 7
scene/animation/animation_blend_tree.cpp

@@ -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) {

+ 3 - 1
scene/animation/animation_blend_tree.h

@@ -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)