From 1829a65898c99cb93e013ed6c80730f76c1c66ba Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 19 May 2017 21:48:59 -0600 Subject: [PATCH] Organization; Collider:isGravityIgnored; Collider:setGravityIgnored; --- src/api/types/collider.c | 299 ++++++++++++++++++++------------------- src/physics/physics.c | 174 ++++++++++++----------- src/physics/physics.h | 28 ++-- 3 files changed, 263 insertions(+), 238 deletions(-) diff --git a/src/api/types/collider.c b/src/api/types/collider.c index d3ba49fb..c82b2327 100644 --- a/src/api/types/collider.c +++ b/src/api/types/collider.c @@ -1,6 +1,12 @@ #include "api/lovr.h" #include "physics/physics.h" +int l_lovrColliderGetWorld(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + luax_pushtype(L, World, lovrColliderGetWorld(collider)); + return 1; +} + int l_lovrColliderAddShape(lua_State* L) { Collider* collider = luax_checktype(L, 1, Collider); Shape* shape = luax_checktypeof(L, 2, Shape); @@ -15,6 +21,142 @@ int l_lovrColliderRemoveShape(lua_State* L) { return 0; } +int l_lovrColliderGetUserData(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + int ref = (int) lovrColliderGetUserData(collider); + lua_rawgeti(L, LUA_REGISTRYINDEX, ref); + return 1; +} + +int l_lovrColliderSetUserData(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + uint64_t ref = (int) lovrColliderGetUserData(collider); + if (ref) { + luaL_unref(L, LUA_REGISTRYINDEX, ref); + } + + if (lua_gettop(L) < 2) { + lua_pushnil(L); + } + + lua_settop(L, 2); + ref = luaL_ref(L, LUA_REGISTRYINDEX); + lovrColliderSetUserData(collider, (void*) ref); + return 0; +} + +int l_lovrColliderIsKinematic(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + lua_pushboolean(L, lovrColliderIsKinematic(collider)); + return 1; +} + +int l_lovrColliderSetKinematic(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + int kinematic = lua_toboolean(L, 2); + lovrColliderSetKinematic(collider, kinematic); + return 0; +} + +int l_lovrColliderIsGravityIgnored(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + lua_pushboolean(L, lovrColliderIsGravityIgnored(collider)); + return 1; +} + +int l_lovrColliderSetGravityIgnored(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + int ignored = lua_toboolean(L, 2); + lovrColliderSetGravityIgnored(collider, ignored); + return 0; +} + +int l_lovrColliderIsAwake(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + lua_pushboolean(L, lovrColliderIsAwake(collider)); + return 1; +} + +int l_lovrColliderSetAwake(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + int awake = lua_toboolean(L, 2); + lovrColliderSetAwake(collider, awake); + return 0; +} + +int l_lovrColliderIsSleepingAllowed(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + lua_pushboolean(L, lovrColliderIsSleepingAllowed(collider)); + return 1; +} + +int l_lovrColliderSetSleepingAllowed(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + int allowed = lua_toboolean(L, 2); + lovrColliderSetSleepingAllowed(collider, allowed); + return 0; +} + +int l_lovrColliderGetMass(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + lua_pushnumber(L, lovrColliderGetMass(collider)); + return 1; +} + +int l_lovrColliderSetMass(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + float mass = luaL_checknumber(L, 2); + lovrColliderSetMass(collider, mass); + return 0; +} + +int l_lovrColliderGetMassData(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + float cx, cy, cz, mass; + float inertia[6]; + lovrColliderGetMassData(collider, &cx, &cy, &cz, &mass, inertia); + lua_pushnumber(L, cx); + lua_pushnumber(L, cy); + lua_pushnumber(L, cz); + lua_pushnumber(L, mass); + lua_newtable(L); + for (int i = 0; i < 6; i++) { + lua_pushnumber(L, inertia[i]); + lua_rawseti(L, -2, i + 1); + } + return 5; +} + +int l_lovrColliderSetMassData(lua_State* L) { + Collider* collider = luax_checktype(L, 1, Collider); + float cx = luaL_checknumber(L, 2); + float cy = luaL_checknumber(L, 3); + float cz = luaL_checknumber(L, 4); + float mass = luaL_checknumber(L, 5); + float inertia[6]; + if (lua_istable(L, 6) && lua_objlen(L, 6) >= 6) { + for (int i = 0; i < 6; i++) { + lua_rawgeti(L, 6, i + 1); + if (!lua_isnumber(L, -1)) { + return luaL_argerror(L, 6, "Expected 6 numbers or a table with 6 numbers"); + } + + inertia[i] = lua_tonumber(L, -1); + lua_pop(L, 1); + } + } else { + for (int i = 6; i < 12; i++) { + if (lua_isnumber(L, i)) { + inertia[i] = lua_tonumber(L, i); + } else { + return luaL_argerror(L, i, "Expected 6 numbers or a table with 6 numbers"); + } + } + } + lovrColliderSetMassData(collider, cx, cy, cz, mass, inertia); + return 0; +} + int l_lovrColliderGetPosition(lua_State* L) { Collider* collider = luax_checktype(L, 1, Collider); float x, y, z; @@ -154,19 +296,6 @@ int l_lovrColliderApplyTorque(lua_State* L) { return 0; } -int l_lovrColliderIsKinematic(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - lua_pushboolean(L, lovrColliderIsKinematic(collider)); - return 1; -} - -int l_lovrColliderSetKinematic(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - int kinematic = lua_toboolean(L, 2); - lovrColliderSetKinematic(collider, kinematic); - return 0; -} - int l_lovrColliderGetLocalPoint(lua_State* L) { Collider* collider = luax_checktype(L, 1, Collider); float wx = luaL_checknumber(L, 2); @@ -245,125 +374,24 @@ int l_lovrColliderGetLinearVelocityFromWorldPoint(lua_State* L) { return 3; } -int l_lovrColliderIsSleepingAllowed(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - lua_pushboolean(L, lovrColliderIsSleepingAllowed(collider)); - return 1; -} - -int l_lovrColliderSetSleepingAllowed(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - int allowed = lua_toboolean(L, 2); - lovrColliderSetSleepingAllowed(collider, allowed); - return 0; -} - -int l_lovrColliderIsAwake(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - lua_pushboolean(L, lovrColliderIsAwake(collider)); - return 1; -} - -int l_lovrColliderSetAwake(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - int awake = lua_toboolean(L, 2); - lovrColliderSetAwake(collider, awake); - return 0; -} - -int l_lovrColliderGetUserData(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - int ref = (int) lovrColliderGetUserData(collider); - lua_rawgeti(L, LUA_REGISTRYINDEX, ref); - return 1; -} - -int l_lovrColliderSetUserData(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - uint64_t ref = (int) lovrColliderGetUserData(collider); - if (ref) { - luaL_unref(L, LUA_REGISTRYINDEX, ref); - } - - if (lua_gettop(L) < 2) { - lua_pushnil(L); - } - - lua_settop(L, 2); - ref = luaL_ref(L, LUA_REGISTRYINDEX); - lovrColliderSetUserData(collider, (void*) ref); - return 0; -} - -int l_lovrColliderGetWorld(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - luax_pushtype(L, World, lovrColliderGetWorld(collider)); - return 1; -} - -int l_lovrColliderGetMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - lua_pushnumber(L, lovrColliderGetMass(collider)); - return 1; -} - -int l_lovrColliderSetMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - float mass = luaL_checknumber(L, 2); - lovrColliderSetMass(collider, mass); - return 0; -} - -int l_lovrColliderGetMassData(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - float cx, cy, cz, mass; - float inertia[6]; - lovrColliderGetMassData(collider, &cx, &cy, &cz, &mass, inertia); - lua_pushnumber(L, cx); - lua_pushnumber(L, cy); - lua_pushnumber(L, cz); - lua_pushnumber(L, mass); - lua_newtable(L); - for (int i = 0; i < 6; i++) { - lua_pushnumber(L, inertia[i]); - lua_rawseti(L, -2, i + 1); - } - return 5; -} - -int l_lovrColliderSetMassData(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); - float cx = luaL_checknumber(L, 2); - float cy = luaL_checknumber(L, 3); - float cz = luaL_checknumber(L, 4); - float mass = luaL_checknumber(L, 5); - float inertia[6]; - if (lua_istable(L, 6) && lua_objlen(L, 6) >= 6) { - for (int i = 0; i < 6; i++) { - lua_rawgeti(L, 6, i + 1); - if (!lua_isnumber(L, -1)) { - return luaL_argerror(L, 6, "Expected 6 numbers or a table with 6 numbers"); - } - - inertia[i] = lua_tonumber(L, -1); - lua_pop(L, 1); - } - } else { - for (int i = 6; i < 12; i++) { - if (lua_isnumber(L, i)) { - inertia[i] = lua_tonumber(L, i); - } else { - return luaL_argerror(L, i, "Expected 6 numbers or a table with 6 numbers"); - } - } - } - lovrColliderSetMassData(collider, cx, cy, cz, mass, inertia); - return 0; -} - const luaL_Reg lovrCollider[] = { + { "getWorld", l_lovrColliderGetWorld }, { "addShape", l_lovrColliderAddShape }, { "removeShape", l_lovrColliderRemoveShape }, + { "getUserData", l_lovrColliderGetUserData }, + { "setUserData", l_lovrColliderSetUserData }, + { "isKinematic", l_lovrColliderIsKinematic }, + { "setKinematic", l_lovrColliderSetKinematic }, + { "isGravityIgnored", l_lovrColliderIsGravityIgnored }, + { "setGravityIgnored", l_lovrColliderSetGravityIgnored }, + { "isSleepingAllowed", l_lovrColliderIsSleepingAllowed }, + { "setSleepingAllowed", l_lovrColliderSetSleepingAllowed }, + { "isAwake", l_lovrColliderIsAwake }, + { "setAwake", l_lovrColliderSetAwake }, + { "getMass", l_lovrColliderGetMass }, + { "setMass", l_lovrColliderSetMass }, + { "getMassData", l_lovrColliderGetMassData }, + { "setMassData", l_lovrColliderSetMassData }, { "getPosition", l_lovrColliderGetPosition }, { "setPosition", l_lovrColliderSetPosition }, { "getOrientation", l_lovrColliderGetOrientation }, @@ -378,24 +406,11 @@ const luaL_Reg lovrCollider[] = { { "setAngularDamping", l_lovrColliderSetAngularDamping }, { "applyForce", l_lovrColliderApplyForce }, { "applyTorque", l_lovrColliderApplyForce }, - { "isKinematic", l_lovrColliderIsKinematic }, - { "setKinematic", l_lovrColliderSetKinematic }, { "getLocalPoint", l_lovrColliderGetLocalPoint }, { "getWorldPoint", l_lovrColliderGetWorldPoint }, { "getLocalVector", l_lovrColliderGetLocalVector }, { "getWorldVector", l_lovrColliderGetWorldVector }, { "getLinearVelocityFromLocalPoint", l_lovrColliderGetLinearVelocityFromLocalPoint }, { "getLinearVelocityFromWorldPoint", l_lovrColliderGetLinearVelocityFromWorldPoint }, - { "isSleepingAllowed", l_lovrColliderIsSleepingAllowed }, - { "setSleepingAllowed", l_lovrColliderSetSleepingAllowed }, - { "isAwake", l_lovrColliderIsAwake }, - { "setAwake", l_lovrColliderSetAwake }, - { "getUserData", l_lovrColliderGetUserData }, - { "setUserData", l_lovrColliderSetUserData }, - { "getWorld", l_lovrColliderGetWorld }, - { "getMass", l_lovrColliderGetMass }, - { "setMass", l_lovrColliderSetMass }, - { "getMassData", l_lovrColliderGetMassData }, - { "setMassData", l_lovrColliderSetMassData }, { NULL, NULL } }; diff --git a/src/physics/physics.c b/src/physics/physics.c index 2086b870..ab34819d 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -156,6 +156,10 @@ void lovrColliderDestroy(const Ref* ref) { free(collider); } +World* lovrColliderGetWorld(Collider* collider) { + return collider->world; +} + void lovrColliderAddShape(Collider* collider, Shape* shape) { shape->collider = collider; dGeomSetBody(shape->id, collider->body); @@ -177,6 +181,93 @@ void lovrColliderRemoveShape(Collider* collider, Shape* shape) { } } +void* lovrColliderGetUserData(Collider* collider) { + return collider->userdata; +} + +void lovrColliderSetUserData(Collider* collider, void* data) { + collider->userdata = data; +} + +int lovrColliderIsKinematic(Collider* collider) { + return dBodyIsKinematic(collider->body); +} + +void lovrColliderSetKinematic(Collider* collider, int kinematic) { + if (kinematic) { + dBodySetKinematic(collider->body); + } else { + dBodySetDynamic(collider->body); + } +} + +int lovrColliderIsGravityIgnored(Collider* collider) { + return !dBodyGetGravityMode(collider->body); +} + +void lovrColliderSetGravityIgnored(Collider* collider, int ignored) { + dBodySetGravityMode(collider->body, !ignored); +} + +int lovrColliderIsSleepingAllowed(Collider* collider) { + return dBodyGetAutoDisableFlag(collider->body); +} + +void lovrColliderSetSleepingAllowed(Collider* collider, int allowed) { + dBodySetAutoDisableFlag(collider->body, allowed); +} + +int lovrColliderIsAwake(Collider* collider) { + return dBodyIsEnabled(collider->body); +} + +void lovrColliderSetAwake(Collider* collider, int awake) { + if (awake) { + dBodyEnable(collider->body); + } else { + dBodyDisable(collider->body); + } +} + +float lovrColliderGetMass(Collider* collider) { + dMass m; + dBodyGetMass(collider->body, &m); + return m.mass; +} + +void lovrColliderSetMass(Collider* collider, float mass) { + dMass m; + dBodyGetMass(collider->body, &m); + dMassAdjust(&m, mass); + dBodySetMass(collider->body, &m); +} + +void lovrColliderGetMassData(Collider* collider, float* cx, float* cy, float* cz, float* mass, float inertia[6]) { + dMass m; + dBodyGetMass(collider->body, &m); + *cx = m.c[0]; + *cy = m.c[1]; + *cz = m.c[2]; + *mass = m.mass; + + // Diagonal + inertia[0] = m.I[0]; + inertia[1] = m.I[5]; + inertia[2] = m.I[10]; + + // Lower triangular + inertia[3] = m.I[4]; + inertia[4] = m.I[8]; + inertia[5] = m.I[9]; +} + +void lovrColliderSetMassData(Collider* collider, float cx, float cy, float cz, float mass, float inertia[]) { + dMass m; + dBodyGetMass(collider->body, &m); + dMassSetParameters(&m, mass, cx, cy, cz, inertia[0], inertia[1], inertia[2], inertia[3], inertia[4], inertia[5]); + dBodySetMass(collider->body, &m); +} + void lovrColliderGetPosition(Collider* collider, float* x, float* y, float* z) { const dReal* position = dBodyGetPosition(collider->body); *x = position[0]; @@ -256,18 +347,6 @@ void lovrColliderApplyTorque(Collider* collider, float x, float y, float z) { dBodyAddTorque(collider->body, x, y, z); } -int lovrColliderIsKinematic(Collider* collider) { - return dBodyIsKinematic(collider->body); -} - -void lovrColliderSetKinematic(Collider* collider, int kinematic) { - if (kinematic) { - dBodySetKinematic(collider->body); - } else { - dBodySetDynamic(collider->body); - } -} - void lovrColliderGetLocalPoint(Collider* collider, float wx, float wy, float wz, float* x, float* y, float* z) { dReal local[3]; dBodyGetPosRelPoint(collider->body, wx, wy, wz, local); @@ -316,77 +395,6 @@ void lovrColliderGetLinearVelocityFromWorldPoint(Collider* collider, float wx, f *vz = velocity[2]; } -int lovrColliderIsSleepingAllowed(Collider* collider) { - return dBodyGetAutoDisableFlag(collider->body); -} - -void lovrColliderSetSleepingAllowed(Collider* collider, int allowed) { - dBodySetAutoDisableFlag(collider->body, allowed); -} - -int lovrColliderIsAwake(Collider* collider) { - return dBodyIsEnabled(collider->body); -} - -void lovrColliderSetAwake(Collider* collider, int awake) { - if (awake) { - dBodyEnable(collider->body); - } else { - dBodyDisable(collider->body); - } -} - -void* lovrColliderGetUserData(Collider* collider) { - return collider->userdata; -} - -void lovrColliderSetUserData(Collider* collider, void* data) { - collider->userdata = data; -} - -World* lovrColliderGetWorld(Collider* collider) { - return collider->world; -} - -float lovrColliderGetMass(Collider* collider) { - dMass m; - dBodyGetMass(collider->body, &m); - return m.mass; -} - -void lovrColliderSetMass(Collider* collider, float mass) { - dMass m; - dBodyGetMass(collider->body, &m); - dMassAdjust(&m, mass); - dBodySetMass(collider->body, &m); -} - -void lovrColliderGetMassData(Collider* collider, float* cx, float* cy, float* cz, float* mass, float inertia[6]) { - dMass m; - dBodyGetMass(collider->body, &m); - *cx = m.c[0]; - *cy = m.c[1]; - *cz = m.c[2]; - *mass = m.mass; - - // Diagonal - inertia[0] = m.I[0]; - inertia[1] = m.I[5]; - inertia[2] = m.I[10]; - - // Lower triangular - inertia[3] = m.I[4]; - inertia[4] = m.I[8]; - inertia[5] = m.I[9]; -} - -void lovrColliderSetMassData(Collider* collider, float cx, float cy, float cz, float mass, float inertia[]) { - dMass m; - dBodyGetMass(collider->body, &m); - dMassSetParameters(&m, mass, cx, cy, cz, inertia[0], inertia[1], inertia[2], inertia[3], inertia[4], inertia[5]); - dBodySetMass(collider->body, &m); -} - void lovrShapeDestroy(const Ref* ref) { Shape* shape = containerof(ref, Shape); dGeomDestroy(shape->id); diff --git a/src/physics/physics.h b/src/physics/physics.h index 14283857..af287390 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -64,8 +64,23 @@ int lovrWorldCollide(World* world, Shape* a, Shape* b); Collider* lovrColliderCreate(); void lovrColliderDestroy(const Ref* ref); +World* lovrColliderGetWorld(Collider* collider); void lovrColliderAddShape(Collider* collider, Shape* shape); void lovrColliderRemoveShape(Collider* collider, Shape* shape); +void* lovrColliderGetUserData(Collider* collider); +void lovrColliderSetUserData(Collider* collider, void* data); +int lovrColliderIsKinematic(Collider* collider); +void lovrColliderSetKinematic(Collider* collider, int kinematic); +int lovrColliderIsGravityIgnored(Collider* collider); +void lovrColliderSetGravityIgnored(Collider* collider, int ignored); +int lovrColliderIsSleepingAllowed(Collider* collider); +void lovrColliderSetSleepingAllowed(Collider* collider, int allowed); +int lovrColliderIsAwake(Collider* collider); +void lovrColliderSetAwake(Collider* collider, int awake); +float lovrColliderGetMass(Collider* collider); +void lovrColliderSetMass(Collider* collider, float mass); +void lovrColliderGetMassData(Collider* collider, float* cx, float* cy, float* cz, float* mass, float inertia[6]); +void lovrColliderSetMassData(Collider* collider, float cx, float cy, float cz, float mass, float inertia[6]); void lovrColliderGetPosition(Collider* collider, float* x, float* y, float* z); void lovrColliderSetPosition(Collider* collider, float x, float y, float z); void lovrColliderGetOrientation(Collider* collider, float* angle, float* x, float* y, float* z); @@ -81,25 +96,12 @@ void lovrColliderSetAngularDamping(Collider* collider, float damping, float thre void lovrColliderApplyForce(Collider* collider, float x, float y, float z); void lovrColliderApplyForceAtPosition(Collider* collider, float x, float y, float z, float cx, float cy, float cz); void lovrColliderApplyTorque(Collider* collider, float x, float y, float z); -int lovrColliderIsKinematic(Collider* collider); -void lovrColliderSetKinematic(Collider* collider, int kinematic); void lovrColliderGetLocalPoint(Collider* collider, float wx, float wy, float wz, float* x, float* y, float* z); void lovrColliderGetWorldPoint(Collider* collider, float x, float y, float z, float* wx, float* wy, float* wz); void lovrColliderGetLocalVector(Collider* collider, float wx, float wy, float wz, float* x, float* y, float* z); 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); -int lovrColliderIsSleepingAllowed(Collider* collider); -void lovrColliderSetSleepingAllowed(Collider* collider, int allowed); -int lovrColliderIsAwake(Collider* collider); -void lovrColliderSetAwake(Collider* collider, int awake); -void* lovrColliderGetUserData(Collider* collider); -void lovrColliderSetUserData(Collider* collider, void* data); -World* lovrColliderGetWorld(Collider* collider); -float lovrColliderGetMass(Collider* collider); -void lovrColliderSetMass(Collider* collider, float mass); -void lovrColliderGetMassData(Collider* collider, float* cx, float* cy, float* cz, float* mass, float inertia[6]); -void lovrColliderSetMassData(Collider* collider, float cx, float cy, float cz, float mass, float inertia[6]); void lovrShapeDestroy(const Ref* ref); ShapeType lovrShapeGetType(Shape* shape);