diff options
| author | Sheikh Dawood Abdul Ajees <[email protected]> | 2017-09-15 15:41:57 -0500 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <[email protected]> | 2017-09-15 15:41:57 -0500 |
| commit | d1c812f1162e5fdb13c215792725b2591d7428f5 (patch) | |
| tree | 407056c45c7e9320c48fca6a3697d81a061c4ea0 /PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp | |
| parent | PhysX 3.4, APEX 1.4 patch release @22121272 (diff) | |
| download | physx-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.cpp | 62 |
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); } |