From 0b6788dfcb8c6f382d8f37c7a70ca377d39af549 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 15 May 2017 23:30:26 -0600 Subject: [PATCH] Body:getLocalVector; Body:getWorldVector; --- src/api/types/body.c | 28 ++++++++++++++++++++++++++++ src/physics/physics.c | 16 ++++++++++++++++ src/physics/physics.h | 2 ++ 3 files changed, 46 insertions(+) diff --git a/src/api/types/body.c b/src/api/types/body.c index 265a10eb..42f3de63 100644 --- a/src/api/types/body.c +++ b/src/api/types/body.c @@ -179,6 +179,32 @@ int l_lovrBodyGetWorldPoint(lua_State* L) { return 3; } +int l_lovrBodyGetLocalVector(lua_State* L) { + Body* body = luax_checktype(L, 1, Body); + float wx = luaL_checknumber(L, 2); + float wy = luaL_checknumber(L, 3); + float wz = luaL_checknumber(L, 4); + float x, y, z; + lovrBodyGetLocalVector(body, wx, wy, wz, &x, &y, &z); + lua_pushnumber(L, x); + lua_pushnumber(L, y); + lua_pushnumber(L, z); + return 3; +} + +int l_lovrBodyGetWorldVector(lua_State* L) { + Body* body = luax_checktype(L, 1, Body); + float x = luaL_checknumber(L, 2); + float y = luaL_checknumber(L, 3); + float z = luaL_checknumber(L, 4); + float wx, wy, wz; + lovrBodyGetWorldVector(body, x, y, z, &wx, &wy, &wz); + lua_pushnumber(L, wx); + lua_pushnumber(L, wy); + lua_pushnumber(L, wz); + return 3; +} + int l_lovrBodyGetLinearVelocityFromLocalPoint(lua_State* L) { Body* body = luax_checktype(L, 1, Body); float x = luaL_checknumber(L, 2); @@ -224,6 +250,8 @@ const luaL_Reg lovrBody[] = { { "setKinematic", l_lovrBodySetKinematic }, { "getLocalPoint", l_lovrBodyGetLocalPoint }, { "getWorldPoint", l_lovrBodyGetWorldPoint }, + { "getLocalVector", l_lovrBodyGetLocalVector }, + { "getWorldVector", l_lovrBodyGetWorldVector }, { "getLinearVelocityFromLocalPoint", l_lovrBodyGetLinearVelocityFromLocalPoint }, { "getLinearVelocityFromWorldPoint", l_lovrBodyGetLinearVelocityFromWorldPoint }, { NULL, NULL } diff --git a/src/physics/physics.c b/src/physics/physics.c index d3b72eb6..53d37973 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -201,6 +201,22 @@ void lovrBodyGetWorldPoint(Body* body, float x, float y, float z, float* wx, flo *wz = world[2]; } +void lovrBodyGetLocalVector(Body* body, float wx, float wy, float wz, float* x, float* y, float* z) { + dReal local[3]; + dBodyVectorFromWorld(body->id, wx, wy, wz, local); + *x = local[0]; + *y = local[1]; + *z = local[2]; +} + +void lovrBodyGetWorldVector(Body* body, float x, float y, float z, float* wx, float* wy, float* wz) { + dReal world[3]; + dBodyVectorToWorld(body->id, x, y, z, world); + *wx = world[0]; + *wy = world[1]; + *wz = world[2]; +} + void lovrBodyGetLinearVelocityFromLocalPoint(Body* body, float x, float y, float z, float* vx, float* vy, float* vz) { dReal velocity[3]; dBodyGetRelPointVel(body->id, x, y, z, velocity); diff --git a/src/physics/physics.h b/src/physics/physics.h index 47b5de38..388e0345 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -48,5 +48,7 @@ int lovrBodyIsKinematic(Body* body); void lovrBodySetKinematic(Body* body, int kinematic); void lovrBodyGetLocalPoint(Body* body, float wx, float wy, float wz, float* x, float* y, float* z); void lovrBodyGetWorldPoint(Body* body, float x, float y, float z, float* wx, float* wy, float* wz); +void lovrBodyGetLocalVector(Body* body, float wx, float wy, float wz, float* x, float* y, float* z); +void lovrBodyGetWorldVector(Body* body, float x, float y, float z, float* wx, float* wy, float* wz); void lovrBodyGetLinearVelocityFromLocalPoint(Body* body, float x, float y, float z, float* vx, float* vy, float* vz); void lovrBodyGetLinearVelocityFromWorldPoint(Body* body, float wx, float wy, float wz, float* vx, float* vy, float* vz);