mirror of https://github.com/bjornbytes/lovr.git
Organization; Collider:isGravityIgnored; Collider:setGravityIgnored;
This commit is contained in:
parent
2c89aa4663
commit
1829a65898
|
@ -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 }
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue