diff --git a/src/api/types/body.c b/src/api/types/body.c index 639ca916..6346f4ea 100644 --- a/src/api/types/body.c +++ b/src/api/types/body.c @@ -287,6 +287,19 @@ int l_lovrBodyGetWorld(lua_State* L) { return 1; } +int l_lovrBodyGetMass(lua_State* L) { + Body* body = luax_checktype(L, 1, Body); + lua_pushnumber(L, lovrBodyGetMass(body)); + return 1; +} + +int l_lovrBodySetMass(lua_State* L) { + Body* body = luax_checktype(L, 1, Body); + float mass = luaL_checknumber(L, 2); + lovrBodySetMass(body, mass); + return 0; +} + const luaL_Reg lovrBody[] = { { "getPosition", l_lovrBodyGetPosition }, { "setPosition", l_lovrBodySetPosition }, @@ -317,5 +330,7 @@ const luaL_Reg lovrBody[] = { { "getUserData", l_lovrBodyGetUserData }, { "setUserData", l_lovrBodySetUserData }, { "getWorld", l_lovrBodyGetWorld }, + { "getMass", l_lovrBodyGetMass }, + { "setMass", l_lovrBodySetMass }, { NULL, NULL } }; diff --git a/src/physics/physics.c b/src/physics/physics.c index 64f63ba1..ad8d9dc6 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -264,6 +264,19 @@ World* lovrBodyGetWorld(Body* body) { return body->world; } +float lovrBodyGetMass(Body* body) { + dMass m; + dBodyGetMass(body->id, &m); + return m.mass; +} + +void lovrBodySetMass(Body* body, float mass) { + dMass m; + dBodyGetMass(body->id, &m); + dMassAdjust(&m, mass); + dBodySetMass(body->id, &m); +} + void lovrShapeDestroy(const Ref* ref) { Shape* shape = containerof(ref, Shape); dGeomDestroy(shape->id); diff --git a/src/physics/physics.h b/src/physics/physics.h index c79a788d..c83a128b 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -79,6 +79,8 @@ void lovrBodySetAwake(Body* body, int awake); void* lovrBodyGetUserData(Body* body); void lovrBodySetUserData(Body* body, void* data); World* lovrBodyGetWorld(Body* body); +float lovrBodyGetMass(Body* body); +void lovrBodySetMass(Body* body, float mass); void lovrShapeDestroy(const Ref* ref); ShapeType lovrShapeGetType(Shape* shape);