fix: physics_world_query_all no longer returns corrupted pointers

This commit is contained in:
Sara 2024-01-14 21:00:02 +01:00
parent f50d6a0b93
commit 8a05984afa
2 changed files with 5 additions and 7 deletions

View file

@ -183,5 +183,5 @@ int _internal_overlap_check(PhysicsQuery a, PhysicsQuery b) {
int overlap_check(PhysicsQuery query, Collider* collider) { int overlap_check(PhysicsQuery query, Collider* collider) {
PhysicsQuery collider_query = collider_to_query(collider); PhysicsQuery collider_query = collider_to_query(collider);
return (query.mask & collider_query.mask) != 0 && _internal_overlap_check(query, collider_query) || _internal_overlap_check(collider_query, query); return (query.mask & collider_query.mask) != 0 && (_internal_overlap_check(query, collider_query) || _internal_overlap_check(collider_query, query));
} }

View file

@ -114,15 +114,14 @@ void physics_world_tick() {
} }
List physics_world_query_all(PhysicsQuery query, RigidBody* ignore) { List physics_world_query_all(PhysicsQuery query, RigidBody* ignore) {
List result = list_init(sizeof(Collider*)); List result = list_from_type(Collider*);
list_foreach(PhysicsEntity*, entity, &_world_bodies) { list_foreach(PhysicsEntity*, entity, &_world_bodies) {
RigidBody* body = entity->tc->get_rigidbody(entity->data); RigidBody* body = entity->tc->get_rigidbody(entity->data);
if(body == ignore) continue; if(body == ignore) continue;
list_foreach(Collider**, collider, rigidbody_get_colliders(body)) { list_foreach(Collider**, collider, rigidbody_get_colliders(body))
if(overlap_check(query, *collider)) if(overlap_check(query, *collider))
list_add(&result, *collider); list_add(&result, collider);
}
} }
return result; return result;
} }
@ -152,11 +151,10 @@ Collider* physics_world_query(PhysicsQuery query, RigidBody* ignore) {
RigidBody* body = entity->tc->get_rigidbody(entity->data); RigidBody* body = entity->tc->get_rigidbody(entity->data);
if(body == ignore) continue; if(body == ignore) continue;
list_foreach(Collider**, collider, rigidbody_get_colliders(body)) { list_foreach(Collider**, collider, rigidbody_get_colliders(body))
if(overlap_check(query, *collider)) if(overlap_check(query, *collider))
return *collider; return *collider;
} }
}
return NULL; return NULL;
} }