fixes to one way collision, closes #10971

This commit is contained in:
Juan Linietsky 2017-09-17 09:38:09 -03:00
parent 27370a9d16
commit 5886f810c2
2 changed files with 14 additions and 4 deletions

View file

@ -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;
}

View file

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