Selaa lähdekoodia

fixes to one way collision, closes #10971

Juan Linietsky 8 vuotta sitten
vanhempi
commit
5886f810c2
2 muutettua tiedostoa jossa 14 lisäystä ja 4 poistoa
  1. 8 4
      servers/physics_2d/space_2d_sw.cpp
  2. 6 0
      servers/physics_2d/space_2d_sw.h

+ 8 - 4
servers/physics_2d/space_2d_sw.cpp

@@ -518,7 +518,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
 	body_aabb = body_aabb.grow(p_margin);
 
 	static const int max_excluded_shape_pairs = 32;
-	Pair<Shape2DSW *, Shape2DSW *> excluded_shape_pairs[max_excluded_shape_pairs];
+	ExcludedShapeSW excluded_shape_pairs[max_excluded_shape_pairs];
 	int excluded_shape_pair_count = 0;
 
 	Transform2D body_transform = p_from;
@@ -577,7 +577,11 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
 					if (!collided && cbk.invalid_by_dir > 0) {
 						//this shape must be excluded
 						if (excluded_shape_pair_count < max_excluded_shape_pairs) {
-							excluded_shape_pairs[excluded_shape_pair_count++] = Pair<Shape2DSW *, Shape2DSW *>(body_shape, against_shape);
+							ExcludedShapeSW esp;
+							esp.local_shape = body_shape;
+							esp.against_object = col_obj;
+							esp.against_shape = against_shape;
+							excluded_shape_pairs[excluded_shape_pair_count++] = esp;
 						}
 					}
 				}
@@ -645,7 +649,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
 
 				for (int k = 0; k < excluded_shape_pair_count; k++) {
 
-					if (excluded_shape_pairs[k].first == body_shape && excluded_shape_pairs[k].second == against_shape) {
+					if (excluded_shape_pairs[k].local_shape == body_shape && excluded_shape_pairs[k].against_object == col_obj && excluded_shape_pairs[k].against_shape == against_shape) {
 						excluded = true;
 						break;
 					}
@@ -776,7 +780,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
 			bool excluded = false;
 			for (int k = 0; k < excluded_shape_pair_count; k++) {
 
-				if (excluded_shape_pairs[k].first == body_shape && excluded_shape_pairs[k].second == against_shape) {
+				if (excluded_shape_pairs[k].local_shape == body_shape && excluded_shape_pairs[k].against_object == col_obj && excluded_shape_pairs[k].against_shape == against_shape) {
 					excluded = true;
 					break;
 				}

+ 6 - 0
servers/physics_2d/space_2d_sw.h

@@ -71,6 +71,12 @@ public:
 	};
 
 private:
+	struct ExcludedShapeSW {
+		Shape2DSW *local_shape;
+		const CollisionObject2DSW *against_object;
+		Shape2DSW *against_shape;
+	};
+
 	uint64_t elapsed_time[ELAPSED_TIME_MAX];
 
 	Physics2DDirectSpaceStateSW *direct_access;