From a7e24ab28eadb90c4e32b77e801c161c792cde48 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 Nov 2019 16:27:30 -0800 Subject: [PATCH] Joint:isEnabled; Joint:setEnabled; --- src/api/l_joints.c | 18 +++++++++++++++++- src/api/l_shapes.c | 1 + src/modules/physics/physics.c | 12 ++++++++++++ src/modules/physics/physics.h | 2 ++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/api/l_joints.c b/src/api/l_joints.c index 2c31ce43..b91afa53 100644 --- a/src/api/l_joints.c +++ b/src/api/l_joints.c @@ -7,6 +7,7 @@ void luax_pushjoint(lua_State* L, Joint* joint) { case JOINT_DISTANCE: luax_pushtype(L, DistanceJoint, joint); break; case JOINT_HINGE: luax_pushtype(L, HingeJoint, joint); break; case JOINT_SLIDER: luax_pushtype(L, SliderJoint, joint); break; + default: lovrThrow("Unreachable"); } } @@ -78,12 +79,27 @@ static int l_lovrJointSetUserData(lua_State* L) { return 0; } +static int l_lovrJointIsEnabled(lua_State* L) { + Joint* joint = luax_checkjoint(L, 1); + lua_pushboolean(L, lovrJointIsEnabled(joint)); + return 1; +} + +static int l_lovrJointSetEnabled(lua_State* L) { + Joint* joint = luax_checkjoint(L, 1); + bool enable = lua_toboolean(L, 2); + lovrJointSetEnabled(joint, enable); + return 0; +} + #define lovrJoint \ { "destroy", l_lovrJointDestroy }, \ { "getType", l_lovrJointGetType }, \ { "getColliders", l_lovrJointGetColliders }, \ { "getUserData", l_lovrJointGetUserData }, \ - { "setUserData", l_lovrJointSetUserData } + { "setUserData", l_lovrJointSetUserData }, \ + { "isEnabled", l_lovrJointIsEnabled }, \ + { "setEnabled", l_lovrJointSetEnabled } static int l_lovrBallJointGetAnchors(lua_State* L) { BallJoint* joint = luax_checktype(L, 1, BallJoint); diff --git a/src/api/l_shapes.c b/src/api/l_shapes.c index 92d4071e..e23627a5 100644 --- a/src/api/l_shapes.c +++ b/src/api/l_shapes.c @@ -7,6 +7,7 @@ void luax_pushshape(lua_State* L, Shape* shape) { case SHAPE_BOX: luax_pushtype(L, BoxShape, shape); break; case SHAPE_CAPSULE: luax_pushtype(L, CapsuleShape, shape); break; case SHAPE_CYLINDER: luax_pushtype(L, CylinderShape, shape); break; + default: lovrThrow("Unreachable"); } } diff --git a/src/modules/physics/physics.c b/src/modules/physics/physics.c index 7dc1e4ce..8da41d51 100644 --- a/src/modules/physics/physics.c +++ b/src/modules/physics/physics.c @@ -900,6 +900,18 @@ void lovrJointSetUserData(Joint* joint, void* data) { joint->userdata = data; } +bool lovrJointIsEnabled(Joint* joint) { + return dJointIsEnabled(joint->id); +} + +void lovrJointSetEnabled(Joint* joint, bool enable) { + if (enable) { + dJointEnable(joint->id); + } else { + dJointDisable(joint->id); + } +} + BallJoint* lovrBallJointInit(BallJoint* joint, Collider* a, Collider* b, float x, float y, float z) { lovrAssert(a->world == b->world, "Joint bodies must exist in same World"); joint->type = JOINT_BALL; diff --git a/src/modules/physics/physics.h b/src/modules/physics/physics.h index 77b2838b..595e07d9 100644 --- a/src/modules/physics/physics.h +++ b/src/modules/physics/physics.h @@ -208,6 +208,8 @@ JointType lovrJointGetType(Joint* joint); void lovrJointGetColliders(Joint* joint, Collider** a, Collider** b); void* lovrJointGetUserData(Joint* joint); void lovrJointSetUserData(Joint* joint, void* data); +bool lovrJointIsEnabled(Joint* joint); +void lovrJointSetEnabled(Joint* joint, bool enable); BallJoint* lovrBallJointInit(BallJoint* joint, Collider* a, Collider* b, float x, float y, float z); #define lovrBallJointCreate(...) lovrBallJointInit(lovrAlloc(BallJoint), __VA_ARGS__)