mirror of https://github.com/bjornbytes/lovr.git
Organization; World:destroy;
This commit is contained in:
parent
1a404c087f
commit
5640b1d048
|
@ -69,6 +69,42 @@ int l_lovrWorldNewSphereCollider(lua_State* L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int l_lovrWorldDestroy(lua_State* L) {
|
||||||
|
World* world = luax_checktype(L, 1, World);
|
||||||
|
lovrWorldDestroyData(world);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int l_lovrWorldUpdate(lua_State* L) {
|
||||||
|
lua_settop(L, 3);
|
||||||
|
World* world = luax_checktype(L, 1, World);
|
||||||
|
float dt = luaL_checknumber(L, 2);
|
||||||
|
CollisionResolver resolver = lua_type(L, 3) == LUA_TFUNCTION ? collisionResolver : NULL;
|
||||||
|
lovrWorldUpdate(world, dt, resolver, L);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int l_lovrWorldComputeOverlaps(lua_State* L) {
|
||||||
|
World* world = luax_checktype(L, 1, World);
|
||||||
|
lovrWorldComputeOverlaps(world);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int l_lovrWorldOverlaps(lua_State* L) {
|
||||||
|
luax_checktype(L, 1, World);
|
||||||
|
lua_settop(L, 1);
|
||||||
|
lua_pushcclosure(L, nextOverlap, 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int l_lovrWorldCollide(lua_State* L) {
|
||||||
|
World* world = luax_checktype(L, 1, World);
|
||||||
|
Shape* a = luax_checktypeof(L, 2, Shape);
|
||||||
|
Shape* b = luax_checktypeof(L, 3, Shape);
|
||||||
|
lua_pushboolean(L, lovrWorldCollide(world, a, b));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int l_lovrWorldGetGravity(lua_State* L) {
|
int l_lovrWorldGetGravity(lua_State* L) {
|
||||||
World* world = luax_checktype(L, 1, World);
|
World* world = luax_checktype(L, 1, World);
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
|
@ -135,42 +171,17 @@ int l_lovrWorldSetSleepingAllowed(lua_State* L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrWorldUpdate(lua_State* L) {
|
|
||||||
lua_settop(L, 3);
|
|
||||||
World* world = luax_checktype(L, 1, World);
|
|
||||||
float dt = luaL_checknumber(L, 2);
|
|
||||||
CollisionResolver resolver = lua_type(L, 3) == LUA_TFUNCTION ? collisionResolver : NULL;
|
|
||||||
lovrWorldUpdate(world, dt, resolver, L);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int l_lovrWorldComputeOverlaps(lua_State* L) {
|
|
||||||
World* world = luax_checktype(L, 1, World);
|
|
||||||
lovrWorldComputeOverlaps(world);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int l_lovrWorldOverlaps(lua_State* L) {
|
|
||||||
luax_checktype(L, 1, World);
|
|
||||||
lua_settop(L, 1);
|
|
||||||
lua_pushcclosure(L, nextOverlap, 1);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int l_lovrWorldCollide(lua_State* L) {
|
|
||||||
World* world = luax_checktype(L, 1, World);
|
|
||||||
Shape* a = luax_checktypeof(L, 2, Shape);
|
|
||||||
Shape* b = luax_checktypeof(L, 3, Shape);
|
|
||||||
lua_pushboolean(L, lovrWorldCollide(world, a, b));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const luaL_Reg lovrWorld[] = {
|
const luaL_Reg lovrWorld[] = {
|
||||||
{ "newCollider", l_lovrWorldNewCollider },
|
{ "newCollider", l_lovrWorldNewCollider },
|
||||||
{ "newBoxCollider", l_lovrWorldNewBoxCollider },
|
{ "newBoxCollider", l_lovrWorldNewBoxCollider },
|
||||||
{ "newCapsuleCollider", l_lovrWorldNewCapsuleCollider },
|
{ "newCapsuleCollider", l_lovrWorldNewCapsuleCollider },
|
||||||
{ "newCylinderCollider", l_lovrWorldNewCylinderCollider },
|
{ "newCylinderCollider", l_lovrWorldNewCylinderCollider },
|
||||||
{ "newSphereCollider", l_lovrWorldNewSphereCollider },
|
{ "newSphereCollider", l_lovrWorldNewSphereCollider },
|
||||||
|
{ "destroy", l_lovrWorldDestroy },
|
||||||
|
{ "update", l_lovrWorldUpdate },
|
||||||
|
{ "computeOverlaps", l_lovrWorldComputeOverlaps },
|
||||||
|
{ "overlaps", l_lovrWorldOverlaps },
|
||||||
|
{ "collide", l_lovrWorldCollide },
|
||||||
{ "getGravity", l_lovrWorldGetGravity },
|
{ "getGravity", l_lovrWorldGetGravity },
|
||||||
{ "setGravity", l_lovrWorldSetGravity },
|
{ "setGravity", l_lovrWorldSetGravity },
|
||||||
{ "getLinearDamping", l_lovrWorldGetLinearDamping },
|
{ "getLinearDamping", l_lovrWorldGetLinearDamping },
|
||||||
|
@ -179,9 +190,5 @@ const luaL_Reg lovrWorld[] = {
|
||||||
{ "setAngularDamping", l_lovrWorldSetAngularDamping },
|
{ "setAngularDamping", l_lovrWorldSetAngularDamping },
|
||||||
{ "isSleepingAllowed", l_lovrWorldIsSleepingAllowed },
|
{ "isSleepingAllowed", l_lovrWorldIsSleepingAllowed },
|
||||||
{ "setSleepingAllowed", l_lovrWorldSetSleepingAllowed },
|
{ "setSleepingAllowed", l_lovrWorldSetSleepingAllowed },
|
||||||
{ "update", l_lovrWorldUpdate },
|
|
||||||
{ "computeOverlaps", l_lovrWorldComputeOverlaps },
|
|
||||||
{ "overlaps", l_lovrWorldOverlaps },
|
|
||||||
{ "collide", l_lovrWorldCollide },
|
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
|
@ -41,49 +41,26 @@ World* lovrWorldCreate() {
|
||||||
|
|
||||||
void lovrWorldDestroy(const Ref* ref) {
|
void lovrWorldDestroy(const Ref* ref) {
|
||||||
World* world = containerof(ref, World);
|
World* world = containerof(ref, World);
|
||||||
dWorldDestroy(world->id);
|
lovrWorldDestroyData(world);
|
||||||
vec_deinit(&world->overlaps);
|
vec_deinit(&world->overlaps);
|
||||||
free(world);
|
free(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrWorldGetGravity(World* world, float* x, float* y, float* z) {
|
void lovrWorldDestroyData(World* world) {
|
||||||
dReal gravity[3];
|
if (world->contactGroup) {
|
||||||
dWorldGetGravity(world->id, gravity);
|
dJointGroupEmpty(world->contactGroup);
|
||||||
*x = gravity[0];
|
world->contactGroup = NULL;
|
||||||
*y = gravity[1];
|
}
|
||||||
*z = gravity[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
void lovrWorldSetGravity(World* world, float x, float y, float z) {
|
if (world->space) {
|
||||||
dWorldSetGravity(world->id, x, y, z);
|
dSpaceDestroy(world->space);
|
||||||
}
|
world->space = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void lovrWorldGetLinearDamping(World* world, float* damping, float* threshold) {
|
if (world->id) {
|
||||||
*damping = dWorldGetLinearDamping(world->id);
|
dWorldDestroy(world->id);
|
||||||
*threshold = dWorldGetLinearDampingThreshold(world->id);
|
world->id = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrWorldSetLinearDamping(World* world, float damping, float threshold) {
|
|
||||||
dWorldSetLinearDamping(world->id, damping);
|
|
||||||
dWorldSetLinearDampingThreshold(world->id, threshold);
|
|
||||||
}
|
|
||||||
|
|
||||||
void lovrWorldGetAngularDamping(World* world, float* damping, float* threshold) {
|
|
||||||
*damping = dWorldGetAngularDamping(world->id);
|
|
||||||
*threshold = dWorldGetAngularDampingThreshold(world->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void lovrWorldSetAngularDamping(World* world, float damping, float threshold) {
|
|
||||||
dWorldSetAngularDamping(world->id, damping);
|
|
||||||
dWorldSetAngularDampingThreshold(world->id, threshold);
|
|
||||||
}
|
|
||||||
|
|
||||||
int lovrWorldIsSleepingAllowed(World* world) {
|
|
||||||
return dWorldGetAutoDisableFlag(world->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void lovrWorldSetSleepingAllowed(World* world, int allowed) {
|
|
||||||
dWorldSetAutoDisableFlag(world->id, allowed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrWorldUpdate(World* world, float dt, CollisionResolver resolver, void* userdata) {
|
void lovrWorldUpdate(World* world, float dt, CollisionResolver resolver, void* userdata) {
|
||||||
|
@ -135,6 +112,46 @@ int lovrWorldCollide(World* world, Shape* a, Shape* b) {
|
||||||
return contactCount;
|
return contactCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lovrWorldGetGravity(World* world, float* x, float* y, float* z) {
|
||||||
|
dReal gravity[3];
|
||||||
|
dWorldGetGravity(world->id, gravity);
|
||||||
|
*x = gravity[0];
|
||||||
|
*y = gravity[1];
|
||||||
|
*z = gravity[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrWorldSetGravity(World* world, float x, float y, float z) {
|
||||||
|
dWorldSetGravity(world->id, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrWorldGetLinearDamping(World* world, float* damping, float* threshold) {
|
||||||
|
*damping = dWorldGetLinearDamping(world->id);
|
||||||
|
*threshold = dWorldGetLinearDampingThreshold(world->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrWorldSetLinearDamping(World* world, float damping, float threshold) {
|
||||||
|
dWorldSetLinearDamping(world->id, damping);
|
||||||
|
dWorldSetLinearDampingThreshold(world->id, threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrWorldGetAngularDamping(World* world, float* damping, float* threshold) {
|
||||||
|
*damping = dWorldGetAngularDamping(world->id);
|
||||||
|
*threshold = dWorldGetAngularDampingThreshold(world->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrWorldSetAngularDamping(World* world, float damping, float threshold) {
|
||||||
|
dWorldSetAngularDamping(world->id, damping);
|
||||||
|
dWorldSetAngularDampingThreshold(world->id, threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
int lovrWorldIsSleepingAllowed(World* world) {
|
||||||
|
return dWorldGetAutoDisableFlag(world->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lovrWorldSetSleepingAllowed(World* world, int allowed) {
|
||||||
|
dWorldSetAutoDisableFlag(world->id, allowed);
|
||||||
|
}
|
||||||
|
|
||||||
Collider* lovrColliderCreate(World* world) {
|
Collider* lovrColliderCreate(World* world) {
|
||||||
if (!world) {
|
if (!world) {
|
||||||
error("No world specified");
|
error("No world specified");
|
||||||
|
|
|
@ -49,6 +49,11 @@ void lovrPhysicsDestroy();
|
||||||
|
|
||||||
World* lovrWorldCreate();
|
World* lovrWorldCreate();
|
||||||
void lovrWorldDestroy(const Ref* ref);
|
void lovrWorldDestroy(const Ref* ref);
|
||||||
|
void lovrWorldDestroyData(World* world);
|
||||||
|
void lovrWorldUpdate(World* world, float dt, CollisionResolver resolver, void* userdata);
|
||||||
|
void lovrWorldComputeOverlaps(World* world);
|
||||||
|
int lovrWorldGetNextOverlap(World* world, Shape** a, Shape** b);
|
||||||
|
int lovrWorldCollide(World* world, Shape* a, Shape* b);
|
||||||
void lovrWorldGetGravity(World* world, float* x, float* y, float* z);
|
void lovrWorldGetGravity(World* world, float* x, float* y, float* z);
|
||||||
void lovrWorldSetGravity(World* world, float x, float y, float z);
|
void lovrWorldSetGravity(World* world, float x, float y, float z);
|
||||||
void lovrWorldGetLinearDamping(World* world, float* damping, float* threshold);
|
void lovrWorldGetLinearDamping(World* world, float* damping, float* threshold);
|
||||||
|
@ -57,10 +62,6 @@ void lovrWorldGetAngularDamping(World* world, float* damping, float* threshold);
|
||||||
void lovrWorldSetAngularDamping(World* world, float damping, float threshold);
|
void lovrWorldSetAngularDamping(World* world, float damping, float threshold);
|
||||||
int lovrWorldIsSleepingAllowed(World* world);
|
int lovrWorldIsSleepingAllowed(World* world);
|
||||||
void lovrWorldSetSleepingAllowed(World* world, int allowed);
|
void lovrWorldSetSleepingAllowed(World* world, int allowed);
|
||||||
void lovrWorldUpdate(World* world, float dt, CollisionResolver resolver, void* userdata);
|
|
||||||
void lovrWorldComputeOverlaps(World* world);
|
|
||||||
int lovrWorldGetNextOverlap(World* world, Shape** a, Shape** b);
|
|
||||||
int lovrWorldCollide(World* world, Shape* a, Shape* b);
|
|
||||||
|
|
||||||
Collider* lovrColliderCreate();
|
Collider* lovrColliderCreate();
|
||||||
void lovrColliderDestroy(const Ref* ref);
|
void lovrColliderDestroy(const Ref* ref);
|
||||||
|
|
Loading…
Reference in New Issue