Fix remaining physics leaks;

This commit is contained in:
bjorn 2018-08-22 09:29:34 -07:00
parent c3b79b7274
commit 7a866552e9
3 changed files with 52 additions and 19 deletions

View File

@ -69,6 +69,7 @@ int l_lovrPhysicsNewBallJoint(lua_State* L) {
float z = luaL_checknumber(L, 5);
BallJoint* joint = lovrBallJointCreate(a, b, x, y, z);
luax_pushobject(L, joint);
lovrRelease(joint);
return 1;
}
@ -78,6 +79,7 @@ int l_lovrPhysicsNewBoxShape(lua_State* L) {
float z = luaL_optnumber(L, 3, x);
BoxShape* box = lovrBoxShapeCreate(x, y, z);
luax_pushobject(L, box);
lovrRelease(box);
return 1;
}
@ -86,6 +88,7 @@ int l_lovrPhysicsNewCapsuleShape(lua_State* L) {
float length = luaL_optnumber(L, 2, 1.f);
CapsuleShape* capsule = lovrCapsuleShapeCreate(radius, length);
luax_pushobject(L, capsule);
lovrRelease(capsule);
return 1;
}
@ -94,6 +97,7 @@ int l_lovrPhysicsNewCylinderShape(lua_State* L) {
float length = luaL_optnumber(L, 2, 1.f);
CylinderShape* cylinder = lovrCylinderShapeCreate(radius, length);
luax_pushobject(L, cylinder);
lovrRelease(cylinder);
return 1;
}
@ -108,6 +112,7 @@ int l_lovrPhysicsNewDistanceJoint(lua_State* L) {
float z2 = luaL_checknumber(L, 8);
DistanceJoint* joint = lovrDistanceJointCreate(a, b, x1, y1, z1, x2, y2, z2);
luax_pushobject(L, joint);
lovrRelease(joint);
return 1;
}
@ -122,6 +127,7 @@ int l_lovrPhysicsNewHingeJoint(lua_State* L) {
float az = luaL_checknumber(L, 8);
HingeJoint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az);
luax_pushobject(L, joint);
lovrRelease(joint);
return 1;
}
@ -133,6 +139,7 @@ int l_lovrPhysicsNewSliderJoint(lua_State* L) {
float az = luaL_checknumber(L, 5);
SliderJoint* joint = lovrSliderJointCreate(a, b, ax, ay, az);
luax_pushobject(L, joint);
lovrRelease(joint);
return 1;
}
@ -140,6 +147,7 @@ int l_lovrPhysicsNewSphereShape(lua_State* L) {
float radius = luaL_optnumber(L, 1, 1.f);
SphereShape* sphere = lovrSphereShapeCreate(radius);
luax_pushobject(L, sphere);
lovrRelease(sphere);
return 1;
}

View File

@ -57,9 +57,11 @@ int l_lovrWorldNewBoxCollider(lua_State* L) {
float sy = luaL_optnumber(L, 6, sx);
float sz = luaL_optnumber(L, 7, sx);
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);
lovrRelease(collider);
lovrRelease(shape);
return 1;
}
@ -71,9 +73,11 @@ int l_lovrWorldNewCapsuleCollider(lua_State* L) {
float radius = luaL_optnumber(L, 5, 1.f);
float length = luaL_optnumber(L, 6, 1.f);
Collider* collider = lovrColliderCreate(world, x, y, z);
lovrColliderAddShape(collider, lovrCapsuleShapeCreate(radius, length));
CapsuleShape* shape = lovrCapsuleShapeCreate(radius, length);
lovrColliderAddShape(collider, shape);
luax_pushobject(L, collider);
lovrRelease(collider);
lovrRelease(shape);
return 1;
}
@ -85,9 +89,11 @@ int l_lovrWorldNewCylinderCollider(lua_State* L) {
float radius = luaL_optnumber(L, 5, 1.f);
float length = luaL_optnumber(L, 6, 1.f);
Collider* collider = lovrColliderCreate(world, x, y, z);
lovrColliderAddShape(collider, lovrCylinderShapeCreate(radius, length));
CylinderShape* shape = lovrCylinderShapeCreate(radius, length);
lovrColliderAddShape(collider, shape);
luax_pushobject(L, collider);
lovrRelease(collider);
lovrRelease(shape);
return 1;
}
@ -98,9 +104,11 @@ int l_lovrWorldNewSphereCollider(lua_State* L) {
float z = luaL_optnumber(L, 4, 0);
float radius = luaL_optnumber(L, 5, 1.f);
Collider* collider = lovrColliderCreate(world, x, y, z);
lovrColliderAddShape(collider, lovrSphereShapeCreate(radius));
SphereShape* shape = lovrSphereShapeCreate(radius);
lovrColliderAddShape(collider, shape);
luax_pushobject(L, collider);
lovrRelease(collider);
lovrRelease(shape);
return 1;
}

