From 2f9cd32f6ca8cf4aa60816b4dc7fa27a82273c46 Mon Sep 17 00:00:00 2001 From: Sara Date: Sat, 13 Jan 2024 13:10:34 +0100 Subject: [PATCH] feat: added query_all functions for physics world --- core/src/physics_world.c | 35 ++++++++++++++++++++++++++++++++++- core/src/physics_world.h | 2 ++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/core/src/physics_world.c b/core/src/physics_world.c index 3b328cf..39cd79e 100644 --- a/core/src/physics_world.c +++ b/core/src/physics_world.c @@ -113,6 +113,40 @@ void physics_world_tick() { _internal_physics_apply(); } +List physics_world_query_all(PhysicsQuery query, RigidBody* ignore) { + List result = list_init(sizeof(Collider*)); + list_foreach(PhysicsEntity*, entity, &_world_bodies) { + RigidBody* body = entity->tc->get_rigidbody(entity->data); + if(body == ignore) continue; + + list_foreach(Collider**, collider, rigidbody_get_colliders(body)) { + if(overlap_check(query, *collider)) + list_add(&result, *collider); + } + } + return result; +} + +List physics_world_box_query_all(Vector centre, Vector extents, PhysicsMask mask, RigidBody* ignore) { + Transform transform = { + .position = centre, + .scale = OneVector, + .rotation = 0.f + }; + Shape* shape = shape_new((Vector[]){ + MakeVector(-extents.x, -extents.y), + MakeVector(extents.x, -extents.y), + MakeVector(extents.x, extents.y), + MakeVector(-extents.x, extents.y) + }, 4); + PhysicsQuery query = { + .shape = shape, + .transform = &transform, + .mask = mask + }; + return physics_world_query_all(query, ignore); +} + Collider* physics_world_query(PhysicsQuery query, RigidBody* ignore) { list_foreach(PhysicsEntity*, entity, &_world_bodies) { RigidBody* body = entity->tc->get_rigidbody(entity->data); @@ -123,7 +157,6 @@ Collider* physics_world_query(PhysicsQuery query, RigidBody* ignore) { return *collider; } } - return NULL; } diff --git a/core/src/physics_world.h b/core/src/physics_world.h index 1152184..a249c32 100644 --- a/core/src/physics_world.h +++ b/core/src/physics_world.h @@ -12,6 +12,8 @@ extern void physics_world_remove_entity(PhysicsEntity entity); extern void physics_world_tick(); +extern List physics_world_query_all(PhysicsQuery query, RigidBody* ignore); +extern List physics_world_box_query_all(Vector centre, Vector extents, PhysicsMask mask, RigidBody* ignore); extern Collider* physics_world_query(PhysicsQuery query, RigidBody* ignore); extern Collider* physics_world_box_query(Vector centre, Vector extents, PhysicsMask mask, RigidBody* ignore);