From dab0be7055a07f002421694c73b6d0dc8e459663 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2020 12:05:30 -0600 Subject: [PATCH] World:getColliders; --- src/api/l_physics_world.c | 22 ++++++++++++++++++++++ src/modules/physics/physics.c | 4 ++++ src/modules/physics/physics.h | 1 + 3 files changed, 27 insertions(+) diff --git a/src/api/l_physics_world.c b/src/api/l_physics_world.c index d3437185..6522d7b9 100644 --- a/src/api/l_physics_world.c +++ b/src/api/l_physics_world.c @@ -110,6 +110,27 @@ static int l_lovrWorldNewSphereCollider(lua_State* L) { return 1; } +static int l_lovrWorldGetColliders(lua_State* L) { + World* world = luax_checktype(L, 1, World); + + if (lua_istable(L, 2)) { + lua_settop(L, 2); + } else { + lua_newtable(L); + } + + Collider* collider = lovrWorldGetFirstCollider(world); + int index = 1; + + while (collider) { + luax_pushtype(L, Collider, collider); + lua_rawseti(L, -2, index++); + collider = collider->next; + } + + return 1; +} + static int l_lovrWorldDestroy(lua_State* L) { World* world = luax_checktype(L, 1, World); lovrWorldDestroyData(world); @@ -255,6 +276,7 @@ const luaL_Reg lovrWorld[] = { { "newCapsuleCollider", l_lovrWorldNewCapsuleCollider }, { "newCylinderCollider", l_lovrWorldNewCylinderCollider }, { "newSphereCollider", l_lovrWorldNewSphereCollider }, + { "getColliders", l_lovrWorldGetColliders }, { "destroy", l_lovrWorldDestroy }, { "update", l_lovrWorldUpdate }, { "computeOverlaps", l_lovrWorldComputeOverlaps }, diff --git a/src/modules/physics/physics.c b/src/modules/physics/physics.c index ddf301f1..39a21f04 100644 --- a/src/modules/physics/physics.c +++ b/src/modules/physics/physics.c @@ -179,6 +179,10 @@ int lovrWorldCollide(World* world, Shape* a, Shape* b, float friction, float res return contactCount; } +Collider* lovrWorldGetFirstCollider(World* world) { + return world->head; +} + void lovrWorldGetGravity(World* world, float* x, float* y, float* z) { dReal gravity[3]; dWorldGetGravity(world->id, gravity); diff --git a/src/modules/physics/physics.h b/src/modules/physics/physics.h index af54a80c..3a0d1893 100644 --- a/src/modules/physics/physics.h +++ b/src/modules/physics/physics.h @@ -94,6 +94,7 @@ void lovrWorldUpdate(World* world, float dt, CollisionResolver resolver, void* u void lovrWorldComputeOverlaps(World* world); int lovrWorldGetNextOverlap(World* world, Shape** a, Shape** b); int lovrWorldCollide(World* world, Shape* a, Shape* b, float friction, float restitution); +Collider* lovrWorldGetFirstCollider(World* world); void lovrWorldGetGravity(World* world, float* x, float* y, float* z); void lovrWorldSetGravity(World* world, float x, float y, float z); void lovrWorldGetLinearDamping(World* world, float* damping, float* threshold);