aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/LowLevelDynamics/src
diff options
context:
space:
mode:
authorSheikh Dawood Abdul Ajees <[email protected]>2017-09-15 15:41:57 -0500
committerSheikh Dawood Abdul Ajees <[email protected]>2017-09-15 15:41:57 -0500
commitd1c812f1162e5fdb13c215792725b2591d7428f5 (patch)
tree407056c45c7e9320c48fca6a3697d81a061c4ea0 /PhysX_3.4/Source/LowLevelDynamics/src
parentPhysX 3.4, APEX 1.4 patch release @22121272 (diff)
downloadphysx-3.4-d1c812f1162e5fdb13c215792725b2591d7428f5.tar.xz
physx-3.4-d1c812f1162e5fdb13c215792725b2591d7428f5.zip
PhysX 3.4.1, APEX 1.4.1 Release @22845541v3.4.1
Diffstat (limited to 'PhysX_3.4/Source/LowLevelDynamics/src')
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.cpp37
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.h12
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4.cpp134
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4PF.cpp61
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepPF.cpp27
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepShared.h12
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp62
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.h6
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraints.cpp3
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsBlock.cpp48
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsShared.h4
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact.h4
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact4.h5
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.cpp26
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.h56
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverControlPF.cpp46
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DySolverPFConstraints.cpp3
17 files changed, 287 insertions, 259 deletions
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.cpp
index 9591fdde..8955cf25 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.cpp
@@ -85,12 +85,15 @@ static void setupFinalizeSolverConstraints(Sc::ShapeInteraction* shapeInteractio
PxReal invMassScale1, PxReal invInertiaScale1,
bool hasForceThreshold, bool staticOrKinematicBody,
const PxReal restDist, PxU8* frictionDataPtr,
- const PxReal maxCCDSeparation)
+ const PxReal maxCCDSeparation,
+ const PxReal solverOffsetSlopF32)
{
// NOTE II: the friction patches are sparse (some of them have no contact patches, and
// therefore did not get written back to the cache) but the patch addresses are dense,
// corresponding to valid patches
+ const Vec3V solverOffsetSlop = V3Load(solverOffsetSlopF32);
+
const FloatV ccdMaxSeparation = FLoad(maxCCDSeparation);
PxU8 flags = PxU8(hasForceThreshold ? SolverContactHeader::eHAS_FORCE_THRESHOLDS : 0);
@@ -101,6 +104,7 @@ static void setupFinalizeSolverConstraints(Sc::ShapeInteraction* shapeInteractio
: DY_SC_TYPE_RB_CONTACT);
const FloatV zero=FZero();
+ const Vec3V v3Zero = V3Zero();
const FloatV d0 = FLoad(invMassScale0);
const FloatV d1 = FLoad(invMassScale1);
@@ -224,7 +228,7 @@ static void setupFinalizeSolverConstraints(Sc::ShapeInteraction* shapeInteractio
normal, norVel, norCross, angVel0, angVel1,
invDt, invDtp8, restDistance, maxPenBias, restitution,
bounceThreshold, contact, *solverContact,
- ccdMaxSeparation);
+ ccdMaxSeparation, solverOffsetSlop);
}
ptr = p;
@@ -307,20 +311,26 @@ static void setupFinalizeSolverConstraints(Sc::ShapeInteraction* shapeInteractio
Vec3V body0Anchor = V3LoadU(frictionPatch.body0Anchors[j]);
Vec3V body1Anchor = V3LoadU(frictionPatch.body1Anchors[j]);
- Vec3V ra = QuatRotate(bodyFrame0q, body0Anchor);
- Vec3V rb = QuatRotate(bodyFrame1q, body1Anchor);
- Vec3V error =V3Sub(V3Add(ra, bodyFrame0p), V3Add(rb, bodyFrame1p));
+ const Vec3V ra = QuatRotate(bodyFrame0q, body0Anchor);
+ const Vec3V rb = QuatRotate(bodyFrame1q, body1Anchor);
+ //ra = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(ra)), v3Zero, ra);
+ //rb = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(rb)), v3Zero, rb);
PxU32 index = c.contactID[i][j];
+ const Vec3V error = V3Sub(V3Add(ra, bodyFrame0p), V3Add(rb, bodyFrame1p));
+ //error = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(error)), v3Zero, error);
index = index == 0xFFFF ? c.contactPatches[c.correlationListHeads[i]].start : index;
const Vec3V tvel = V3LoadA(buffer[index].targetVel);
{
- const Vec3V raXn = V3Cross(ra, t0Cross);
- const Vec3V rbXn = V3Cross(rb, t0Cross);
+ Vec3V raXn = V3Cross(ra, t0Cross);
+ Vec3V rbXn = V3Cross(rb, t0Cross);
+
+ raXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(raXn)), v3Zero, raXn);
+ rbXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(rbXn)), v3Zero, rbXn);
const Vec3V raXnSqrtInertia = M33MulV3(invSqrtInertia0, raXn);
const Vec3V rbXnSqrtInertia = M33MulV3(invSqrtInertia1, rbXn);
@@ -348,8 +358,11 @@ static void setupFinalizeSolverConstraints(Sc::ShapeInteraction* shapeInteractio
{
- const Vec3V raXn = V3Cross(ra, t1Cross);
- const Vec3V rbXn = V3Cross(rb, t1Cross);
+ Vec3V raXn = V3Cross(ra, t1Cross);
+ Vec3V rbXn = V3Cross(rb, t1Cross);
+
+ raXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(raXn)), v3Zero, raXn);
+ rbXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(rbXn)), v3Zero, rbXn);
const Vec3V raXnSqrtInertia = M33MulV3(invSqrtInertia0, raXn);
const Vec3V rbXnSqrtInertia = M33MulV3(invSqrtInertia1, rbXn);
@@ -533,6 +546,7 @@ bool createFinalizeSolverContacts(
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
Ps::prefetchLine(contactDesc.body0);
@@ -658,7 +672,7 @@ bool createFinalizeSolverContacts(
setupFinalizeSolverConstraints(contactDesc.shapeInteraction, contactDesc.contacts, c, contactDesc.bodyFrame0, contactDesc.bodyFrame1, solverConstraint,
data0, data1, invDtF32, bounceThresholdF32,
contactDesc.mInvMassScales.linear0, contactDesc.mInvMassScales.angular0, contactDesc.mInvMassScales.linear1, contactDesc.mInvMassScales.angular1,
- hasForceThreshold, staticOrKinematicBody, contactDesc.restDistance, frictionDataPtr, contactDesc.maxCCDSeparation);
+ hasForceThreshold, staticOrKinematicBody, contactDesc.restDistance, frictionDataPtr, contactDesc.maxCCDSeparation, solverOffsetSlop);
}
//KS - set to 0 so we have a counter for the number of times we solved the constraint
//only going to be used on SPU but might as well set on all platforms because this code is shared
@@ -678,6 +692,7 @@ bool createFinalizeSolverContacts(PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
ContactBuffer& buffer = threadContext.mContactBuffer;
@@ -714,7 +729,7 @@ bool createFinalizeSolverContacts(PxSolverContactDesc& contactDesc,
CorrelationBuffer& c = threadContext.mCorrelationBuffer;
- return createFinalizeSolverContacts(contactDesc, c, invDtF32, bounceThresholdF32, frictionOffsetThreshold, correlationDistance, constraintAllocator);
+ return createFinalizeSolverContacts(contactDesc, c, invDtF32, bounceThresholdF32, frictionOffsetThreshold, correlationDistance, solverOffsetSlop, constraintAllocator);
}
PxU32 getContactManagerConstraintDesc(const PxsContactManagerOutput& cmOutput, const PxsContactManager& /*cm*/, PxSolverConstraintDesc& desc)
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.h b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.h
index 46c2af0b..b1a5adb0 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.h
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep.h
@@ -58,7 +58,8 @@ namespace Dy
const PxReal invDtF32, \
PxReal bounceThresholdF32, \
PxReal frictionOffsetThreshold, \
- PxReal correlationDistance, \
+ PxReal correlationDistance, \
+ PxReal solverOffsetSlop, \
PxConstraintAllocator& constraintAllocator
#define CREATE_FINALIZE_SOVLER_CONTACT_METHOD_ARGS_4 \
@@ -69,6 +70,7 @@ namespace Dy
PxReal bounceThresholdF32, \
PxReal frictionThresholdF32, \
PxReal correlationDistanceF32, \
+ PxReal solverOffsetSlopF32, \
PxConstraintAllocator& constraintAllocator
@@ -92,6 +94,7 @@ bool createFinalizeSolverContacts( PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
bool createFinalizeSolverContacts( PxSolverContactDesc& contactDesc,
@@ -100,6 +103,7 @@ bool createFinalizeSolverContacts( PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
SolverConstraintPrepState::Enum createFinalizeSolverContacts4( PxsContactManagerOutput** outputs,
@@ -109,6 +113,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4( PxsContactManager
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
SolverConstraintPrepState::Enum createFinalizeSolverContacts4( Dy::CorrelationBuffer& c,
@@ -117,6 +122,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4( Dy::CorrelationBu
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
@@ -128,6 +134,7 @@ bool createFinalizeSolverContactsCoulomb1D(PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
bool createFinalizeSolverContactsCoulomb2D(PxSolverContactDesc& contactDesc,
@@ -137,6 +144,7 @@ bool createFinalizeSolverContactsCoulomb2D(PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
@@ -147,6 +155,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb1D( PxsConta
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb2D(PxsContactManagerOutput** outputs,
@@ -156,6 +165,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb2D(PxsContac
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator);
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4.cpp
index 569e6996..70d57a77 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4.cpp
@@ -78,7 +78,7 @@ inline bool ValidateVec4(const Vec4V v)
}
static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT descs, CorrelationBuffer& c, PxU8* PX_RESTRICT workspace,
- const PxReal invDtF32, PxReal bounceThresholdF32,
+ const PxReal invDtF32, PxReal bounceThresholdF32, const PxReal solverOffsetSlopF32,
const Ps::aos::Vec4VArg invMassScale0, const Ps::aos::Vec4VArg invInertiaScale0,
const Ps::aos::Vec4VArg invMassScale1, const Ps::aos::Vec4VArg invInertiaScale1)
{
@@ -86,6 +86,7 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
//OK, we have a workspace of pre-allocated space to store all 4 descs in. We now need to create the constraints in it
const Vec4V ccdMaxSeparation = Ps::aos::V4LoadXYZW(descs[0].maxCCDSeparation, descs[1].maxCCDSeparation, descs[2].maxCCDSeparation, descs[3].maxCCDSeparation);
+ const Vec4V solverOffsetSlop = V4Load(solverOffsetSlopF32);
const Vec4V zero = V4Zero();
const BoolV bFalse = BFFFF();
@@ -96,16 +97,16 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
PxU8(descs[2].hasForceThresholds ? SolverContactHeader::eHAS_FORCE_THRESHOLDS : 0),
PxU8(descs[3].hasForceThresholds ? SolverContactHeader::eHAS_FORCE_THRESHOLDS : 0) };
- bool hasMaxImpulse = descs[0].hasMaxImpulse || descs[1].hasMaxImpulse || descs[2].hasMaxImpulse || descs[3].hasMaxImpulse;
-
//The block is dynamic if **any** of the constraints have a non-static body B. This allows us to batch static and non-static constraints but we only get a memory/perf
//saving if all 4 are static. This simplifies the constraint partitioning such that it only needs to care about separating contacts and 1D constraints (which it already does)
bool isDynamic = false;
bool hasKinematic = false;
+ PxReal maxImpulse[4];
for(PxU32 a = 0; a < 4; ++a)
{
isDynamic = isDynamic || (descs[a].bodyState1 == PxSolverContactDesc::eDYNAMIC_BODY);
hasKinematic = hasKinematic || descs[a].bodyState1 == PxSolverContactDesc::eKINEMATIC_BODY;
+ maxImpulse[a] = PxMin(descs[a].data0->maxContactImpulse, descs[a].data1->maxContactImpulse);
}
const PxU32 constraintSize = isDynamic ? sizeof(SolverContactBatchPointDynamic4) : sizeof(SolverContactBatchPointBase4);
@@ -294,8 +295,6 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
PxU32 patch0 = 0, patch1 = 0, patch2 = 0, patch3 = 0;
PxU8 flag = 0;
- if(hasMaxImpulse)
- flag |= SolverContactHeader4::eHAS_MAX_IMPULSE;
for(PxU32 i=0;i<maxPatches;i++)
{
@@ -360,8 +359,6 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
header->shapeInteraction[0] = descs[0].shapeInteraction; header->shapeInteraction[1] = descs[1].shapeInteraction;
header->shapeInteraction[2] = descs[2].shapeInteraction; header->shapeInteraction[3] = descs[3].shapeInteraction;
- Vec4V* maxImpulse = reinterpret_cast<Vec4V*>(ptr + constraintSize * totalContacts);
-
header->restitution = restitution;
Vec4V normal0 = V4LoadA(&contactBase0->normal.x);
@@ -418,9 +415,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
((PxU32(hasFinished2 || !iter2.hasNextContact())) << 2) |
((PxU32(hasFinished3 || !iter3.hasNextContact())) << 3);
+
+ PxReal patchMaxImpulse[4] = { maxImpulse[0], maxImpulse[1], maxImpulse[2], maxImpulse[3] };
+
+
while(finished != 0xf)
{
- finished = newFinished;
+
++contactCount;
Ps::prefetchLine(p, 384);
Ps::prefetchLine(p, 512);
@@ -442,6 +443,21 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
Vec4V point2 = V4LoadA(&con2.point.x);
Vec4V point3 = V4LoadA(&con3.point.x);
+ if (descs[0].hasMaxImpulse)
+ patchMaxImpulse[0] = descs[0].contacts[c.contactPatches[patch0].start + contact0].maxImpulse;
+ if (descs[1].hasMaxImpulse)
+ patchMaxImpulse[1] = descs[1].contacts[c.contactPatches[patch1].start + contact1].maxImpulse;
+ if (descs[2].hasMaxImpulse)
+ patchMaxImpulse[2] = descs[2].contacts[c.contactPatches[patch2].start + contact2].maxImpulse;
+ if (descs[3].hasMaxImpulse)
+ patchMaxImpulse[3] = descs[3].contacts[c.contactPatches[patch3].start + contact3].maxImpulse;
+ for (PxU32 a = 0; a < 4; ++a)
+ {
+ if ((finished & (1 << a)))
+ patchMaxImpulse[a] = 0.f;
+ }
+
+
Vec4V pointX, pointY, pointZ;
PX_TRANSPOSE_44_34(point0, point1, point2, point3, pointX, pointY, pointZ);
@@ -469,6 +485,14 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
const Vec4V rbY = V4Sub(pointY, bodyFrame1pY);
const Vec4V rbZ = V4Sub(pointZ, bodyFrame1pZ);
+ /*raX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raX)), zero, raX);
+ raY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raY)), zero, raY);
+ raZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raZ)), zero, raZ);
+
+ rbX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbX)), zero, rbX);
+ rbY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbY)), zero, rbY);
+ rbZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbZ)), zero, rbZ);*/
+
PX_ASSERT(ValidateVec4(raX));
PX_ASSERT(ValidateVec4(raY));
PX_ASSERT(ValidateVec4(raZ));
@@ -480,9 +504,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
//raXn = cross(ra, normal) which = Vec3V( a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x);
- const Vec4V raXnX = V4NegMulSub(raZ, normalY, V4Mul(raY, normalZ));
- const Vec4V raXnY = V4NegMulSub(raX, normalZ, V4Mul(raZ, normalX));
- const Vec4V raXnZ = V4NegMulSub(raY, normalX, V4Mul(raX, normalY));
+ Vec4V raXnX = V4NegMulSub(raZ, normalY, V4Mul(raY, normalZ));
+ Vec4V raXnY = V4NegMulSub(raX, normalZ, V4Mul(raZ, normalX));
+ Vec4V raXnZ = V4NegMulSub(raY, normalX, V4Mul(raX, normalY));
+
+ raXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnX)), zero, raXnX);
+ raXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnY)), zero, raXnY);
+ raXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnZ)), zero, raXnZ);
Vec4V delAngVel0X = V4Mul(invInertia0X0, raXnX);
Vec4V delAngVel0Y = V4Mul(invInertia0X1, raXnX);
@@ -512,9 +540,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
if(isDynamic)
{
SolverContactBatchPointDynamic4* PX_RESTRICT dynamicContact = static_cast<SolverContactBatchPointDynamic4*>(solverContact);
- const Vec4V rbXnX = V4NegMulSub(rbZ, normalY, V4Mul(rbY, normalZ));
- const Vec4V rbXnY = V4NegMulSub(rbX, normalZ, V4Mul(rbZ, normalX));
- const Vec4V rbXnZ = V4NegMulSub(rbY, normalX, V4Mul(rbX, normalY));
+ Vec4V rbXnX = V4NegMulSub(rbZ, normalY, V4Mul(rbY, normalZ));
+ Vec4V rbXnY = V4NegMulSub(rbX, normalZ, V4Mul(rbZ, normalX));
+ Vec4V rbXnZ = V4NegMulSub(rbY, normalX, V4Mul(rbX, normalY));
+
+ rbXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnX)), zero, rbXnX);
+ rbXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnY)), zero, rbXnY);
+ rbXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnZ)), zero, rbXnZ);
Vec4V delAngVel1X = V4Mul(invInertia1X0, rbXnX);
Vec4V delAngVel1Y = V4Mul(invInertia1X1, rbXnX);
@@ -586,16 +618,14 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
solverContact->raXnZ = delAngVel0Z;
solverContact->velMultiplier = velMultiplier;
solverContact->biasedErr = biasedErr;
+ solverContact->maxContactImpulse = V4LoadU(patchMaxImpulse);
//solverContact->scaledBias = V4Max(zero, scaledBias);
solverContact->scaledBias = V4Sel(isGreater2, scaledBias, V4Max(zero, scaledBias));
-
- if(hasMaxImpulse)
- {
- maxImpulse[contactCount-1] = V4Merge(FLoad(con0.maxImpulse), FLoad(con1.maxImpulse), FLoad(con2.maxImpulse),
- FLoad(con3.maxImpulse));
- }
}
+
+ finished = newFinished;
+
if(!(finished & 0x1))
{
iter0.nextContact(patch0, contact0);
@@ -621,10 +651,6 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
}
}
ptr = p;
- if(hasMaxImpulse)
- {
- ptr += sizeof(Vec4V) * totalContacts;
- }
//OK...friction time :-)
@@ -811,9 +837,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
const Vec4V rbWorldY = V4Add(rbY, bodyFrame1pY);
const Vec4V rbWorldZ = V4Add(rbZ, bodyFrame1pZ);
- const Vec4V errorX = V4Sub(raWorldX, rbWorldX);
- const Vec4V errorY = V4Sub(raWorldY, rbWorldY);
- const Vec4V errorZ = V4Sub(raWorldZ, rbWorldZ);
+ Vec4V errorX = V4Sub(raWorldX, rbWorldX);
+ Vec4V errorY = V4Sub(raWorldY, rbWorldY);
+ Vec4V errorZ = V4Sub(raWorldZ, rbWorldZ);
+
+ errorX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(errorX)), zero, errorX);
+ errorY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(errorY)), zero, errorY);
+ errorZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(errorZ)), zero, errorZ);
//KS - todo - get this working with per-point friction
PxU32 contactIndex0 = c.contactID[frictionIndex0][index0];
@@ -837,9 +867,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
{
- const Vec4V raXnX = V4NegMulSub(raZ, t0Y, V4Mul(raY, t0Z));
- const Vec4V raXnY = V4NegMulSub(raX, t0Z, V4Mul(raZ, t0X));
- const Vec4V raXnZ = V4NegMulSub(raY, t0X, V4Mul(raX, t0Y));
+ Vec4V raXnX = V4NegMulSub(raZ, t0Y, V4Mul(raY, t0Z));
+ Vec4V raXnY = V4NegMulSub(raX, t0Z, V4Mul(raZ, t0X));
+ Vec4V raXnZ = V4NegMulSub(raY, t0X, V4Mul(raX, t0Y));
+
+ raXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnX)), zero, raXnX);
+ raXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnY)), zero, raXnY);
+ raXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnZ)), zero, raXnZ);
Vec4V delAngVel0X = V4Mul(invInertia0X0, raXnX);
Vec4V delAngVel0Y = V4Mul(invInertia0X1, raXnX);
@@ -864,9 +898,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
{
SolverContactFrictionDynamic4* PX_RESTRICT dynamicF0 = static_cast<SolverContactFrictionDynamic4*>(f0);
- const Vec4V rbXnX = V4NegMulSub(rbZ, t0Y, V4Mul(rbY, t0Z));
- const Vec4V rbXnY = V4NegMulSub(rbX, t0Z, V4Mul(rbZ, t0X));
- const Vec4V rbXnZ = V4NegMulSub(rbY, t0X, V4Mul(rbX, t0Y));
+ Vec4V rbXnX = V4NegMulSub(rbZ, t0Y, V4Mul(rbY, t0Z));
+ Vec4V rbXnY = V4NegMulSub(rbX, t0Z, V4Mul(rbZ, t0X));
+ Vec4V rbXnZ = V4NegMulSub(rbY, t0X, V4Mul(rbX, t0Y));
+
+ rbXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnX)), zero, rbXnX);
+ rbXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnY)), zero, rbXnY);
+ rbXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnZ)), zero, rbXnZ);
Vec4V delAngVel1X = V4Mul(invInertia1X0, rbXnX);
Vec4V delAngVel1Y = V4Mul(invInertia1X1, rbXnX);
@@ -925,9 +963,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
}
{
- const Vec4V raXnX = V4NegMulSub(raZ, t1Y, V4Mul(raY, t1Z));
- const Vec4V raXnY = V4NegMulSub(raX, t1Z, V4Mul(raZ, t1X));
- const Vec4V raXnZ = V4NegMulSub(raY, t1X, V4Mul(raX, t1Y));
+ Vec4V raXnX = V4NegMulSub(raZ, t1Y, V4Mul(raY, t1Z));
+ Vec4V raXnY = V4NegMulSub(raX, t1Z, V4Mul(raZ, t1X));
+ Vec4V raXnZ = V4NegMulSub(raY, t1X, V4Mul(raX, t1Y));
+
+ raXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnX)), zero, raXnX);
+ raXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnY)), zero, raXnY);
+ raXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnZ)), zero, raXnZ);
Vec4V delAngVel0X = V4Mul(invInertia0X0, raXnX);
Vec4V delAngVel0Y = V4Mul(invInertia0X1, raXnX);
@@ -952,9 +994,13 @@ static void setupFinalizeSolverConstraints4(PxSolverContactDesc* PX_RESTRICT des
{
SolverContactFrictionDynamic4* PX_RESTRICT dynamicF1 = static_cast<SolverContactFrictionDynamic4*>(f1);
- const Vec4V rbXnX = V4NegMulSub(rbZ, t1Y, V4Mul(rbY, t1Z));
- const Vec4V rbXnY = V4NegMulSub(rbX, t1Z, V4Mul(rbZ, t1X));
- const Vec4V rbXnZ = V4NegMulSub(rbY, t1X, V4Mul(rbX, t1Y));
+ Vec4V rbXnX = V4NegMulSub(rbZ, t1Y, V4Mul(rbY, t1Z));
+ Vec4V rbXnY = V4NegMulSub(rbX, t1Z, V4Mul(rbZ, t1X));
+ Vec4V rbXnZ = V4NegMulSub(rbY, t1X, V4Mul(rbX, t1Y));
+
+ rbXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnX)), zero, rbXnX);
+ rbXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnY)), zero, rbXnY);
+ rbXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnZ)), zero, rbXnZ);
Vec4V delAngVel1X = V4Mul(invInertia1X0, rbXnX);
Vec4V delAngVel1Y = V4Mul(invInertia1X1, rbXnX);
@@ -1101,12 +1147,10 @@ void computeBlockStreamByteSizes4(PxSolverContactDesc* descs,
PxU32 maxFrictionCount[CorrelationBuffer::MAX_FRICTION_PATCHES];
PxMemZero(maxContactCount, sizeof(maxContactCount));
PxMemZero(maxFrictionCount, sizeof(maxFrictionCount));
- bool hasMaxImpulse = false;
for(PxU32 a = 0; a < 4; ++a)
{
PxU32 axisConstraintCount = 0;
- hasMaxImpulse = hasMaxImpulse || descs[a].hasMaxImpulse;
for(PxU32 i = 0; i < descs[a].numFrictionPatches; i++)
{
PxU32 ind = i + descs[a].startFrictionPatchIndex;
@@ -1168,8 +1212,6 @@ void computeBlockStreamByteSizes4(PxSolverContactDesc* descs,
constraintSize += sizeof(Vec4V)*(totalContacts+totalFriction);
//If we have max impulse, reserve a buffer for it
- if(hasMaxImpulse)
- constraintSize += sizeof(Ps::aos::Vec4V) * totalContacts;
_solverConstraintByteSize = ((constraintSize + headerSize + 0x0f) & ~0x0f);
PX_ASSERT(0 == (_solverConstraintByteSize & 0x0f));
@@ -1238,6 +1280,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4(
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
PX_ALIGN(16, PxReal invMassScale0[4]);
@@ -1379,7 +1422,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4(
const Vec4V iMassScale1 = V4LoadA(invMassScale1);
const Vec4V iInertiaScale1 = V4LoadA(invInertiaScale1);
- setupFinalizeSolverConstraints4(blockDescs, c, solverConstraint, invDtF32, bounceThresholdF32,
+ setupFinalizeSolverConstraints4(blockDescs, c, solverConstraint, invDtF32, bounceThresholdF32, solverOffsetSlop,
iMassScale0, iInertiaScale0, iMassScale1, iInertiaScale1);
PX_ASSERT((*solverConstraint == DY_SC_TYPE_BLOCK_RB_CONTACT) || (*solverConstraint == DY_SC_TYPE_BLOCK_STATIC_RB_CONTACT));
@@ -1400,6 +1443,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4(
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
@@ -1475,7 +1519,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4(
}
return createFinalizeSolverContacts4(c, blockDescs,
invDtF32, bounceThresholdF32, frictionOffsetThreshold,
- correlationDistance, constraintAllocator);
+ correlationDistance, solverOffsetSlop, constraintAllocator);
}
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4PF.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4PF.cpp
index 3d931f0f..ca5880f1 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4PF.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrep4PF.cpp
@@ -72,11 +72,12 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb(
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator,
PxFrictionType::Enum frictionType);
static bool setupFinalizeSolverConstraintsCoulomb4(PxSolverContactDesc* PX_RESTRICT descs, PxU8* PX_RESTRICT workspace,
- const PxReal invDtF32, PxReal bounceThresholdF32, CorrelationBuffer& c, const PxU32 numFrictionPerPoint,
+ const PxReal invDtF32, PxReal bounceThresholdF32, PxReal solverOffsetSlopF32, CorrelationBuffer& c, const PxU32 numFrictionPerPoint,
const PxU32 numContactPoints4, const PxU32 /*solverConstraintByteSize*/,
const Ps::aos::Vec4VArg invMassScale0, const Ps::aos::Vec4VArg invInertiaScale0,
const Ps::aos::Vec4VArg invMassScale1, const Ps::aos::Vec4VArg invInertiaScale1)
@@ -84,6 +85,7 @@ static bool setupFinalizeSolverConstraintsCoulomb4(PxSolverContactDesc* PX_RESTR
//KS - final step. Create the constraints in the place we pre-allocated...
const Vec4V ccdMaxSeparation = Ps::aos::V4LoadXYZW(descs[0].maxCCDSeparation, descs[1].maxCCDSeparation, descs[2].maxCCDSeparation, descs[3].maxCCDSeparation);
+ const Vec4V solverOffsetSlop = V4Load(solverOffsetSlopF32);
const Vec4V zero = V4Zero();
@@ -483,6 +485,14 @@ static bool setupFinalizeSolverConstraintsCoulomb4(PxSolverContactDesc* PX_RESTR
const Vec4V rbY = V4Sub(pointY, bodyFrame1pY);
const Vec4V rbZ = V4Sub(pointZ, bodyFrame1pZ);
+ /*raX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raX)), zero, raX);
+ raY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raY)), zero, raY);
+ raZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raZ)), zero, raZ);
+
+ rbX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbX)), zero, rbX);
+ rbY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbY)), zero, rbY);
+ rbZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbZ)), zero, rbZ);*/
+
{
const Vec4V separation = V4Merge(FLoad(con0.separation), FLoad(con1.separation), FLoad(con2.separation),
FLoad(con3.separation));
@@ -492,9 +502,13 @@ static bool setupFinalizeSolverConstraintsCoulomb4(PxSolverContactDesc* PX_RESTR
const Vec4V cTargetVel = V4MulAdd(normalX, targetVelX, V4MulAdd(normalY, targetVelY, V4Mul(normalZ, targetVelZ)));
//raXn = cross(ra, normal) which = Vec3V( a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x);
- const Vec4V raXnX = V4NegMulSub(raZ, normalY, V4Mul(raY, normalZ));
- const Vec4V raXnY = V4NegMulSub(raX, normalZ, V4Mul(raZ, normalX));
- const Vec4V raXnZ = V4NegMulSub(raY, normalX, V4Mul(raX, normalY));
+ Vec4V raXnX = V4NegMulSub(raZ, normalY, V4Mul(raY, normalZ));
+ Vec4V raXnY = V4NegMulSub(raX, normalZ, V4Mul(raZ, normalX));
+ Vec4V raXnZ = V4NegMulSub(raY, normalX, V4Mul(raX, normalY));
+
+ raXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnX)), zero, raXnX);
+ raXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnY)), zero, raXnY);
+ raXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnZ)), zero, raXnZ);
const Vec4V v0a0 = V4Mul(invInertia0X0, raXnX);
const Vec4V v0a1 = V4Mul(invInertia0X1, raXnX);
@@ -519,9 +533,13 @@ static bool setupFinalizeSolverConstraintsCoulomb4(PxSolverContactDesc* PX_RESTR
if(isDynamic)
{
SolverContact4Dynamic* PX_RESTRICT dynamicContact = static_cast<SolverContact4Dynamic*>(solverContact);
- const Vec4V rbXnX = V4NegMulSub(rbZ, normalY, V4Mul(rbY, normalZ));
- const Vec4V rbXnY = V4NegMulSub(rbX, normalZ, V4Mul(rbZ, normalX));
- const Vec4V rbXnZ = V4NegMulSub(rbY, normalX, V4Mul(rbX, normalY));
+ Vec4V rbXnX = V4NegMulSub(rbZ, normalY, V4Mul(rbY, normalZ));
+ Vec4V rbXnY = V4NegMulSub(rbX, normalZ, V4Mul(rbZ, normalX));
+ Vec4V rbXnZ = V4NegMulSub(rbY, normalX, V4Mul(rbX, normalY));
+
+ rbXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnX)), zero, rbXnX);
+ rbXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnY)), zero, rbXnY);
+ rbXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnZ)), zero, rbXnZ);
const Vec4V v0b0 = V4Mul(invInertia1X0, rbXnX);
const Vec4V v0b1 = V4Mul(invInertia1X1, rbXnX);
@@ -610,9 +628,13 @@ static bool setupFinalizeSolverConstraintsCoulomb4(PxSolverContactDesc* PX_RESTR
fricIndex = 1 - fricIndex;
- const Vec4V raXnX = V4NegMulSub(raZ, tY, V4Mul(raY, tZ));
- const Vec4V raXnY = V4NegMulSub(raX, tZ, V4Mul(raZ, tX));
- const Vec4V raXnZ = V4NegMulSub(raY, tX, V4Mul(raX, tY));
+ Vec4V raXnX = V4NegMulSub(raZ, tY, V4Mul(raY, tZ));
+ Vec4V raXnY = V4NegMulSub(raX, tZ, V4Mul(raZ, tX));
+ Vec4V raXnZ = V4NegMulSub(raY, tX, V4Mul(raX, tY));
+
+ raXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnX)), zero, raXnX);
+ raXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnY)), zero, raXnY);
+ raXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(raXnZ)), zero, raXnZ);
const Vec4V v0a0 = V4Mul(invInertia0X0, raXnX);
const Vec4V v0a1 = V4Mul(invInertia0X1, raXnX);
@@ -638,9 +660,13 @@ static bool setupFinalizeSolverConstraintsCoulomb4(PxSolverContactDesc* PX_RESTR
{
SolverFriction4Dynamic* PX_RESTRICT dFric = static_cast<SolverFriction4Dynamic*>(friction);
- const Vec4V rbXnX = V4NegMulSub(rbZ, tY, V4Mul(rbY, tZ));
- const Vec4V rbXnY = V4NegMulSub(rbX, tZ, V4Mul(rbZ, tX));
- const Vec4V rbXnZ = V4NegMulSub(rbY, tX, V4Mul(rbX, tY));
+ Vec4V rbXnX = V4NegMulSub(rbZ, tY, V4Mul(rbY, tZ));
+ Vec4V rbXnY = V4NegMulSub(rbX, tZ, V4Mul(rbZ, tX));
+ Vec4V rbXnZ = V4NegMulSub(rbY, tX, V4Mul(rbX, tY));
+
+ rbXnX = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnX)), zero, rbXnX);
+ rbXnY = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnY)), zero, rbXnY);
+ rbXnZ = V4Sel(V4IsGrtr(solverOffsetSlop, V4Abs(rbXnZ)), zero, rbXnZ);
const Vec4V v0b0 = V4Mul(invInertia1X0, rbXnX);
const Vec4V v0b1 = V4Mul(invInertia1X1, rbXnX);
@@ -850,10 +876,11 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb1D(
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
return createFinalizeSolverContacts4Coulomb(outputs, threadContext, blockDescs, invDtF32, bounceThresholdF32,
- frictionOffsetThreshold, correlationDistance, constraintAllocator, PxFrictionType::eONE_DIRECTIONAL);
+ frictionOffsetThreshold, correlationDistance, solverOffsetSlop, constraintAllocator, PxFrictionType::eONE_DIRECTIONAL);
}
SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb2D(
@@ -864,10 +891,11 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb2D(
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
return createFinalizeSolverContacts4Coulomb(outputs, threadContext, blockDescs, invDtF32, bounceThresholdF32,
- frictionOffsetThreshold, correlationDistance, constraintAllocator, PxFrictionType::eTWO_DIRECTIONAL);
+ frictionOffsetThreshold, correlationDistance, solverOffsetSlop, constraintAllocator, PxFrictionType::eTWO_DIRECTIONAL);
}
@@ -879,6 +907,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb(
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator,
PxFrictionType::Enum frictionType)
{
@@ -1001,7 +1030,7 @@ SolverConstraintPrepState::Enum createFinalizeSolverContacts4Coulomb(
bool hasFriction = setupFinalizeSolverConstraintsCoulomb4(blockDescs, solverConstraint,
- invDtF32, bounceThresholdF32, c, numFrictionPerPoint, numContactPoints4, solverConstraintByteSize,
+ invDtF32, bounceThresholdF32, solverOffsetSlop, c, numFrictionPerPoint, numContactPoints4, solverConstraintByteSize,
iMassScale0, iInertiaScale0, iMassScale1, iInertiaScale1);
*(reinterpret_cast<PxU32*>(solverConstraint + solverConstraintByteSize)) = 0;
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepPF.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepPF.cpp
index e45d4eda..61ec9aae 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepPF.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepPF.cpp
@@ -72,6 +72,7 @@ bool createFinalizeSolverContactsCoulomb(PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator,
PxFrictionType::Enum frictionType);
@@ -92,9 +93,11 @@ static bool setupFinalizeSolverConstraintsCoulomb(
PxReal invMassScale0, PxReal invInertiaScale0,
PxReal invMassScale1, PxReal invInertiaScale1,
PxReal restDist,
- const PxReal maxCCDSeparation)
+ const PxReal maxCCDSeparation,
+ const PxReal solverOffsetSlopF32)
{
const FloatV ccdMaxSeparation = FLoad(maxCCDSeparation);
+ const Vec3V solverOffsetSlop = V3Load(solverOffsetSlopF32);
PxU8* PX_RESTRICT ptr = workspace;
const FloatV zero=FZero();
@@ -227,7 +230,7 @@ static bool setupFinalizeSolverConstraintsCoulomb(
invMassNorLenSq1, angD0, angD1, bodyFrame0p, bodyFrame1p,
normal, norVel, norCross, angVel0, angVel1,
invDt, invDtp8, restDistance, maxPenBias, restitution,
- bounceThreshold, contact, *solverContact, ccdMaxSeparation);
+ bounceThreshold, contact, *solverContact, ccdMaxSeparation, solverOffsetSlop);
}
ptr = p;
}
@@ -315,6 +318,8 @@ static bool setupFinalizeSolverConstraintsCoulomb(
const Vec3V point = V3LoadU(contact.point);
const Vec3V ra = V3Sub(point, bodyFrame0p);
const Vec3V rb = V3Sub(point, bodyFrame1p);
+ //ra = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(ra)), V3Zero(), ra);
+ //rb = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(rb)), V3Zero(), rb);
const Vec3V targetVel = V3LoadU(contact.targetVel);
for(PxU32 k = 0; k < frictionPerPointCount; ++k)
@@ -327,8 +332,11 @@ static bool setupFinalizeSolverConstraintsCoulomb(
p += frictionStride;
//f0->brokenOrContactIndex = contactId;
- const Vec3V raXn = V3Cross(ra, t0);
- const Vec3V rbXn = V3Cross(rb, t0);
+ Vec3V raXn = V3Cross(ra, t0);
+ Vec3V rbXn = V3Cross(rb, t0);
+
+ raXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(raXn)), V3Zero(), raXn);
+ rbXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(rbXn)), V3Zero(), rbXn);
const Vec3V delAngVel0 = M33MulV3(invSqrtInertia0, raXn);
const Vec3V delAngVel1 = M33MulV3(invSqrtInertia1, rbXn);
@@ -494,9 +502,11 @@ bool createFinalizeSolverContactsCoulomb1D(PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
- return createFinalizeSolverContactsCoulomb(contactDesc, output, threadContext, invDtF32, bounceThresholdF32, frictionOffsetThreshold, correlationDistance, constraintAllocator, PxFrictionType::eONE_DIRECTIONAL);
+ return createFinalizeSolverContactsCoulomb(contactDesc, output, threadContext, invDtF32, bounceThresholdF32, frictionOffsetThreshold, correlationDistance, solverOffsetSlop,
+ constraintAllocator, PxFrictionType::eONE_DIRECTIONAL);
}
bool createFinalizeSolverContactsCoulomb2D(PxSolverContactDesc& contactDesc,
@@ -506,10 +516,12 @@ bool createFinalizeSolverContactsCoulomb2D(PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator)
{
- return createFinalizeSolverContactsCoulomb(contactDesc, output, threadContext, invDtF32, bounceThresholdF32, frictionOffsetThreshold, correlationDistance, constraintAllocator, PxFrictionType::eTWO_DIRECTIONAL);
+ return createFinalizeSolverContactsCoulomb(contactDesc, output, threadContext, invDtF32, bounceThresholdF32, frictionOffsetThreshold, correlationDistance, solverOffsetSlop,
+ constraintAllocator, PxFrictionType::eTWO_DIRECTIONAL);
}
bool createFinalizeSolverContactsCoulomb(PxSolverContactDesc& contactDesc,
@@ -519,6 +531,7 @@ bool createFinalizeSolverContactsCoulomb(PxSolverContactDesc& contactDesc,
PxReal bounceThresholdF32,
PxReal frictionOffsetThreshold,
PxReal correlationDistance,
+ PxReal solverOffsetSlop,
PxConstraintAllocator& constraintAllocator,
PxFrictionType::Enum frictionType)
{
@@ -634,7 +647,7 @@ bool createFinalizeSolverContactsCoulomb(PxSolverContactDesc& contactDesc,
hasFriction = setupFinalizeSolverConstraintsCoulomb(contactDesc.shapeInteraction, buffer, c, contactDesc.bodyFrame0, contactDesc.bodyFrame1, solverConstraint,
data0, data1, invDtF32, bounceThresholdF32, numFrictionPerPatch, contactDesc.hasForceThresholds, contactDesc.bodyState1 == PxSolverContactDesc::eSTATIC_BODY,
- invMassScale0, invInertiaScale0, invMassScale1, invInertiaScale1, contactDesc.restDistance, contactDesc.maxCCDSeparation);
+ invMassScale0, invInertiaScale0, invMassScale1, invInertiaScale1, contactDesc.restDistance, contactDesc.maxCCDSeparation, solverOffsetSlop);
}
*(reinterpret_cast<PxU32*>(solverConstraint + solverConstraintByteSize)) = 0;
*(reinterpret_cast<PxU32*>(solverConstraint + solverConstraintByteSize + 4)) = hasFriction ? 0xFFFFFFFF : 0;
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepShared.h b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepShared.h
index 67ed680b..c973f1cf 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepShared.h
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyContactPrepShared.h
@@ -234,7 +234,7 @@ private:
const Vec3VArg normal, const FloatVArg norVel, const VecCrossV& norCross, const Vec3VArg angVel0, const Vec3VArg angVel1,
const FloatVArg invDt, const FloatVArg invDtp8, const FloatVArg restDistance, const FloatVArg maxPenBias, const FloatVArg restitution,
const FloatVArg bounceThreshold, const Gu::ContactPoint& contact, SolverContactPoint& solverContact,
- const FloatVArg ccdMaxSeparation)
+ const FloatVArg ccdMaxSeparation, const Vec3VArg solverOffsetSlop)
{
const FloatV zero = FZero();
const Vec3V point = V3LoadA(contact.point);
@@ -245,8 +245,14 @@ private:
const Vec3V ra = V3Sub(point, bodyFrame0p);
const Vec3V rb = V3Sub(point, bodyFrame1p);
- const Vec3V raXn = V3Cross(ra, norCross);
- const Vec3V rbXn = V3Cross(rb, norCross);
+ //ra = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(ra)), V3Zero(), ra);
+ //rb = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(rb)), V3Zero(), rb);
+
+ Vec3V raXn = V3Cross(ra, norCross);
+ Vec3V rbXn = V3Cross(rb, norCross);
+
+ raXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(raXn)), V3Zero(), raXn);
+ rbXn = V3Sel(V3IsGrtr(solverOffsetSlop, V3Abs(rbXn)), V3Zero(), rbXn);
const Vec3V raXnSqrtInertia = M33MulV3(invSqrtInertia0, raXn);
const Vec3V rbXnSqrtInertia = M33MulV3(invSqrtInertia1, rbXn);
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp
index 7bf839f3..97e5ffe0 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp
@@ -102,13 +102,14 @@ struct SolverIslandObjects
Context* createDynamicsContext( PxcNpMemBlockPool* memBlockPool,
PxcScratchAllocator& scratchAllocator, Cm::FlushPool& taskPool,
- PxvSimStats& simStats, PxTaskManager* taskManager, Ps::VirtualAllocatorCallback* allocatorCallback, PxsMaterialManager* materialManager,
- IG::IslandSim* accurateIslandSim, PxU64 contextID,
- const bool enableStabilization, const bool useEnhancedDeterminism, const bool useAdaptiveForce
+ PxvSimStats& simStats, PxTaskManager* taskManager, Ps::VirtualAllocatorCallback* allocatorCallback,
+ PxsMaterialManager* materialManager, IG::IslandSim* accurateIslandSim, PxU64 contextID,
+ const bool enableStabilization, const bool useEnhancedDeterminism, const bool useAdaptiveForce,
+ const PxReal maxBiasCoefficient
)
{
return DynamicsContext::create( memBlockPool, scratchAllocator, taskPool, simStats, taskManager, allocatorCallback, materialManager, accurateIslandSim,
- contextID, enableStabilization, useEnhancedDeterminism, useAdaptiveForce);
+ contextID, enableStabilization, useEnhancedDeterminism, useAdaptiveForce, maxBiasCoefficient);
}
// PT: TODO: consider removing this function. We already have "createDynamicsContext".
@@ -123,14 +124,16 @@ DynamicsContext* DynamicsContext::create( PxcNpMemBlockPool* memBlockPool,
PxU64 contextID,
const bool enableStabilization,
const bool useEnhancedDeterminism,
- const bool useAdaptiveForce
+ const bool useAdaptiveForce,
+ const PxReal maxBiasCoefficient
)
{
// PT: TODO: inherit from UserAllocated, remove placement new
DynamicsContext* dc = reinterpret_cast<DynamicsContext*>(PX_ALLOC(sizeof(DynamicsContext), "DynamicsContext"));
if(dc)
{
- new(dc)DynamicsContext(memBlockPool, scratchAllocator, taskPool, simStats, taskManager, allocatorCallback, materialManager, accurateIslandSim, contextID, enableStabilization, useEnhancedDeterminism, useAdaptiveForce);
+ new(dc)DynamicsContext(memBlockPool, scratchAllocator, taskPool, simStats, taskManager, allocatorCallback, materialManager, accurateIslandSim, contextID,
+ enableStabilization, useEnhancedDeterminism, useAdaptiveForce, maxBiasCoefficient);
}
return dc;
}
@@ -169,9 +172,10 @@ DynamicsContext::DynamicsContext( PxcNpMemBlockPool* memBlockPool,
PxU64 contextID,
const bool enableStabilization,
const bool useEnhancedDeterminism,
- const bool useAdaptiveForce
+ const bool useAdaptiveForce,
+ const PxReal maxBiasCoefficient
) :
- Dy::Context (accurateIslandSim, allocatorCallback, simStats, enableStabilization, useEnhancedDeterminism, useAdaptiveForce),
+ Dy::Context (accurateIslandSim, allocatorCallback, simStats, enableStabilization, useEnhancedDeterminism, useAdaptiveForce, maxBiasCoefficient),
mThreadContextPool (memBlockPool),
mMaterialManager (materialManager),
mScratchAllocator (scratchAllocator),
@@ -265,8 +269,8 @@ void DynamicsContext::setDescFromIndices(PxSolverConstraintDesc& desc, const Pxs
desc.bodyA = constraint.indexType0 == PxsIndexedInteraction::eWORLD ? &mWorldSolverBody
: &mSolverBodyPool[PxU32(constraint.solverBody0) + offsetMap[constraint.indexType0]];
- desc.bodyADataIndex = PxU16(constraint.indexType0 == PxsIndexedInteraction::eWORLD ? 0
- : PxU16(constraint.solverBody0) + 1 + offsetMap[constraint.indexType0]);
+ desc.bodyADataIndex = constraint.indexType0 == PxsIndexedInteraction::eWORLD ? 0
+ : PxU32(constraint.solverBody0) + 1 + offsetMap[constraint.indexType0];
}
if(constraint.indexType1 == PxsIndexedInteraction::eARTICULATION)
@@ -283,8 +287,8 @@ void DynamicsContext::setDescFromIndices(PxSolverConstraintDesc& desc, const Pxs
//desc.articulationBLength = 0; //this is unioned with bodyBDataIndex
desc.bodyB = constraint.indexType1 == PxsIndexedInteraction::eWORLD ? &mWorldSolverBody
: &mSolverBodyPool[PxU32(constraint.solverBody1) + offsetMap[constraint.indexType1]];
- desc.bodyBDataIndex = PxU16(constraint.indexType1 == PxsIndexedInteraction::eWORLD ? 0
- : PxU16(constraint.solverBody1) + 1 + offsetMap[constraint.indexType1]);
+ desc.bodyBDataIndex = constraint.indexType1 == PxsIndexedInteraction::eWORLD ? 0
+ : PxU32(constraint.solverBody1) + 1 + offsetMap[constraint.indexType1];
}
}
@@ -891,34 +895,47 @@ public:
const IG::IslandSim& islandSim = mIslandManager.getAccurateIslandSim();
PxU32 bodyIndex = 0, articIndex = 0;
- for(PxU32 i = 0; i < nbIslands; ++i)
+ for (PxU32 i = 0; i < nbIslands; ++i)
{
const IG::Island& island = islandSim.getIsland(islandIds[i]);
IG::NodeIndex currentIndex = island.mRootNode;
- while(currentIndex.isValid())
+ while (currentIndex.isValid())
{
const IG::Node& node = islandSim.getNode(currentIndex);
- if(node.getNodeType() == IG::Node::eARTICULATION_TYPE)
+ if (node.getNodeType() == IG::Node::eARTICULATION_TYPE)
{
articulationPtr[articIndex++] = node.getArticulation();
}
else
{
- PxsRigidBody* rigid = node.getRigidBody();
PX_ASSERT(bodyIndex < (mIslandContext.mCounts.bodies + mContext.mKinematicCount + 1));
- rigidBodyPtr[bodyIndex] = rigid;
- bodyArrayPtr[bodyIndex] = &rigid->getCore();
- nodeIndexArray[bodyIndex] = currentIndex.index();
- bodyRemapTable[islandSim.getActiveNodeIndex(currentIndex)] = bodyIndex++;
+ nodeIndexArray[bodyIndex++] = currentIndex.index();
}
currentIndex = node.mNextNode;
}
}
+ //Bodies can come in a slightly jumbled order from islandGen. It's deterministic if the scene is
+ //identical but can vary if there are additional bodies in the scene in a different island.
+ if (mEnhancedDeterminism)
+ {
+ Ps::sort(nodeIndexArray, bodyIndex);
+ }
+
+ for (PxU32 a = 0; a < bodyIndex; ++a)
+ {
+ IG::NodeIndex currentIndex(nodeIndexArray[a]);
+ const IG::Node& node = islandSim.getNode(currentIndex);
+ PxsRigidBody* rigid = node.getRigidBody();
+ rigidBodyPtr[a] = rigid;
+ bodyArrayPtr[a] = &rigid->getCore();
+ bodyRemapTable[islandSim.getActiveNodeIndex(currentIndex)] = a;
+ }
+
PxsIndexedContactManager* indexedManagers = mObjects.contactManagers;
@@ -2610,7 +2627,7 @@ static PxU32 createFinalizeContacts_Parallel(PxSolverBodyData* solverBodyData, T
const PxReal bounceThreshold = context.getBounceThreshold();
const PxReal frictionOffsetThreshold = context.getFrictionOffsetThreshold();
const PxReal dt = context.getDt();
- const PxReal invDt = context.getInvDt();
+ const PxReal invDt = PxMin(context.getMaxBiasCoefficient(), context.getInvDt());
PxSolverConstraintDesc* contactDescPtr = mThreadContext.orderedContactConstraints;
@@ -2697,6 +2714,7 @@ static PxU32 createFinalizeContacts_Parallel(PxSolverBodyData* solverBodyData, T
bounceThreshold,
frictionOffsetThreshold,
context.getCorrelationDistance(),
+ context.getSolverOffsetSlop(),
blockAllocator);
}
@@ -2712,7 +2730,7 @@ static PxU32 createFinalizeContacts_Parallel(PxSolverBodyData* solverBodyData, T
PxsContactManagerOutput& output = outputs.getContactManager(n.mNpIndex);
createFinalizeMethods[frictionType](blockDescs[i], output, *threadContext,
- invDt, bounceThreshold, frictionOffsetThreshold, context.getCorrelationDistance(), blockAllocator);
+ invDt, bounceThreshold, frictionOffsetThreshold, context.getCorrelationDistance(), context.getSolverOffsetSlop(), blockAllocator);
getContactManagerConstraintDesc(output,*cm,desc);
}
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.h b/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.h
index e2c307b9..6946f76c 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.h
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.h
@@ -176,7 +176,8 @@ public:
PxU64 contextID,
const bool enableStabilization,
const bool useEnhancedDeterminism,
- const bool useAdaptiveForce
+ const bool useAdaptiveForce,
+ const PxReal maxBiasCoefficient
);
/**
@@ -268,7 +269,8 @@ protected:
PxU64 contextID,
const bool enableStabilization,
const bool useEnhancedDeterminism,
- const bool useAdaptiveForce
+ const bool useAdaptiveForce,
+ const PxReal maxBiasCoefficient
);
/**
\brief Destructor for DynamicsContext
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraints.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraints.cpp
index 0a33c778..5e397b98 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraints.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraints.cpp
@@ -31,8 +31,6 @@
#include "foundation/PxPreprocessor.h"
#include "PsVecMath.h"
-#ifdef PX_SUPPORT_SIMD
-
#include "CmPhysXCommon.h"
#include "DySolverBody.h"
#include "DySolverContact.h"
@@ -1122,4 +1120,3 @@ void solveConcludeContact_BStatic (const PxSolverConstraintDesc& desc, SolverCon
}
-#endif
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsBlock.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsBlock.cpp
index 2d3d917c..5d238d0b 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsBlock.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsBlock.cpp
@@ -32,8 +32,6 @@
#include "PsVecMath.h"
#include "PsFPU.h"
-#ifdef PX_SUPPORT_SIMD
-
#include "CmPhysXCommon.h"
#include "DySolverBody.h"
#include "DySolverContact.h"
@@ -105,7 +103,7 @@ static void solveContact4_Block(const PxSolverConstraintDesc* PX_RESTRICT desc,
//hopefully pointer aliasing doesn't bite.
PxU8* PX_RESTRICT currPtr = desc[0].constraint;
- Vec4V vMax = V4Splat(FMax());
+
const PxU8* PX_RESTRICT prefetchAddress = currPtr + sizeof(SolverContactHeader4) + sizeof(SolverContactBatchPointDynamic4);
@@ -129,26 +127,12 @@ static void solveContact4_Block(const PxSolverConstraintDesc* PX_RESTRICT desc,
const PxU32 numNormalConstr = hdr->numNormalConstr;
const PxU32 numFrictionConstr = hdr->numFrictionConstr;
- bool hasMaxImpulse = (hdr->flag & SolverContactHeader4::eHAS_MAX_IMPULSE) != 0;
-
Vec4V* appliedForces = reinterpret_cast<Vec4V*>(currPtr);
currPtr += sizeof(Vec4V)*numNormalConstr;
SolverContactBatchPointDynamic4* PX_RESTRICT contacts = reinterpret_cast<SolverContactBatchPointDynamic4*>(currPtr);
- Vec4V* maxImpulses;
currPtr = reinterpret_cast<PxU8*>(contacts + numNormalConstr);
- PxU32 maxImpulseMask = 0;
- if(hasMaxImpulse)
- {
- maxImpulseMask = 0xFFFFFFFF;
- maxImpulses = reinterpret_cast<Vec4V*>(currPtr);
- currPtr += sizeof(Vec4V) * numNormalConstr;
- }
- else
- {
- maxImpulses = &vMax;
- }
SolverFrictionSharedData4* PX_RESTRICT fd = reinterpret_cast<SolverFrictionSharedData4*>(currPtr);
@@ -192,7 +176,7 @@ static void solveContact4_Block(const PxSolverConstraintDesc* PX_RESTRICT desc,
prefetchAddress += offset;
const Vec4V appliedForce = appliedForces[i];
- const Vec4V maxImpulse = maxImpulses[i & maxImpulseMask];
+ const Vec4V maxImpulse = c.maxContactImpulse;
Vec4V contactNormalVel2 = V4Mul(c.raXnX, angState0T0);
Vec4V contactNormalVel4 = V4Mul(c.rbXnX, angState1T0);
@@ -426,7 +410,6 @@ static void solveContact4_StaticBlock(const PxSolverConstraintDesc* PX_RESTRICT
//We'll need this.
const Vec4V vZero = V4Zero();
- Vec4V vMax = V4Splat(FMax());
Vec4V linVel00 = V4LoadA(&b00.linearVelocity.x);
Vec4V angState00 = V4LoadA(&b00.angularState.x);
@@ -463,7 +446,6 @@ static void solveContact4_StaticBlock(const PxSolverConstraintDesc* PX_RESTRICT
const PxU32 numNormalConstr = hdr->numNormalConstr;
const PxU32 numFrictionConstr = hdr->numFrictionConstr;
- bool hasMaxImpulse = (hdr->flag & SolverContactHeader4::eHAS_MAX_IMPULSE) != 0;
Vec4V* appliedForces = reinterpret_cast<Vec4V*>(currPtr);
currPtr += sizeof(Vec4V)*numNormalConstr;
@@ -472,20 +454,6 @@ static void solveContact4_StaticBlock(const PxSolverConstraintDesc* PX_RESTRICT
currPtr = reinterpret_cast<PxU8*>(contacts + numNormalConstr);
- Vec4V* maxImpulses;
- PxU32 maxImpulseMask;
- if(hasMaxImpulse)
- {
- maxImpulseMask = 0xFFFFFFFF;
- maxImpulses = reinterpret_cast<Vec4V*>(currPtr);
- currPtr += sizeof(Vec4V) * numNormalConstr;
- }
- else
- {
- maxImpulseMask = 0;
- maxImpulses = &vMax;
- }
-
SolverFrictionSharedData4* PX_RESTRICT fd = reinterpret_cast<SolverFrictionSharedData4*>(currPtr);
if(numFrictionConstr)
currPtr += sizeof(SolverFrictionSharedData4);
@@ -523,7 +491,7 @@ static void solveContact4_StaticBlock(const PxSolverConstraintDesc* PX_RESTRICT
prefetchAddress += offset;
const Vec4V appliedForce = appliedForces[i];
- const Vec4V maxImpulse = maxImpulses[i&maxImpulseMask];
+ const Vec4V maxImpulse = c.maxContactImpulse;
Vec4V contactNormalVel2 = V4MulAdd(c.raXnX, angState0T0, contactNormalVel1);
contactNormalVel2 = V4MulAdd(c.raXnY, angState0T1, contactNormalVel2);
const Vec4V normalVel = V4MulAdd(c.raXnZ, angState0T2, contactNormalVel2);
@@ -689,10 +657,6 @@ static void concludeContact4_Block(const PxSolverConstraintDesc* PX_RESTRICT des
SolverContactBatchPointBase4* PX_RESTRICT contacts = reinterpret_cast<SolverContactBatchPointBase4*>(currPtr);
currPtr += (numNormalConstr * contactSize);
- bool hasMaxImpulse = (hdr->flag & SolverContactHeader4::eHAS_MAX_IMPULSE) != 0;
-
- if(hasMaxImpulse)
- currPtr += sizeof(Vec4V) * numNormalConstr;
currPtr += sizeof(Vec4V)*numFrictionConstr;
@@ -760,11 +724,6 @@ void writeBackContact4_Block(const PxSolverConstraintDesc* PX_RESTRICT desc, Sol
//SolverContactBatchPointBase4* PX_RESTRICT contacts = (SolverContactBatchPointBase4*)currPtr;
currPtr += (numNormalConstr * contactSize);
- bool hasMaxImpulse = (hdr->flag & SolverContactHeader4::eHAS_MAX_IMPULSE) != 0;
-
- if(hasMaxImpulse)
- currPtr += sizeof(Vec4V) * numNormalConstr;
-
SolverFrictionSharedData4* PX_RESTRICT fd = reinterpret_cast<SolverFrictionSharedData4*>(currPtr);
if(numFrictionConstr)
currPtr += sizeof(SolverFrictionSharedData4);
@@ -1227,4 +1186,3 @@ void writeBack1D4Block(const PxSolverConstraintDesc* PX_RESTRICT desc, const PxU
}
-#endif
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsShared.h b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsShared.h
index ae46b357..7eb0b2bd 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsShared.h
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverConstraintsShared.h
@@ -33,8 +33,6 @@
#include "foundation/PxPreprocessor.h"
#include "PsVecMath.h"
-#ifdef PX_SUPPORT_SIMD
-
#include "CmPhysXCommon.h"
#include "DySolverBody.h"
#include "DySolverContact.h"
@@ -215,7 +213,5 @@ PX_FORCE_INLINE static FloatV solveExtContacts(SolverContactPointExt* contacts,
}
-#endif //PX_SUPPORT_SIMD
-
#endif //DY_SOLVER_CORE_SHARED_H
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact.h b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact.h
index c5b95886..55ab2a73 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact.h
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact.h
@@ -127,10 +127,8 @@ struct SolverContactPoint
PX_FORCE_INLINE FloatV getMaxImpulse() const {return FLoad(maxImpulse);}
-#ifdef PX_SUPPORT_SIMD
PX_FORCE_INLINE Vec3V getRaXn() const {return raXn;}
PX_FORCE_INLINE Vec3V getRbXn() const {return rbXn;}
-#endif
PX_FORCE_INLINE void setRaXn(const PxVec3& v) {V3WriteXYZ(raXn, v);}
PX_FORCE_INLINE void setRbXn(const PxVec3& v) {V3WriteXYZ(rbXn, v);}
@@ -181,11 +179,9 @@ struct SolverContactFriction
PX_FORCE_INLINE FloatV getVelMultiplier() const {return V4GetW(raXnXYZ_velMultiplierW);}
PX_FORCE_INLINE FloatV getBias() const {return V4GetW(rbXnXYZ_biasW);}
-#ifdef PX_SUPPORT_SIMD
PX_FORCE_INLINE Vec3V getNormal() const {return Vec3V_From_Vec4V(normalXYZ_appliedForceW);}
PX_FORCE_INLINE Vec3V getRaXn() const {return Vec3V_From_Vec4V(raXnXYZ_velMultiplierW);}
PX_FORCE_INLINE Vec3V getRbXn() const {return Vec3V_From_Vec4V(rbXnXYZ_biasW);}
-#endif
PX_FORCE_INLINE void setNormal(const PxVec3& v) {V4WriteXYZ(normalXYZ_appliedForceW, v);}
PX_FORCE_INLINE void setRaXn(const PxVec3& v) {V4WriteXYZ(raXnXYZ_velMultiplierW, v);}
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact4.h b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact4.h
index 814f4cc1..c6222f0b 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact4.h
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverContact4.h
@@ -115,8 +115,9 @@ struct SolverContactBatchPointBase4
Vec4V velMultiplier;
Vec4V scaledBias;
Vec4V biasedErr;
+ Vec4V maxContactImpulse;
};
-PX_COMPILE_TIME_ASSERT(sizeof(SolverContactBatchPointBase4) == 96);
+PX_COMPILE_TIME_ASSERT(sizeof(SolverContactBatchPointBase4) == 112);
/**
\brief Contains the additional data required to represent 4 contacts between 2 dynamic bodies
@@ -128,7 +129,7 @@ struct SolverContactBatchPointDynamic4 : public SolverContactBatchPointBase4
Vec4V rbXnY;
Vec4V rbXnZ;
};
-PX_COMPILE_TIME_ASSERT(sizeof(SolverContactBatchPointDynamic4) == 144);
+PX_COMPILE_TIME_ASSERT(sizeof(SolverContactBatchPointDynamic4) == 160);
/**
\brief This represents the shared information of a batch of 4 friction constraints
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.cpp
index aa964099..bbb48efe 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.cpp
@@ -242,14 +242,13 @@ void SolverCoreGeneral::solveV_Blocks(SolverIslandParams& params) const
//0-(n-1) iterations
PxI32 normalIter = 0;
- PxI32 frictionIter = 0;
for (PxU32 iteration = positionIterations; iteration > 0; iteration--) //decreasing positive numbers == position iters
{
cache.doFriction = iteration<=3;
- SolveBlockParallel<false>(constraintList, batchCount, normalIter * batchCount, batchCount,
- cache, contactIterator, iteration == 1 ? gVTableSolveConcludeBlock : gVTableSolveBlock, normalIter, frictionIter, normalIter);
+ SolveBlockParallel(constraintList, batchCount, normalIter * batchCount, batchCount,
+ cache, contactIterator, iteration == 1 ? gVTableSolveConcludeBlock : gVTableSolveBlock, normalIter);
++normalIter;
}
@@ -274,8 +273,8 @@ void SolverCoreGeneral::solveV_Blocks(SolverIslandParams& params) const
for(; iteration < velItersMinOne; ++iteration)
{
- SolveBlockParallel<false>(constraintList, batchCount, normalIter * batchCount, batchCount,
- cache, contactIterator, gVTableSolveBlock, normalIter, frictionIter, normalIter);
+ SolveBlockParallel(constraintList, batchCount, normalIter * batchCount, batchCount,
+ cache, contactIterator, gVTableSolveBlock, normalIter);
++normalIter;
}
@@ -291,8 +290,8 @@ void SolverCoreGeneral::solveV_Blocks(SolverIslandParams& params) const
for(; iteration < PxI32(velocityIterations); ++iteration)
{
- SolveBlockParallel<false>(constraintList, batchCount, normalIter * batchCount, batchCount,
- cache, contactIterator, gVTableSolveWriteBackBlock, normalIter, frictionIter, normalIter);
+ SolveBlockParallel(constraintList, batchCount, normalIter * batchCount, batchCount,
+ cache, contactIterator, gVTableSolveWriteBackBlock, normalIter);
++normalIter;
}
@@ -363,7 +362,6 @@ PxI32 SolverCoreGeneral::solveVParallelAndWriteBack
PxI32 maxNormalIndex = 0;
PxI32 normalIteration = 0;
- PxI32 frictionIteration = 0;
PxU32 a = 0;
PxI32 targetConstraintIndex = 0;
for(PxU32 i = 0; i < 2; ++i)
@@ -382,8 +380,8 @@ PxI32 SolverCoreGeneral::solveVParallelAndWriteBack
while(index < maxNormalIndex)
{
const PxI32 remainder = PxMin(maxNormalIndex - index, endIndexCount);
- SolveBlockParallel<false>(constraintList, remainder, index, batchCount, cache, contactIter, solveTable,
- normalIteration, frictionIteration, normalIteration);
+ SolveBlockParallel(constraintList, remainder, index, batchCount, cache, contactIter, solveTable,
+ normalIteration);
index += remainder;
endIndexCount -= remainder;
nbSolved += remainder;
@@ -489,8 +487,8 @@ PxI32 SolverCoreGeneral::solveVParallelAndWriteBack
while(index < maxNormalIndex)
{
const PxI32 remainder = PxMin(maxNormalIndex - index, endIndexCount);
- SolveBlockParallel<false>(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveBlock,
- normalIteration, 0, normalIteration);
+ SolveBlockParallel(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveBlock,
+ normalIteration);
index += remainder;
endIndexCount -= remainder;
nbSolved += remainder;
@@ -532,8 +530,8 @@ PxI32 SolverCoreGeneral::solveVParallelAndWriteBack
{
const PxI32 remainder = PxMin(maxNormalIndex - index, endIndexCount);
- SolveBlockParallel<false>(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveWriteBackBlock,
- normalIteration, 0, normalIteration);
+ SolveBlockParallel(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveWriteBackBlock,
+ normalIteration);
index += remainder;
endIndexCount -= remainder;
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.h b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.h
index 719eb445..6d7be4fe 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.h
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControl.h
@@ -62,45 +62,6 @@ inline void BusyWaitStates(volatile PxU32* stateA, volatile PxU32* stateB, const
}
-PX_FORCE_INLINE void WaitBodyABodyBRequiredState(const PxSolverConstraintDesc& desc, const PxI32 iterationA, const PxI32 iterationB)
-{
- PxSolverBody* PX_RESTRICT pBodyA = desc.bodyA;
- PxSolverBody* PX_RESTRICT pBodyB = desc.bodyB;
-
- const PxU32 requiredProgressA=(desc.bodyASolverProgress == 0xFFFF) ? 0xFFFF : PxU32(desc.bodyASolverProgress + iterationA * pBodyA->maxSolverNormalProgress + iterationB * pBodyA->maxSolverFrictionProgress);
- const PxU32 requiredProgressB=(desc.bodyBSolverProgress == 0xFFFF) ? 0xFFFF : PxU32(desc.bodyBSolverProgress + iterationA * pBodyB->maxSolverNormalProgress + iterationB * pBodyB->maxSolverFrictionProgress);
- PX_ASSERT(requiredProgressA!=0xFFFFFFFF || requiredProgressB!=0xFFFFFFFF);
-
- const PxU32 solverProgressA = pBodyA->solverProgress;
- const PxU32 solverProgressB = pBodyB->solverProgress;
-
- if(solverProgressA != requiredProgressA || solverProgressB != requiredProgressB)
- {
- BusyWaitStates(&pBodyA->solverProgress, &pBodyB->solverProgress, requiredProgressA, requiredProgressB);
- }
-}
-
-PX_FORCE_INLINE void IncrementBodyProgress(const PxSolverConstraintDesc& desc)
-{
- PxSolverBody* PX_RESTRICT pBodyA = desc.bodyA;
- PxSolverBody* PX_RESTRICT pBodyB = desc.bodyB;
-
- const PxU32 maxProgressA = pBodyA->maxSolverNormalProgress;
- const PxU32 maxProgressB = pBodyB->maxSolverNormalProgress;
-
- //NB - this approach removes the need for an imul (which is a non-pipeline instruction on PPC chips)
- const PxU32 requiredProgressA=(maxProgressA == 0xFFFF) ? 0xFFFF : pBodyA->solverProgress + 1;
- const PxU32 requiredProgressB=(maxProgressB == 0xFFFF) ? 0xFFFF : pBodyB->solverProgress + 1;
-
- volatile PxU32* solveProgressA = &pBodyA->solverProgress;
- volatile PxU32* solveProgressB = &pBodyB->solverProgress;
-
- *solveProgressA=requiredProgressA;
- *solveProgressB=requiredProgressB;
-
-}
-
-
class BatchIterator
{
public:
@@ -127,10 +88,9 @@ private:
};
-template<bool bWaitIncrement>
-void SolveBlockParallel (PxSolverConstraintDesc* PX_RESTRICT constraintList, const PxI32 batchCount, const PxI32 index,
+inline void SolveBlockParallel (PxSolverConstraintDesc* PX_RESTRICT constraintList, const PxI32 batchCount, const PxI32 index,
const PxI32 headerCount, SolverContext& cache, BatchIterator& iterator,
- SolveBlockMethod solveTable[], const PxI32 normalIteration, const PxI32 frictionIteration,
+ SolveBlockMethod solveTable[],
const PxI32 iteration
)
{
@@ -152,22 +112,10 @@ void SolveBlockParallel (PxSolverConstraintDesc* PX_RESTRICT constraintList, con
{
Ps::prefetchLine(block[b].bodyA);
Ps::prefetchLine(block[b].bodyB);
- if(bWaitIncrement)
- WaitBodyABodyBRequiredState(block[b], normalIteration, frictionIteration);
}
//OK. We have a number of constraints to run...
solveTable[header.mConstraintType](block, PxU32(numToGrab), cache);
-
- //Increment body progresses
- if(bWaitIncrement)
- {
- Ps::memoryBarrier();
- for(PxI32 j = 0; j < numToGrab; ++j)
- {
- IncrementBodyProgress(block[j]);
- }
- }
}
}
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControlPF.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControlPF.cpp
index 45e01b1e..188bcf3d 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControlPF.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverControlPF.cpp
@@ -275,8 +275,8 @@ void SolverCoreGeneralPF::solveV_Blocks(SolverIslandParams& params) const
for (PxU32 iteration = positionIterations; iteration > 0; iteration--) //decreasing positive numbers == position iters
{
- SolveBlockParallel<false>(constraintList, batchCount, normalIter * batchCount, batchCount,
- cache, contactIterator, iteration == 1 ? gVTableSolveConcludeBlockCoulomb : gVTableSolveBlockCoulomb, normalIter, frictionIter, normalIter);
+ SolveBlockParallel(constraintList, batchCount, normalIter * batchCount, batchCount,
+ cache, contactIterator, iteration == 1 ? gVTableSolveConcludeBlockCoulomb : gVTableSolveBlockCoulomb, normalIter);
++normalIter;
}
@@ -286,8 +286,8 @@ void SolverCoreGeneralPF::solveV_Blocks(SolverIslandParams& params) const
const PxU32 numIterations = positionIterations * 2;
for (PxU32 iteration = numIterations; iteration > 0; iteration--) //decreasing positive numbers == position iters
{
- SolveBlockParallel<false>(frictionConstraintList, frictionBatchCount, frictionIter * frictionBatchCount, frictionBatchCount,
- cache, frictionIterator, iteration == 1 ? gVTableSolveConcludeBlockCoulomb : gVTableSolveBlockCoulomb, normalIter, frictionIter, frictionIter);
+ SolveBlockParallel(frictionConstraintList, frictionBatchCount, frictionIter * frictionBatchCount, frictionBatchCount,
+ cache, frictionIterator, iteration == 1 ? gVTableSolveConcludeBlockCoulomb : gVTableSolveBlockCoulomb, frictionIter);
++frictionIter;
}
}
@@ -312,14 +312,14 @@ void SolverCoreGeneralPF::solveV_Blocks(SolverIslandParams& params) const
for(; iteration < velItersMinOne; ++iteration)
{
- SolveBlockParallel<false>(constraintList, batchCount, normalIter * batchCount, batchCount,
- cache, contactIterator, gVTableSolveBlockCoulomb, normalIter, frictionIter, normalIter);
+ SolveBlockParallel(constraintList, batchCount, normalIter * batchCount, batchCount,
+ cache, contactIterator, gVTableSolveBlockCoulomb, normalIter);
++normalIter;
if(frictionBatchCount > 0)
{
- SolveBlockParallel<false>(frictionConstraintList, frictionBatchCount, frictionIter * frictionBatchCount, frictionBatchCount,
- cache, frictionIterator, gVTableSolveBlockCoulomb, normalIter, frictionIter, frictionIter);
+ SolveBlockParallel(frictionConstraintList, frictionBatchCount, frictionIter * frictionBatchCount, frictionBatchCount,
+ cache, frictionIterator, gVTableSolveBlockCoulomb, frictionIter);
++frictionIter;
}
}
@@ -336,14 +336,14 @@ void SolverCoreGeneralPF::solveV_Blocks(SolverIslandParams& params) const
for(; iteration < velocityIterations; ++iteration)
{
- SolveBlockParallel<false>(constraintList, batchCount, normalIter * batchCount, batchCount,
- cache, contactIterator, gVTableSolveWriteBackBlockCoulomb, normalIter, frictionIter, normalIter);
+ SolveBlockParallel(constraintList, batchCount, normalIter * batchCount, batchCount,
+ cache, contactIterator, gVTableSolveWriteBackBlockCoulomb, normalIter);
++normalIter;
if(frictionBatchCount > 0)
{
- SolveBlockParallel<false>(frictionConstraintList, frictionBatchCount, frictionIter * frictionBatchCount, frictionBatchCount,
- cache, frictionIterator, gVTableSolveWriteBackBlockCoulomb, normalIter, frictionIter, frictionIter);
+ SolveBlockParallel(frictionConstraintList, frictionBatchCount, frictionIter * frictionBatchCount, frictionBatchCount,
+ cache, frictionIterator, gVTableSolveWriteBackBlockCoulomb, frictionIter);
++frictionIter;
}
}
@@ -433,8 +433,8 @@ PxI32 SolverCoreGeneralPF::solveVParallelAndWriteBack(SolverIslandParams& params
while(index < maxNormalIndex)
{
const PxI32 remainder = PxMin(maxNormalIndex - index, endIndexCount);
- SolveBlockParallel<false>(constraintList, remainder, index, batchCount, cache, contactIter, solveTable,
- normalIteration, frictionIteration, normalIteration);
+ SolveBlockParallel(constraintList, remainder, index, batchCount, cache, contactIter, solveTable,
+ normalIteration);
index += remainder;
endIndexCount -= remainder;
nbSolved += remainder;
@@ -471,8 +471,8 @@ PxI32 SolverCoreGeneralPF::solveVParallelAndWriteBack(SolverIslandParams& params
while(frictionIndex < maxFrictionIndex)
{
const PxI32 remainder = PxMin(maxFrictionIndex - frictionIndex, frictionEndIndexCount);
- SolveBlockParallel<false>(frictionConstraintList, remainder, frictionIndex, frictionBatchCount, cache, frictionIter,
- solveTable, normalIteration, frictionIteration, frictionIteration);
+ SolveBlockParallel(frictionConstraintList, remainder, frictionIndex, frictionBatchCount, cache, frictionIter,
+ solveTable, frictionIteration);
frictionIndex += remainder;
frictionEndIndexCount -= remainder;
nbSolved += remainder;
@@ -582,7 +582,7 @@ PxI32 SolverCoreGeneralPF::solveVParallelAndWriteBack(SolverIslandParams& params
while(index < maxNormalIndex)
{
const PxI32 remainder = PxMin(maxNormalIndex - index, endIndexCount);
- SolveBlockParallel<false>(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveBlockCoulomb, normalIteration, frictionIteration, normalIteration);
+ SolveBlockParallel(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveBlockCoulomb, normalIteration);
index += remainder;
endIndexCount -= remainder;
nbSolved += remainder;
@@ -610,8 +610,8 @@ PxI32 SolverCoreGeneralPF::solveVParallelAndWriteBack(SolverIslandParams& params
while(frictionIndex < maxFrictionIndex)
{
const PxI32 remainder = PxMin(maxFrictionIndex - frictionIndex, frictionEndIndexCount);
- SolveBlockParallel<false>(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveBlockCoulomb,
- normalIteration, frictionIteration, normalIteration);
+ SolveBlockParallel(constraintList, remainder, index, batchCount, cache, contactIter, gVTableSolveBlockCoulomb,
+ normalIteration);
frictionIndex += remainder;
frictionEndIndexCount -= remainder;
@@ -652,8 +652,8 @@ PxI32 SolverCoreGeneralPF::solveVParallelAndWriteBack(SolverIslandParams& params
{
const PxI32 remainder = PxMin(maxNormalIndex - index, endIndexCount);
- SolveBlockParallel<false>(constraintList, remainder, normalIteration * batchCount, batchCount,
- cache, contactIter, gVTableSolveWriteBackBlockCoulomb, normalIteration, frictionIteration, normalIteration);
+ SolveBlockParallel(constraintList, remainder, normalIteration * batchCount, batchCount,
+ cache, contactIter, gVTableSolveWriteBackBlockCoulomb, normalIteration);
index += remainder;
endIndexCount -= remainder;
@@ -688,8 +688,8 @@ PxI32 SolverCoreGeneralPF::solveVParallelAndWriteBack(SolverIslandParams& params
{
const PxI32 remainder = PxMin(maxFrictionIndex - frictionIndex, frictionEndIndexCount);
- SolveBlockParallel<false>(frictionConstraintList, remainder, frictionIndex, frictionBatchCount, cache, frictionIter,
- gVTableSolveWriteBackBlockCoulomb, normalIteration, frictionIteration, frictionIteration);
+ SolveBlockParallel(frictionConstraintList, remainder, frictionIndex, frictionBatchCount, cache, frictionIter,
+ gVTableSolveWriteBackBlockCoulomb, frictionIteration);
frictionIndex += remainder;
frictionEndIndexCount -= remainder;
diff --git a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverPFConstraints.cpp b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverPFConstraints.cpp
index 76fe8e7f..0ede719d 100644
--- a/PhysX_3.4/Source/LowLevelDynamics/src/DySolverPFConstraints.cpp
+++ b/PhysX_3.4/Source/LowLevelDynamics/src/DySolverPFConstraints.cpp
@@ -31,8 +31,6 @@
#include "foundation/PxPreprocessor.h"
#include "PsVecMath.h"
-#ifdef PX_SUPPORT_SIMD
-
#include "CmPhysXCommon.h"
#include "DySolverBody.h"
#include "DySolverContact.h"
@@ -865,4 +863,3 @@ void solveConcludeContactCoulomb_BStatic (const PxSolverConstraintDesc& desc, So
}
-#endif //PX_SUPPORT_SIMD