diff --git a/src/api/types/collider.c b/src/api/types/collider.c index 835f62ff..0b49487c 100644 --- a/src/api/types/collider.c +++ b/src/api/types/collider.c @@ -27,6 +27,20 @@ int l_lovrColliderRemoveShape(lua_State* L) { return 0; } +int l_lovrColliderGetShapeList(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + lua_newtable(L); + int i; + Shape* shape; + + for (i = 1, shape = lovrColliderGetFirstShape(collider); shape; shape = lovrColliderGetNextShape(collider, shape), i++) { + luax_pushshape(L, shape); + lua_rawseti(L, -2, i); + } + + return 1; +} + int l_lovrColliderGetUserData(lua_State* L) { Collider* collider = luax_checktype(L, 1, Collider); int ref = (int) lovrColliderGetUserData(collider); @@ -395,6 +409,7 @@ const luaL_Reg lovrCollider[] = { { "getWorld", l_lovrColliderGetWorld }, { "addShape", l_lovrColliderAddShape }, { "removeShape", l_lovrColliderRemoveShape }, + { "getShapeList", l_lovrColliderGetShapeList }, { "getUserData", l_lovrColliderGetUserData }, { "setUserData", l_lovrColliderSetUserData }, { "isKinematic", l_lovrColliderIsKinematic }, diff --git a/src/physics/physics.c b/src/physics/physics.c index 2987d7b2..112a66b8 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -205,6 +205,16 @@ void lovrColliderRemoveShape(Collider* collider, Shape* shape) { } } +Shape* lovrColliderGetFirstShape(Collider* collider) { + dGeomID geom = dBodyGetFirstGeom(collider->body); + return geom ? dGeomGetData(geom) : NULL; +} + +Shape* lovrColliderGetNextShape(Collider* collider, Shape* shape) { + dGeomID geom = dBodyGetNextGeom(shape->id); + return geom ? dGeomGetData(geom) : NULL; +} + void* lovrColliderGetUserData(Collider* collider) { return collider->userdata; } diff --git a/src/physics/physics.h b/src/physics/physics.h index ad4d48aa..aaca5d5c 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -69,6 +69,8 @@ void lovrColliderDestroyData(Collider* collider); World* lovrColliderGetWorld(Collider* collider); void lovrColliderAddShape(Collider* collider, Shape* shape); void lovrColliderRemoveShape(Collider* collider, Shape* shape); +Shape* lovrColliderGetFirstShape(Collider* collider); +Shape* lovrColliderGetNextShape(Collider* collider, Shape* shape); void* lovrColliderGetUserData(Collider* collider); void lovrColliderSetUserData(Collider* collider, void* data); int lovrColliderIsKinematic(Collider* collider);