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 "api/lovr.h"
|
||||||
#include "physics/physics.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) {
|
int l_lovrColliderAddShape(lua_State* L) {
|
||||||
Collider* collider = luax_checktype(L, 1, Collider);
|
Collider* collider = luax_checktype(L, 1, Collider);
|
||||||
Shape* shape = luax_checktypeof(L, 2, Shape);
|
Shape* shape = luax_checktypeof(L, 2, Shape);
|
||||||
|
@ -15,6 +21,142 @@ int l_lovrColliderRemoveShape(lua_State* L) {
|
||||||
return 0;
|
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) {
|
int l_lovrColliderGetPosition(lua_State* L) {
|
||||||
Collider* collider = luax_checktype(L, 1, Collider);
|
Collider* collider = luax_checktype(L, 1, Collider);
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
|
@ -154,19 +296,6 @@ int l_lovrColliderApplyTorque(lua_State* L) {
|
||||||
return 0;
|
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) {
|
int l_lovrColliderGetLocalPoint(lua_State* L) {
|
||||||
Collider* collider = luax_checktype(L, 1, Collider);
|
Collider* collider = luax_checktype(L, 1, Collider);
|
||||||
float wx = luaL_checknumber(L, 2);
|
float wx = luaL_checknumber(L, 2);
|
||||||
|
@ -245,125 +374,24 @@ int l_lovrColliderGetLinearVelocityFromWorldPoint(lua_State* L) {
|
||||||
return 3;
|
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[] = {
|
const luaL_Reg lovrCollider[] = {
|
||||||
|
{ "getWorld", l_lovrColliderGetWorld },
|
||||||
{ "addShape", l_lovrColliderAddShape },
|
{ "addShape", l_lovrColliderAddShape },
|
||||||
{ "removeShape", l_lovrColliderRemoveShape },
|
{ "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 },
|
{ "getPosition", l_lovrColliderGetPosition },
|
||||||
{ "setPosition", l_lovrColliderSetPosition },
|
{ "setPosition", l_lovrColliderSetPosition },
|
||||||
{ "getOrientation", l_lovrColliderGetOrientation },
|
{ "getOrientation", l_lovrColliderGetOrientation },
|
||||||
|
@ -378,24 +406,11 @@ const luaL_Reg lovrCollider[] = {
|
||||||
{ "setAngularDamping", l_lovrColliderSetAngularDamping },
|
{ "setAngularDamping", l_lovrColliderSetAngularDamping },
|
||||||
{ "applyForce", l_lovrColliderApplyForce },
|
{ "applyForce", l_lovrColliderApplyForce },
|
||||||
{ "applyTorque", l_lovrColliderApplyForce },
|
{ "applyTorque", l_lovrColliderApplyForce },
|
||||||
{ "isKinematic", l_lovrColliderIsKinematic },
|
|
||||||
{ "setKinematic", l_lovrColliderSetKinematic },
|
|
||||||
{ "getLocalPoint", l_lovrColliderGetLocalPoint },
|
{ "getLocalPoint", l_lovrColliderGetLocalPoint },
|
||||||
{ "getWorldPoint", l_lovrColliderGetWorldPoint },
|
{ "getWorldPoint", l_lovrColliderGetWorldPoint },
|
||||||
{ "getLocalVector", l_lovrColliderGetLocalVector },
|
{ "getLocalVector", l_lovrColliderGetLocalVector },
|
||||||
{ "getWorldVector", l_lovrColliderGetWorldVector },
|
{ "getWorldVector", l_lovrColliderGetWorldVector },
|
||||||
{ "getLinearVelocityFromLocalPoint", l_lovrColliderGetLinearVelocityFromLocalPoint },
|
{ "getLinearVelocityFromLocalPoint", l_lovrColliderGetLinearVelocityFromLocalPoint },
|
||||||
{ "getLinearVelocityFromWorldPoint", l_lovrColliderGetLinearVelocityFromWorldPoint },
|
{ "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 }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
|
@ -156,6 +156,10 @@ void lovrColliderDestroy(const Ref* ref) {
|
||||||
free(collider);
|
free(collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
World* lovrColliderGetWorld(Collider* collider) {
|
||||||
|
return collider->world;
|
||||||
|
}
|
||||||
|
|
||||||
void lovrColliderAddShape(Collider* collider, Shape* shape) {
|
void lovrColliderAddShape(Collider* collider, Shape* shape) {
|
||||||
shape->collider = collider;
|
shape->collider = collider;
|
||||||
dGeomSetBody(shape->id, collider->body);
|
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) {
|
void lovrColliderGetPosition(Collider* collider, float* x, float* y, float* z) {
|
||||||
const dReal* position = dBodyGetPosition(collider->body);
|
const dReal* position = dBodyGetPosition(collider->body);
|
||||||
*x = position[0];
|
*x = position[0];
|
||||||
|
@ -256,18 +347,6 @@ void lovrColliderApplyTorque(Collider* collider, float x, float y, float z) {
|
||||||
dBodyAddTorque(collider->body, x, y, 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) {
|
void lovrColliderGetLocalPoint(Collider* collider, float wx, float wy, float wz, float* x, float* y, float* z) {
|
||||||
dReal local[3];
|
dReal local[3];
|
||||||
dBodyGetPosRelPoint(collider->body, wx, wy, wz, local);
|
dBodyGetPosRelPoint(collider->body, wx, wy, wz, local);
|
||||||
|
@ -316,77 +395,6 @@ void lovrColliderGetLinearVelocityFromWorldPoint(Collider* collider, float wx, f
|
||||||
*vz = velocity[2];
|
*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) {
|
void lovrShapeDestroy(const Ref* ref) {
|
||||||
Shape* shape = containerof(ref, Shape);
|
Shape* shape = containerof(ref, Shape);
|
||||||
dGeomDestroy(shape->id);
|
dGeomDestroy(shape->id);
|
||||||
|
|
|
@ -64,8 +64,23 @@ int lovrWorldCollide(World* world, Shape* a, Shape* b);
|
||||||
|
|
||||||
Collider* lovrColliderCreate();
|
Collider* lovrColliderCreate();
|
||||||
void lovrColliderDestroy(const Ref* ref);
|
void lovrColliderDestroy(const Ref* ref);
|
||||||
|
World* lovrColliderGetWorld(Collider* collider);
|
||||||
void lovrColliderAddShape(Collider* collider, Shape* shape);
|
void lovrColliderAddShape(Collider* collider, Shape* shape);
|
||||||
void lovrColliderRemoveShape(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 lovrColliderGetPosition(Collider* collider, float* x, float* y, float* z);
|
||||||
void lovrColliderSetPosition(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);
|
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 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 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);
|
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 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 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 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 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 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 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);
|
void lovrShapeDestroy(const Ref* ref);
|
||||||
ShapeType lovrShapeGetType(Shape* shape);
|
ShapeType lovrShapeGetType(Shape* shape);
|
||||||
|
|
Loading…
Reference in New Issue