diff options
| author | Sheikh Dawood Abdul Ajees <[email protected]> | 2017-11-20 11:35:52 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <[email protected]> | 2017-11-20 11:35:52 -0600 |
| commit | 3cc1861221d761b7f0301b9b61de4e1aa18c09f4 (patch) | |
| tree | a51eb808016e1710a4bbd537000a493250602944 /PhysX_3.4/Source/PhysXExtensions | |
| parent | PhysX 3.4.1, APEX 1.4.1 Release @22845541 (diff) | |
| download | physx-3.4-3cc1861221d761b7f0301b9b61de4e1aa18c09f4.tar.xz physx-3.4-3cc1861221d761b7f0301b9b61de4e1aa18c09f4.zip | |
PhysX 3.4.1, APEX 1.4.1 Release @23131702
Diffstat (limited to 'PhysX_3.4/Source/PhysXExtensions')
14 files changed, 180 insertions, 107 deletions
diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtConstraintHelper.h b/PhysX_3.4/Source/PhysXExtensions/src/ExtConstraintHelper.h index cf4d300c..6f45fca4 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtConstraintHelper.h +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtConstraintHelper.h @@ -254,9 +254,16 @@ namespace Ext if(lin) { PxMat33 axes(qA); - if(lin&1) linear(axes[0], -cB2cAp[0], PxConstraintSolveHint::eEQUALITY, current++); - if(lin&2) linear(axes[1], -cB2cAp[1], PxConstraintSolveHint::eEQUALITY, current++); - if(lin&4) linear(axes[2], -cB2cAp[2], PxConstraintSolveHint::eEQUALITY, current++); + + PxVec3 error(0.f); + + if(lin&1) error -= axes[0]*cB2cAp[0]; + if(lin&2) error -= axes[1]*cB2cAp[1]; + if(lin&4) error -= axes[2]*cB2cAp[2]; + + if(lin&1) linear(axes[0], -cB2cAp[0], PxConstraintSolveHint::eEQUALITY, current++, error); + if(lin&2) linear(axes[1], -cB2cAp[1], PxConstraintSolveHint::eEQUALITY, current++, error); + if(lin&4) linear(axes[2], -cB2cAp[2], PxConstraintSolveHint::eEQUALITY, current++, error); } for(Px1DConstraint* front = mCurrent; front < current; front++) @@ -300,10 +307,11 @@ namespace Ext return c; } - PX_FORCE_INLINE Px1DConstraint* linear(const PxVec3& axis, PxReal posErr, PxConstraintSolveHint::Enum hint, Px1DConstraint* c) + PX_FORCE_INLINE Px1DConstraint* linear(const PxVec3& axis, PxReal posErr, PxConstraintSolveHint::Enum hint, Px1DConstraint* c, + const PxVec3& errorVec) { c->solveHint = PxU16(hint); - c->linear0 = axis; c->angular0 = mRa.cross(axis); + c->linear0 = axis; c->angular0 = (mRa + errorVec).cross(axis); c->linear1 = axis; c->angular1 = mRb.cross(axis); PX_ASSERT(c->linear0.isFinite()); PX_ASSERT(c->linear1.isFinite()); diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.cpp index f60aa21b..152cf8f6 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.cpp @@ -343,11 +343,6 @@ This used to be in angular locked: namespace { -PxReal tanHalfFromSin(PxReal sin) -{ - return Ps::tanHalf(sin, 1 - sin*sin); -} - PxQuat truncate(const PxQuat& qIn, PxReal minCosHalfTol, bool& truncated) { PxQuat q = qIn.w >= 0 ? qIn : -qIn; @@ -440,7 +435,7 @@ void D6JointVisualize(PxConstraintVisualizer &viz, const void* constantBlock, const PxTransform& body0Transform, const PxTransform& body1Transform, - PxU32 /*flags*/) + PxU32 flags) { using namespace joint; @@ -459,57 +454,78 @@ void D6JointVisualize(PxConstraintVisualizer &viz, PxTransform cA2w = body0Transform * data.c2b[0]; PxTransform cB2w = body1Transform * data.c2b[1]; - viz.visualizeJointFrames(cA2w, cB2w); + if(flags & PxConstraintVisualizationFlag::eLOCAL_FRAMES) + viz.visualizeJointFrames(cA2w, cB2w); - if(cA2w.q.dot(cB2w.q)<0) - cB2w.q = -cB2w.q; + if(flags & PxConstraintVisualizationFlag::eLIMITS) + { + if(cA2w.q.dot(cB2w.q)<0) + cB2w.q = -cB2w.q; - PxTransform cB2cA = cA2w.transformInv(cB2w); + PxTransform cB2cA = cA2w.transformInv(cB2w); - PxQuat swing, twist; - Ps::separateSwingTwist(cB2cA.q,swing,twist); + PxQuat swing, twist; + Ps::separateSwingTwist(cB2cA.q,swing,twist); - PxMat33 cA2w_m(cA2w.q), cB2w_m(cB2w.q); - PxVec3 bX = cB2w_m[0], aY = cA2w_m[1], aZ = cA2w_m[2]; + PxMat33 cA2w_m(cA2w.q), cB2w_m(cB2w.q); + PxVec3 bX = cB2w_m[0], aY = cA2w_m[1], aZ = cA2w_m[2]; - if(data.limited&TWIST_FLAG) - { - PxReal tqPhi = Ps::tanHalf(twist.x, twist.w); // always support (-pi, +pi) - viz.visualizeAngularLimit(cA2w, data.twistLimit.lower, data.twistLimit.upper, - PxAbs(tqPhi) > data.tqTwistHigh + data.tqSwingPad); - } + if(data.limited&TWIST_FLAG) + { + PxReal tqPhi = Ps::tanHalf(twist.x, twist.w); // always support (-pi, +pi) - bool swing1Limited = (data.limited & SWING1_FLAG)!=0, swing2Limited = (data.limited & SWING2_FLAG)!=0; + // PT: TODO: refactor with similar code in revolute joint + PxReal quarterAngle = tqPhi; + PxReal lower = data.tqTwistLow; + PxReal upper = data.tqTwistHigh; + PxReal pad = data.tqTwistPad; - if(swing1Limited && swing2Limited) - { - PxVec3 tanQSwing = PxVec3(0, Ps::tanHalf(swing.z,swing.w), -Ps::tanHalf(swing.y,swing.w)); - Cm::ConeLimitHelper coneHelper(data.tqSwingZ, data.tqSwingY, data.tqSwingPad); - viz.visualizeLimitCone(cA2w, data.tqSwingZ, data.tqSwingY, - !coneHelper.contains(tanQSwing)); - } - else if(swing1Limited ^ swing2Limited) - { - PxTransform yToX = PxTransform(PxVec3(0), PxQuat(-PxPi/2, PxVec3(0,0,1.f))); - PxTransform zToX = PxTransform(PxVec3(0), PxQuat(PxPi/2, PxVec3(0,1.f,0))); + if(data.twistLimit.isSoft()) + pad = 0.0f; + + bool active = false; + PX_ASSERT(lower<upper); + if(quarterAngle < lower+pad) + active = true; + if(quarterAngle > upper-pad) + active = true; + + viz.visualizeAngularLimit(cA2w, data.twistLimit.lower, data.twistLimit.upper, active); + } + + bool swing1Limited = (data.limited & SWING1_FLAG)!=0, swing2Limited = (data.limited & SWING2_FLAG)!=0; - if(swing1Limited) + if(swing1Limited && swing2Limited) { - if(data.locked & SWING2_FLAG) - viz.visualizeAngularLimit(cA2w * yToX, -data.swingLimit.yAngle, data.swingLimit.yAngle, - PxAbs(Ps::tanHalf(swing.y, swing.w)) > data.tqSwingY - data.tqSwingPad); - else - viz.visualizeDoubleCone(cA2w * zToX, data.swingLimit.yAngle, - PxAbs(tanHalfFromSin(aZ.dot(bX)))> data.thSwingY - data.thSwingPad); + PxVec3 tanQSwing = PxVec3(0, Ps::tanHalf(swing.z,swing.w), -Ps::tanHalf(swing.y,swing.w)); + const PxReal pad = data.swingLimit.isSoft() ? 0.0f : data.tqSwingPad; + Cm::ConeLimitHelper coneHelper(data.tqSwingZ, data.tqSwingY, pad); + viz.visualizeLimitCone(cA2w, data.tqSwingZ, data.tqSwingY, + !coneHelper.contains(tanQSwing)); } - else + else if(swing1Limited ^ swing2Limited) { - if(data.locked & SWING1_FLAG) - viz.visualizeAngularLimit(cA2w * zToX, -data.swingLimit.zAngle, data.swingLimit.zAngle, - PxAbs(Ps::tanHalf(swing.z, swing.w)) > data.tqSwingZ - data.tqSwingPad); - else - viz.visualizeDoubleCone(cA2w * yToX, data.swingLimit.zAngle, - PxAbs(tanHalfFromSin(aY.dot(bX)))> data.thSwingZ - data.thSwingPad); + PxTransform yToX = PxTransform(PxVec3(0), PxQuat(-PxPi/2, PxVec3(0,0,1.f))); + PxTransform zToX = PxTransform(PxVec3(0), PxQuat(PxPi/2, PxVec3(0,1.f,0))); + + if(swing1Limited) + { + if(data.locked & SWING2_FLAG) + viz.visualizeAngularLimit(cA2w * yToX, -data.swingLimit.yAngle, data.swingLimit.yAngle, + PxAbs(Ps::tanHalf(swing.y, swing.w)) > data.tqSwingY - data.tqSwingPad); + else + viz.visualizeDoubleCone(cA2w * zToX, data.swingLimit.yAngle, + PxAbs(tanHalfFromSin(aZ.dot(bX)))> data.thSwingY - data.thSwingPad); + } + else + { + if(data.locked & SWING1_FLAG) + viz.visualizeAngularLimit(cA2w * zToX, -data.swingLimit.zAngle, data.swingLimit.zAngle, + PxAbs(Ps::tanHalf(swing.z, swing.w)) > data.tqSwingZ - data.tqSwingPad); + else + viz.visualizeDoubleCone(cA2w * yToX, data.swingLimit.zAngle, + PxAbs(tanHalfFromSin(aY.dot(bX)))> data.thSwingZ - data.thSwingPad); + } } } } diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.h b/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.h index 059ba002..9cba22af 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.h +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.h @@ -33,12 +33,18 @@ #include "ExtJoint.h" #include "PxD6Joint.h" +#include "PsMathUtils.h" namespace physx { struct PxD6JointGeneratedValues; namespace Ext { + PX_FORCE_INLINE PxReal tanHalfFromSin(PxReal sin) + { + return Ps::tanHalf(sin, PxSqrt(1.0f - sin*sin)); + } + struct D6JointData : public JointData { //= ATTENTION! ===================================================================================== diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtD6JointSolverPrep.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtD6JointSolverPrep.cpp index 632f53d4..c6d3f7c1 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtD6JointSolverPrep.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtD6JointSolverPrep.cpp @@ -68,7 +68,7 @@ namespace Ext PxTransform cB2w = bB2w.transform(data.c2b[1]); body0WorldOffset = cB2w.p-bA2w.p; - ConstraintHelper g(constraints, cA2w.p-bA2w.p, cB2w.p-bB2w.p); + ConstraintHelper g(constraints, cB2w.p-bA2w.p, cB2w.p-bB2w.p); if(cA2w.q.dot(cB2w.q)<0) // minimum dist quat (equiv to flipping cB2bB.q, which we don't use anywhere) cB2w.q = -cB2w.q; @@ -147,7 +147,8 @@ namespace Ext if(limited & SWING1_FLAG && limited & SWING2_FLAG) { - Cm::ConeLimitHelper coneHelper(data.tqSwingZ, data.tqSwingY, data.tqSwingPad); + const PxReal pad = data.swingLimit.isSoft() ? 0.0f : data.tqSwingPad; + Cm::ConeLimitHelper coneHelper(data.tqSwingZ, data.tqSwingY, pad); PxVec3 axis; PxReal error; @@ -163,26 +164,16 @@ namespace Ext if(limited & SWING1_FLAG) { if(locked & SWING2_FLAG) - { g.quarterAnglePair(Ps::tanHalf(swing.y, swing.w), -data.tqSwingY, data.tqSwingY, tqPad, aY, limit); - } else - { - PxReal dot=-aZ.dot(bX); - g.halfAnglePair(Ps::tanHalf(dot, 1-dot*dot), -data.thSwingY, data.thSwingY, thPad, aZ.cross(bX), limit); - } + g.halfAnglePair(tanHalfFromSin(-aZ.dot(bX)), -data.thSwingY, data.thSwingY, thPad, aZ.cross(bX), limit); } if(limited & SWING2_FLAG) { if(locked & SWING1_FLAG) - { g.quarterAnglePair(Ps::tanHalf(swing.z, swing.w), -data.tqSwingZ, data.tqSwingZ, tqPad, aZ, limit); - } else - { - PxReal dot=aY.dot(bX); - g.halfAnglePair(Ps::tanHalf(dot, 1-dot*dot), -data.thSwingZ, data.thSwingZ, thPad, -aY.cross(bX), limit); - } + g.halfAnglePair(tanHalfFromSin(aY.dot(bX)), -data.thSwingZ, data.thSwingZ, thPad, -aY.cross(bX), limit); } } diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtDistanceJoint.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtDistanceJoint.cpp index c1dde681..9168d893 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtDistanceJoint.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtDistanceJoint.cpp @@ -148,12 +148,35 @@ void DistanceJoint::setDistanceJointFlag(PxDistanceJointFlag::Enum flag, bool va namespace { -void DistanceJointVisualize(PxConstraintVisualizer& /*viz*/, - const void* /*constantBlock*/, - const PxTransform& /*body0Transform*/, - const PxTransform& /*body1Transform*/, - PxU32 /*flags*/) +static void DistanceJointVisualize(PxConstraintVisualizer& viz, const void* constantBlock, const PxTransform& body0Transform, const PxTransform& body1Transform, PxU32 flags) { + const DistanceJointData& data = *reinterpret_cast<const DistanceJointData*>(constantBlock); + + const PxTransform cA2w = body0Transform.transform(data.c2b[0]); + const PxTransform cB2w = body1Transform.transform(data.c2b[1]); + + if(flags & PxConstraintVisualizationFlag::eLOCAL_FRAMES) + viz.visualizeJointFrames(cA2w, cB2w); + + // PT: we consider the following is part of the joint's "limits" since that's the only available flag we have + if(flags & PxConstraintVisualizationFlag::eLIMITS) + { + const bool enforceMax = (data.jointFlags & PxDistanceJointFlag::eMAX_DISTANCE_ENABLED); + const bool enforceMin = (data.jointFlags & PxDistanceJointFlag::eMIN_DISTANCE_ENABLED); + if(!enforceMin && !enforceMax) + return; + + PxVec3 dir = cB2w.p - cA2w.p; + const float currentDist = dir.normalize(); + + PxU32 color = 0x00ff00; + if(enforceMax && currentDist>data.maxDistance) + color = 0xff0000; + if(enforceMin && currentDist<data.minDistance) + color = 0x0000ff; + + viz.visualizeLine(cA2w.p, cB2w.p, color); + } } void DistanceJointProject(const void* /*constantBlock*/, diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJoint.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJoint.cpp index bee99ed2..980721c1 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJoint.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJoint.cpp @@ -93,14 +93,17 @@ void FixedJointVisualize(PxConstraintVisualizer& viz, const void* constantBlock, const PxTransform& body0Transform, const PxTransform& body1Transform, - PxU32 /*flags*/) + PxU32 flags) { - const FixedJointData& data = *reinterpret_cast<const FixedJointData*>(constantBlock); + if(flags & PxConstraintVisualizationFlag::eLOCAL_FRAMES) + { + const FixedJointData& data = *reinterpret_cast<const FixedJointData*>(constantBlock); - const PxTransform& t0 = body0Transform * data.c2b[0]; - const PxTransform& t1 = body1Transform * data.c2b[1]; + const PxTransform& t0 = body0Transform * data.c2b[0]; + const PxTransform& t1 = body1Transform * data.c2b[1]; - viz.visualizeJointFrames(t0, t1); + viz.visualizeJointFrames(t0, t1); + } } diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJointSolverPrep.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJointSolverPrep.cpp index d677bee1..162440a4 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJointSolverPrep.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJointSolverPrep.cpp @@ -55,7 +55,7 @@ namespace Ext PxVec3 bOriginInA = cA2w.transformInv(cB2w.p); body0WorldOffset = cB2w.p-bA2w.p; - joint::ConstraintHelper ch(constraints,cA2w.p-bA2w.p, cB2w.p-bB2w.p); + joint::ConstraintHelper ch(constraints,cB2w.p-bA2w.p, cB2w.p-bB2w.p); ch.prepareLockedAxes(cA2w.q, cB2w.q, bOriginInA, 7, 7); return ch.getCount(); diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtJoint.h b/PhysX_3.4/Source/PhysXExtensions/src/ExtJoint.h index 9a8b1d9d..d6428f0f 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtJoint.h +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtJoint.h @@ -202,17 +202,13 @@ namespace Ext mPxConstraint->markDirty(); } - PxTransform getBodyPose(const PxRigidActor* actor) const + static PxTransform getGlobalPose(const PxRigidActor* actor) { if(!actor) return PxTransform(PxIdentity); - else if(actor->is<PxRigidStatic>()) - return actor->getGlobalPose(); - else - return actor->getGlobalPose() * static_cast<const PxRigidBody*>(actor)->getCMassLocalPose(); + return actor->getGlobalPose(); } - void getActorVelocity(const PxRigidActor* actor, PxVec3& linear, PxVec3& angular) const { if(!actor || actor->is<PxRigidStatic>()) @@ -230,8 +226,8 @@ namespace Ext { PxRigidActor* actor0, * actor1; mPxConstraint->getActors(actor0, actor1); - PxTransform t0 = getBodyPose(actor0) * mLocalPose[0], - t1 = getBodyPose(actor1) * mLocalPose[1]; + const PxTransform t0 = getGlobalPose(actor0) * mLocalPose[0]; + const PxTransform t1 = getGlobalPose(actor1) * mLocalPose[1]; return t0.transformInv(t1); } diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJoint.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJoint.cpp index 882803dd..7ce3f789 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJoint.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJoint.cpp @@ -123,20 +123,21 @@ void PrismaticJointVisualize(PxConstraintVisualizer& viz, const void* constantBlock, const PxTransform& body0Transform, const PxTransform& body1Transform, - PxU32 /*flags*/) + PxU32 flags) { const PrismaticJointData& data = *reinterpret_cast<const PrismaticJointData*>(constantBlock); const PxTransform& t0 = body0Transform * data.c2b[0]; const PxTransform& t1 = body1Transform * data.c2b[1]; - viz.visualizeJointFrames(t0, t1); + if(flags & PxConstraintVisualizationFlag::eLOCAL_FRAMES) + viz.visualizeJointFrames(t0, t1); - PxVec3 axis = t0.rotate(PxVec3(1.f,0,0)); - PxReal ordinate = axis.dot(t0.transformInv(t1.p)-t0.p); - - if(data.jointFlags & PxPrismaticJointFlag::eLIMIT_ENABLED) + if((flags & PxConstraintVisualizationFlag::eLIMITS) && (data.jointFlags & PxPrismaticJointFlag::eLIMIT_ENABLED)) { + const PxVec3 bOriginInA = t0.transformInv(t1.p); + const PxReal ordinate = bOriginInA.x; + viz.visualizeLinearLimit(t0, t1, data.limit.lower, ordinate < data.limit.lower + data.limit.contactDistance); viz.visualizeLinearLimit(t0, t1, data.limit.upper, ordinate > data.limit.upper - data.limit.contactDistance); } diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJointSolverPrep.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJointSolverPrep.cpp index a5d7d633..d65086e6 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJointSolverPrep.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJointSolverPrep.cpp @@ -59,7 +59,7 @@ namespace Ext PxVec3 bOriginInA = cA2w.transformInv(cB2w.p); body0WorldOffset = cB2w.p-bA2w.p; - joint::ConstraintHelper ch(constraints,cA2w.p-bA2w.p, cB2w.p-bB2w.p); + joint::ConstraintHelper ch(constraints,cB2w.p-bA2w.p, cB2w.p-bB2w.p); ch.prepareLockedAxes(cA2w.q, cB2w.q, bOriginInA, limitIsLocked ? 7ul : 6ul, 7ul); if(limitEnabled && !limitIsLocked) diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJoint.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJoint.cpp index 40300b90..6f3e82c4 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJoint.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJoint.cpp @@ -82,7 +82,7 @@ PxReal RevoluteJoint::getAngle() const PxReal RevoluteJoint::getVelocity() const { - return getRelativeAngularVelocity().x; + return getRelativeAngularVelocity().magnitude(); } @@ -94,7 +94,7 @@ PxJointAngularLimitPair RevoluteJoint::getLimit() const void RevoluteJoint::setLimit(const PxJointAngularLimitPair& limit) { - PX_CHECK_AND_RETURN(limit.isValid(), "PxRevoluteJoint::setTwistLimit: limit invalid"); + PX_CHECK_AND_RETURN(limit.isValid(), "PxRevoluteJoint::setLimit: limit invalid"); PX_CHECK_AND_RETURN(limit.lower>-PxPi && limit.upper<PxPi , "PxRevoluteJoint::twist limit must be strictly -*PI and PI"); PX_CHECK_AND_RETURN(limit.upper - limit.lower < PxTwoPi, "PxRevoluteJoint::twist limit range must be strictly less than 2*PI"); data().limit = limit; @@ -226,17 +226,42 @@ void RevoluteJointVisualize(PxConstraintVisualizer& viz, const void* constantBlock, const PxTransform& body0Transform, const PxTransform& body1Transform, - PxU32 /*flags*/) + PxU32 flags) { const RevoluteJointData& data = *reinterpret_cast<const RevoluteJointData*>(constantBlock); const PxTransform& t0 = body0Transform * data.c2b[0]; const PxTransform& t1 = body1Transform * data.c2b[1]; - viz.visualizeJointFrames(t0, t1); + if(flags & PxConstraintVisualizationFlag::eLOCAL_FRAMES) + viz.visualizeJointFrames(t0, t1); - if(data.jointFlags & PxRevoluteJointFlag::eLIMIT_ENABLED) - viz.visualizeAngularLimit(t0, data.limit.lower, data.limit.upper, false); + if((flags & PxConstraintVisualizationFlag::eLIMITS) && (data.jointFlags & PxRevoluteJointFlag::eLIMIT_ENABLED)) + { + // PT: TODO: refactor this with the solver prep code + PxQuat cB2cAq = t0.q.getConjugate() * t1.q; + PxQuat twist(cB2cAq.x,0,0,cB2cAq.w); + + PxReal magnitude = twist.normalize(); + PxReal tqPhi = physx::intrinsics::fsel(magnitude - 1e-6f, twist.x / (1.0f + twist.w), 0.f); + + PxReal quarterAngle = tqPhi; + PxReal lower = data.tqLow; + PxReal upper = data.tqHigh; + PxReal pad = data.tqPad; + + if(data.limit.isSoft()) + pad = 0; + + bool active = false; + PX_ASSERT(lower<upper); + if(quarterAngle < lower+pad) + active = true; + if(quarterAngle > upper-pad) + active = true; + + viz.visualizeAngularLimit(t0, data.limit.lower, data.limit.upper, active); + } } } diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJointSolverPrep.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJointSolverPrep.cpp index faca3069..3d175b64 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJointSolverPrep.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJointSolverPrep.cpp @@ -61,7 +61,7 @@ namespace Ext cB2w.q = -cB2w.q; body0WorldOffset = cB2w.p-bA2w.p; - Ext::joint::ConstraintHelper ch(constraints, cA2w.p - bA2w.p, cB2w.p - bB2w.p); + Ext::joint::ConstraintHelper ch(constraints, cB2w.p - bA2w.p, cB2w.p - bB2w.p); ch.prepareLockedAxes(cA2w.q, cB2w.q, cA2w.transformInv(cB2w.p), 7, PxU32(limitIsLocked ? 7 : 6)); @@ -98,10 +98,13 @@ namespace Ext if(limitEnabled) { - PxQuat cB2cAq = cA2w.q.getConjugate() * cB2w.q; - PxQuat twist(cB2cAq.x,0,0,cB2cAq.w); + // PT: rotation part of "const PxTransform cB2cA = cA2w.transformInv(cB2w);" + const PxQuat cB2cAq = cA2w.q.getConjugate() * cB2w.q; + // PT: twist part of "Ps::separateSwingTwist(cB2cAq,swing,twist)" (more or less) + PxQuat twist(cB2cAq.x,0,0,cB2cAq.w); PxReal magnitude = twist.normalize(); + PxReal tqPhi = physx::intrinsics::fsel(magnitude - 1e-6f, twist.x / (1.0f + twist.w), 0.f); ch.quarterAnglePair(tqPhi, data.tqLow, data.tqHigh, data.tqPad, axis, limit); diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJoint.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJoint.cpp index 362b3f9d..d60f94de 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJoint.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJoint.cpp @@ -128,7 +128,7 @@ void SphericalJointVisualize(PxConstraintVisualizer& viz, const void* constantBlock, const PxTransform& body0Transform, const PxTransform& body1Transform, - PxU32 /*flags*/) + PxU32 flags) { using namespace joint; const SphericalJointData& data = *reinterpret_cast<const SphericalJointData*>(constantBlock); @@ -136,10 +136,10 @@ void SphericalJointVisualize(PxConstraintVisualizer& viz, PxTransform cA2w = body0Transform * data.c2b[0]; PxTransform cB2w = body1Transform * data.c2b[1]; - viz.visualizeJointFrames(cA2w, cB2w); + if(flags & PxConstraintVisualizationFlag::eLOCAL_FRAMES) + viz.visualizeJointFrames(cA2w, cB2w); - - if(data.jointFlags & PxSphericalJointFlag::eLIMIT_ENABLED) + if((flags & PxConstraintVisualizationFlag::eLIMITS) && (data.jointFlags & PxSphericalJointFlag::eLIMIT_ENABLED)) { if(cA2w.q.dot(cB2w.q)<0) cB2w.q = -cB2w.q; @@ -149,7 +149,8 @@ void SphericalJointVisualize(PxConstraintVisualizer& viz, Ps::separateSwingTwist(cB2cA.q,swing,twist); PxVec3 tanQSwing = PxVec3(0, Ps::tanHalf(swing.z,swing.w), -Ps::tanHalf(swing.y,swing.w)); - Cm::ConeLimitHelper coneHelper(data.tanQZLimit, data.tanQYLimit, data.tanQPad); + const PxReal pad = data.limit.isSoft() ? 0.0f : data.tanQPad; + Cm::ConeLimitHelper coneHelper(data.tanQZLimit, data.tanQYLimit, pad); viz.visualizeLimitCone(cA2w, data.tanQZLimit, data.tanQYLimit, !coneHelper.contains(tanQSwing)); } diff --git a/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJointSolverPrep.cpp b/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJointSolverPrep.cpp index 6a82189d..148ff7d7 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJointSolverPrep.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJointSolverPrep.cpp @@ -66,13 +66,13 @@ namespace Ext Ps::separateSwingTwist(cA2w.q.getConjugate() * cB2w.q, swing, twist); PX_ASSERT(PxAbs(swing.x)<1e-6f); - Cm::ConeLimitHelper coneHelper(data.tanQZLimit, data.tanQYLimit, data.tanQPad); + const PxReal pad = data.limit.isSoft() ? 0.0f : data.tanQPad; + Cm::ConeLimitHelper coneHelper(data.tanQZLimit, data.tanQYLimit, pad); PxVec3 axis; PxReal error; if(coneHelper.getLimit(swing, axis, error)) ch.angularLimit(cA2w.rotate(axis),error,data.limit); - } ch.prepareLockedAxes(cA2w.q, cB2w.q, cA2w.transformInv(cB2w.p), 7, 0); |