fixes to one way collision, closes #10971
This commit is contained in:
parent
27370a9d16
commit
5886f810c2
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user