Skip to content

Commit

Permalink
Giant Shape rework!;
Browse files Browse the repository at this point in the history
  • Loading branch information
bjornbytes committed May 19, 2024
1 parent cd290f4 commit f70d987
Show file tree
Hide file tree
Showing 9 changed files with 823 additions and 581 deletions.
1 change: 0 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ dev
- Add `Collider:get/setCenterOfMass`.
- Add `Collider:resetMassData`.
- Add `Collider:is/setEnabled`.
- Add `CompoundShape`.
- Add `ConvexShape`.
- Add `WeldJoint`.
- Add `ConeJoint`.
Expand Down
11 changes: 0 additions & 11 deletions src/api/l_physics.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ StringEntry lovrShapeType[] = {
[SHAPE_CONVEX] = ENTRY("convex"),
[SHAPE_MESH] = ENTRY("mesh"),
[SHAPE_TERRAIN] = ENTRY("terrain"),
[SHAPE_COMPOUND] = ENTRY("compound"),
{ 0 }
};

Expand Down Expand Up @@ -212,13 +211,6 @@ static int l_lovrPhysicsNewTerrainShape(lua_State* L) {
return 1;
}

static int l_lovrPhysicsNewCompoundShape(lua_State* L) {
CompoundShape* shape = luax_newcompoundshape(L, 1);
luax_pushtype(L, CompoundShape, shape);
lovrRelease(shape, lovrShapeDestroy);
return 1;
}

static int l_lovrPhysicsNewWeldJoint(lua_State* L) {
Collider* a = luax_totype(L, 1, Collider);
Collider* b = luax_totype(L, 2, Collider);
Expand Down Expand Up @@ -297,7 +289,6 @@ static const luaL_Reg lovrPhysics[] = {
{ "newConvexShape", l_lovrPhysicsNewConvexShape },
{ "newMeshShape", l_lovrPhysicsNewMeshShape },
{ "newTerrainShape", l_lovrPhysicsNewTerrainShape },
{ "newCompoundShape", l_lovrPhysicsNewCompoundShape },
{ "newWeldJoint", l_lovrPhysicsNewWeldJoint },
{ "newBallJoint", l_lovrPhysicsNewBallJoint },
{ "newConeJoint", l_lovrPhysicsNewConeJoint },
Expand All @@ -317,7 +308,6 @@ extern const luaL_Reg lovrCylinderShape[];
extern const luaL_Reg lovrConvexShape[];
extern const luaL_Reg lovrMeshShape[];
extern const luaL_Reg lovrTerrainShape[];
extern const luaL_Reg lovrCompoundShape[];
extern const luaL_Reg lovrWeldJoint[];
extern const luaL_Reg lovrBallJoint[];
extern const luaL_Reg lovrConeJoint[];
Expand All @@ -338,7 +328,6 @@ int luaopen_lovr_physics(lua_State* L) {
luax_registertype(L, ConvexShape);
luax_registertype(L, MeshShape);
luax_registertype(L, TerrainShape);
luax_registertype(L, CompoundShape);
luax_registertype(L, WeldJoint);
luax_registertype(L, BallJoint);
luax_registertype(L, ConeJoint);
Expand Down
111 changes: 63 additions & 48 deletions src/api/l_physics_collider.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,33 @@ static int l_lovrColliderGetWorld(lua_State* L) {
return 1;
}

static int l_lovrColliderGetJoints(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_newtable(L);
int index = 1;
Joint* joint = NULL;
while ((joint = lovrColliderGetJoints(collider, joint)) != NULL) {
luax_pushjoint(L, joint);
lua_rawseti(L, -2, index++);
}
return 1;
}

static int l_lovrColliderGetShapes(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_newtable(L);
int index = 1;
Shape* shape = NULL;
while ((shape = lovrColliderGetShapes(collider, shape)) != NULL) {
luax_pushshape(L, shape);
lua_rawseti(L, -2, index++);
}
return 1;
}

static int l_lovrColliderGetShape(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
Shape* shape = lovrColliderGetShape(collider);
Shape* shape = lovrColliderGetShapes(collider, NULL);
if (shape) {
luax_pushshape(L, shape);
} else {
Expand All @@ -49,23 +73,19 @@ static int l_lovrColliderGetShape(lua_State* L) {
return 1;
}

static int l_lovrColliderSetShape(lua_State* L) {
static int l_lovrColliderAddShape(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
Shape* shape = lua_isnoneornil(L, 2) ? NULL : luax_checkshape(L, 2);
lovrColliderSetShape(collider, shape);
return 0;
Shape* shape = luax_checkshape(L, 2);
lovrColliderAddShape(collider, shape);
lua_settop(L, 2);
return 1;
}

static int l_lovrColliderGetJoints(lua_State* L) {
static int l_lovrColliderRemoveShape(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_newtable(L);
int index = 1;
Joint* joint = NULL;
while ((joint = lovrColliderGetJoints(collider, joint)) != NULL) {
luax_pushjoint(L, joint);
lua_rawseti(L, -2, index++);
}
return 1;
Shape* shape = luax_checkshape(L, 2);
lovrColliderRemoveShape(collider, shape);
return 0;
}

static int l_lovrColliderGetUserData(lua_State* L) {
Expand Down Expand Up @@ -174,12 +194,8 @@ static int l_lovrColliderGetMass(lua_State* L) {

static int l_lovrColliderSetMass(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
if (lua_isnoneornil(L, 2)) {
lovrColliderSetMass(collider, NULL);
} else {
float mass = luax_checkfloat(L, 2);
lovrColliderSetMass(collider, &mass);
}
float mass = luax_checkfloat(L, 2);
lovrColliderSetMass(collider, mass);
return 0;
}

Expand All @@ -199,14 +215,10 @@ static int l_lovrColliderGetInertia(lua_State* L) {

static int l_lovrColliderSetInertia(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
if (lua_isnoneornil(L, 2)) {
lovrColliderSetInertia(collider, NULL, NULL);
} else {
float diagonal[3], rotation[4];
int index = luax_readvec3(L, 2, diagonal, NULL);
luax_readquat(L, index, rotation, NULL);
lovrColliderSetInertia(collider, diagonal, rotation);
}
float diagonal[3], rotation[4];
int index = luax_readvec3(L, 2, diagonal, NULL);
luax_readquat(L, index, rotation, NULL);
lovrColliderSetInertia(collider, diagonal, rotation);
return 0;
}

Expand All @@ -222,13 +234,23 @@ static int l_lovrColliderGetCenterOfMass(lua_State* L) {

static int l_lovrColliderSetCenterOfMass(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
if (lua_isnoneornil(L, 2)) {
lovrColliderSetCenterOfMass(collider, NULL);
} else {
float center[3];
luax_readvec3(L, 2, center, NULL);
lovrColliderSetCenterOfMass(collider, center);
}
float center[3];
luax_readvec3(L, 2, center, NULL);
lovrColliderSetCenterOfMass(collider, center);
return 0;
}

static int l_lovrColliderGetAutomaticMass(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool enabled = lovrColliderGetAutomaticMass(collider);
lua_pushboolean(L, enabled);
return 1;
}

static int l_lovrColliderSetAutomaticMass(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool enable = lua_toboolean(L, 2);
lovrColliderSetAutomaticMass(collider, enable);
return 0;
}

Expand Down Expand Up @@ -607,16 +629,6 @@ static int l_lovrColliderSetTag(lua_State* L) {
return 0;
}

// Deprecated
static int l_lovrColliderGetShapes(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
Shape* shape = lovrColliderGetShape(collider);
lua_createtable(L, 1, 0);
luax_pushshape(L, shape);
lua_rawseti(L, -2, 1);
return 1;
}

// Deprecated
static int l_lovrColliderIsGravityIgnored(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
Expand All @@ -638,9 +650,11 @@ const luaL_Reg lovrCollider[] = {
{ "isEnabled", l_lovrColliderIsEnabled },
{ "setEnabled", l_lovrColliderSetEnabled },
{ "getWorld", l_lovrColliderGetWorld },
{ "getShape", l_lovrColliderGetShape },
{ "setShape", l_lovrColliderSetShape },
{ "getJoints", l_lovrColliderGetJoints },
{ "getShapes", l_lovrColliderGetShapes },
{ "getShape", l_lovrColliderGetShape },
{ "addShape", l_lovrColliderAddShape },
{ "removeShape", l_lovrColliderRemoveShape },
{ "getUserData", l_lovrColliderGetUserData },
{ "setUserData", l_lovrColliderSetUserData },
{ "isKinematic", l_lovrColliderIsKinematic },
Expand All @@ -661,6 +675,8 @@ const luaL_Reg lovrCollider[] = {
{ "setInertia", l_lovrColliderSetInertia },
{ "getCenterOfMass", l_lovrColliderGetCenterOfMass },
{ "setCenterOfMass", l_lovrColliderSetCenterOfMass },
{ "getAutomaticMass", l_lovrColliderGetAutomaticMass },
{ "setAutomaticMass", l_lovrColliderSetAutomaticMass },
{ "resetMassData", l_lovrColliderResetMassData },
{ "getEnabledAxes", l_lovrColliderGetEnabledAxes },
{ "setEnabledAxes", l_lovrColliderSetEnabledAxes },
Expand Down Expand Up @@ -699,7 +715,6 @@ const luaL_Reg lovrCollider[] = {
{ "setTag", l_lovrColliderSetTag },

// Deprecated
{ "getShapes", l_lovrColliderGetShapes },
{ "isGravityIgnored", l_lovrColliderIsGravityIgnored },
{ "setGravityIgnored", l_lovrColliderSetGravityIgnored },

Expand Down

0 comments on commit f70d987

Please sign in to comment.