aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp
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/DyDynamics.cpp
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/DyDynamics.cpp')
-rw-r--r--PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp62
1 files changed, 40 insertions, 22 deletions
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);
}