Lots of Joint stuff;

This commit is contained in:
bjorn 2024-04-24 14:23:09 -07:00
parent 795b585e75
commit 5d7811903b
6 changed files with 679 additions and 310 deletions

View File

@ -56,6 +56,7 @@ extern StringEntry lovrShapeType[];
extern StringEntry lovrSmoothMode[];
extern StringEntry lovrStackType[];
extern StringEntry lovrStencilAction[];
extern StringEntry lovrTargetType[];
extern StringEntry lovrTextureFeature[];
extern StringEntry lovrTextureFormat[];
extern StringEntry lovrTextureType[];

View File

@ -23,6 +23,13 @@ StringEntry lovrJointType[] = {
{ 0 }
};
StringEntry lovrTargetType[] = {
[TARGET_NONE] = ENTRY("none"),
[TARGET_VELOCITY] = ENTRY("velocity"),
[TARGET_POSITION] = ENTRY("position"),
{ 0 }
};
static int l_lovrPhysicsNewWorld(lua_State* L) {
WorldInfo info = {
.maxColliders = 65536,

View File

@ -1,6 +1,7 @@
#include "api.h"
#include "physics/physics.h"
#include "util.h"
#include <math.h>
#include <string.h>
void luax_pushjoint(lua_State* L, Joint* joint) {
@ -82,6 +83,20 @@ static int l_lovrJointSetUserData(lua_State* L) {
return 0;
}
static int l_lovrJointGetPriority(lua_State* L) {
Joint* joint = luax_checktype(L, 1, Joint);
uint32_t priority = lovrJointGetPriority(joint);
lua_pushinteger(L, priority);
return 1;
}
static int l_lovrJointSetPriority(lua_State* L) {
Joint* joint = luax_checktype(L, 1, Joint);
uint32_t priority = luax_checku32(L, 2);
lovrJointSetPriority(joint, priority);
return 0;
}
static int l_lovrJointIsEnabled(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
lua_pushboolean(L, lovrJointIsEnabled(joint));
@ -116,6 +131,8 @@ static int l_lovrJointGetTorque(lua_State* L) {
{ "getColliders", l_lovrJointGetColliders }, \
{ "getUserData", l_lovrJointGetUserData }, \
{ "setUserData", l_lovrJointSetUserData }, \
{ "getPriority", l_lovrJointGetPriority }, \
{ "setPriority", l_lovrJointSetPriority }, \
{ "isEnabled", l_lovrJointIsEnabled }, \
{ "setEnabled", l_lovrJointSetEnabled }, \
{ "getForce", l_lovrJointGetForce }, \
@ -153,43 +170,9 @@ static int l_lovrBallJointGetAnchors(lua_State* L) {
return 6;
}
static int l_lovrBallJointGetResponseTime(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float responseTime = lovrBallJointGetResponseTime(joint);
lua_pushnumber(L, responseTime);
return 1;
}
static int l_lovrBallJointSetResponseTime(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float responseTime = luax_checkfloat(L, 2);
lovrCheck(responseTime >= 0, "Negative response time causes simulation instability");
lovrBallJointSetResponseTime(joint, responseTime);
return 0;
}
static int l_lovrBallJointGetTightness(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float tightness = lovrBallJointGetTightness(joint);
lua_pushnumber(L, tightness);
return 1;
}
static int l_lovrBallJointSetTightness(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float tightness = luax_checkfloat(L, 2);
lovrCheck(tightness >= 0, "Negative tightness factor causes simulation instability");
lovrBallJointSetTightness(joint, tightness);
return 0;
}
const luaL_Reg lovrBallJoint[] = {
lovrJoint,
{ "getAnchors", l_lovrBallJointGetAnchors },
{ "getResponseTime", l_lovrBallJointGetResponseTime},
{ "setResponseTime", l_lovrBallJointSetResponseTime},
{ "getTightness", l_lovrBallJointGetTightness},
{ "setTightness", l_lovrBallJointSetTightness},
{ NULL, NULL }
};
@ -206,58 +189,47 @@ static int l_lovrDistanceJointGetAnchors(lua_State* L) {
return 6;
}
static int l_lovrDistanceJointGetDistance(lua_State* L) {
static int l_lovrDistanceJointGetLimits(lua_State* L) {
DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint);
lua_pushnumber(L, lovrDistanceJointGetDistance(joint));
return 1;
float min, max;
lovrDistanceJointGetLimits(joint, &min, &max);
lua_pushnumber(L, min);
lua_pushnumber(L, max);
return 2;
}
static int l_lovrDistanceJointSetDistance(lua_State* L) {
static int l_lovrDistanceJointSetLimits(lua_State* L) {
DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint);
float distance = luax_checkfloat(L, 2);
lovrDistanceJointSetDistance(joint, distance);
float min = luax_optfloat(L, 2, 0.f);
float max = luax_optfloat(L, 3, lua_type(L, 2) == LUA_TNUMBER ? min : HUGE_VALF);
lovrDistanceJointSetLimits(joint, min, max);
return 0;
}
static int l_lovrDistanceJointGetResponseTime(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float responseTime = lovrDistanceJointGetResponseTime(joint);
lua_pushnumber(L, responseTime);
return 1;
static int l_lovrDistanceJointGetSpring(lua_State* L) {
DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint);
float frequency, damping;
lovrDistanceJointGetSpring(joint, &frequency, &damping);
lua_pushnumber(L, frequency);
lua_pushnumber(L, damping);
return 2;
}
static int l_lovrDistanceJointSetResponseTime(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float responseTime = luax_checkfloat(L, 2);
lovrCheck(responseTime >= 0, "Negative response time causes simulation instability");
lovrDistanceJointSetResponseTime(joint, responseTime);
return 0;
}
static int l_lovrDistanceJointGetTightness(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float tightness = lovrDistanceJointGetTightness(joint);
lua_pushnumber(L, tightness);
return 1;
}
static int l_lovrDistanceJointSetTightness(lua_State* L) {
Joint* joint = luax_checkjoint(L, 1);
float tightness = luax_checkfloat(L, 2);
lovrCheck(tightness >= 0, "Negative tightness factor causes simulation instability");
lovrDistanceJointSetTightness(joint, tightness);
static int l_lovrDistanceJointSetSpring(lua_State* L) {
DistanceJoint* joint = luax_checktype(L, 1, DistanceJoint);
float frequency = luax_checkfloat(L, 2);
float damping = luax_checkfloat(L, 3);
lovrDistanceJointSetSpring(joint, frequency, damping);
return 0;
}
const luaL_Reg lovrDistanceJoint[] = {
lovrJoint,
{ "getAnchors", l_lovrDistanceJointGetAnchors },
{ "getDistance", l_lovrDistanceJointGetDistance },
{ "setDistance", l_lovrDistanceJointSetDistance },
{ "getResponseTime", l_lovrDistanceJointGetResponseTime},
{ "setResponseTime", l_lovrDistanceJointSetResponseTime},
{ "getTightness", l_lovrDistanceJointGetTightness},
{ "setTightness", l_lovrDistanceJointSetTightness},
{ "getLimits", l_lovrDistanceJointGetLimits },
{ "setLimits", l_lovrDistanceJointSetLimits },
{ "getSpring", l_lovrDistanceJointGetSpring },
{ "setSpring", l_lovrDistanceJointSetSpring },
{ NULL, NULL }
};
@ -284,59 +256,133 @@ static int l_lovrHingeJointGetAxis(lua_State* L) {
return 3;
}
static int l_lovrHingeJointSetAxis(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float axis[3];
luax_readvec3(L, 2, axis, NULL);
lovrHingeJointSetAxis(joint, axis);
return 0;
}
static int l_lovrHingeJointGetAngle(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
lua_pushnumber(L, lovrHingeJointGetAngle(joint));
return 1;
}
static int l_lovrHingeJointGetLowerLimit(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
lua_pushnumber(L, lovrHingeJointGetLowerLimit(joint));
return 1;
}
static int l_lovrHingeJointSetLowerLimit(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float limit = luax_checkfloat(L, 2);
lovrHingeJointSetLowerLimit(joint, limit);
return 0;
}
static int l_lovrHingeJointGetUpperLimit(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
lua_pushnumber(L, lovrHingeJointGetUpperLimit(joint));
return 1;
}
static int l_lovrHingeJointSetUpperLimit(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float limit = luax_checkfloat(L, 2);
lovrHingeJointSetUpperLimit(joint, limit);
return 0;
}
static int l_lovrHingeJointGetLimits(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
lua_pushnumber(L, lovrHingeJointGetLowerLimit(joint));
lua_pushnumber(L, lovrHingeJointGetUpperLimit(joint));
float min, max;
lovrHingeJointGetLimits(joint, &min, &max);
lua_pushnumber(L, min);
lua_pushnumber(L, max);
return 2;
}
static int l_lovrHingeJointSetLimits(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float lower = luax_checkfloat(L, 2);
float upper = luax_checkfloat(L, 3);
lovrHingeJointSetLowerLimit(joint, lower);
lovrHingeJointSetUpperLimit(joint, upper);
if (lua_isnoneornil(L, 2)) {
lovrHingeJointSetLimits(joint, (float) -M_PI, (float) M_PI);
} else {
float min = luax_checkfloat(L, 2);
float max = luax_checkfloat(L, 3);
lovrHingeJointSetLimits(joint, min, max);
}
return 0;
}
static int l_lovrHingeJointGetFriction(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float friction = lovrHingeJointGetFriction(joint);
lua_pushnumber(L, friction);
return 1;
}
static int l_lovrHingeJointSetFriction(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float friction = luax_optfloat(L, 2, 0.f);
lovrHingeJointSetFriction(joint, friction);
return 0;
}
static int l_lovrHingeJointGetMotorTarget(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
TargetType type;
float value;
lovrHingeJointGetMotorTarget(joint, &type, &value);
if (type == TARGET_NONE) {
lua_pushnil(L);
return 1;
} else {
luax_pushenum(L, TargetType, type);
lua_pushnumber(L, value);
return 2;
}
}
static int l_lovrHingeJointSetMotorTarget(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
if (lua_isnoneornil(L, 2)) {
lovrHingeJointSetMotorTarget(joint, TARGET_NONE, 0.f);
} else {
TargetType type = luax_checkenum(L, 2, TargetType, NULL);
float value = luax_checkfloat(L, 3);
lovrHingeJointSetMotorTarget(joint, type, value);
}
return 0;
}
static int l_lovrHingeJointGetMotorSpring(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float frequency, damping;
lovrHingeJointGetMotorSpring(joint, &frequency, &damping);
lua_pushnumber(L, frequency);
lua_pushnumber(L, damping);
return 2;
}
static int l_lovrHingeJointSetMotorSpring(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float frequency = luax_checkfloat(L, 2);
float damping = luax_checkfloat(L, 3);
lovrHingeJointSetMotorSpring(joint, frequency, damping);
return 0;
}
static int l_lovrHingeJointGetMaxMotorForce(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float positive, negative;
lovrHingeJointGetMaxMotorForce(joint, &positive, &negative);
lua_pushnumber(L, positive);
lua_pushnumber(L, negative);
return 2;
}
static int l_lovrHingeJointSetMaxMotorForce(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
if (lua_isnoneornil(L, 2)) {
lovrHingeJointSetMaxMotorForce(joint, HUGE_VALF, HUGE_VALF);
} else {
float positive = luax_checkfloat(L, 2);
float negative = luax_optfloat(L, 3, positive);
lovrHingeJointSetMaxMotorForce(joint, positive, negative);
}
return 0;
}
static int l_lovrHingeJointGetMotorForce(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float force = lovrHingeJointGetMotorForce(joint);
lua_pushnumber(L, force);
return 1;
}
static int l_lovrHingeJointGetSpring(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float frequency, damping;
lovrHingeJointGetSpring(joint, &frequency, &damping);
lua_pushnumber(L, frequency);
lua_pushnumber(L, damping);
return 2;
}
static int l_lovrHingeJointSetSpring(lua_State* L) {
HingeJoint* joint = luax_checktype(L, 1, HingeJoint);
float frequency = luax_checkfloat(L, 2);
float damping = luax_checkfloat(L, 3);
lovrHingeJointSetSpring(joint, frequency, damping);
return 0;
}
@ -344,17 +390,36 @@ const luaL_Reg lovrHingeJoint[] = {
lovrJoint,
{ "getAnchors", l_lovrHingeJointGetAnchors },
{ "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 },
{ "getFriction", l_lovrHingeJointGetFriction },
{ "setFriction", l_lovrHingeJointSetFriction },
{ "getMotorTarget", l_lovrHingeJointGetMotorTarget },
{ "setMotorTarget", l_lovrHingeJointSetMotorTarget },
{ "getMotorSpring", l_lovrHingeJointGetMotorSpring },
{ "setMotorSpring", l_lovrHingeJointSetMotorSpring },
{ "getMaxMotorForce", l_lovrHingeJointGetMaxMotorForce },
{ "setMaxMotorForce", l_lovrHingeJointSetMaxMotorForce },
{ "getMotorForce", l_lovrHingeJointGetMotorForce },
{ "getSpring", l_lovrHingeJointGetSpring },
{ "setSpring", l_lovrHingeJointSetSpring },
{ NULL, NULL }
};
static int l_lovrSliderJointGetAnchors(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float anchor1[3], anchor2[3];
lovrSliderJointGetAnchors(joint, anchor1, anchor2);
lua_pushnumber(L, anchor1[0]);
lua_pushnumber(L, anchor1[1]);
lua_pushnumber(L, anchor1[2]);
lua_pushnumber(L, anchor2[0]);
lua_pushnumber(L, anchor2[1]);
lua_pushnumber(L, anchor2[2]);
return 6;
}
static int l_lovrSliderJointGetAxis(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float axis[3];
@ -365,72 +430,153 @@ static int l_lovrSliderJointGetAxis(lua_State* L) {
return 3;
}
static int l_lovrSliderJointSetAxis(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float axis[3];
luax_readvec3(L, 2, axis, NULL);
lovrSliderJointSetAxis(joint, axis);
return 0;
}
static int l_lovrSliderJointGetPosition(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
lua_pushnumber(L, lovrSliderJointGetPosition(joint));
return 1;
}
static int l_lovrSliderJointGetLowerLimit(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
lua_pushnumber(L, lovrSliderJointGetLowerLimit(joint));
return 1;
}
static int l_lovrSliderJointSetLowerLimit(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float limit = luax_checkfloat(L, 2);
lovrSliderJointSetLowerLimit(joint, limit);
return 0;
}
static int l_lovrSliderJointGetUpperLimit(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
lua_pushnumber(L, lovrSliderJointGetUpperLimit(joint));
return 1;
}
static int l_lovrSliderJointSetUpperLimit(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float limit = luax_checkfloat(L, 2);
lovrSliderJointSetUpperLimit(joint, limit);
return 0;
}
static int l_lovrSliderJointGetLimits(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
lua_pushnumber(L, lovrSliderJointGetLowerLimit(joint));
lua_pushnumber(L, lovrSliderJointGetUpperLimit(joint));
float min, max;
lovrSliderJointGetLimits(joint, &min, &max);
lua_pushnumber(L, min);
lua_pushnumber(L, max);
return 2;
}
static int l_lovrSliderJointSetLimits(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float lower = luax_checkfloat(L, 2);
float upper = luax_checkfloat(L, 3);
lovrSliderJointSetLowerLimit(joint, lower);
lovrSliderJointSetUpperLimit(joint, upper);
if (lua_isnoneornil(L, 2)) {
lovrSliderJointSetLimits(joint, (float) -HUGE_VALF, (float) HUGE_VALF);
} else {
float min = luax_checkfloat(L, 2);
float max = luax_checkfloat(L, 3);
lovrSliderJointSetLimits(joint, min, max);
}
return 0;
}
static int l_lovrSliderJointGetFriction(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float friction = lovrSliderJointGetFriction(joint);
lua_pushnumber(L, friction);
return 1;
}
static int l_lovrSliderJointSetFriction(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float friction = luax_optfloat(L, 2, 0.f);
lovrSliderJointSetFriction(joint, friction);
return 0;
}
static int l_lovrSliderJointGetMotorTarget(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
TargetType type;
float value;
lovrSliderJointGetMotorTarget(joint, &type, &value);
if (type == TARGET_NONE) {
lua_pushnil(L);
return 1;
} else {
luax_pushenum(L, TargetType, type);
lua_pushnumber(L, value);
return 2;
}
}
static int l_lovrSliderJointSetMotorTarget(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
if (lua_isnoneornil(L, 2)) {
lovrSliderJointSetMotorTarget(joint, TARGET_NONE, 0.f);
} else {
TargetType type = luax_checkenum(L, 2, TargetType, NULL);
float value = luax_checkfloat(L, 3);
lovrSliderJointSetMotorTarget(joint, type, value);
}
return 0;
}
static int l_lovrSliderJointGetMotorSpring(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float frequency, damping;
lovrSliderJointGetMotorSpring(joint, &frequency, &damping);
lua_pushnumber(L, frequency);
lua_pushnumber(L, damping);
return 2;
}
static int l_lovrSliderJointSetMotorSpring(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float frequency = luax_checkfloat(L, 2);
float damping = luax_checkfloat(L, 3);
lovrSliderJointSetMotorSpring(joint, frequency, damping);
return 0;
}
static int l_lovrSliderJointGetMaxMotorForce(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float positive, negative;
lovrSliderJointGetMaxMotorForce(joint, &positive, &negative);
lua_pushnumber(L, positive);
lua_pushnumber(L, negative);
return 2;
}
static int l_lovrSliderJointSetMaxMotorForce(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
if (lua_isnoneornil(L, 2)) {
lovrSliderJointSetMaxMotorForce(joint, HUGE_VALF, HUGE_VALF);
} else {
float positive = luax_checkfloat(L, 2);
float negative = luax_optfloat(L, 3, positive);
lovrSliderJointSetMaxMotorForce(joint, positive, negative);
}
return 0;
}
static int l_lovrSliderJointGetMotorForce(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float force = lovrSliderJointGetMotorForce(joint);
lua_pushnumber(L, force);
return 1;
}
static int l_lovrSliderJointGetSpring(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float frequency, damping;
lovrSliderJointGetSpring(joint, &frequency, &damping);
lua_pushnumber(L, frequency);
lua_pushnumber(L, damping);
return 2;
}
static int l_lovrSliderJointSetSpring(lua_State* L) {
SliderJoint* joint = luax_checktype(L, 1, SliderJoint);
float frequency = luax_checkfloat(L, 2);
float damping = luax_checkfloat(L, 3);
lovrSliderJointSetSpring(joint, frequency, damping);
return 0;
}
const luaL_Reg lovrSliderJoint[] = {
lovrJoint,
{ "getAnchors", l_lovrSliderJointGetAnchors },
{ "getAxis", l_lovrSliderJointGetAxis },
{ "setAxis", l_lovrSliderJointSetAxis },
{ "getPosition", l_lovrSliderJointGetPosition },
{ "getLowerLimit", l_lovrSliderJointGetLowerLimit },
{ "setLowerLimit", l_lovrSliderJointSetLowerLimit },
{ "getUpperLimit", l_lovrSliderJointGetUpperLimit },
{ "setUpperLimit", l_lovrSliderJointSetUpperLimit },
{ "getLimits", l_lovrSliderJointGetLimits },
{ "setLimits", l_lovrSliderJointSetLimits },
{ "getFriction", l_lovrSliderJointGetFriction },
{ "setFriction", l_lovrSliderJointSetFriction },
{ "getMotorTarget", l_lovrSliderJointGetMotorTarget },
{ "setMotorTarget", l_lovrSliderJointSetMotorTarget },
{ "getMotorSpring", l_lovrSliderJointGetMotorSpring },
{ "setMotorSpring", l_lovrSliderJointSetMotorSpring },
{ "getMaxMotorForce", l_lovrSliderJointGetMaxMotorForce },
{ "setMaxMotorForce", l_lovrSliderJointSetMaxMotorForce },
{ "getMotorForce", l_lovrSliderJointGetMotorForce },
{ "getSpring", l_lovrSliderJointGetSpring },
{ "setSpring", l_lovrSliderJointSetSpring },
{ NULL, NULL }
};

View File

@ -208,6 +208,12 @@ typedef enum {
JOINT_SLIDER
} JointType;
typedef enum {
TARGET_NONE,
TARGET_VELOCITY,
TARGET_POSITION
} TargetType;
void lovrJointDestroy(void* ref);
void lovrJointDestroyData(Joint* joint);
bool lovrJointIsDestroyed(Joint* joint);
@ -215,6 +221,8 @@ JointType lovrJointGetType(Joint* joint);
Collider* lovrJointGetColliderA(Joint* joint);
Collider* lovrJointGetColliderB(Joint* joint);
Joint* lovrJointGetNext(Joint* joint, Collider* collider);
uint32_t lovrJointGetPriority(Joint* joint);
void lovrJointSetPriority(Joint* joint, uint32_t priority);
bool lovrJointIsEnabled(Joint* joint);
void lovrJointSetEnabled(Joint* joint, bool enable);
float lovrJointGetForce(Joint* joint);
@ -225,38 +233,49 @@ void lovrWeldJointGetAnchors(WeldJoint* joint, float anchor1[3], float anchor2[3
BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float anchor[3]);
void lovrBallJointGetAnchors(BallJoint* joint, float anchor1[3], float anchor2[3]);
float lovrBallJointGetResponseTime(Joint* joint);
void lovrBallJointSetResponseTime(Joint* joint, float responseTime);
float lovrBallJointGetTightness(Joint* joint);
void lovrBallJointSetTightness(Joint* joint, float tightness);
DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float anchor1[3], float anchor2[3]);
void lovrDistanceJointGetAnchors(DistanceJoint* joint, float anchor1[3], float anchor2[3]);
float lovrDistanceJointGetDistance(DistanceJoint* joint);
void lovrDistanceJointSetDistance(DistanceJoint* joint, float distance);
float lovrDistanceJointGetResponseTime(Joint* joint);
void lovrDistanceJointSetResponseTime(Joint* joint, float responseTime);
float lovrDistanceJointGetTightness(Joint* joint);
void lovrDistanceJointSetTightness(Joint* joint, float tightness);
void lovrDistanceJointGetLimits(DistanceJoint* joint, float* min, float* max);
void lovrDistanceJointSetLimits(DistanceJoint* joint, float min, float max);
void lovrDistanceJointGetSpring(DistanceJoint* joint, float* frequency, float* damping);
void lovrDistanceJointSetSpring(DistanceJoint* joint, float frequency, float damping);
HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float anchor[3], float axis[3]);
void lovrHingeJointGetAnchors(HingeJoint* joint, float anchor1[3], float anchor2[3]);
void lovrHingeJointGetAxis(HingeJoint* joint, float axis[3]);
void lovrHingeJointSetAxis(HingeJoint* joint, float axis[3]);
float lovrHingeJointGetAngle(HingeJoint* joint);
float lovrHingeJointGetLowerLimit(HingeJoint* joint);
void lovrHingeJointSetLowerLimit(HingeJoint* joint, float limit);
float lovrHingeJointGetUpperLimit(HingeJoint* joint);
void lovrHingeJointSetUpperLimit(HingeJoint* joint, float limit);
void lovrHingeJointGetLimits(HingeJoint* joint, float* min, float* max);
void lovrHingeJointSetLimits(HingeJoint* joint, float min, float max);
float lovrHingeJointGetFriction(HingeJoint* joint);
void lovrHingeJointSetFriction(HingeJoint* joint, float friction);
void lovrHingeJointGetMotorTarget(HingeJoint* joint, TargetType* type, float* value);
void lovrHingeJointSetMotorTarget(HingeJoint* joint, TargetType type, float value);
void lovrHingeJointGetMotorSpring(HingeJoint* joint, float* frequency, float* damping);
void lovrHingeJointSetMotorSpring(HingeJoint* joint, float frequency, float damping);
void lovrHingeJointGetMaxMotorForce(HingeJoint* joint, float* positive, float* negative);
void lovrHingeJointSetMaxMotorForce(HingeJoint* joint, float positive, float negative);
float lovrHingeJointGetMotorForce(HingeJoint* joint);
void lovrHingeJointGetSpring(HingeJoint* joint, float* frequency, float* damping);
void lovrHingeJointSetSpring(HingeJoint* joint, float frequency, float damping);
SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float axis[3]);
void lovrSliderJointGetAnchors(SliderJoint* joint, float anchor1[3], float anchor2[3]);
void lovrSliderJointGetAxis(SliderJoint* joint, float axis[3]);
void lovrSliderJointSetAxis(SliderJoint* joint, float axis[3]);
float lovrSliderJointGetPosition(SliderJoint* joint);
float lovrSliderJointGetLowerLimit(SliderJoint* joint);
void lovrSliderJointSetLowerLimit(SliderJoint* joint, float limit);
float lovrSliderJointGetUpperLimit(SliderJoint* joint);
void lovrSliderJointSetUpperLimit(SliderJoint* joint, float limit);
void lovrSliderJointGetLimits(SliderJoint* joint, float* min, float* max);
void lovrSliderJointSetLimits(SliderJoint* joint, float min, float max);
float lovrSliderJointGetFriction(SliderJoint* joint);
void lovrSliderJointSetFriction(SliderJoint* joint, float friction);
void lovrSliderJointGetMotorTarget(SliderJoint* joint, TargetType* type, float* value);
void lovrSliderJointSetMotorTarget(SliderJoint* joint, TargetType type, float value);
void lovrSliderJointGetMotorSpring(SliderJoint* joint, float* frequency, float* damping);
void lovrSliderJointSetMotorSpring(SliderJoint* joint, float frequency, float damping);
void lovrSliderJointGetMaxMotorForce(SliderJoint* joint, float* positive, float* negative);
void lovrSliderJointSetMaxMotorForce(SliderJoint* joint, float positive, float negative);
float lovrSliderJointGetMotorForce(SliderJoint* joint);
void lovrSliderJointGetSpring(SliderJoint* joint, float* frequency, float* damping);
void lovrSliderJointSetSpring(SliderJoint* joint, float frequency, float damping);
// These tokens need to exist for Lua bindings
#define lovrWeldJointDestroy lovrJointDestroy

View File

@ -1108,6 +1108,14 @@ Joint* lovrJointGetNext(Joint* joint, Collider* collider) {
return lovrJointGetNode(joint, collider)->next;
}
uint32_t lovrJointGetPriority(Joint* joint) {
return JPH_Constraint_GetConstraintPriority(joint->constraint);
}
void lovrJointSetPriority(Joint* joint, uint32_t priority) {
JPH_Constraint_SetConstraintPriority(joint->constraint, priority);
}
bool lovrJointIsEnabled(Joint* joint) {
return JPH_Constraint_GetEnabled(joint->constraint);
}
@ -1159,16 +1167,18 @@ float lovrJointGetTorque(Joint* joint) {
}
}
// WeldJoint
WeldJoint* lovrWeldJointCreate(Collider* a, Collider* b, float anchor[3]) {
lovrCheck(a->world == b->world, "Joint bodies must exist in same World");
WeldJoint* joint = lovrCalloc(sizeof(WeldJoint));
joint->ref = 1;
joint->type = JOINT_WELD;
JPH_FixedConstraintSettings* settings = JPH_FixedConstraintSettings_Create();
JPH_FixedConstraintSettings_SetPoint1(settings, vec3_toJolt(anchor));
JPH_FixedConstraintSettings_SetPoint2(settings, vec3_toJolt(anchor));
joint->constraint = (JPH_Constraint*) JPH_FixedConstraintSettings_CreateConstraint(settings, a->body, b->body);
JPH_ConstraintSettings_Destroy((JPH_ConstraintSettings*) settings);
JPH_FixedConstraintSettings settings;
JPH_FixedConstraintSettings_InitDefault(&settings);
settings.point1 = (JPH_Vec3) { anchor[0], anchor[1], anchor[2] };
settings.point2 = (JPH_Vec3) { anchor[0], anchor[1], anchor[2] };
joint->constraint = (JPH_Constraint*) JPH_FixedConstraintSettings_CreateConstraint(&settings, a->body, b->body);
JPH_PhysicsSystem_AddConstraint(a->world->system, joint->constraint);
lovrJointInit(joint, a, b);
lovrRetain(joint);
@ -1179,6 +1189,8 @@ void lovrWeldJointGetAnchors(WeldJoint* joint, float anchor1[3], float anchor2[3
lovrJointGetAnchors((Joint*) joint, anchor1, anchor2);
}
// BallJoint
BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float anchor[3]) {
lovrCheck(a->world == b->world, "Joint bodies must exist in same World");
BallJoint* joint = lovrCalloc(sizeof(BallJoint));
@ -1200,21 +1212,7 @@ void lovrBallJointGetAnchors(BallJoint* joint, float anchor1[3], float anchor2[3
lovrJointGetAnchors((Joint*) joint, anchor1, anchor2);
}
float lovrBallJointGetResponseTime(Joint* joint) {
lovrLog(LOG_WARN, "PHY", "Jolt does not support BallJoint response time");
}
void lovrBallJointSetResponseTime(Joint* joint, float responseTime) {
lovrLog(LOG_WARN, "PHY", "Jolt does not support BallJoint response time");
}
float lovrBallJointGetTightness(Joint* joint) {
lovrLog(LOG_WARN, "PHY", "Jolt does not support BallJoint tightness");
}
void lovrBallJointSetTightness(Joint* joint, float tightness) {
lovrLog(LOG_WARN, "PHY", "Jolt does not support BallJoint tightness");
}
// DistanceJoint
DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float anchor1[3], float anchor2[3]) {
lovrCheck(a->world == b->world, "Joint bodies must exist in same World");
@ -1237,35 +1235,30 @@ void lovrDistanceJointGetAnchors(DistanceJoint* joint, float anchor1[3], float a
lovrJointGetAnchors((Joint*) joint, anchor1, anchor2);
}
float lovrDistanceJointGetDistance(DistanceJoint* joint) {
return JPH_DistanceConstraint_GetMaxDistance((JPH_DistanceConstraint*) joint->constraint);
void lovrDistanceJointGetLimits(DistanceJoint* joint, float* min, float* max) {
*min = JPH_DistanceConstraint_GetMinDistance((JPH_DistanceConstraint*) joint->constraint);
*max = JPH_DistanceConstraint_GetMaxDistance((JPH_DistanceConstraint*) joint->constraint);
}
void lovrDistanceJointSetDistance(DistanceJoint* joint, float distance) {
JPH_DistanceConstraint_SetDistance((JPH_DistanceConstraint*) joint->constraint, distance, distance);
void lovrDistanceJointSetLimits(DistanceJoint* joint, float min, float max) {
JPH_DistanceConstraint_SetDistance((JPH_DistanceConstraint*) joint->constraint, min, max);
}
float lovrDistanceJointGetResponseTime(Joint* joint) {
JPH_SpringSettings* settings = JPH_DistanceConstraint_GetLimitsSpringSettings((JPH_DistanceConstraint*) joint->constraint);
return 1.f / JPH_SpringSettings_GetFrequency(settings);
void lovrDistanceJointGetSpring(DistanceJoint* joint, float* frequency, float* damping) {
JPH_SpringSettings settings;
JPH_DistanceConstraint_GetLimitsSpringSettings((JPH_DistanceConstraint*) joint->constraint, &settings);
*frequency = settings.frequencyOrStiffness;
*damping = settings.damping;
}
void lovrDistanceJointSetResponseTime(Joint* joint, float responseTime) {
JPH_SpringSettings* settings = JPH_SpringSettings_Create(1.f / responseTime, 0.f);
JPH_DistanceConstraint_SetLimitsSpringSettings((JPH_DistanceConstraint*) joint->constraint, settings);
JPH_SpringSettings_Destroy(settings);
void lovrDistanceJointSetSpring(DistanceJoint* joint, float frequency, float damping) {
JPH_DistanceConstraint_SetLimitsSpringSettings((JPH_DistanceConstraint*) joint->constraint, &(JPH_SpringSettings) {
.frequencyOrStiffness = frequency,
.damping = damping
});
}
float lovrDistanceJointGetTightness(Joint* joint) {
// todo: jolt has spring damping instead of tightness, not compatible with lovr API
// (but body's damping is not that different)
lovrLog(LOG_WARN, "PHY", "Jolt does not support DistanceJoint tightness");
return 0.f;
}
void lovrDistanceJointSetTightness(Joint* joint, float tightness) {
lovrLog(LOG_WARN, "PHY", "Jolt does not support DistanceJoint tightness");
}
// HingeJoint
HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float anchor[3], float axis[3]) {
lovrCheck(a->world == b->world, "Joint bodies must exist in the same World");
@ -1313,33 +1306,105 @@ void lovrHingeJointGetAxis(HingeJoint* joint, float axis[3]) {
axis[2] = translation[2];
}
void lovrHingeJointSetAxis(HingeJoint* joint, float axis[3]) {
lovrLog(LOG_WARN, "PHY", "Jolt does not support modifying joint axis after creation");
// todo: no setter available, but the constraint could be removed and re-added
}
float lovrHingeJointGetAngle(HingeJoint* joint) {
return -JPH_HingeConstraint_GetCurrentAngle((JPH_HingeConstraint*) joint->constraint);
}
float lovrHingeJointGetLowerLimit(HingeJoint* joint) {
return JPH_HingeConstraint_GetLimitsMin((JPH_HingeConstraint*) joint->constraint);
void lovrHingeJointGetLimits(HingeJoint* joint, float* min, float* max) {
*min = JPH_HingeConstraint_GetLimitsMin((JPH_HingeConstraint*) joint->constraint);
*max = JPH_HingeConstraint_GetLimitsMax((JPH_HingeConstraint*) joint->constraint);
}
void lovrHingeJointSetLowerLimit(HingeJoint* joint, float limit) {
float upper_limit = JPH_HingeConstraint_GetLimitsMax((JPH_HingeConstraint*) joint->constraint);
JPH_HingeConstraint_SetLimits((JPH_HingeConstraint*) joint->constraint, limit, upper_limit);
void lovrHingeJointSetLimits(HingeJoint* joint, float min, float max) {
JPH_HingeConstraint_SetLimits((JPH_HingeConstraint*) joint->constraint, min, max);
}
float lovrHingeJointGetUpperLimit(HingeJoint* joint) {
return JPH_HingeConstraint_GetLimitsMax((JPH_HingeConstraint*) joint->constraint);
float lovrHingeJointGetFriction(HingeJoint* joint) {
return JPH_HingeConstraint_GetMaxFrictionTorque((JPH_HingeConstraint*) joint->constraint);
}
void lovrHingeJointSetUpperLimit(HingeJoint* joint, float limit) {
float lower_limit = JPH_HingeConstraint_GetLimitsMin((JPH_HingeConstraint*) joint->constraint);
JPH_HingeConstraint_SetLimits((JPH_HingeConstraint*) joint->constraint, lower_limit, limit);
void lovrHingeJointSetFriction(HingeJoint* joint, float friction) {
JPH_HingeConstraint_SetMaxFrictionTorque((JPH_HingeConstraint*) joint->constraint, friction);
}
void lovrHingeJointGetMotorTarget(HingeJoint* joint, TargetType* type, float* value) {
JPH_HingeConstraint* constraint = (JPH_HingeConstraint*) joint->constraint;
JPH_MotorState motorState = JPH_HingeConstraint_GetMotorState(constraint);
*type = (TargetType) motorState;
switch (motorState) {
case JPH_MotorState_Velocity: *value = JPH_HingeConstraint_GetTargetAngularVelocity(constraint); break;
case JPH_MotorState_Position: *value = JPH_HingeConstraint_GetTargetAngle(constraint); break;
default: *value = 0.f; break;
}
}
void lovrHingeJointSetMotorTarget(HingeJoint* joint, TargetType type, float value) {
JPH_HingeConstraint* constraint = (JPH_HingeConstraint*) joint->constraint;
switch (type) {
case TARGET_VELOCITY:
JPH_HingeConstraint_SetMotorState(constraint, JPH_MotorState_Velocity);
JPH_HingeConstraint_SetTargetAngularVelocity(constraint, value);
break;
case TARGET_POSITION:
JPH_HingeConstraint_SetMotorState(constraint, JPH_MotorState_Position);
JPH_HingeConstraint_SetTargetAngle(constraint, value);
break;
default:
JPH_HingeConstraint_SetMotorState(constraint, JPH_MotorState_Off);
break;
}
}
void lovrHingeJointGetMotorSpring(HingeJoint* joint, float* frequency, float* damping) {
JPH_MotorSettings settings;
JPH_HingeConstraint_GetMotorSettings((JPH_HingeConstraint*) joint->constraint, &settings);
*frequency = settings.springSettings.frequencyOrStiffness;
*damping = settings.springSettings.damping;
}
void lovrHingeJointSetMotorSpring(HingeJoint* joint, float frequency, float damping) {
JPH_MotorSettings settings;
JPH_HingeConstraint_GetMotorSettings((JPH_HingeConstraint*) joint->constraint, &settings);
settings.springSettings.frequencyOrStiffness = frequency;
settings.springSettings.damping = damping;
JPH_HingeConstraint_SetMotorSettings((JPH_HingeConstraint*) joint->constraint, &settings);
}
void lovrHingeJointGetMaxMotorForce(HingeJoint* joint, float* positive, float* negative) {
JPH_MotorSettings settings;
JPH_HingeConstraint_GetMotorSettings((JPH_HingeConstraint*) joint->constraint, &settings);
*positive = settings.maxTorqueLimit;
*negative = -settings.minTorqueLimit;
}
void lovrHingeJointSetMaxMotorForce(HingeJoint* joint, float positive, float negative) {
JPH_MotorSettings settings;
JPH_HingeConstraint_GetMotorSettings((JPH_HingeConstraint*) joint->constraint, &settings);
settings.minTorqueLimit = -negative;
settings.maxTorqueLimit = positive;
JPH_HingeConstraint_SetMotorSettings((JPH_HingeConstraint*) joint->constraint, &settings);
}
float lovrHingeJointGetMotorForce(HingeJoint* joint) {
return JPH_HingeConstraint_GetTotalLambdaMotor((JPH_HingeConstraint*) joint->constraint);
}
void lovrHingeJointGetSpring(HingeJoint* joint, float* frequency, float* damping) {
JPH_SpringSettings settings;
JPH_HingeConstraint_GetLimitsSpringSettings((JPH_HingeConstraint*) joint->constraint, &settings);
*frequency = settings.frequencyOrStiffness;
*damping = settings.damping;
}
void lovrHingeJointSetSpring(HingeJoint* joint, float frequency, float damping) {
JPH_HingeConstraint_SetLimitsSpringSettings((JPH_HingeConstraint*) joint->constraint, &(JPH_SpringSettings) {
.frequencyOrStiffness = frequency,
.damping = damping
});
}
// SliderJoint
SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float axis[3]) {
lovrCheck(a->world == b->world, "Joint bodies must exist in the same World");
@ -1357,6 +1422,10 @@ SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float axis[3]) {
return joint;
}
void lovrSliderJointGetAnchors(SliderJoint* joint, float anchor1[3], float anchor2[3]) {
lovrJointGetAnchors(joint, anchor1, anchor2);
}
void lovrSliderJointGetAxis(SliderJoint* joint, float axis[3]) {
JPH_Vec3 resultAxis;
JPH_SliderConstraintSettings* settings = JPH_SliderConstraint_GetSettings((JPH_SliderConstraint*) joint->constraint);
@ -1378,29 +1447,99 @@ void lovrSliderJointGetAxis(SliderJoint* joint, float axis[3]) {
axis[2] = translation[2];
}
void lovrSliderJointSetAxis(SliderJoint* joint, float axis[3]) {
lovrLog(LOG_WARN, "PHY", "Jolt does not support modifying joint axis after creation");
// todo: no setter available, but the constraint could be removed and re-added
}
float lovrSliderJointGetPosition(SliderJoint* joint) {
return JPH_SliderConstraint_GetCurrentPosition((JPH_SliderConstraint*) joint->constraint);
}
float lovrSliderJointGetLowerLimit(SliderJoint* joint) {
return JPH_SliderConstraint_GetLimitsMin((JPH_SliderConstraint*) joint->constraint);
void lovrSliderJointGetLimits(SliderJoint* joint, float* min, float* max) {
*min = JPH_SliderConstraint_GetLimitsMin((JPH_SliderConstraint*) joint->constraint);
*max = JPH_SliderConstraint_GetLimitsMax((JPH_SliderConstraint*) joint->constraint);
}
void lovrSliderJointSetLowerLimit(SliderJoint* joint, float limit) {
float upper_limit = JPH_SliderConstraint_GetLimitsMax((JPH_SliderConstraint*) joint->constraint);
JPH_SliderConstraint_SetLimits((JPH_SliderConstraint*) joint->constraint, limit, upper_limit);
void lovrSliderJointSetLimits(SliderJoint* joint, float min, float max) {
JPH_SliderConstraint_SetLimits((JPH_SliderConstraint*) joint->constraint, min, max);
}
float lovrSliderJointGetUpperLimit(SliderJoint* joint) {
return JPH_SliderConstraint_GetLimitsMax((JPH_SliderConstraint*) joint->constraint);
float lovrSliderJointGetFriction(SliderJoint* joint) {
return JPH_SliderConstraint_GetMaxFrictionForce((JPH_SliderConstraint*) joint->constraint);
}
void lovrSliderJointSetUpperLimit(SliderJoint* joint, float limit) {
float lower_limit = JPH_SliderConstraint_GetLimitsMin((JPH_SliderConstraint*) joint->constraint);
JPH_SliderConstraint_SetLimits((JPH_SliderConstraint*) joint->constraint, lower_limit, limit);
void lovrSliderJointSetFriction(SliderJoint* joint, float friction) {
JPH_SliderConstraint_SetMaxFrictionForce((JPH_SliderConstraint*) joint->constraint, friction);
}
void lovrSliderJointGetMotorTarget(SliderJoint* joint, TargetType* type, float* value) {
JPH_SliderConstraint* constraint = (JPH_SliderConstraint*) joint->constraint;
JPH_MotorState motorState = JPH_SliderConstraint_GetMotorState(constraint);
*type = (TargetType) motorState;
switch (motorState) {
case JPH_MotorState_Velocity: *value = JPH_SliderConstraint_GetTargetVelocity(constraint); break;
case JPH_MotorState_Position: *value = JPH_SliderConstraint_GetTargetPosition(constraint); break;
default: *value = 0.f; break;
}
}
void lovrSliderJointSetMotorTarget(SliderJoint* joint, TargetType type, float value) {
JPH_SliderConstraint* constraint = (JPH_SliderConstraint*) joint->constraint;
switch (type) {
case TARGET_VELOCITY:
JPH_SliderConstraint_SetMotorState(constraint, JPH_MotorState_Velocity);
JPH_SliderConstraint_SetTargetVelocity(constraint, value);
break;
case TARGET_POSITION:
JPH_SliderConstraint_SetMotorState(constraint, JPH_MotorState_Position);
JPH_SliderConstraint_SetTargetPosition(constraint, value);
break;
default:
JPH_SliderConstraint_SetMotorState(constraint, JPH_MotorState_Off);
break;
}
}
void lovrSliderJointGetMotorSpring(SliderJoint* joint, float* frequency, float* damping) {
JPH_MotorSettings settings;
JPH_SliderConstraint_GetMotorSettings((JPH_SliderConstraint*) joint->constraint, &settings);
*frequency = settings.springSettings.frequencyOrStiffness;
*damping = settings.springSettings.damping;
}
void lovrSliderJointSetMotorSpring(SliderJoint* joint, float frequency, float damping) {
JPH_MotorSettings settings;
JPH_SliderConstraint_GetMotorSettings((JPH_SliderConstraint*) joint->constraint, &settings);
settings.springSettings.frequencyOrStiffness = frequency;
settings.springSettings.damping = damping;
JPH_SliderConstraint_SetMotorSettings((JPH_SliderConstraint*) joint->constraint, &settings);
}
void lovrSliderJointGetMaxMotorForce(SliderJoint* joint, float* positive, float* negative) {
JPH_MotorSettings settings;
JPH_SliderConstraint_GetMotorSettings((JPH_SliderConstraint*) joint->constraint, &settings);
*positive = settings.maxForceLimit;
*negative = -settings.minForceLimit;
}
void lovrSliderJointSetMaxMotorForce(SliderJoint* joint, float positive, float negative) {
JPH_MotorSettings settings;
JPH_SliderConstraint_GetMotorSettings((JPH_SliderConstraint*) joint->constraint, &settings);
settings.minForceLimit = -negative;
settings.maxForceLimit = positive;
JPH_SliderConstraint_SetMotorSettings((JPH_SliderConstraint*) joint->constraint, &settings);
}
float lovrSliderJointGetMotorForce(SliderJoint* joint) {
return JPH_SliderConstraint_GetTotalLambdaMotor((JPH_SliderConstraint*) joint->constraint);
}
void lovrSliderJointGetSpring(SliderJoint* joint, float* frequency, float* damping) {
JPH_SpringSettings settings;
JPH_SliderConstraint_GetLimitsSpringSettings((JPH_SliderConstraint*) joint->constraint, &settings);
*frequency = settings.frequencyOrStiffness;
*damping = settings.damping;
}
void lovrSliderJointSetSpring(SliderJoint* joint, float frequency, float damping) {
JPH_SliderConstraint_SetLimitsSpringSettings((JPH_SliderConstraint*) joint->constraint, &(JPH_SpringSettings) {
.frequencyOrStiffness = frequency,
.damping = damping
});
}

View File

@ -1071,6 +1071,14 @@ Collider* lovrJointGetColliderB(Joint* joint) {
return bodyB ? dBodyGetData(bodyB) : NULL;
}
uint32_t lovrJointGetPriority(Joint* joint) {
return 0;
}
void lovrJointSetPriority(Joint* joint, uint32_t priority) {
//
}
bool lovrJointIsEnabled(Joint* joint) {
return dJointIsEnabled(joint->id);
}
@ -1124,22 +1132,6 @@ void lovrBallJointGetAnchors(BallJoint* joint, float anchor1[3], float anchor2[3
anchor2[2] = anchor[2];
}
float lovrBallJointGetResponseTime(Joint* joint) {
return dJointGetBallParam(joint->id, dParamCFM);
}
void lovrBallJointSetResponseTime(Joint* joint, float responseTime) {
dJointSetBallParam(joint->id, dParamCFM, responseTime);
}
float lovrBallJointGetTightness(Joint* joint) {
return dJointGetBallParam(joint->id, dParamERP);
}
void lovrBallJointSetTightness(Joint* joint, float tightness) {
dJointSetBallParam(joint->id, dParamERP, tightness);
}
DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float anchor1[3], float anchor2[3]) {
lovrCheck(a->world == b->world, "Joint bodies must exist in same World");
DistanceJoint* joint = lovrCalloc(sizeof(DistanceJoint));
@ -1166,28 +1158,21 @@ void lovrDistanceJointGetAnchors(DistanceJoint* joint, float anchor1[3], float a
anchor2[2] = anchor[2];
}
float lovrDistanceJointGetDistance(DistanceJoint* joint) {
return dJointGetDBallDistance(joint->id);
void lovrDistanceJointGetLimits(DistanceJoint* joint, float* min, float* max) {
*min = dJointGetDBallDistance(joint->id);
*max = dJointGetDBallDistance(joint->id);
}
void lovrDistanceJointSetDistance(DistanceJoint* joint, float distance) {
dJointSetDBallDistance(joint->id, distance);
void lovrDistanceJointSetLimits(DistanceJoint* joint, float min, float max) {
dJointSetDBallDistance(joint->id, max);
}
float lovrDistanceJointGetResponseTime(Joint* joint) {
return dJointGetDBallParam(joint->id, dParamCFM);
void lovrDistanceJointGetSpring(DistanceJoint* joint, float* frequency, float* damping) {
// TODO
}
void lovrDistanceJointSetResponseTime(Joint* joint, float responseTime) {
dJointSetDBallParam(joint->id, dParamCFM, responseTime);
}
float lovrDistanceJointGetTightness(Joint* joint) {
return dJointGetDBallParam(joint->id, dParamERP);
}
void lovrDistanceJointSetTightness(Joint* joint, float tightness) {
dJointSetDBallParam(joint->id, dParamERP, tightness);
void lovrDistanceJointSetSpring(DistanceJoint* joint, float frequency, float damping) {
// TODO
}
HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float anchor[3], float axis[3]) {
@ -1199,7 +1184,7 @@ HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float anchor[3], floa
dJointSetData(joint->id, joint);
dJointAttach(joint->id, a->body, b->body);
dJointSetHingeAnchor(joint->id, anchor[0], anchor[1], anchor[2]);
lovrHingeJointSetAxis(joint, axis);
dJointSetHingeAxis(joint->id, axis[0], axis[1], axis[2]);
lovrRetain(joint);
return joint;
}
@ -1224,28 +1209,62 @@ void lovrHingeJointGetAxis(HingeJoint* joint, float axis[3]) {
axis[2] = daxis[2];
}
void lovrHingeJointSetAxis(HingeJoint* joint, float axis[3]) {
dJointSetHingeAxis(joint->id, axis[0], axis[1], axis[2]);
}
float lovrHingeJointGetAngle(HingeJoint* joint) {
return dJointGetHingeAngle(joint->id);
}
float lovrHingeJointGetLowerLimit(HingeJoint* joint) {
return dJointGetHingeParam(joint->id, dParamLoStop);
void lovrHingeJointGetLimits(HingeJoint* joint, float* min, float* max) {
*min = dJointGetHingeParam(joint->id, dParamLoStop);
*max = dJointGetHingeParam(joint->id, dParamHiStop);
}
void lovrHingeJointSetLowerLimit(HingeJoint* joint, float limit) {
dJointSetHingeParam(joint->id, dParamLoStop, limit);
void lovrHingeJointSetLimits(HingeJoint* joint, float min, float max) {
dJointSetHingeParam(joint->id, dParamLoStop, min);
dJointSetHingeParam(joint->id, dParamHiStop, max);
}
float lovrHingeJointGetUpperLimit(HingeJoint* joint) {
return dJointGetHingeParam(joint->id, dParamHiStop);
float lovrHingeJointGetFriction(HingeJoint* joint) {
return 0.f;
}
void lovrHingeJointSetUpperLimit(HingeJoint* joint, float limit) {
dJointSetHingeParam(joint->id, dParamHiStop, limit);
void lovrHingeJointSetFriction(HingeJoint* joint, float friction) {
//
}
void lovrHingeJointGetMotorTarget(HingeJoint* joint, TargetType* type, float* value) {
//
}
void lovrHingeJointSetMotorTarget(HingeJoint* joint, TargetType type, float value) {
//
}
void lovrHingeJointGetMotorSpring(HingeJoint* joint, float* frequency, float* damping) {
//
}
void lovrHingeJointSetMotorSpring(HingeJoint* joint, float frequency, float damping) {
//
}
void lovrHingeJointGetMaxMotorForce(HingeJoint* joint, float* positive, float* negative) {
//
}
void lovrHingeJointSetMaxMotorForce(HingeJoint* joint, float positive, float negative) {
//
}
float lovrHingeJointGetMotorForce(HingeJoint* joint) {
return 0.f;
}
void lovrHingeJointGetSpring(HingeJoint* joint, float* frequency, float* damping) {
//
}
void lovrHingeJointSetSpring(HingeJoint* joint, float frequency, float damping) {
//
}
SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float axis[3]) {
@ -1256,11 +1275,15 @@ SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float axis[3]) {
joint->id = dJointCreateSlider(a->world->id, 0);
dJointSetData(joint->id, joint);
dJointAttach(joint->id, a->body, b->body);
lovrSliderJointSetAxis(joint, axis);
dJointSetSliderAxis(joint->id, axis[0], axis[1], axis[2]);
lovrRetain(joint);
return joint;
}
void lovrSliderJointGetAnchors(SliderJoint* joint, float anchor1[3], float anchor2[3]) {
//
}
void lovrSliderJointGetAxis(SliderJoint* joint, float axis[3]) {
dReal daxis[4];
dJointGetSliderAxis(joint->id, axis);
@ -1269,26 +1292,60 @@ void lovrSliderJointGetAxis(SliderJoint* joint, float axis[3]) {
axis[2] = daxis[2];
}
void lovrSliderJointSetAxis(SliderJoint* joint, float axis[3]) {
dJointSetSliderAxis(joint->id, axis[0], axis[1], axis[2]);
}
float lovrSliderJointGetPosition(SliderJoint* joint) {
return dJointGetSliderPosition(joint->id);
}
float lovrSliderJointGetLowerLimit(SliderJoint* joint) {
return dJointGetSliderParam(joint->id, dParamLoStop);
void lovrSliderJointGetLimits(SliderJoint* joint, float* min, float* max) {
*min = dJointGetSliderParam(joint->id, dParamLoStop);
*min = dJointGetSliderParam(joint->id, dParamHiStop);
}
void lovrSliderJointSetLowerLimit(SliderJoint* joint, float limit) {
dJointSetSliderParam(joint->id, dParamLoStop, limit);
void lovrSliderJointSetLimits(SliderJoint* joint, float min, float max) {
dJointSetSliderParam(joint->id, dParamLoStop, min);
dJointSetSliderParam(joint->id, dParamHiStop, max);
}
float lovrSliderJointGetUpperLimit(SliderJoint* joint) {
return dJointGetSliderParam(joint->id, dParamHiStop);
float lovrSliderJointGetFriction(SliderJoint* joint) {
return 0.f;
}
void lovrSliderJointSetUpperLimit(SliderJoint* joint, float limit) {
dJointSetSliderParam(joint->id, dParamHiStop, limit);
void lovrSliderJointSetFriction(SliderJoint* joint, float friction) {
//
}
void lovrSliderJointGetMotorTarget(SliderJoint* joint, TargetType* type, float* value) {
//
}
void lovrSliderJointSetMotorTarget(SliderJoint* joint, TargetType type, float value) {
//
}
void lovrSliderJointGetMotorSpring(SliderJoint* joint, float* frequency, float* damping) {
//
}
void lovrSliderJointSetMotorSpring(SliderJoint* joint, float frequency, float damping) {
//
}
void lovrSliderJointGetMaxMotorForce(SliderJoint* joint, float* positive, float* negative) {
//
}
void lovrSliderJointSetMaxMotorForce(SliderJoint* joint, float positive, float negative) {
//
}
float lovrSliderJointGetMotorForce(SliderJoint* joint) {
return 0.f;
}
void lovrSliderJointGetSpring(SliderJoint* joint, float* frequency, float* damping) {
//
}
void lovrSliderJointSetSpring(SliderJoint* joint, float frequency, float damping) {
//
}