From 6bfea99be6a8a6b4dc0bee5ce3706ab21893951c Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 24 May 2017 18:10:39 -0700 Subject: [PATCH] Collider:getAABB; --- src/api/types/collider.c | 11 +++++++++++ src/physics/physics.c | 22 ++++++++++++++++++++++ src/physics/physics.h | 1 + 3 files changed, 34 insertions(+) diff --git a/src/api/types/collider.c b/src/api/types/collider.c index 1d64a101..f78579c8 100644 --- a/src/api/types/collider.c +++ b/src/api/types/collider.c @@ -413,6 +413,16 @@ int l_lovrColliderGetLinearVelocityFromWorldPoint(lua_State* L) { return 3; } +int l_lovrColliderGetAABB(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + float aabb[6]; + lovrColliderGetAABB(collider, aabb); + for (int i = 0; i < 6; i++) { + lua_pushnumber(L, aabb[i]); + } + return 6; +} + const luaL_Reg lovrCollider[] = { { "destroy", l_lovrColliderDestroy }, { "getWorld", l_lovrColliderGetWorld }, @@ -454,5 +464,6 @@ const luaL_Reg lovrCollider[] = { { "getWorldVector", l_lovrColliderGetWorldVector }, { "getLinearVelocityFromLocalPoint", l_lovrColliderGetLinearVelocityFromLocalPoint }, { "getLinearVelocityFromWorldPoint", l_lovrColliderGetLinearVelocityFromWorldPoint }, + { "getAABB", l_lovrColliderGetAABB }, { NULL, NULL } }; diff --git a/src/physics/physics.c b/src/physics/physics.c index 340962f2..b4e9ed6b 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -495,6 +495,28 @@ void lovrColliderGetLinearVelocityFromWorldPoint(Collider* collider, float wx, f *vz = velocity[2]; } +void lovrColliderGetAABB(Collider* collider, float aabb[6]) { + dGeomID shape = dBodyGetFirstGeom(collider->body); + + if (!shape) { + memset(aabb, 0, 6 * sizeof(float)); + return; + } + + dGeomGetAABB(shape, aabb); + + float otherAABB[6]; + while ((shape = dBodyGetNextGeom(shape)) != NULL) { + dGeomGetAABB(shape, otherAABB); + aabb[0] = MIN(aabb[0], otherAABB[0]); + aabb[1] = MAX(aabb[0], otherAABB[0]); + aabb[2] = MIN(aabb[2], otherAABB[2]); + aabb[3] = MAX(aabb[3], otherAABB[3]); + aabb[4] = MIN(aabb[4], otherAABB[4]); + aabb[5] = MAX(aabb[5], otherAABB[5]); + } +} + void lovrShapeDestroy(const Ref* ref) { Shape* shape = containerof(ref, Shape); lovrShapeDestroyData(shape); diff --git a/src/physics/physics.h b/src/physics/physics.h index 9730c9e6..4ec8867a 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -131,6 +131,7 @@ void lovrColliderGetLocalVector(Collider* collider, float wx, float wy, float wz void lovrColliderGetWorldVector(Collider* collider, float x, float y, float z, float* wx, float* wy, float* wz); void lovrColliderGetLinearVelocityFromLocalPoint(Collider* collider, float x, float y, float z, float* vx, float* vy, float* vz); void lovrColliderGetLinearVelocityFromWorldPoint(Collider* collider, float wx, float wy, float wz, float* vx, float* vy, float* vz); +void lovrColliderGetAABB(Collider* collider, float aabb[6]); void lovrShapeDestroy(const Ref* ref); void lovrShapeDestroyData(Shape* shape);