From 1b5302972f0f6a8e3e63143b04e5aec8720a3093 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 3 Jun 2024 09:46:02 -0700 Subject: [PATCH] Flip the order of the optional Collider in Joint constructors; Making the second collider the parent was messing up anchor points. --- src/api/l_physics.c | 24 +++++----- src/modules/physics/physics.c | 88 +++++++++++++++++------------------ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/api/l_physics.c b/src/api/l_physics.c index f3c46fea5..41eb9eaf0 100644 --- a/src/api/l_physics.c +++ b/src/api/l_physics.c @@ -212,8 +212,8 @@ static int l_lovrPhysicsNewTerrainShape(lua_State* L) { } static int l_lovrPhysicsNewWeldJoint(lua_State* L) { - Collider* a = luax_checktype(L, 1, Collider); - Collider* b = luax_totype(L, 2, Collider); + Collider* a = luax_totype(L, 1, Collider); + Collider* b = luax_checktype(L, 2, Collider); float anchor[3]; luax_readvec3(L, 3, anchor, NULL); WeldJoint* joint = lovrWeldJointCreate(a, b, anchor); @@ -223,8 +223,8 @@ static int l_lovrPhysicsNewWeldJoint(lua_State* L) { } static int l_lovrPhysicsNewBallJoint(lua_State* L) { - Collider* a = luax_checktype(L, 1, Collider); - Collider* b = luax_totype(L, 2, Collider); + Collider* a = luax_totype(L, 1, Collider); + Collider* b = luax_checktype(L, 2, Collider); float anchor[3]; luax_readvec3(L, 3, anchor, NULL); BallJoint* joint = lovrBallJointCreate(a, b, anchor); @@ -234,8 +234,8 @@ static int l_lovrPhysicsNewBallJoint(lua_State* L) { } static int l_lovrPhysicsNewConeJoint(lua_State* L) { - Collider* a = luax_checktype(L, 1, Collider); - Collider* b = luax_totype(L, 2, Collider); + Collider* a = luax_totype(L, 1, Collider); + Collider* b = luax_checktype(L, 2, Collider); float anchor[3], axis[3]; int index = luax_readvec3(L, 3, anchor, NULL); luax_readvec3(L, index, axis, NULL); @@ -246,8 +246,8 @@ static int l_lovrPhysicsNewConeJoint(lua_State* L) { } static int l_lovrPhysicsNewDistanceJoint(lua_State* L) { - Collider* a = luax_checktype(L, 1, Collider); - Collider* b = luax_totype(L, 2, Collider); + Collider* a = luax_totype(L, 1, Collider); + Collider* b = luax_checktype(L, 2, Collider); float anchor1[3], anchor2[3]; int index = luax_readvec3(L, 3, anchor1, NULL); luax_readvec3(L, index, anchor2, NULL); @@ -258,8 +258,8 @@ static int l_lovrPhysicsNewDistanceJoint(lua_State* L) { } static int l_lovrPhysicsNewHingeJoint(lua_State* L) { - Collider* a = luax_checktype(L, 1, Collider); - Collider* b = luax_totype(L, 2, Collider); + Collider* a = luax_totype(L, 1, Collider); + Collider* b = luax_checktype(L, 2, Collider); float anchor[3], axis[3]; int index = luax_readvec3(L, 3, anchor, NULL); luax_readvec3(L, index, axis, NULL); @@ -270,8 +270,8 @@ static int l_lovrPhysicsNewHingeJoint(lua_State* L) { } static int l_lovrPhysicsNewSliderJoint(lua_State* L) { - Collider* a = luax_checktype(L, 1, Collider); - Collider* b = luax_totype(L, 2, Collider); + Collider* a = luax_totype(L, 1, Collider); + Collider* b = luax_checktype(L, 2, Collider); float axis[3]; luax_readvec3(L, 3, axis, NULL); SliderJoint* joint = lovrSliderJointCreate(a, b, axis); diff --git a/src/modules/physics/physics.c b/src/modules/physics/physics.c index 15a87c767..60a87809b 100644 --- a/src/modules/physics/physics.c +++ b/src/modules/physics/physics.c @@ -2025,24 +2025,24 @@ static JointNode* lovrJointGetNode(Joint* joint, Collider* collider) { } void lovrJointInit(Joint* joint, Collider* a, Collider* b) { - World* world = a->world; + World* world = b->world; - if (a->joints) { - joint->a.next = a->joints; - lovrJointGetNode(a->joints, a)->prev = joint; - } - - a->joints = joint; - - if (b) { - if (b->joints) { - joint->b.next = b->joints; - lovrJointGetNode(b->joints, b)->prev = joint; + if (a) { + if (a->joints) { + joint->a.next = a->joints; + lovrJointGetNode(a->joints, a)->prev = joint; } - b->joints = joint; + a->joints = joint; + } + + if (b->joints) { + joint->b.next = b->joints; + lovrJointGetNode(b->joints, b)->prev = joint; } + b->joints = joint; + if (world->joints) { joint->world.next = world->joints; world->joints->world.prev = joint; @@ -2066,7 +2066,7 @@ void lovrJointDestruct(Joint* joint) { JPH_TwoBodyConstraint* constraint = (JPH_TwoBodyConstraint*) joint->constraint; Collider* a = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody1(constraint)); Collider* b = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody2(constraint)); - World* world = a->world; + World* world = b->world; JointNode* node; node = &joint->a; @@ -2157,7 +2157,7 @@ float lovrJointGetForce(Joint* joint) { JPH_TwoBodyConstraint* constraint = (JPH_TwoBodyConstraint*) joint->constraint; Collider* a = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody1(constraint)); Collider* b = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody2(constraint)); - World* world = a->world; + World* world = b->world; JPH_Vec3 v; float force[3], x, y; @@ -2184,7 +2184,7 @@ float lovrJointGetTorque(Joint* joint) { JPH_TwoBodyConstraint* constraint = (JPH_TwoBodyConstraint*) joint->constraint; Collider* a = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody1(constraint)); Collider* b = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody2(constraint)); - World* world = a->world; + World* world = b->world; JPH_Vec3 v; float torque[3], x, y; @@ -2209,8 +2209,8 @@ float lovrJointGetTorque(Joint* joint) { // WeldJoint WeldJoint* lovrWeldJointCreate(Collider* a, Collider* b, float anchor[3]) { - lovrCheck(!b || a->world == b->world, "Joint bodies must exist in same World"); - JPH_Body* parent = b ? b->body : JPH_Body_GetFixedToWorldBody(); + lovrCheck(!a || a->world == b->world, "Joint bodies must exist in same World"); + JPH_Body* parent = a ? a->body : JPH_Body_GetFixedToWorldBody(); WeldJoint* joint = lovrCalloc(sizeof(WeldJoint)); joint->ref = 1; @@ -2219,9 +2219,9 @@ WeldJoint* lovrWeldJointCreate(Collider* a, Collider* b, float anchor[3]) { 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, parent, a->body); + joint->constraint = (JPH_Constraint*) JPH_FixedConstraintSettings_CreateConstraint(settings, parent, b->body); JPH_ConstraintSettings_Destroy((JPH_ConstraintSettings*) settings); - JPH_PhysicsSystem_AddConstraint(a->world->system, joint->constraint); + JPH_PhysicsSystem_AddConstraint(b->world->system, joint->constraint); lovrJointInit(joint, a, b); lovrRetain(joint); return joint; @@ -2230,8 +2230,8 @@ WeldJoint* lovrWeldJointCreate(Collider* a, Collider* b, float anchor[3]) { // BallJoint BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float anchor[3]) { - lovrCheck(!b || a->world == b->world, "Joint bodies must exist in same World"); - JPH_Body* parent = b ? b->body : JPH_Body_GetFixedToWorldBody(); + lovrCheck(!a || a->world == b->world, "Joint bodies must exist in same World"); + JPH_Body* parent = a ? a->body : JPH_Body_GetFixedToWorldBody(); BallJoint* joint = lovrCalloc(sizeof(BallJoint)); joint->ref = 1; @@ -2240,9 +2240,9 @@ BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float anchor[3]) { JPH_PointConstraintSettings* settings = JPH_PointConstraintSettings_Create(); JPH_PointConstraintSettings_SetPoint1(settings, vec3_toJolt(anchor)); JPH_PointConstraintSettings_SetPoint2(settings, vec3_toJolt(anchor)); - joint->constraint = (JPH_Constraint*) JPH_PointConstraintSettings_CreateConstraint(settings, parent, a->body); + joint->constraint = (JPH_Constraint*) JPH_PointConstraintSettings_CreateConstraint(settings, parent, b->body); JPH_ConstraintSettings_Destroy((JPH_ConstraintSettings*) settings); - JPH_PhysicsSystem_AddConstraint(a->world->system, joint->constraint); + JPH_PhysicsSystem_AddConstraint(b->world->system, joint->constraint); lovrJointInit(joint, a, b); lovrRetain(joint); return joint; @@ -2251,8 +2251,8 @@ BallJoint* lovrBallJointCreate(Collider* a, Collider* b, float anchor[3]) { // ConeJoint ConeJoint* lovrConeJointCreate(Collider* a, Collider* b, float anchor[3], float axis[3]) { - lovrCheck(!b || a->world == b->world, "Joint bodies must exist in same World"); - JPH_Body* parent = b ? b->body : JPH_Body_GetFixedToWorldBody(); + lovrCheck(!a || a->world == b->world, "Joint bodies must exist in same World"); + JPH_Body* parent = a ? a->body : JPH_Body_GetFixedToWorldBody(); ConeJoint* joint = lovrCalloc(sizeof(ConeJoint)); joint->ref = 1; @@ -2263,8 +2263,8 @@ ConeJoint* lovrConeJointCreate(Collider* a, Collider* b, float anchor[3], float JPH_ConeConstraintSettings_SetPoint2(settings, vec3_toJolt(anchor)); JPH_ConeConstraintSettings_SetTwistAxis1(settings, vec3_toJolt(axis)); JPH_ConeConstraintSettings_SetTwistAxis2(settings, vec3_toJolt(axis)); - joint->constraint = (JPH_Constraint*) JPH_ConeConstraintSettings_CreateConstraint(settings, parent, a->body); - JPH_PhysicsSystem_AddConstraint(a->world->system, joint->constraint); + joint->constraint = (JPH_Constraint*) JPH_ConeConstraintSettings_CreateConstraint(settings, parent, b->body); + JPH_PhysicsSystem_AddConstraint(b->world->system, joint->constraint); lovrJointInit(joint, a, b); lovrRetain(joint); return joint; @@ -2301,8 +2301,8 @@ void lovrConeJointSetLimit(ConeJoint* joint, float angle) { // DistanceJoint DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float anchor1[3], float anchor2[3]) { - lovrCheck(!b || a->world == b->world, "Joint bodies must exist in same World"); - JPH_Body* parent = b ? b->body : JPH_Body_GetFixedToWorldBody(); + lovrCheck(!a || a->world == b->world, "Joint bodies must exist in same World"); + JPH_Body* parent = a ? a->body : JPH_Body_GetFixedToWorldBody(); DistanceJoint* joint = lovrCalloc(sizeof(DistanceJoint)); joint->ref = 1; @@ -2311,9 +2311,9 @@ DistanceJoint* lovrDistanceJointCreate(Collider* a, Collider* b, float anchor1[3 JPH_DistanceConstraintSettings* settings = JPH_DistanceConstraintSettings_Create(); JPH_DistanceConstraintSettings_SetPoint1(settings, vec3_toJolt(anchor1)); JPH_DistanceConstraintSettings_SetPoint2(settings, vec3_toJolt(anchor2)); - joint->constraint = (JPH_Constraint*) JPH_DistanceConstraintSettings_CreateConstraint(settings, parent, a->body); + joint->constraint = (JPH_Constraint*) JPH_DistanceConstraintSettings_CreateConstraint(settings, parent, b->body); JPH_ConstraintSettings_Destroy((JPH_ConstraintSettings*) settings); - JPH_PhysicsSystem_AddConstraint(a->world->system, joint->constraint); + JPH_PhysicsSystem_AddConstraint(b->world->system, joint->constraint); lovrJointInit(joint, a, b); lovrRetain(joint); return joint; @@ -2347,8 +2347,8 @@ void lovrDistanceJointSetSpring(DistanceJoint* joint, float frequency, float dam // HingeJoint HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float anchor[3], float axis[3]) { - lovrCheck(!b || a->world == b->world, "Joint bodies must exist in same World"); - JPH_Body* parent = b ? b->body : JPH_Body_GetFixedToWorldBody(); + lovrCheck(!a || a->world == b->world, "Joint bodies must exist in same World"); + JPH_Body* parent = a ? a->body : JPH_Body_GetFixedToWorldBody(); HingeJoint* joint = lovrCalloc(sizeof(HingeJoint)); joint->ref = 1; @@ -2359,9 +2359,9 @@ HingeJoint* lovrHingeJointCreate(Collider* a, Collider* b, float anchor[3], floa JPH_HingeConstraintSettings_SetPoint2(settings, vec3_toJolt(anchor)); JPH_HingeConstraintSettings_SetHingeAxis1(settings, vec3_toJolt(axis)); JPH_HingeConstraintSettings_SetHingeAxis2(settings, vec3_toJolt(axis)); - joint->constraint = (JPH_Constraint*) JPH_HingeConstraintSettings_CreateConstraint(settings, parent, a->body); + joint->constraint = (JPH_Constraint*) JPH_HingeConstraintSettings_CreateConstraint(settings, parent, b->body); JPH_ConstraintSettings_Destroy((JPH_ConstraintSettings*) settings); - JPH_PhysicsSystem_AddConstraint(a->world->system, joint->constraint); + JPH_PhysicsSystem_AddConstraint(b->world->system, joint->constraint); lovrJointInit(joint, a, b); lovrRetain(joint); return joint; @@ -2465,8 +2465,8 @@ void lovrHingeJointSetMaxMotorTorque(HingeJoint* joint, float positive, float ne float lovrHingeJointGetMotorTorque(HingeJoint* joint) { JPH_TwoBodyConstraint* constraint = (JPH_TwoBodyConstraint*) joint->constraint; - Collider* a = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody1(constraint)); - return JPH_HingeConstraint_GetTotalLambdaMotor((JPH_HingeConstraint*) joint->constraint) * a->world->inverseDelta; + Collider* b = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody1(constraint)); + return JPH_HingeConstraint_GetTotalLambdaMotor((JPH_HingeConstraint*) joint->constraint) * b->world->inverseDelta; } void lovrHingeJointGetSpring(HingeJoint* joint, float* frequency, float* damping) { @@ -2486,8 +2486,8 @@ void lovrHingeJointSetSpring(HingeJoint* joint, float frequency, float damping) // SliderJoint SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float axis[3]) { - lovrCheck(!b || a->world == b->world, "Joint bodies must exist in same World"); - JPH_Body* parent = b ? b->body : JPH_Body_GetFixedToWorldBody(); + lovrCheck(!a || a->world == b->world, "Joint bodies must exist in same World"); + JPH_Body* parent = a ? a->body : JPH_Body_GetFixedToWorldBody(); SliderJoint* joint = lovrCalloc(sizeof(SliderJoint)); joint->ref = 1; @@ -2495,9 +2495,9 @@ SliderJoint* lovrSliderJointCreate(Collider* a, Collider* b, float axis[3]) { JPH_SliderConstraintSettings* settings = JPH_SliderConstraintSettings_Create(); JPH_SliderConstraintSettings_SetSliderAxis(settings, vec3_toJolt(axis)); - joint->constraint = (JPH_Constraint*) JPH_SliderConstraintSettings_CreateConstraint(settings, parent, a->body); + joint->constraint = (JPH_Constraint*) JPH_SliderConstraintSettings_CreateConstraint(settings, parent, b->body); JPH_ConstraintSettings_Destroy((JPH_ConstraintSettings*) settings); - JPH_PhysicsSystem_AddConstraint(a->world->system, joint->constraint); + JPH_PhysicsSystem_AddConstraint(b->world->system, joint->constraint); lovrJointInit(joint, a, b); lovrRetain(joint); return joint; @@ -2603,8 +2603,8 @@ void lovrSliderJointSetMaxMotorForce(SliderJoint* joint, float positive, float n float lovrSliderJointGetMotorForce(SliderJoint* joint) { JPH_TwoBodyConstraint* constraint = (JPH_TwoBodyConstraint*) joint->constraint; - Collider* a = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody1(constraint)); - return JPH_SliderConstraint_GetTotalLambdaMotor((JPH_SliderConstraint*) joint->constraint) * a->world->inverseDelta; + Collider* b = (Collider*) (uintptr_t) JPH_Body_GetUserData(JPH_TwoBodyConstraint_GetBody2(constraint)); + return JPH_SliderConstraint_GetTotalLambdaMotor((JPH_SliderConstraint*) joint->constraint) * b->world->inverseDelta; } void lovrSliderJointGetSpring(SliderJoint* joint, float* frequency, float* damping) {