From c198369c956fd8393cd31a219ef362c02ba3e075 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 25 May 2017 15:20:55 -0700 Subject: [PATCH] Joint limits; --- src/api/physics.c | 6 +-- src/api/types/joints.c | 98 +++++++++++++++++++++++++++++++++++++++++- src/physics/physics.c | 32 ++++++++++++++ src/physics/physics.h | 8 ++++ 4 files changed, 140 insertions(+), 4 deletions(-) diff --git a/src/api/physics.c b/src/api/physics.c index 416f7615..13fbd5a2 100644 --- a/src/api/physics.c +++ b/src/api/physics.c @@ -64,7 +64,7 @@ int l_lovrPhysicsNewBallJoint(lua_State* L) { float x = luaL_checknumber(L, 3); float y = luaL_checknumber(L, 4); float z = luaL_checknumber(L, 5); - Joint* joint = lovrBallJointCreate(a, b, x, y, z); + BallJoint* joint = lovrBallJointCreate(a, b, x, y, z); luax_pushtype(L, BallJoint, joint); return 1; } @@ -103,7 +103,7 @@ int l_lovrPhysicsNewHingeJoint(lua_State* L) { float ax = luaL_checknumber(L, 6); float ay = luaL_checknumber(L, 7); float az = luaL_checknumber(L, 8); - Joint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az); + HingeJoint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az); luax_pushtype(L, HingeJoint, joint); return 1; } @@ -114,7 +114,7 @@ int l_lovrPhysicsNewSliderJoint(lua_State* L) { float ax = luaL_checknumber(L, 3); float ay = luaL_checknumber(L, 4); float az = luaL_checknumber(L, 5); - Joint* joint = lovrSliderJointCreate(a, b, ax, ay, az); + SliderJoint* joint = lovrSliderJointCreate(a, b, ax, ay, az); luax_pushtype(L, SliderJoint, joint); return 1; } diff --git a/src/api/types/joints.c b/src/api/types/joints.c index 43342619..8380a046 100644 --- a/src/api/types/joints.c +++ b/src/api/types/joints.c @@ -138,12 +138,60 @@ int l_lovrHingeJointGetAngle(lua_State* L) { return 1; } +int l_lovrHingeJointGetLowerLimit(lua_State* L) { + HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + lua_pushnumber(L, lovrHingeJointGetLowerLimit(hinge)); + return 1; +} + +int l_lovrHingeJointSetLowerLimit(lua_State* L) { + HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + float limit = luaL_checknumber(L, 2); + lovrHingeJointSetLowerLimit(hinge, limit); + return 0; +} + +int l_lovrHingeJointGetUpperLimit(lua_State* L) { + HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + lua_pushnumber(L, lovrHingeJointGetUpperLimit(hinge)); + return 1; +} + +int l_lovrHingeJointSetUpperLimit(lua_State* L) { + HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + float limit = luaL_checknumber(L, 2); + lovrHingeJointSetUpperLimit(hinge, limit); + return 0; +} + +int l_lovrHingeJointGetLimits(lua_State* L) { + HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + lua_pushnumber(L, lovrHingeJointGetLowerLimit(hinge)); + lua_pushnumber(L, lovrHingeJointGetUpperLimit(hinge)); + return 2; +} + +int l_lovrHingeJointSetLimits(lua_State* L) { + HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + float lower = luaL_checknumber(L, 2); + float upper = luaL_checknumber(L, 3); + lovrHingeJointSetLowerLimit(hinge, lower); + lovrHingeJointSetUpperLimit(hinge, upper); + return 0; +} + const luaL_Reg lovrHingeJoint[] = { { "getAnchors", l_lovrHingeJointGetAnchors }, { "setAnchor", l_lovrHingeJointSetAnchor }, { "getAxis", l_lovrHingeJointGetAxis }, { "setAxis", l_lovrHingeJointSetAxis }, { "getAngle", l_lovrHingeJointGetAngle }, + { "getLowerLimit", l_lovrHingeJointGetLowerLimit }, + { "setLowerLimit", l_lovrHingeJointSetLowerLimit }, + { "getUpperLimit", l_lovrHingeJointGetUpperLimit }, + { "setUpperLimit", l_lovrHingeJointSetUpperLimit }, + { "getLimits", l_lovrHingeJointGetLimits }, + { "setLimits", l_lovrHingeJointSetLimits }, { NULL, NULL } }; @@ -172,9 +220,57 @@ int l_lovrSliderJointGetPosition(lua_State* L) { return 1; } +int l_lovrSliderJointGetLowerLimit(lua_State* L) { + SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + lua_pushnumber(L, lovrSliderJointGetLowerLimit(slider)); + return 1; +} + +int l_lovrSliderJointSetLowerLimit(lua_State* L) { + SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + float limit = luaL_checknumber(L, 2); + lovrSliderJointSetLowerLimit(slider, limit); + return 0; +} + +int l_lovrSliderJointGetUpperLimit(lua_State* L) { + SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + lua_pushnumber(L, lovrSliderJointGetUpperLimit(slider)); + return 1; +} + +int l_lovrSliderJointSetUpperLimit(lua_State* L) { + SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + float limit = luaL_checknumber(L, 2); + lovrSliderJointSetUpperLimit(slider, limit); + return 0; +} + +int l_lovrSliderJointGetLimits(lua_State* L) { + SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + lua_pushnumber(L, lovrSliderJointGetLowerLimit(slider)); + lua_pushnumber(L, lovrSliderJointGetUpperLimit(slider)); + return 2; +} + +int l_lovrSliderJointSetLimits(lua_State* L) { + SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + float lower = luaL_checknumber(L, 2); + float upper = luaL_checknumber(L, 3); + lovrSliderJointSetLowerLimit(slider, lower); + lovrSliderJointSetUpperLimit(slider, upper); + return 0; +} + const luaL_Reg lovrSliderJoint[] = { { "getAxis", l_lovrSliderJointGetAxis }, { "setAxis", l_lovrSliderJointSetAxis }, - { "getPosition", l_lovrHingeJointGetAngle }, + { "getPosition", l_lovrSliderJointGetPosition }, + { "getLowerLimit", l_lovrSliderJointGetLowerLimit }, + { "setLowerLimit", l_lovrSliderJointSetLowerLimit }, + { "getUpperLimit", l_lovrSliderJointGetUpperLimit }, + { "setUpperLimit", l_lovrSliderJointSetUpperLimit }, + { "getLimits", l_lovrSliderJointGetLimits }, + { "setLimits", l_lovrSliderJointSetLimits }, { NULL, NULL } }; diff --git a/src/physics/physics.c b/src/physics/physics.c index 8c1930e6..2d169d3c 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -973,6 +973,22 @@ float lovrHingeJointGetAngle(HingeJoint* hinge) { return dJointGetHingeAngle(hinge->id); } +float lovrHingeJointGetLowerLimit(HingeJoint* hinge) { + return dJointGetHingeParam(hinge->id, dParamLoStop); +} + +void lovrHingeJointSetLowerLimit(HingeJoint* hinge, float limit) { + dJointSetHingeParam(hinge->id, dParamLoStop, limit); +} + +float lovrHingeJointGetUpperLimit(HingeJoint* hinge) { + return dJointGetHingeParam(hinge->id, dParamHiStop); +} + +void lovrHingeJointSetUpperLimit(HingeJoint* hinge, float limit) { + dJointSetHingeParam(hinge->id, dParamHiStop, limit); +} + SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float ax, float ay, float az) { if (a->world != b->world) { error("Joint bodies must exist in same World"); @@ -1005,3 +1021,19 @@ void lovrSliderJointSetAxis(SliderJoint* slider, float x, float y, float z) { float lovrSliderJointGetPosition(SliderJoint* slider) { return dJointGetSliderPosition(slider->id); } + +float lovrSliderJointGetLowerLimit(SliderJoint* slider) { + return dJointGetSliderParam(slider->id, dParamLoStop); +} + +void lovrSliderJointSetLowerLimit(SliderJoint* slider, float limit) { + dJointSetSliderParam(slider->id, dParamLoStop, limit); +} + +float lovrSliderJointGetUpperLimit(SliderJoint* slider) { + return dJointGetSliderParam(slider->id, dParamHiStop); +} + +void lovrSliderJointSetUpperLimit(SliderJoint* slider, float limit) { + dJointSetSliderParam(slider->id, dParamHiStop, limit); +} diff --git a/src/physics/physics.h b/src/physics/physics.h index ef929d26..e5fdf615 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -205,8 +205,16 @@ void lovrHingeJointSetAnchor(HingeJoint* hinge, float x, float y, float z); void lovrHingeJointGetAxis(HingeJoint* hinge, float* x, float* y, float* z); void lovrHingeJointSetAxis(HingeJoint* hinge, float x, float y, float z); float lovrHingeJointGetAngle(HingeJoint* hinge); +float lovrHingeJointGetLowerLimit(HingeJoint* hinge); +void lovrHingeJointSetLowerLimit(HingeJoint* hinge, float limit); +float lovrHingeJointGetUpperLimit(HingeJoint* hinge); +void lovrHingeJointSetUpperLimit(HingeJoint* hinge, float limit); SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float ax, float ay, float az); void lovrSliderJointGetAxis(SliderJoint* slider, float* x, float* y, float* z); void lovrSliderJointSetAxis(SliderJoint* slider, float x, float y, float z); float lovrSliderJointGetPosition(SliderJoint* slider); +float lovrSliderJointGetLowerLimit(SliderJoint* slider); +void lovrSliderJointSetLowerLimit(SliderJoint* slider, float limit); +float lovrSliderJointGetUpperLimit(SliderJoint* slider); +void lovrSliderJointSetUpperLimit(SliderJoint* slider, float limit);