aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/PhysXExtensions
diff options
context:
space:
mode:
authorSheikh Dawood Abdul Ajees <[email protected]>2017-11-20 11:35:52 -0600
committerSheikh Dawood Abdul Ajees <[email protected]>2017-11-20 11:35:52 -0600
commit3cc1861221d761b7f0301b9b61de4e1aa18c09f4 (patch)
treea51eb808016e1710a4bbd537000a493250602944 /PhysX_3.4/Source/PhysXExtensions
parentPhysX 3.4.1, APEX 1.4.1 Release @22845541 (diff)
downloadphysx-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')
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtConstraintHelper.h18
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.cpp108
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtD6Joint.h6
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtD6JointSolverPrep.cpp19
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtDistanceJoint.cpp33
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJoint.cpp13
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtFixedJointSolverPrep.cpp2
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtJoint.h12
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJoint.cpp13
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtPrismaticJointSolverPrep.cpp2
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJoint.cpp37
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtRevoluteJointSolverPrep.cpp9
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJoint.cpp11
-rw-r--r--PhysX_3.4/Source/PhysXExtensions/src/ExtSphericalJointSolverPrep.cpp4
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);