diff --git a/src/api/l_physics_collider.c b/src/api/l_physics_collider.c index 7f6372fe6..331cb6d85 100644 --- a/src/api/l_physics_collider.c +++ b/src/api/l_physics_collider.c @@ -4,8 +4,14 @@ #include "util.h" #include +static Collider* luax_checkcollider(lua_State* L, int index) { + Collider* collider = luax_checktype(L, index, Collider); + lovrCheck(!lovrColliderIsDestroyed(collider), "Attempt to use a destroyed Collider"); + return collider; +} + static int l_lovrColliderDestroy(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lovrColliderDestruct(collider); return 0; } @@ -18,28 +24,28 @@ static int l_lovrColliderIsDestroyed(lua_State* L) { } static int l_lovrColliderIsEnabled(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool enabled = lovrColliderIsEnabled(collider); lua_pushboolean(L, enabled); return 1; } static int l_lovrColliderSetEnabled(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool enable = lua_toboolean(L, 2); lovrColliderSetEnabled(collider, enable); return 1; } static int l_lovrColliderGetWorld(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); World* world = lovrColliderGetWorld(collider); luax_pushtype(L, World, world); return 1; } static int l_lovrColliderGetJoints(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_newtable(L); int index = 1; Joint* joint = NULL; @@ -51,7 +57,7 @@ static int l_lovrColliderGetJoints(lua_State* L) { } static int l_lovrColliderGetShapes(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_newtable(L); int index = 1; Shape* shape = NULL; @@ -63,7 +69,7 @@ static int l_lovrColliderGetShapes(lua_State* L) { } static int l_lovrColliderGetShape(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); Shape* shape = lovrColliderGetShapes(collider, NULL); if (shape) { luax_pushshape(L, shape); @@ -74,7 +80,7 @@ static int l_lovrColliderGetShape(lua_State* L) { } static int l_lovrColliderAddShape(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); Shape* shape = luax_checkshape(L, 2); lovrColliderAddShape(collider, shape); lua_settop(L, 2); @@ -82,14 +88,14 @@ static int l_lovrColliderAddShape(lua_State* L) { } static int l_lovrColliderRemoveShape(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); Shape* shape = luax_checkshape(L, 2); lovrColliderRemoveShape(collider, shape); return 0; } static int l_lovrColliderGetUserData(lua_State* L) { - luax_checktype(L, 1, Collider); + luax_checkcollider(L, 1); luax_pushstash(L, "lovr.collider.userdata"); lua_pushvalue(L, 1); lua_rawget(L, -2); @@ -97,7 +103,7 @@ static int l_lovrColliderGetUserData(lua_State* L) { } static int l_lovrColliderSetUserData(lua_State* L) { - luax_checktype(L, 1, Collider); + luax_checkcollider(L, 1); lua_settop(L, 2); luax_pushstash(L, "lovr.collider.userdata"); lua_pushvalue(L, 1); @@ -107,100 +113,100 @@ static int l_lovrColliderSetUserData(lua_State* L) { } static int l_lovrColliderIsKinematic(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushboolean(L, lovrColliderIsKinematic(collider)); return 1; } static int l_lovrColliderSetKinematic(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool kinematic = lua_toboolean(L, 2); lovrColliderSetKinematic(collider, kinematic); return 0; } static int l_lovrColliderIsSensor(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushboolean(L, lovrColliderIsSensor(collider)); return 1; } static int l_lovrColliderSetSensor(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool sensor = lua_toboolean(L, 2); lovrColliderSetSensor(collider, sensor); return 0; } static int l_lovrColliderIsContinuous(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool continuous = lovrColliderIsContinuous(collider); lua_pushboolean(L, continuous); return 1; } static int l_lovrColliderSetContinuous(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool continuous = lua_toboolean(L, 2); lovrColliderSetContinuous(collider, continuous); return 0; } static int l_lovrColliderGetGravityScale(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float scale = lovrColliderGetGravityScale(collider); lua_pushnumber(L, scale); return 1; } static int l_lovrColliderSetGravityScale(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float scale = luax_checkfloat(L, 2); lovrColliderSetGravityScale(collider, scale); return 0; } static int l_lovrColliderIsAwake(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushboolean(L, lovrColliderIsAwake(collider)); return 1; } static int l_lovrColliderSetAwake(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool awake = lua_toboolean(L, 2); lovrColliderSetAwake(collider, awake); return 0; } static int l_lovrColliderIsSleepingAllowed(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushboolean(L, lovrColliderIsSleepingAllowed(collider)); return 1; } static int l_lovrColliderSetSleepingAllowed(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool allowed = lua_toboolean(L, 2); lovrColliderSetSleepingAllowed(collider, allowed); return 0; } static int l_lovrColliderGetMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushnumber(L, lovrColliderGetMass(collider)); return 1; } static int l_lovrColliderSetMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float mass = luax_checkfloat(L, 2); lovrColliderSetMass(collider, mass); return 0; } static int l_lovrColliderGetInertia(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float diagonal[3], rotation[4]; lovrColliderGetInertia(collider, diagonal, rotation); lua_pushnumber(L, diagonal[0]); @@ -214,7 +220,7 @@ static int l_lovrColliderGetInertia(lua_State* L) { } static int l_lovrColliderSetInertia(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float diagonal[3], rotation[4]; int index = luax_readvec3(L, 2, diagonal, NULL); luax_readquat(L, index, rotation, NULL); @@ -223,7 +229,7 @@ static int l_lovrColliderSetInertia(lua_State* L) { } static int l_lovrColliderGetCenterOfMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float center[3]; lovrColliderGetCenterOfMass(collider, center); lua_pushnumber(L, center[0]); @@ -233,7 +239,7 @@ static int l_lovrColliderGetCenterOfMass(lua_State* L) { } static int l_lovrColliderSetCenterOfMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float center[3]; luax_readvec3(L, 2, center, NULL); lovrColliderSetCenterOfMass(collider, center); @@ -241,27 +247,27 @@ static int l_lovrColliderSetCenterOfMass(lua_State* L) { } static int l_lovrColliderGetAutomaticMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool enabled = lovrColliderGetAutomaticMass(collider); lua_pushboolean(L, enabled); return 1; } static int l_lovrColliderSetAutomaticMass(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool enable = lua_toboolean(L, 2); lovrColliderSetAutomaticMass(collider, enable); return 0; } static int l_lovrColliderResetMassData(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lovrColliderResetMassData(collider); return 0; } static int l_lovrColliderGetEnabledAxes(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool translation[3]; bool rotation[3]; lovrColliderGetEnabledAxes(collider, translation, rotation); @@ -289,7 +295,7 @@ static int l_lovrColliderGetEnabledAxes(lua_State* L) { } static int l_lovrColliderSetEnabledAxes(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool translation[3] = { false, false, false }; bool rotation[3] = { false, false, false }; const char* string; @@ -314,7 +320,7 @@ static int l_lovrColliderSetEnabledAxes(lua_State* L) { } static int l_lovrColliderGetPosition(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float position[3]; lovrColliderGetPosition(collider, position); lua_pushnumber(L, position[0]); @@ -324,7 +330,7 @@ static int l_lovrColliderGetPosition(lua_State* L) { } static int l_lovrColliderSetPosition(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float position[3]; luax_readvec3(L, 2, position, NULL); lovrColliderSetPosition(collider, position); @@ -332,7 +338,7 @@ static int l_lovrColliderSetPosition(lua_State* L) { } static int l_lovrColliderGetOrientation(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float orientation[4], angle, x, y, z; lovrColliderGetOrientation(collider, orientation); quat_getAngleAxis(orientation, &angle, &x, &y, &z); @@ -344,7 +350,7 @@ static int l_lovrColliderGetOrientation(lua_State* L) { } static int l_lovrColliderSetOrientation(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float orientation[4]; luax_readquat(L, 2, orientation, NULL); lovrColliderSetOrientation(collider, orientation); @@ -352,7 +358,7 @@ static int l_lovrColliderSetOrientation(lua_State* L) { } static int l_lovrColliderGetPose(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float position[3], orientation[4], angle, ax, ay, az; lovrColliderGetPosition(collider, position); lovrColliderGetOrientation(collider, orientation); @@ -368,7 +374,7 @@ static int l_lovrColliderGetPose(lua_State* L) { } static int l_lovrColliderSetPose(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float position[3], orientation[4]; int index = luax_readvec3(L, 2, position, NULL); luax_readquat(L, index, orientation, NULL); @@ -378,7 +384,7 @@ static int l_lovrColliderSetPose(lua_State* L) { } static int l_lovrColliderGetRawPosition(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float position[3]; lovrColliderGetRawPosition(collider, position); lua_pushnumber(L, position[0]); @@ -388,7 +394,7 @@ static int l_lovrColliderGetRawPosition(lua_State* L) { } static int l_lovrColliderGetRawOrientation(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float orientation[4], angle, x, y, z; lovrColliderGetRawOrientation(collider, orientation); quat_getAngleAxis(orientation, &angle, &x, &y, &z); @@ -400,7 +406,7 @@ static int l_lovrColliderGetRawOrientation(lua_State* L) { } static int l_lovrColliderGetLinearVelocity(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float velocity[3]; lovrColliderGetLinearVelocity(collider, velocity); lua_pushnumber(L, velocity[0]); @@ -410,7 +416,7 @@ static int l_lovrColliderGetLinearVelocity(lua_State* L) { } static int l_lovrColliderSetLinearVelocity(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float velocity[3]; luax_readvec3(L, 2, velocity, NULL); lovrColliderSetLinearVelocity(collider, velocity); @@ -418,7 +424,7 @@ static int l_lovrColliderSetLinearVelocity(lua_State* L) { } static int l_lovrColliderGetAngularVelocity(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float velocity[3]; lovrColliderGetAngularVelocity(collider, velocity); lua_pushnumber(L, velocity[0]); @@ -428,7 +434,7 @@ static int l_lovrColliderGetAngularVelocity(lua_State* L) { } static int l_lovrColliderSetAngularVelocity(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float velocity[3]; luax_readvec3(L, 2, velocity, NULL); lovrColliderSetAngularVelocity(collider, velocity); @@ -436,7 +442,7 @@ static int l_lovrColliderSetAngularVelocity(lua_State* L) { } static int l_lovrColliderGetLinearDamping(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float damping, threshold; lovrColliderGetLinearDamping(collider, &damping, &threshold); lua_pushnumber(L, damping); @@ -445,7 +451,7 @@ static int l_lovrColliderGetLinearDamping(lua_State* L) { } static int l_lovrColliderSetLinearDamping(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float damping = luax_checkfloat(L, 2); float threshold = luax_optfloat(L, 3, 0.0f); lovrColliderSetLinearDamping(collider, damping, threshold); @@ -453,7 +459,7 @@ static int l_lovrColliderSetLinearDamping(lua_State* L) { } static int l_lovrColliderGetAngularDamping(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float damping, threshold; lovrColliderGetAngularDamping(collider, &damping, &threshold); lua_pushnumber(L, damping); @@ -462,7 +468,7 @@ static int l_lovrColliderGetAngularDamping(lua_State* L) { } static int l_lovrColliderSetAngularDamping(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float damping = luax_checkfloat(L, 2); float threshold = luax_optfloat(L, 3, 0.0f); lovrColliderSetAngularDamping(collider, damping, threshold); @@ -470,7 +476,7 @@ static int l_lovrColliderSetAngularDamping(lua_State* L) { } static int l_lovrColliderApplyForce(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float force[3]; int index = luax_readvec3(L, 2, force, NULL); @@ -486,7 +492,7 @@ static int l_lovrColliderApplyForce(lua_State* L) { } static int l_lovrColliderApplyTorque(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float torque[3]; luax_readvec3(L, 2, torque, NULL); lovrColliderApplyTorque(collider, torque); @@ -494,7 +500,7 @@ static int l_lovrColliderApplyTorque(lua_State* L) { } static int l_lovrColliderApplyLinearImpulse(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float impulse[3]; int index = luax_readvec3(L, 2, impulse, NULL); if (lua_gettop(L) >= index) { @@ -508,7 +514,7 @@ static int l_lovrColliderApplyLinearImpulse(lua_State* L) { } static int l_lovrColliderApplyAngularImpulse(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float impulse[3]; luax_readvec3(L, 2, impulse, NULL); lovrColliderApplyAngularImpulse(collider, impulse); @@ -516,7 +522,7 @@ static int l_lovrColliderApplyAngularImpulse(lua_State* L) { } static int l_lovrColliderGetLocalPoint(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float world[3], local[3]; luax_readvec3(L, 2, world, NULL); lovrColliderGetLocalPoint(collider, world, local); @@ -527,7 +533,7 @@ static int l_lovrColliderGetLocalPoint(lua_State* L) { } static int l_lovrColliderGetWorldPoint(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float local[3], world[3]; luax_readvec3(L, 2, local, NULL); lovrColliderGetWorldPoint(collider, local, world); @@ -538,7 +544,7 @@ static int l_lovrColliderGetWorldPoint(lua_State* L) { } static int l_lovrColliderGetLocalVector(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float world[3], local[3]; luax_readvec3(L, 2, world, NULL); lovrColliderGetLocalVector(collider, world, local); @@ -549,7 +555,7 @@ static int l_lovrColliderGetLocalVector(lua_State* L) { } static int l_lovrColliderGetWorldVector(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float local[3], world[3]; luax_readvec3(L, 2, local, NULL); lovrColliderGetWorldVector(collider, local, world); @@ -560,7 +566,7 @@ static int l_lovrColliderGetWorldVector(lua_State* L) { } static int l_lovrColliderGetLinearVelocityFromLocalPoint(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float point[3], velocity[3]; luax_readvec3(L, 2, point, NULL); lovrColliderGetLinearVelocityFromLocalPoint(collider, point, velocity); @@ -571,7 +577,7 @@ static int l_lovrColliderGetLinearVelocityFromLocalPoint(lua_State* L) { } static int l_lovrColliderGetLinearVelocityFromWorldPoint(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float point[3], velocity[3]; luax_readvec3(L, 2, point, NULL); lovrColliderGetLinearVelocityFromWorldPoint(collider, point, velocity); @@ -582,7 +588,7 @@ static int l_lovrColliderGetLinearVelocityFromWorldPoint(lua_State* L) { } static int l_lovrColliderGetAABB(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float aabb[6]; lovrColliderGetAABB(collider, aabb); for (int i = 0; i < 6; i++) { @@ -592,53 +598,53 @@ static int l_lovrColliderGetAABB(lua_State* L) { } static int l_lovrColliderGetFriction(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushnumber(L, lovrColliderGetFriction(collider)); return 1; } static int l_lovrColliderSetFriction(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float friction = luax_checkfloat(L, 2); lovrColliderSetFriction(collider, friction); return 0; } static int l_lovrColliderGetRestitution(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushnumber(L, lovrColliderGetRestitution(collider)); return 1; } static int l_lovrColliderSetRestitution(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); float restitution = luax_checkfloat(L, 2); lovrColliderSetRestitution(collider, restitution); return 0; } static int l_lovrColliderGetTag(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushstring(L, lovrColliderGetTag(collider)); return 1; } static int l_lovrColliderSetTag(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lovrColliderSetTag(collider, lua_tostring(L, 2)); return 0; } // Deprecated static int l_lovrColliderIsGravityIgnored(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); lua_pushboolean(L, lovrColliderGetGravityScale(collider) == 0.f); return 1; } // Deprecated static int l_lovrColliderSetGravityIgnored(lua_State* L) { - Collider* collider = luax_checktype(L, 1, Collider); + Collider* collider = luax_checkcollider(L, 1); bool ignored = lua_toboolean(L, 2); lovrColliderSetGravityScale(collider, ignored ? 0.f : 1.f); return 0; diff --git a/src/api/l_physics_joints.c b/src/api/l_physics_joints.c index c38aeecfa..5f9148dbe 100644 --- a/src/api/l_physics_joints.c +++ b/src/api/l_physics_joints.c @@ -16,7 +16,7 @@ void luax_pushjoint(lua_State* L, Joint* joint) { } } -Joint* luax_checkjoint(lua_State* L, int index) { +static Joint* luax_tojoint(lua_State* L, int index) { Proxy* p = lua_touserdata(L, index); if (p) { @@ -36,10 +36,20 @@ Joint* luax_checkjoint(lua_State* L, int index) { } } - luax_typeerror(L, index, "Joint"); return NULL; } +Joint* luax_checkjoint(lua_State* L, int index) { + Joint* joint = luax_tojoint(L, index); + if (joint) { + lovrCheck(!lovrJointIsDestroyed(joint), "Attempt to use a destroyed Joint"); + return joint; + } else { + luax_typeerror(L, index, "Joint"); + return NULL; + } +} + static int l_lovrJointDestroy(lua_State* L) { Joint* joint = luax_checkjoint(L, 1); lovrJointDestruct(joint); @@ -47,7 +57,8 @@ static int l_lovrJointDestroy(lua_State* L) { } static int l_lovrJointIsDestroyed(lua_State* L) { - Joint* joint = luax_checkjoint(L, 1); + Joint* joint = luax_tojoint(L, 1); + if (!joint) luax_typeerror(L, 1, "Joint"); bool destroyed = lovrJointIsDestroyed(joint); lua_pushboolean(L, destroyed); return 1; diff --git a/src/api/l_physics_shapes.c b/src/api/l_physics_shapes.c index 972d6dd4f..3982fb1f6 100644 --- a/src/api/l_physics_shapes.c +++ b/src/api/l_physics_shapes.c @@ -19,7 +19,7 @@ void luax_pushshape(lua_State* L, Shape* shape) { } } -Shape* luax_checkshape(lua_State* L, int index) { +static Shape* luax_toshape(lua_State* L, int index) { Proxy* p = lua_touserdata(L, index); if (p) { @@ -40,10 +40,20 @@ Shape* luax_checkshape(lua_State* L, int index) { } } - luax_typeerror(L, index, "Shape"); return NULL; } +Shape* luax_checkshape(lua_State* L, int index) { + Shape* shape = luax_toshape(L, index); + if (shape) { + lovrCheck(!lovrShapeIsDestroyed(shape), "Attempt to use a destroyed Shape"); + return shape; + } else { + luax_typeerror(L, index, "Shape"); + return NULL; + } +} + Shape* luax_newboxshape(lua_State* L, int index) { float size[3]; luax_readscale(L, index, size, 3, NULL); @@ -154,7 +164,8 @@ static int l_lovrShapeDestroy(lua_State* L) { } static int l_lovrShapeIsDestroyed(lua_State* L) { - Shape* shape = luax_checkshape(L, 1); + Shape* shape = luax_toshape(L, 1); + if (!shape) luax_typeerror(L, 1, "Shape"); bool destroyed = lovrShapeIsDestroyed(shape); lua_pushboolean(L, destroyed); return 1;