Joint limits;

This commit is contained in:
bjorn 2017-05-25 15:20:55 -07:00
parent 39400776dc
commit c198369c95
4 changed files with 140 additions and 4 deletions

View File

@ -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;
}

View File

@ -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 }
};

View File

@ -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);
}

View File

@ -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);