Fix physics queries not filtering out disabled collision shapes
This change allows collide_shape, intersect_shape, cast_motion and rest_info in both 2D and 3D to ignore disabled shapes and make them consistent with the physics simulation. In some other cases, _cull_aabb_for_body is used and filters shapes out internally, but whenever a physics query uses the broadphase directly without calling _cull_aabb_for_body, disabled shapes can be returned and need to be filtered out.
This commit is contained in:
parent
df9c98e107
commit
50501f2843
2 changed files with 44 additions and 4 deletions
|
@ -84,6 +84,10 @@ int PhysicsDirectSpaceState2DSW::_intersect_point_impl(const Vector2 &p_point, S
|
|||
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Shape2DSW *shape = col_obj->get_shape(shape_idx);
|
||||
|
||||
Vector2 local_point = (col_obj->get_transform() * col_obj->get_shape_transform(shape_idx)).affine_inverse().xform(p_point);
|
||||
|
@ -229,6 +233,10 @@ int PhysicsDirectSpaceState2DSW::intersect_shape(const RID &p_shape, const Trans
|
|||
const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!CollisionSolver2DSW::solve(shape, p_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), nullptr, nullptr, nullptr, p_margin)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -272,6 +280,10 @@ bool PhysicsDirectSpaceState2DSW::cast_motion(const RID &p_shape, const Transfor
|
|||
const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Transform2D col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
|
||||
//test initial overlap, does it collide if going all the way?
|
||||
if (!CollisionSolver2DSW::solve(shape, p_xform, p_motion, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), nullptr, nullptr, nullptr, p_margin)) {
|
||||
|
@ -346,12 +358,17 @@ bool PhysicsDirectSpaceState2DSW::collide_shape(RID p_shape, const Transform2D &
|
|||
}
|
||||
|
||||
const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
cbk.valid_dir = Vector2();
|
||||
cbk.valid_depth = 0;
|
||||
|
||||
|
@ -433,12 +450,17 @@ bool PhysicsDirectSpaceState2DSW::rest_info(RID p_shape, const Transform2D &p_sh
|
|||
}
|
||||
|
||||
const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
rcd.valid_dir = Vector2();
|
||||
rcd.object = col_obj;
|
||||
rcd.shape = shape_idx;
|
||||
|
|
|
@ -210,6 +210,10 @@ int PhysicsDirectSpaceState3DSW::intersect_shape(const RID &p_shape, const Trans
|
|||
const CollisionObject3DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!CollisionSolver3DSW::solve_static(shape, p_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), nullptr, nullptr, nullptr, p_margin, 0)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -265,6 +269,10 @@ bool PhysicsDirectSpaceState3DSW::cast_motion(const RID &p_shape, const Transfor
|
|||
const CollisionObject3DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Vector3 point_A, point_B;
|
||||
Vector3 sep_axis = p_motion.normalized();
|
||||
|
||||
|
@ -365,12 +373,17 @@ bool PhysicsDirectSpaceState3DSW::collide_shape(RID p_shape, const Transform &p_
|
|||
}
|
||||
|
||||
const CollisionObject3DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CollisionSolver3DSW::solve_static(shape, p_shape_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), cbkres, cbkptr, nullptr, p_margin)) {
|
||||
collided = true;
|
||||
}
|
||||
|
@ -432,12 +445,17 @@ bool PhysicsDirectSpaceState3DSW::rest_info(RID p_shape, const Transform &p_shap
|
|||
}
|
||||
|
||||
const CollisionObject3DSW *col_obj = space->intersection_query_results[i];
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (p_exclude.has(col_obj->get_self())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int shape_idx = space->intersection_query_subindex_results[i];
|
||||
|
||||
if (col_obj->is_shape_set_as_disabled(shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
rcd.object = col_obj;
|
||||
rcd.shape = shape_idx;
|
||||
bool sc = CollisionSolver3DSW::solve_static(shape, p_shape_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), _rest_cbk_result, &rcd, nullptr, p_margin);
|
||||
|
|
Loading…
Reference in a new issue