Organization; Collider:isGravityIgnored; Collider:setGravityIgnored;

This commit is contained in:
bjorn 2017-05-19 21:48:59 -06:00
parent 2c89aa4663
commit 1829a65898
3 changed files with 263 additions and 238 deletions

View File

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

View File

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

View File

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