mirror of https://github.com/bjornbytes/lovr.git
Fix remaining physics leaks;
This commit is contained in:
parent
c3b79b7274
commit
7a866552e9
|
@ -69,6 +69,7 @@ int l_lovrPhysicsNewBallJoint(lua_State* L) {
|
||||||
float z = luaL_checknumber(L, 5);
|
float z = luaL_checknumber(L, 5);
|
||||||
BallJoint* joint = lovrBallJointCreate(a, b, x, y, z);
|
BallJoint* joint = lovrBallJointCreate(a, b, x, y, z);
|
||||||
luax_pushobject(L, joint);
|
luax_pushobject(L, joint);
|
||||||
|
lovrRelease(joint);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +79,7 @@ int l_lovrPhysicsNewBoxShape(lua_State* L) {
|
||||||
float z = luaL_optnumber(L, 3, x);
|
float z = luaL_optnumber(L, 3, x);
|
||||||
BoxShape* box = lovrBoxShapeCreate(x, y, z);
|
BoxShape* box = lovrBoxShapeCreate(x, y, z);
|
||||||
luax_pushobject(L, box);
|
luax_pushobject(L, box);
|
||||||
|
lovrRelease(box);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +88,7 @@ int l_lovrPhysicsNewCapsuleShape(lua_State* L) {
|
||||||
float length = luaL_optnumber(L, 2, 1.f);
|
float length = luaL_optnumber(L, 2, 1.f);
|
||||||
CapsuleShape* capsule = lovrCapsuleShapeCreate(radius, length);
|
CapsuleShape* capsule = lovrCapsuleShapeCreate(radius, length);
|
||||||
luax_pushobject(L, capsule);
|
luax_pushobject(L, capsule);
|
||||||
|
lovrRelease(capsule);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +97,7 @@ int l_lovrPhysicsNewCylinderShape(lua_State* L) {
|
||||||
float length = luaL_optnumber(L, 2, 1.f);
|
float length = luaL_optnumber(L, 2, 1.f);
|
||||||
CylinderShape* cylinder = lovrCylinderShapeCreate(radius, length);
|
CylinderShape* cylinder = lovrCylinderShapeCreate(radius, length);
|
||||||
luax_pushobject(L, cylinder);
|
luax_pushobject(L, cylinder);
|
||||||
|
lovrRelease(cylinder);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +112,7 @@ int l_lovrPhysicsNewDistanceJoint(lua_State* L) {
|
||||||
float z2 = luaL_checknumber(L, 8);
|
float z2 = luaL_checknumber(L, 8);
|
||||||
DistanceJoint* joint = lovrDistanceJointCreate(a, b, x1, y1, z1, x2, y2, z2);
|
DistanceJoint* joint = lovrDistanceJointCreate(a, b, x1, y1, z1, x2, y2, z2);
|
||||||
luax_pushobject(L, joint);
|
luax_pushobject(L, joint);
|
||||||
|
lovrRelease(joint);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +127,7 @@ int l_lovrPhysicsNewHingeJoint(lua_State* L) {
|
||||||
float az = luaL_checknumber(L, 8);
|
float az = luaL_checknumber(L, 8);
|
||||||
HingeJoint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az);
|
HingeJoint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az);
|
||||||
luax_pushobject(L, joint);
|
luax_pushobject(L, joint);
|
||||||
|
lovrRelease(joint);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,6 +139,7 @@ int l_lovrPhysicsNewSliderJoint(lua_State* L) {
|
||||||
float az = luaL_checknumber(L, 5);
|
float az = luaL_checknumber(L, 5);
|
||||||
SliderJoint* joint = lovrSliderJointCreate(a, b, ax, ay, az);
|
SliderJoint* joint = lovrSliderJointCreate(a, b, ax, ay, az);
|
||||||
luax_pushobject(L, joint);
|
luax_pushobject(L, joint);
|
||||||
|
lovrRelease(joint);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,6 +147,7 @@ int l_lovrPhysicsNewSphereShape(lua_State* L) {
|
||||||
float radius = luaL_optnumber(L, 1, 1.f);
|
float radius = luaL_optnumber(L, 1, 1.f);
|
||||||
SphereShape* sphere = lovrSphereShapeCreate(radius);
|
SphereShape* sphere = lovrSphereShapeCreate(radius);
|
||||||
luax_pushobject(L, sphere);
|
luax_pushobject(L, sphere);
|
||||||
|
lovrRelease(sphere);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,9 +57,11 @@ int l_lovrWorldNewBoxCollider(lua_State* L) {
|
||||||
float sy = luaL_optnumber(L, 6, sx);
|
float sy = luaL_optnumber(L, 6, sx);
|
||||||
float sz = luaL_optnumber(L, 7, sx);
|
float sz = luaL_optnumber(L, 7, sx);
|
||||||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||||
lovrColliderAddShape(collider, lovrBoxShapeCreate(sx, sy, sz));
|
BoxShape* shape = lovrBoxShapeCreate(sx, sy, sz);
|
||||||
|
lovrColliderAddShape(collider, shape);
|
||||||
luax_pushobject(L, collider);
|
luax_pushobject(L, collider);
|
||||||
lovrRelease(collider);
|
lovrRelease(collider);
|
||||||
|
lovrRelease(shape);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,9 +73,11 @@ int l_lovrWorldNewCapsuleCollider(lua_State* L) {
|
||||||
float radius = luaL_optnumber(L, 5, 1.f);
|
float radius = luaL_optnumber(L, 5, 1.f);
|
||||||
float length = luaL_optnumber(L, 6, 1.f);
|
float length = luaL_optnumber(L, 6, 1.f);
|
||||||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||||
lovrColliderAddShape(collider, lovrCapsuleShapeCreate(radius, length));
|
CapsuleShape* shape = lovrCapsuleShapeCreate(radius, length);
|
||||||
|
lovrColliderAddShape(collider, shape);
|
||||||
luax_pushobject(L, collider);
|
luax_pushobject(L, collider);
|
||||||
lovrRelease(collider);
|
lovrRelease(collider);
|
||||||
|
lovrRelease(shape);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,9 +89,11 @@ int l_lovrWorldNewCylinderCollider(lua_State* L) {
|
||||||
float radius = luaL_optnumber(L, 5, 1.f);
|
float radius = luaL_optnumber(L, 5, 1.f);
|
||||||
float length = luaL_optnumber(L, 6, 1.f);
|
float length = luaL_optnumber(L, 6, 1.f);
|
||||||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||||
lovrColliderAddShape(collider, lovrCylinderShapeCreate(radius, length));
|
CylinderShape* shape = lovrCylinderShapeCreate(radius, length);
|
||||||
|
lovrColliderAddShape(collider, shape);
|
||||||
luax_pushobject(L, collider);
|
luax_pushobject(L, collider);
|
||||||
lovrRelease(collider);
|
lovrRelease(collider);
|
||||||
|
lovrRelease(shape);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,9 +104,11 @@ int l_lovrWorldNewSphereCollider(lua_State* L) {
|
||||||
float z = luaL_optnumber(L, 4, 0);
|
float z = luaL_optnumber(L, 4, 0);
|
||||||
float radius = luaL_optnumber(L, 5, 1.f);
|
float radius = luaL_optnumber(L, 5, 1.f);
|
||||||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||||
lovrColliderAddShape(collider, lovrSphereShapeCreate(radius));
|
SphereShape* shape = lovrSphereShapeCreate(radius);
|
||||||
|
lovrColliderAddShape(collider, shape);
|
||||||
luax_pushobject(L, collider);
|
luax_pushobject(L, collider);
|
||||||
lovrRelease(collider);
|
lovrRelease(collider);
|
||||||
|
lovrRelease(shape);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,8 +75,14 @@ void lovrWorldDestroy(void* ref) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrWorldDestroyData(World* world) {
|
void lovrWorldDestroyData(World* world) {
|
||||||
|
while (world->head) {
|
||||||
|
Collider* next = world->head->next;
|
||||||
|
lovrColliderDestroyData(world->head);
|
||||||
|
world->head = next;
|
||||||
|
}
|
||||||
|
|
||||||
if (world->contactGroup) {
|
if (world->contactGroup) {
|
||||||
dJointGroupEmpty(world->contactGroup);
|
dJointGroupDestroy(world->contactGroup);
|
||||||
world->contactGroup = NULL;
|
world->contactGroup = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,12 +91,6 @@ void lovrWorldDestroyData(World* world) {
|
||||||
world->space = NULL;
|
world->space = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (world->head) {
|
|
||||||
Collider* next = world->head->next;
|
|
||||||
lovrColliderDestroyData(world->head);
|
|
||||||
world->head = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (world->id) {
|
if (world->id) {
|
||||||
dWorldDestroy(world->id);
|
dWorldDestroy(world->id);
|
||||||
world->id = NULL;
|
world->id = NULL;
|
||||||
|
@ -305,9 +305,9 @@ Collider* lovrColliderCreate(World* world, float x, float y, float z) {
|
||||||
|
|
||||||
void lovrColliderDestroy(void* ref) {
|
void lovrColliderDestroy(void* ref) {
|
||||||
Collider* collider = ref;
|
Collider* collider = ref;
|
||||||
|
lovrColliderDestroyData(collider);
|
||||||
vec_deinit(&collider->shapes);
|
vec_deinit(&collider->shapes);
|
||||||
vec_deinit(&collider->joints);
|
vec_deinit(&collider->joints);
|
||||||
lovrColliderDestroyData(collider);
|
|
||||||
free(collider);
|
free(collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,6 +316,18 @@ void lovrColliderDestroyData(Collider* collider) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec_void_t* shapes = lovrColliderGetShapes(collider);
|
||||||
|
Shape* shape; int i;
|
||||||
|
vec_foreach(shapes, shape, i) {
|
||||||
|
lovrColliderRemoveShape(collider, shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec_void_t* joints = lovrColliderGetJoints(collider);
|
||||||
|
Joint* joint; int j;
|
||||||
|
vec_foreach(joints, joint, j) {
|
||||||
|
lovrRelease(joint);
|
||||||
|
}
|
||||||
|
|
||||||
dBodyDestroy(collider->body);
|
dBodyDestroy(collider->body);
|
||||||
collider->body = NULL;
|
collider->body = NULL;
|
||||||
|
|
||||||
|
@ -333,16 +345,15 @@ World* lovrColliderGetWorld(Collider* collider) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrColliderAddShape(Collider* collider, Shape* shape) {
|
void lovrColliderAddShape(Collider* collider, Shape* shape) {
|
||||||
shape->collider = collider;
|
lovrRetain(shape);
|
||||||
dGeomSetBody(shape->id, collider->body);
|
|
||||||
|
|
||||||
dSpaceID oldSpace = dGeomGetSpace(shape->id);
|
if (shape->collider) {
|
||||||
dSpaceID newSpace = collider->world->space;
|
lovrColliderRemoveShape(shape->collider, shape);
|
||||||
|
|
||||||
if (oldSpace && oldSpace != newSpace) {
|
|
||||||
dSpaceRemove(oldSpace, shape->id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shape->collider = collider;
|
||||||
|
dGeomSetBody(shape->id, collider->body);
|
||||||
|
dSpaceID newSpace = collider->world->space;
|
||||||
dSpaceAdd(newSpace, shape->id);
|
dSpaceAdd(newSpace, shape->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,6 +361,8 @@ void lovrColliderRemoveShape(Collider* collider, Shape* shape) {
|
||||||
if (shape->collider == collider) {
|
if (shape->collider == collider) {
|
||||||
dSpaceRemove(collider->world->space, shape->id);
|
dSpaceRemove(collider->world->space, shape->id);
|
||||||
dGeomSetBody(shape->id, 0);
|
dGeomSetBody(shape->id, 0);
|
||||||
|
shape->collider = NULL;
|
||||||
|
lovrRelease(shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -931,6 +944,7 @@ BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float x, float y, float
|
||||||
dJointSetData(joint->id, joint);
|
dJointSetData(joint->id, joint);
|
||||||
dJointAttach(joint->id, a->body, b->body);
|
dJointAttach(joint->id, a->body, b->body);
|
||||||
lovrBallJointSetAnchor(joint, x, y, z);
|
lovrBallJointSetAnchor(joint, x, y, z);
|
||||||
|
lovrRetain(joint);
|
||||||
|
|
||||||
return joint;
|
return joint;
|
||||||
}
|
}
|
||||||
|
@ -961,6 +975,7 @@ DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float x1, float
|
||||||
dJointSetData(joint->id, joint);
|
dJointSetData(joint->id, joint);
|
||||||
dJointAttach(joint->id, a->body, b->body);
|
dJointAttach(joint->id, a->body, b->body);
|
||||||
lovrDistanceJointSetAnchors(joint, x1, y1, z1, x2, y2, z2);
|
lovrDistanceJointSetAnchors(joint, x1, y1, z1, x2, y2, z2);
|
||||||
|
lovrRetain(joint);
|
||||||
|
|
||||||
return joint;
|
return joint;
|
||||||
}
|
}
|
||||||
|
@ -1001,6 +1016,7 @@ HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float x, float y, flo
|
||||||
dJointAttach(joint->id, a->body, b->body);
|
dJointAttach(joint->id, a->body, b->body);
|
||||||
lovrHingeJointSetAnchor(joint, x, y, z);
|
lovrHingeJointSetAnchor(joint, x, y, z);
|
||||||
lovrHingeJointSetAxis(joint, ax, ay, az);
|
lovrHingeJointSetAxis(joint, ax, ay, az);
|
||||||
|
lovrRetain(joint);
|
||||||
|
|
||||||
return joint;
|
return joint;
|
||||||
}
|
}
|
||||||
|
@ -1063,6 +1079,7 @@ SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float ax, float ay,
|
||||||
dJointSetData(joint->id, joint);
|
dJointSetData(joint->id, joint);
|
||||||
dJointAttach(joint->id, a->body, b->body);
|
dJointAttach(joint->id, a->body, b->body);
|
||||||
lovrSliderJointSetAxis(joint, ax, ay, az);
|
lovrSliderJointSetAxis(joint, ax, ay, az);
|
||||||
|
lovrRetain(joint);
|
||||||
|
|
||||||
return joint;
|
return joint;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue