From d1c812f1162e5fdb13c215792725b2591d7428f5 Mon Sep 17 00:00:00 2001 From: Sheikh Dawood Abdul Ajees Date: Fri, 15 Sep 2017 15:41:57 -0500 Subject: PhysX 3.4.1, APEX 1.4.1 Release @22845541 --- .../Source/LowLevelDynamics/src/DyDynamics.cpp | 62 ++++++++++++++-------- 1 file changed, 40 insertions(+), 22 deletions(-) (limited to 'PhysX_3.4/Source/LowLevelDynamics/src/DyDynamics.cpp') 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(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); } -- cgit v1.2.3