Browse Source

Merge pull request #19774 from karroffel/blendspace-1d-sync-fix

ensure BlendSpace1D syncs animations
Rémi Verschelde 7 năm trước cách đây
mục cha
commit
e574c7cedc
1 tập tin đã thay đổi với 20 bổ sung8 xóa
  1. 20 8
      scene/animation/animation_blend_space_1d.cpp

+ 20 - 8
scene/animation/animation_blend_space_1d.cpp

@@ -187,6 +187,8 @@ float AnimationNodeBlendSpace1D::process(float p_time, bool p_seek) {
 		return blend_node(blend_points[0].node, p_time, p_seek, 1.0, FILTER_IGNORE, false);
 	}
 
+	float weights[MAX_BLEND_POINTS] = {};
+
 	int point_lower = -1;
 	float pos_lower = 0.0;
 	int point_higher = -1;
@@ -216,18 +218,21 @@ float AnimationNodeBlendSpace1D::process(float p_time, bool p_seek) {
 		}
 	}
 
+	// fill in weights
+
 	if (point_lower == -1) {
 		// we are on the left side, no other point to the left
 		// we just play the next point.
 
-		return blend_node(blend_points[point_higher].node, p_time, p_seek, 1.0, FILTER_IGNORE, false);
+		weights[point_higher] = 1.0;
 	} else if (point_higher == -1) {
 		// we are on the right side, no other point to the right
 		// we just play the previous point
-		return blend_node(blend_points[point_lower].node, p_time, p_seek, 1.0, FILTER_IGNORE, false);
+
+		weights[point_lower] = 1.0;
 	} else {
 
-		//w we are between two points.
+		// we are between two points.
 		// figure out weights, then blend the animations
 
 		float distance_between_points = pos_higher - pos_lower;
@@ -239,14 +244,21 @@ float AnimationNodeBlendSpace1D::process(float p_time, bool p_seek) {
 		float blend_lower = 1.0 - blend_percentage;
 		float blend_higher = blend_percentage;
 
-		float time_remaining_lower = 0.0;
-		float time_remaining_higher = 0.0;
+		weights[point_lower] = blend_lower;
+		weights[point_higher] = blend_higher;
+	}
+
+	// actually blend the animations now
+
+	float max_time_remaining = 0.0;
 
-		time_remaining_lower = blend_node(blend_points[point_lower].node, p_time, p_seek, blend_lower, FILTER_IGNORE, false);
-		time_remaining_higher = blend_node(blend_points[point_higher].node, p_time, p_seek, blend_higher, FILTER_IGNORE, false);
+	for (int i = 0; i < blend_points_used; i++) {
+		float remaining = blend_node(blend_points[i].node, p_time, p_seek, weights[i], FILTER_IGNORE, false);
 
-		return MAX(time_remaining_lower, time_remaining_higher);
+		max_time_remaining = MAX(max_time_remaining, remaining);
 	}
+
+	return max_time_remaining;
 }
 
 String AnimationNodeBlendSpace1D::get_caption() const {