View File

@ -75,8 +75,14 @@ void lovrWorldDestroy(void* ref) {
}
void lovrWorldDestroyData(World* world) {
while (world->head) {
Collider* next = world->head->next;
lovrColliderDestroyData(world->head);
world->head = next;
}
if (world->contactGroup) {
dJointGroupEmpty(world->contactGroup);
dJointGroupDestroy(world->contactGroup);
world->contactGroup = NULL;
}
@ -85,12 +91,6 @@ void lovrWorldDestroyData(World* world) {
world->space = NULL;
}
while (world->head) {
Collider* next = world->head->next;
lovrColliderDestroyData(world->head);
world->head = next;
}
if (world->id) {
dWorldDestroy(world->id);
world->id = NULL;
@ -305,9 +305,9 @@ Collider* lovrColliderCreate(World* world, float x, float y, float z) {
void lovrColliderDestroy(void* ref) {
Collider* collider = ref;
lovrColliderDestroyData(collider);
vec_deinit(&collider->shapes);
vec_deinit(&collider->joints);
lovrColliderDestroyData(collider);
free(collider);
}
@ -316,6 +316,18 @@ void lovrColliderDestroyData(Collider* collider) {
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);
collider->body = NULL;
@ -333,16 +345,15 @@ World* lovrColliderGetWorld(Collider* collider) {
}
void lovrColliderAddShape(Collider* collider, Shape* shape) {
shape->collider = collider;
dGeomSetBody(shape->id, collider->body);
lovrRetain(shape);
dSpaceID oldSpace = dGeomGetSpace(shape->id);
dSpaceID newSpace = collider->world->space;
if (oldSpace && oldSpace != newSpace) {
dSpaceRemove(oldSpace, shape->id);
if (shape->collider) {
lovrColliderRemoveShape(shape->collider, shape);
}
shape->collider = collider;
dGeomSetBody(shape->id, collider->body);
dSpaceID newSpace = collider->world->space;
dSpaceAdd(newSpace, shape->id);
}
@ -350,6 +361,8 @@ void lovrColliderRemoveShape(Collider* collider, Shape* shape) {
if (shape->collider == collider) {
dSpaceRemove(collider->world->space, shape->id);
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);
dJointAttach(joint->id, a->body, b->body);
lovrBallJointSetAnchor(joint, x, y, z);
lovrRetain(joint);
return joint;
}
@ -961,6 +975,7 @@ DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float x1, float
dJointSetData(joint->id, joint);
dJointAttach(joint->id, a->body, b->body);
lovrDistanceJointSetAnchors(joint, x1, y1, z1, x2, y2, z2);
lovrRetain(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);
lovrHingeJointSetAnchor(joint, x, y, z);
lovrHingeJointSetAxis(joint, ax, ay, az);
lovrRetain(joint);
return joint;
}
@ -1063,6 +1079,7 @@ SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float ax, float ay,
dJointSetData(joint->id, joint);
dJointAttach(joint->id, a->body, b->body);
lovrSliderJointSetAxis(joint, ax, ay, az);
lovrRetain(joint);
return joint;
}