Fix and clean disabled shapes handling in godot physics servers
In 3D, disabled shapes are now not added to the broadphase anymore. Since they are removed right away when disabled, no need to check for disabled shapes for any query that comes from the broadphase. Also Fixes raycast queries returning disabled shapes. In 2D, disabled shapes where already not added to the broadphase. Remove the same unnecessary checks as in 3D. Overall harmonized API for disabled shapes in the physics servers and removed duplicate method.
This commit is contained in:
@ -33,10 +33,7 @@
|
||||
|
||||
bool AreaPair2DSW::setup(real_t p_step) {
|
||||
bool result = false;
|
||||
|
||||
if (area->is_shape_set_as_disabled(area_shape) || body->is_shape_set_as_disabled(body_shape)) {
|
||||
result = false;
|
||||
} else if (area->test_collision_mask(body) && CollisionSolver2DSW::solve(body->get_shape(body_shape), body->get_transform() * body->get_shape_transform(body_shape), Vector2(), area->get_shape(area_shape), area->get_transform() * area->get_shape_transform(area_shape), Vector2(), nullptr, this)) {
|
||||
if (area->test_collision_mask(body) && CollisionSolver2DSW::solve(body->get_shape(body_shape), body->get_transform() * body->get_shape_transform(body_shape), Vector2(), area->get_shape(area_shape), area->get_transform() * area->get_shape_transform(area_shape), Vector2(), nullptr, this)) {
|
||||
result = true;
|
||||
}
|
||||
|
||||
@ -97,9 +94,7 @@ AreaPair2DSW::~AreaPair2DSW() {
|
||||
|
||||
bool Area2Pair2DSW::setup(real_t p_step) {
|
||||
bool result = false;
|
||||
if (area_a->is_shape_set_as_disabled(shape_a) || area_b->is_shape_set_as_disabled(shape_b)) {
|
||||
result = false;
|
||||
} else if (area_a->test_collision_mask(area_b) && CollisionSolver2DSW::solve(area_a->get_shape(shape_a), area_a->get_transform() * area_a->get_shape_transform(shape_a), Vector2(), area_b->get_shape(shape_b), area_b->get_transform() * area_b->get_shape_transform(shape_b), Vector2(), nullptr, this)) {
|
||||
if (area_a->test_collision_mask(area_b) && CollisionSolver2DSW::solve(area_a->get_shape(shape_a), area_a->get_transform() * area_a->get_shape_transform(shape_a), Vector2(), area_b->get_shape(shape_b), area_b->get_transform() * area_b->get_shape_transform(shape_b), Vector2(), nullptr, this)) {
|
||||
result = true;
|
||||
}
|
||||
|
||||
|
||||
@ -226,11 +226,6 @@ bool BodyPair2DSW::setup(real_t p_step) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (A->is_shape_set_as_disabled(shape_A) || B->is_shape_set_as_disabled(shape_B)) {
|
||||
collided = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
//use local A coordinates to avoid numerical issues on collision detection
|
||||
offset_B = B->get_transform().get_origin() - A->get_transform().get_origin();
|
||||
|
||||
|
||||
@ -47,8 +47,6 @@ void CollisionObject2DSW::add_shape(Shape2DSW *p_shape, const Transform2D &p_tra
|
||||
if (!pending_shape_update_list.in_list()) {
|
||||
Physics2DServerSW::singletonsw->pending_shape_update_list.add(&pending_shape_update_list);
|
||||
}
|
||||
// _update_shapes();
|
||||
// _shapes_changed();
|
||||
}
|
||||
|
||||
void CollisionObject2DSW::set_shape(int p_index, Shape2DSW *p_shape) {
|
||||
@ -61,8 +59,6 @@ void CollisionObject2DSW::set_shape(int p_index, Shape2DSW *p_shape) {
|
||||
if (!pending_shape_update_list.in_list()) {
|
||||
Physics2DServerSW::singletonsw->pending_shape_update_list.add(&pending_shape_update_list);
|
||||
}
|
||||
// _update_shapes();
|
||||
// _shapes_changed();
|
||||
}
|
||||
|
||||
void CollisionObject2DSW::set_shape_metadata(int p_index, const Variant &p_metadata) {
|
||||
@ -79,11 +75,9 @@ void CollisionObject2DSW::set_shape_transform(int p_index, const Transform2D &p_
|
||||
if (!pending_shape_update_list.in_list()) {
|
||||
Physics2DServerSW::singletonsw->pending_shape_update_list.add(&pending_shape_update_list);
|
||||
}
|
||||
// _update_shapes();
|
||||
// _shapes_changed();
|
||||
}
|
||||
|
||||
void CollisionObject2DSW::set_shape_as_disabled(int p_idx, bool p_disabled) {
|
||||
void CollisionObject2DSW::set_shape_disabled(int p_idx, bool p_disabled) {
|
||||
ERR_FAIL_INDEX(p_idx, shapes.size());
|
||||
|
||||
CollisionObject2DSW::Shape &shape = shapes.write[p_idx];
|
||||
@ -103,12 +97,10 @@ void CollisionObject2DSW::set_shape_as_disabled(int p_idx, bool p_disabled) {
|
||||
if (!pending_shape_update_list.in_list()) {
|
||||
Physics2DServerSW::singletonsw->pending_shape_update_list.add(&pending_shape_update_list);
|
||||
}
|
||||
//_update_shapes();
|
||||
} else if (!p_disabled && shape.bpid == 0) {
|
||||
if (!pending_shape_update_list.in_list()) {
|
||||
Physics2DServerSW::singletonsw->pending_shape_update_list.add(&pending_shape_update_list);
|
||||
}
|
||||
//_update_shapes(); // automatically adds shape with bpid == 0
|
||||
}
|
||||
}
|
||||
|
||||
@ -139,8 +131,6 @@ void CollisionObject2DSW::remove_shape(int p_index) {
|
||||
if (!pending_shape_update_list.in_list()) {
|
||||
Physics2DServerSW::singletonsw->pending_shape_update_list.add(&pending_shape_update_list);
|
||||
}
|
||||
// _update_shapes();
|
||||
// _shapes_changed();
|
||||
}
|
||||
|
||||
void CollisionObject2DSW::_set_static(bool p_static) {
|
||||
@ -177,7 +167,6 @@ void CollisionObject2DSW::_update_shapes() {
|
||||
|
||||
for (int i = 0; i < shapes.size(); i++) {
|
||||
Shape &s = shapes.write[i];
|
||||
|
||||
if (s.disabled) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -118,10 +118,6 @@ public:
|
||||
void set_shape_metadata(int p_index, const Variant &p_metadata);
|
||||
|
||||
_FORCE_INLINE_ int get_shape_count() const { return shapes.size(); }
|
||||
_FORCE_INLINE_ bool is_shape_disabled(int p_index) const {
|
||||
CRASH_BAD_INDEX(p_index, shapes.size());
|
||||
return shapes[p_index].disabled;
|
||||
}
|
||||
_FORCE_INLINE_ Shape2DSW *get_shape(int p_index) const {
|
||||
CRASH_BAD_INDEX(p_index, shapes.size());
|
||||
return shapes[p_index].shape;
|
||||
@ -147,9 +143,9 @@ public:
|
||||
_FORCE_INLINE_ Transform2D get_inv_transform() const { return inv_transform; }
|
||||
_FORCE_INLINE_ Space2DSW *get_space() const { return space; }
|
||||
|
||||
void set_shape_as_disabled(int p_idx, bool p_disabled);
|
||||
_FORCE_INLINE_ bool is_shape_set_as_disabled(int p_idx) const {
|
||||
CRASH_BAD_INDEX(p_idx, shapes.size());
|
||||
void set_shape_disabled(int p_idx, bool p_disabled);
|
||||
_FORCE_INLINE_ bool is_shape_disabled(int p_idx) const {
|
||||
ERR_FAIL_INDEX_V(p_idx, shapes.size(), false);
|
||||
return shapes[p_idx].disabled;
|
||||
}
|
||||
|
||||
|
||||
@ -361,7 +361,7 @@ void Physics2DServerSW::area_set_shape_disabled(RID p_area, int p_shape, bool p_
|
||||
ERR_FAIL_INDEX(p_shape, area->get_shape_count());
|
||||
FLUSH_QUERY_CHECK(area);
|
||||
|
||||
area->set_shape_as_disabled(p_shape, p_disabled);
|
||||
area->set_shape_disabled(p_shape, p_disabled);
|
||||
}
|
||||
|
||||
int Physics2DServerSW::area_get_shape_count(RID p_area) const {
|
||||
@ -651,7 +651,7 @@ void Physics2DServerSW::body_set_shape_disabled(RID p_body, int p_shape_idx, boo
|
||||
ERR_FAIL_INDEX(p_shape_idx, body->get_shape_count());
|
||||
FLUSH_QUERY_CHECK(body);
|
||||
|
||||
body->set_shape_as_disabled(p_shape_idx, p_disabled);
|
||||
body->set_shape_disabled(p_shape_idx, p_disabled);
|
||||
}
|
||||
void Physics2DServerSW::body_set_shape_as_one_way_collision(RID p_body, int p_shape_idx, bool p_enable, float p_margin) {
|
||||
Body2DSW *body = body_owner.get(p_body);
|
||||
|
||||
@ -494,8 +494,6 @@ int Space2DSW::_cull_aabb_for_body(Body2DSW *p_body, const Rect2 &p_aabb) {
|
||||
keep = false;
|
||||
} else if (static_cast<Body2DSW *>(intersection_query_results[i])->has_exception(p_body->get_self()) || p_body->has_exception(intersection_query_results[i]->get_self())) {
|
||||
keep = false;
|
||||
} else if (static_cast<Body2DSW *>(intersection_query_results[i])->is_shape_set_as_disabled(intersection_query_subindex_results[i])) {
|
||||
keep = false;
|
||||
}
|
||||
|
||||
if (!keep) {
|
||||
@ -518,7 +516,7 @@ int Space2DSW::test_body_ray_separation(Body2DSW *p_body, const Transform2D &p_t
|
||||
bool shapes_found = false;
|
||||
|
||||
for (int i = 0; i < p_body->get_shape_count(); i++) {
|
||||
if (p_body->is_shape_set_as_disabled(i)) {
|
||||
if (p_body->is_shape_disabled(i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -570,7 +568,7 @@ int Space2DSW::test_body_ray_separation(Body2DSW *p_body, const Transform2D &p_t
|
||||
int amount = _cull_aabb_for_body(p_body, body_aabb);
|
||||
|
||||
for (int j = 0; j < p_body->get_shape_count(); j++) {
|
||||
if (p_body->is_shape_set_as_disabled(j)) {
|
||||
if (p_body->is_shape_disabled(j)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -711,7 +709,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
|
||||
bool shapes_found = false;
|
||||
|
||||
for (int i = 0; i < p_body->get_shape_count(); i++) {
|
||||
if (p_body->is_shape_set_as_disabled(i)) {
|
||||
if (p_body->is_shape_disabled(i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -774,7 +772,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
|
||||
int amount = _cull_aabb_for_body(p_body, body_aabb);
|
||||
|
||||
for (int j = 0; j < p_body->get_shape_count(); j++) {
|
||||
if (p_body->is_shape_set_as_disabled(j)) {
|
||||
if (p_body->is_shape_disabled(j)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -897,7 +895,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
|
||||
int amount = _cull_aabb_for_body(p_body, motion_aabb);
|
||||
|
||||
for (int body_shape_idx = 0; body_shape_idx < p_body->get_shape_count(); body_shape_idx++) {
|
||||
if (p_body->is_shape_set_as_disabled(body_shape_idx)) {
|
||||
if (p_body->is_shape_disabled(body_shape_idx)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1039,7 +1037,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co
|
||||
int to_shape = best_shape != -1 ? best_shape + 1 : p_body->get_shape_count();
|
||||
|
||||
for (int j = from_shape; j < to_shape; j++) {
|
||||
if (p_body->is_shape_set_as_disabled(j)) {
|
||||
if (p_body->is_shape_disabled(j)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user