From 1cc62a9b6de913216d3b8a8941be9f28270cf2f8 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 10 Jun 2017 15:13:19 -0700 Subject: [PATCH] DistanceJoint; --- src/api/lovr.h | 1 + src/api/physics.c | 16 +++++ src/api/types/joints.c | 147 +++++++++++++++++++++++++++-------------- src/physics/physics.c | 126 +++++++++++++++++++++++------------ src/physics/physics.h | 44 +++++++----- 5 files changed, 225 insertions(+), 109 deletions(-) diff --git a/src/api/lovr.h b/src/api/lovr.h index 58bdf5e9..135caa13 100644 --- a/src/api/lovr.h +++ b/src/api/lovr.h @@ -22,6 +22,7 @@ extern const luaL_Reg lovrController[]; extern const luaL_Reg lovrCylinderShape[]; extern const luaL_Reg lovrBlob[]; extern const luaL_Reg lovrCollider[]; +extern const luaL_Reg lovrDistanceJoint[]; extern const luaL_Reg lovrEvent[]; extern const luaL_Reg lovrFilesystem[]; extern const luaL_Reg lovrFont[]; diff --git a/src/api/physics.c b/src/api/physics.c index 13fbd5a2..6fb2526d 100644 --- a/src/api/physics.c +++ b/src/api/physics.c @@ -10,6 +10,7 @@ int l_lovrPhysicsInit(lua_State* L) { luax_registertype(L, "World", lovrWorld); luax_registertype(L, "Collider", lovrCollider); luax_extendtype(L, "Joint", "BallJoint", lovrJoint, lovrBallJoint); + luax_extendtype(L, "Joint", "DistanceJoint", lovrJoint, lovrDistanceJoint); luax_extendtype(L, "Joint", "HingeJoint", lovrJoint, lovrHingeJoint); luax_extendtype(L, "Joint", "SliderJoint", lovrJoint, lovrSliderJoint); luax_extendtype(L, "Shape", "SphereShape", lovrShape, lovrSphereShape); @@ -94,6 +95,20 @@ int l_lovrPhysicsNewCylinderShape(lua_State* L) { return 1; } +int l_lovrPhysicsNewDistanceJoint(lua_State* L) { + Collider* a = luax_checktype(L, 1, Collider); + Collider* b = luax_checktype(L, 2, Collider); + float x1 = luaL_checknumber(L, 3); + float y1 = luaL_checknumber(L, 4); + float z1 = luaL_checknumber(L, 5); + float x2 = luaL_checknumber(L, 6); + float y2 = luaL_checknumber(L, 7); + float z2 = luaL_checknumber(L, 8); + DistanceJoint* joint = lovrDistanceJointCreate(a, b, x1, y1, z1, x2, y2, z2); + luax_pushtype(L, DistanceJoint, joint); + return 1; +} + int l_lovrPhysicsNewHingeJoint(lua_State* L) { Collider* a = luax_checktype(L, 1, Collider); Collider* b = luax_checktype(L, 2, Collider); @@ -132,6 +147,7 @@ const luaL_Reg lovrPhysics[] = { { "newBoxShape", l_lovrPhysicsNewBoxShape }, { "newCapsuleShape", l_lovrPhysicsNewCapsuleShape }, { "newCylinderShape", l_lovrPhysicsNewCylinderShape }, + { "newDistanceJoint", l_lovrPhysicsNewDistanceJoint }, { "newHingeJoint", l_lovrPhysicsNewHingeJoint }, { "newSliderJoint", l_lovrPhysicsNewSliderJoint }, { "newSphereShape", l_lovrPhysicsNewSphereShape }, diff --git a/src/api/types/joints.c b/src/api/types/joints.c index 8380a046..14a21b16 100644 --- a/src/api/types/joints.c +++ b/src/api/types/joints.c @@ -4,6 +4,9 @@ int luax_pushjoint(lua_State* L, Joint* joint) { switch (lovrJointGetType(joint)) { case JOINT_BALL: luax_pushtype(L, BallJoint, joint); return 1; + case JOINT_DISTANCE: luax_pushtype(L, DistanceJoint, joint); return 1; + case JOINT_HINGE: luax_pushtype(L, HingeJoint, joint); return 1; + case JOINT_SLIDER: luax_pushtype(L, SliderJoint, joint); return 1; default: return 0; } } @@ -64,9 +67,9 @@ const luaL_Reg lovrJoint[] = { }; int l_lovrBallJointGetAnchors(lua_State* L) { - BallJoint* ball = luax_checktype(L, 1, BallJoint); + BallJoint* joint = luax_checktype(L, 1, BallJoint); float x1, y1, z1, x2, y2, z2; - lovrBallJointGetAnchors(ball, &x1, &y1, &z1, &x2, &y2, &z2); + lovrBallJointGetAnchors(joint, &x1, &y1, &z1, &x2, &y2, &z2); lua_pushnumber(L, x1); lua_pushnumber(L, y1); lua_pushnumber(L, z1); @@ -77,11 +80,11 @@ int l_lovrBallJointGetAnchors(lua_State* L) { } int l_lovrBallJointSetAnchor(lua_State* L) { - BallJoint* ball = luax_checktype(L, 1, BallJoint); + BallJoint* joint = luax_checktype(L, 1, BallJoint); float x = luaL_checknumber(L, 2); float y = luaL_checknumber(L, 3); float z = luaL_checknumber(L, 4); - lovrBallJointSetAnchor(ball, x, y, z); + lovrBallJointSetAnchor(joint, x, y, z); return 0; } @@ -91,10 +94,56 @@ const luaL_Reg lovrBallJoint[] = { { NULL, NULL } }; -int l_lovrHingeJointGetAnchors(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); +int l_lovrDistanceJointGetAnchors(lua_State* L) { + DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint); float x1, y1, z1, x2, y2, z2; - lovrHingeJointGetAnchors(hinge, &x1, &y1, &z1, &x2, &y2, &z2); + lovrDistanceJointGetAnchors(joint, &x1, &y1, &z1, &x2, &y2, &z2); + lua_pushnumber(L, x1); + lua_pushnumber(L, y1); + lua_pushnumber(L, z1); + lua_pushnumber(L, x2); + lua_pushnumber(L, y2); + lua_pushnumber(L, z2); + return 6; +} + +int l_lovrDistanceJointSetAnchors(lua_State* L) { + DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint); + float x1 = luaL_checknumber(L, 2); + float y1 = luaL_checknumber(L, 3); + float z1 = luaL_checknumber(L, 4); + float x2 = luaL_checknumber(L, 5); + float y2 = luaL_checknumber(L, 6); + float z2 = luaL_checknumber(L, 7); + lovrDistanceJointSetAnchors(joint, x1, y1, z1, x2, y2, z2); + return 0; +} + +int l_lovrDistanceJointGetDistance(lua_State* L) { + DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint); + lua_pushnumber(L, lovrDistanceJointGetDistance(joint)); + return 1; +} + +int l_lovrDistanceJointSetDistance(lua_State* L) { + DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint); + float distance = luaL_checknumber(L, 2); + lovrDistanceJointSetDistance(joint, distance); + return 0; +} + +const luaL_Reg lovrDistanceJoint[] = { + { "getAnchors", l_lovrDistanceJointGetAnchors }, + { "setAnchors", l_lovrDistanceJointSetAnchors }, + { "getDistance", l_lovrDistanceJointGetDistance }, + { "setDistance", l_lovrDistanceJointSetDistance }, + { NULL, NULL } +}; + +int l_lovrHingeJointGetAnchors(lua_State* L) { + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); + float x1, y1, z1, x2, y2, z2; + lovrHingeJointGetAnchors(joint, &x1, &y1, &z1, &x2, &y2, &z2); lua_pushnumber(L, x1); lua_pushnumber(L, y1); lua_pushnumber(L, z1); @@ -105,18 +154,18 @@ int l_lovrHingeJointGetAnchors(lua_State* L) { } int l_lovrHingeJointSetAnchor(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); float x = luaL_checknumber(L, 2); float y = luaL_checknumber(L, 3); float z = luaL_checknumber(L, 4); - lovrHingeJointSetAnchor(hinge, x, y, z); + lovrHingeJointSetAnchor(joint, x, y, z); return 0; } int l_lovrHingeJointGetAxis(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); float x, y, z; - lovrHingeJointGetAxis(hinge, &x, &y, &z); + lovrHingeJointGetAxis(joint, &x, &y, &z); lua_pushnumber(L, x); lua_pushnumber(L, y); lua_pushnumber(L, z); @@ -124,59 +173,59 @@ int l_lovrHingeJointGetAxis(lua_State* L) { } int l_lovrHingeJointSetAxis(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); float x = luaL_checknumber(L, 2); float y = luaL_checknumber(L, 3); float z = luaL_checknumber(L, 4); - lovrHingeJointSetAxis(hinge, x, y, z); + lovrHingeJointSetAxis(joint, x, y, z); return 0; } int l_lovrHingeJointGetAngle(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); - lua_pushnumber(L, lovrHingeJointGetAngle(hinge)); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); + lua_pushnumber(L, lovrHingeJointGetAngle(joint)); return 1; } int l_lovrHingeJointGetLowerLimit(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); - lua_pushnumber(L, lovrHingeJointGetLowerLimit(hinge)); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); + lua_pushnumber(L, lovrHingeJointGetLowerLimit(joint)); return 1; } int l_lovrHingeJointSetLowerLimit(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); float limit = luaL_checknumber(L, 2); - lovrHingeJointSetLowerLimit(hinge, limit); + lovrHingeJointSetLowerLimit(joint, limit); return 0; } int l_lovrHingeJointGetUpperLimit(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); - lua_pushnumber(L, lovrHingeJointGetUpperLimit(hinge)); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); + lua_pushnumber(L, lovrHingeJointGetUpperLimit(joint)); return 1; } int l_lovrHingeJointSetUpperLimit(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); float limit = luaL_checknumber(L, 2); - lovrHingeJointSetUpperLimit(hinge, limit); + lovrHingeJointSetUpperLimit(joint, 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)); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); + lua_pushnumber(L, lovrHingeJointGetLowerLimit(joint)); + lua_pushnumber(L, lovrHingeJointGetUpperLimit(joint)); return 2; } int l_lovrHingeJointSetLimits(lua_State* L) { - HingeJoint* hinge = luax_checktype(L, 1, HingeJoint); + HingeJoint* joint = luax_checktype(L, 1, HingeJoint); float lower = luaL_checknumber(L, 2); float upper = luaL_checknumber(L, 3); - lovrHingeJointSetLowerLimit(hinge, lower); - lovrHingeJointSetUpperLimit(hinge, upper); + lovrHingeJointSetLowerLimit(joint, lower); + lovrHingeJointSetUpperLimit(joint, upper); return 0; } @@ -196,9 +245,9 @@ const luaL_Reg lovrHingeJoint[] = { }; int l_lovrSliderJointGetAxis(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); float x, y, z; - lovrSliderJointGetAxis(slider, &x, &y, &z); + lovrSliderJointGetAxis(joint, &x, &y, &z); lua_pushnumber(L, x); lua_pushnumber(L, y); lua_pushnumber(L, z); @@ -206,59 +255,59 @@ int l_lovrSliderJointGetAxis(lua_State* L) { } int l_lovrSliderJointSetAxis(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); float x = luaL_checknumber(L, 2); float y = luaL_checknumber(L, 3); float z = luaL_checknumber(L, 4); - lovrSliderJointSetAxis(slider, x, y, z); + lovrSliderJointSetAxis(joint, x, y, z); return 0; } int l_lovrSliderJointGetPosition(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); - lua_pushnumber(L, lovrSliderJointGetPosition(slider)); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); + lua_pushnumber(L, lovrSliderJointGetPosition(joint)); return 1; } int l_lovrSliderJointGetLowerLimit(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); - lua_pushnumber(L, lovrSliderJointGetLowerLimit(slider)); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); + lua_pushnumber(L, lovrSliderJointGetLowerLimit(joint)); return 1; } int l_lovrSliderJointSetLowerLimit(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); float limit = luaL_checknumber(L, 2); - lovrSliderJointSetLowerLimit(slider, limit); + lovrSliderJointSetLowerLimit(joint, limit); return 0; } int l_lovrSliderJointGetUpperLimit(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); - lua_pushnumber(L, lovrSliderJointGetUpperLimit(slider)); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); + lua_pushnumber(L, lovrSliderJointGetUpperLimit(joint)); return 1; } int l_lovrSliderJointSetUpperLimit(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); float limit = luaL_checknumber(L, 2); - lovrSliderJointSetUpperLimit(slider, limit); + lovrSliderJointSetUpperLimit(joint, 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)); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); + lua_pushnumber(L, lovrSliderJointGetLowerLimit(joint)); + lua_pushnumber(L, lovrSliderJointGetUpperLimit(joint)); return 2; } int l_lovrSliderJointSetLimits(lua_State* L) { - SliderJoint* slider = luax_checktype(L, 1, SliderJoint); + SliderJoint* joint = luax_checktype(L, 1, SliderJoint); float lower = luaL_checknumber(L, 2); float upper = luaL_checknumber(L, 3); - lovrSliderJointSetLowerLimit(slider, lower); - lovrSliderJointSetUpperLimit(slider, upper); + lovrSliderJointSetLowerLimit(joint, lower); + lovrSliderJointSetUpperLimit(joint, upper); return 0; } diff --git a/src/physics/physics.c b/src/physics/physics.c index f45b9018..6c51aaaa 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -899,25 +899,67 @@ BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float x, float y, float joint->id = dJointCreateBall(a->world->id, 0); dJointSetData(joint->id, joint); dJointAttach(joint->id, a->body, b->body); - dJointSetBallAnchor(joint->id, x, y, z); + lovrBallJointSetAnchor(joint, x, y, z); return joint; } -void lovrBallJointGetAnchors(BallJoint* ball, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2) { +void lovrBallJointGetAnchors(BallJoint* joint, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2) { float anchor[3]; - dJointGetBallAnchor(ball->id, anchor); + dJointGetBallAnchor(joint->id, anchor); *x1 = anchor[0]; *y1 = anchor[1]; *z1 = anchor[2]; - dJointGetBallAnchor2(ball->id, anchor); + dJointGetBallAnchor2(joint->id, anchor); *x2 = anchor[0]; *y2 = anchor[1]; *z2 = anchor[2]; } -void lovrBallJointSetAnchor(BallJoint* ball, float x, float y, float z) { - dJointSetBallAnchor(ball->id, x, y, z); +void lovrBallJointSetAnchor(BallJoint* joint, float x, float y, float z) { + dJointSetBallAnchor(joint->id, x, y, z); +} + +DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float x1, float y1, float z1, float x2, float y2, float z2) { + if (a->world != b->world) { + error("Joint bodies must exist in same World"); + } + + DistanceJoint* joint = lovrAlloc(sizeof(DistanceJoint), lovrJointDestroy); + if (!joint) return NULL; + + joint->type = JOINT_DISTANCE; + joint->id = dJointCreateDBall(a->world->id, 0); + dJointSetData(joint->id, joint); + dJointAttach(joint->id, a->body, b->body); + lovrDistanceJointSetAnchors(joint, x1, y1, z1, x2, y2, z2); + + return joint; +} + +void lovrDistanceJointGetAnchors(DistanceJoint* joint, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2) { + float anchor[3]; + dJointGetDBallAnchor1(joint->id, anchor); + *x1 = anchor[0]; + *y1 = anchor[1]; + *z1 = anchor[2]; + dJointGetDBallAnchor2(joint->id, anchor); + *x2 = anchor[0]; + *y2 = anchor[1]; + *z2 = anchor[2]; +} + +void lovrDistanceJointSetAnchors(DistanceJoint* joint, float x1, float y1, float z1, float x2, float y2, float z2) { + dJointSetDBallAnchor1(joint->id, x1, y1, z1); + dJointSetDBallAnchor2(joint->id, x2, y2, z2); +} + +float lovrDistanceJointGetDistance(DistanceJoint* joint) { + return dJointGetDBallDistance(joint->id); +} + +void lovrDistanceJointSetDistance(DistanceJoint* joint, float distance) { + dJointSetDBallDistance(joint->id, distance); } HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float x, float y, float z, float ax, float ay, float az) { @@ -932,58 +974,58 @@ HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float x, float y, flo joint->id = dJointCreateHinge(a->world->id, 0); dJointSetData(joint->id, joint); dJointAttach(joint->id, a->body, b->body); - dJointSetHingeAnchor(joint->id, x, y, z); - dJointSetHingeAxis(joint->id, ax, ay, az); + lovrHingeJointSetAnchor(joint, x, y, z); + lovrHingeJointSetAxis(joint, ax, ay, az); return joint; } -void lovrHingeJointGetAnchors(HingeJoint* hinge, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2) { +void lovrHingeJointGetAnchors(HingeJoint* joint, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2) { float anchor[3]; - dJointGetHingeAnchor(hinge->id, anchor); + dJointGetHingeAnchor(joint->id, anchor); *x1 = anchor[0]; *y1 = anchor[1]; *z1 = anchor[2]; - dJointGetHingeAnchor2(hinge->id, anchor); + dJointGetHingeAnchor2(joint->id, anchor); *x2 = anchor[0]; *y2 = anchor[1]; *z2 = anchor[2]; } -void lovrHingeJointSetAnchor(HingeJoint* hinge, float x, float y, float z) { - dJointSetHingeAnchor(hinge->id, x, y, z); +void lovrHingeJointSetAnchor(HingeJoint* joint, float x, float y, float z) { + dJointSetHingeAnchor(joint->id, x, y, z); } -void lovrHingeJointGetAxis(HingeJoint* hinge, float* x, float* y, float* z) { +void lovrHingeJointGetAxis(HingeJoint* joint, float* x, float* y, float* z) { float axis[3]; - dJointGetHingeAxis(hinge->id, axis); + dJointGetHingeAxis(joint->id, axis); *x = axis[0]; *y = axis[1]; *z = axis[2]; } -void lovrHingeJointSetAxis(HingeJoint* hinge, float x, float y, float z) { - dJointSetHingeAxis(hinge->id, x, y, z); +void lovrHingeJointSetAxis(HingeJoint* joint, float x, float y, float z) { + dJointSetHingeAxis(joint->id, x, y, z); } -float lovrHingeJointGetAngle(HingeJoint* hinge) { - return dJointGetHingeAngle(hinge->id); +float lovrHingeJointGetAngle(HingeJoint* joint) { + return dJointGetHingeAngle(joint->id); } -float lovrHingeJointGetLowerLimit(HingeJoint* hinge) { - return dJointGetHingeParam(hinge->id, dParamLoStop); +float lovrHingeJointGetLowerLimit(HingeJoint* joint) { + return dJointGetHingeParam(joint->id, dParamLoStop); } -void lovrHingeJointSetLowerLimit(HingeJoint* hinge, float limit) { - dJointSetHingeParam(hinge->id, dParamLoStop, limit); +void lovrHingeJointSetLowerLimit(HingeJoint* joint, float limit) { + dJointSetHingeParam(joint->id, dParamLoStop, limit); } -float lovrHingeJointGetUpperLimit(HingeJoint* hinge) { - return dJointGetHingeParam(hinge->id, dParamHiStop); +float lovrHingeJointGetUpperLimit(HingeJoint* joint) { + return dJointGetHingeParam(joint->id, dParamHiStop); } -void lovrHingeJointSetUpperLimit(HingeJoint* hinge, float limit) { - dJointSetHingeParam(hinge->id, dParamHiStop, limit); +void lovrHingeJointSetUpperLimit(HingeJoint* joint, float limit) { + dJointSetHingeParam(joint->id, dParamHiStop, limit); } SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float ax, float ay, float az) { @@ -998,39 +1040,39 @@ SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float ax, float ay, joint->id = dJointCreateSlider(a->world->id, 0); dJointSetData(joint->id, joint); dJointAttach(joint->id, a->body, b->body); - dJointSetSliderAxis(joint->id, ax, ay, az); + lovrSliderJointSetAxis(joint, ax, ay, az); return joint; } -void lovrSliderJointGetAxis(SliderJoint* slider, float* x, float* y, float* z) { +void lovrSliderJointGetAxis(SliderJoint* joint, float* x, float* y, float* z) { float axis[3]; - dJointGetSliderAxis(slider->id, axis); + dJointGetSliderAxis(joint->id, axis); *x = axis[0]; *y = axis[1]; *z = axis[2]; } -void lovrSliderJointSetAxis(SliderJoint* slider, float x, float y, float z) { - dJointSetSliderAxis(slider->id, x, y, z); +void lovrSliderJointSetAxis(SliderJoint* joint, float x, float y, float z) { + dJointSetSliderAxis(joint->id, x, y, z); } -float lovrSliderJointGetPosition(SliderJoint* slider) { - return dJointGetSliderPosition(slider->id); +float lovrSliderJointGetPosition(SliderJoint* joint) { + return dJointGetSliderPosition(joint->id); } -float lovrSliderJointGetLowerLimit(SliderJoint* slider) { - return dJointGetSliderParam(slider->id, dParamLoStop); +float lovrSliderJointGetLowerLimit(SliderJoint* joint) { + return dJointGetSliderParam(joint->id, dParamLoStop); } -void lovrSliderJointSetLowerLimit(SliderJoint* slider, float limit) { - dJointSetSliderParam(slider->id, dParamLoStop, limit); +void lovrSliderJointSetLowerLimit(SliderJoint* joint, float limit) { + dJointSetSliderParam(joint->id, dParamLoStop, limit); } -float lovrSliderJointGetUpperLimit(SliderJoint* slider) { - return dJointGetSliderParam(slider->id, dParamHiStop); +float lovrSliderJointGetUpperLimit(SliderJoint* joint) { + return dJointGetSliderParam(joint->id, dParamHiStop); } -void lovrSliderJointSetUpperLimit(SliderJoint* slider, float limit) { - dJointSetSliderParam(slider->id, dParamHiStop, limit); +void lovrSliderJointSetUpperLimit(SliderJoint* joint, float limit) { + dJointSetSliderParam(joint->id, dParamHiStop, limit); } diff --git a/src/physics/physics.h b/src/physics/physics.h index ee82089f..ec948c69 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -19,6 +19,7 @@ typedef enum { typedef enum { JOINT_BALL, + JOINT_DISTANCE, JOINT_HINGE, JOINT_SLIDER } JointType; @@ -66,6 +67,7 @@ typedef struct { } Joint; typedef Joint BallJoint; +typedef Joint DistanceJoint; typedef Joint HingeJoint; typedef Joint SliderJoint; @@ -196,25 +198,31 @@ void* lovrJointGetUserData(Joint* joint); void lovrJointSetUserData(Joint* joint, void* data); BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float x, float y, float z); -void lovrBallJointGetAnchors(BallJoint* ball, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2); -void lovrBallJointSetAnchor(BallJoint* ball, float x, float y, float z); +void lovrBallJointGetAnchors(BallJoint* joint, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2); +void lovrBallJointSetAnchor(BallJoint* joint, float x, float y, float z); + +DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float x1, float y1, float z1, float x2, float y2, float z2); +void lovrDistanceJointGetAnchors(DistanceJoint* joint, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2); +void lovrDistanceJointSetAnchors(DistanceJoint* joint, float x1, float y1, float z1, float x2, float y2, float z2); +float lovrDistanceJointGetDistance(DistanceJoint* joint); +void lovrDistanceJointSetDistance(DistanceJoint* joint, float distance); HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float x, float y, float z, float ax, float ay, float az); -void lovrHingeJointGetAnchors(HingeJoint* hinge, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2); -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); +void lovrHingeJointGetAnchors(HingeJoint* joint, float* x1, float* y1, float* z1, float* x2, float* y2, float* z2); +void lovrHingeJointSetAnchor(HingeJoint* joint, float x, float y, float z); +void lovrHingeJointGetAxis(HingeJoint* joint, float* x, float* y, float* z); +void lovrHingeJointSetAxis(HingeJoint* joint, float x, float y, float z); +float lovrHingeJointGetAngle(HingeJoint* joint); +float lovrHingeJointGetLowerLimit(HingeJoint* joint); +void lovrHingeJointSetLowerLimit(HingeJoint* joint, float limit); +float lovrHingeJointGetUpperLimit(HingeJoint* joint); +void lovrHingeJointSetUpperLimit(HingeJoint* joint, 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); +void lovrSliderJointGetAxis(SliderJoint* joint, float* x, float* y, float* z); +void lovrSliderJointSetAxis(SliderJoint* joint, float x, float y, float z); +float lovrSliderJointGetPosition(SliderJoint* joint); +float lovrSliderJointGetLowerLimit(SliderJoint* joint); +void lovrSliderJointSetLowerLimit(SliderJoint* joint, float limit); +float lovrSliderJointGetUpperLimit(SliderJoint* joint); +void lovrSliderJointSetUpperLimit(SliderJoint* joint, float limit);