Collider:getAABB;

This commit is contained in:
bjorn 2017-05-24 18:10:39 -07:00
parent 876a8406b1
commit 6bfea99be6
3 changed files with 34 additions and 0 deletions

View File

@ -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 }
};

View File

@ -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);

View File

@ -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);