diff options
| author | Sheikh Dawood Abdul Ajees <[email protected]> | 2017-04-25 16:02:08 -0500 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <[email protected]> | 2017-04-25 16:02:08 -0500 |
| commit | d11708e398c2f6377d9eac2b1f7248c62faab569 (patch) | |
| tree | 5778e794690c046ab4b0205d8f764960a5af168b /PhysX_3.4/Source/LowLevelAABB/src | |
| parent | PhysX 3.4, APEX 1.4 patch release @21821222 (diff) | |
| download | physx-3.4-d11708e398c2f6377d9eac2b1f7248c62faab569.tar.xz physx-3.4-d11708e398c2f6377d9eac2b1f7248c62faab569.zip | |
PhysX 3.4, APEX 1.4 patch release @22017166
Diffstat (limited to 'PhysX_3.4/Source/LowLevelAABB/src')
9 files changed, 100 insertions, 60 deletions
diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhase.cpp b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhase.cpp index d39cf594..a68fe607 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhase.cpp +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhase.cpp @@ -48,7 +48,7 @@ BroadPhase* BroadPhase::create( PX_ASSERT(bpType==PxBroadPhaseType::eMBP || bpType == PxBroadPhaseType::eSAP); if(bpType==PxBroadPhaseType::eMBP) - return PX_NEW(BroadPhaseMBP)(maxNbRegions, maxNbBroadPhaseOverlaps, maxNbStaticShapes, maxNbDynamicShapes); + return PX_NEW(BroadPhaseMBP)(maxNbRegions, maxNbBroadPhaseOverlaps, maxNbStaticShapes, maxNbDynamicShapes, contextID); else return PX_NEW(BroadPhaseSap)(maxNbBroadPhaseOverlaps, maxNbStaticShapes, maxNbDynamicShapes, contextID); } diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.cpp b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.cpp index 7220976a..b4a448d7 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.cpp +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.cpp @@ -3374,10 +3374,13 @@ void MBP::setTransientBounds(const PxBounds3* bounds, const PxReal* contactDista #define DEFAULT_CREATED_DELETED_PAIRS_CAPACITY 1024 -BroadPhaseMBP::BroadPhaseMBP(PxU32 maxNbRegions, +BroadPhaseMBP::BroadPhaseMBP( PxU32 maxNbRegions, PxU32 maxNbBroadPhaseOverlaps, PxU32 maxNbStaticShapes, - PxU32 maxNbDynamicShapes) : + PxU32 maxNbDynamicShapes, + PxU64 contextID) : + mMBPUpdateWorkTask (contextID), + mMBPPostUpdateWorkTask (contextID), mMapping (NULL), mCapacity (0), mGroups (NULL) diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.h b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.h index 9e3ddbfb..ffc52ae2 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.h +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseMBP.h @@ -53,7 +53,9 @@ namespace Bp BroadPhaseMBP(PxU32 maxNbRegions, PxU32 maxNbBroadPhaseOverlaps, PxU32 maxNbStaticShapes, - PxU32 maxNbDynamicShapes); + PxU32 maxNbDynamicShapes, + PxU64 contextID + ); virtual ~BroadPhaseMBP(); // BroadPhaseBase @@ -67,23 +69,24 @@ namespace Bp //~BroadPhaseBase // BroadPhase - virtual PxBroadPhaseType::Enum getType() const { return PxBroadPhaseType::eMBP; } + virtual PxBroadPhaseType::Enum getType() const { return PxBroadPhaseType::eMBP; } - virtual void destroy(); + virtual void destroy(); - virtual void update(const PxU32 numCpuTasks, PxcScratchAllocator* scratchAllocator, const BroadPhaseUpdateData& updateData, physx::PxBaseTask* continuation, physx::PxBaseTask* narrowPhaseUnblockTask); + virtual void update(const PxU32 numCpuTasks, PxcScratchAllocator* scratchAllocator, const BroadPhaseUpdateData& updateData, physx::PxBaseTask* continuation, physx::PxBaseTask* narrowPhaseUnblockTask); + virtual void fetchBroadPhaseResults(physx::PxBaseTask*) {} - virtual PxU32 getNbCreatedPairs() const; - virtual BroadPhasePairReport* getCreatedPairs(); - virtual PxU32 getNbDeletedPairs() const; - virtual BroadPhasePairReport* getDeletedPairs(); + virtual PxU32 getNbCreatedPairs() const; + virtual BroadPhasePairReport* getCreatedPairs(); + virtual PxU32 getNbDeletedPairs() const; + virtual BroadPhasePairReport* getDeletedPairs(); - virtual void freeBuffers(); + virtual void freeBuffers(); - virtual void shiftOrigin(const PxVec3& shift); + virtual void shiftOrigin(const PxVec3& shift); #if PX_CHECKED - virtual bool isValid(const BroadPhaseUpdateData& updateData) const; + virtual bool isValid(const BroadPhaseUpdateData& updateData) const; #endif virtual BroadPhasePair* getBroadPhasePairs() const {return NULL;} //KS - TODO - implement this!!! @@ -103,7 +106,7 @@ namespace Bp Ps::Array<BroadPhasePairReport> mCreated; Ps::Array<BroadPhasePairReport> mDeleted; - const BpHandle* mGroups; // ### why are those 'handles'? + const BpHandle* mGroups; // ### why are those 'handles'? void setUpdateData(const BroadPhaseUpdateData& updateData); void update(physx::PxBaseTask* continuation); diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.cpp b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.cpp index 6f0c163d..b490c4fd 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.cpp +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.cpp @@ -55,9 +55,15 @@ BroadPhaseSap::BroadPhaseSap( const PxU32 maxNbStaticShapes, const PxU32 maxNbDynamicShapes, PxU64 contextID) : - mScratchAllocator (NULL), - mContextID (contextID) + mScratchAllocator (NULL), + mSapUpdateWorkTask (contextID), + mSapPostUpdateWorkTask (contextID), + mContextID (contextID) { + + for(PxU32 i=0;i<3;i++) + mBatchUpdateTasks[i].setContextId(contextID); + //Boxes mBoxesSize=0; mBoxesSizePrev=0; diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.h b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.h index 34c935ed..9d292c0f 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.h +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpBroadPhaseSap.h @@ -60,13 +60,13 @@ class BroadPhaseBatchUpdateWorkTask: public Cm::Task { public: - BroadPhaseBatchUpdateWorkTask() - : Cm::Task(), - mSap(NULL), - mAxis(0xffffffff), - mPairs(NULL), - mPairsSize(0), - mPairsCapacity(0) + BroadPhaseBatchUpdateWorkTask(PxU64 contextId=0) : + Cm::Task(contextId), + mSap(NULL), + mAxis(0xffffffff), + mPairs(NULL), + mPairsSize(0), + mPairsCapacity(0) { } @@ -118,6 +118,7 @@ public: virtual PxBroadPhaseType::Enum getType() const { return PxBroadPhaseType::eSAP; } virtual void update(const PxU32 numCpuTasks, PxcScratchAllocator* scratchAllocator, const BroadPhaseUpdateData& updateData, physx::PxBaseTask* continuation, physx::PxBaseTask* narrowPhaseUnblockTask); + virtual void fetchBroadPhaseResults(physx::PxBaseTask*) {} virtual PxU32 getNbCreatedPairs() const { return mCreatedPairsSize; } virtual BroadPhasePairReport* getCreatedPairs() { return mCreatedPairsArray; } diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.cpp b/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.cpp index 9524329c..ddadd59c 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.cpp +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.cpp @@ -36,7 +36,7 @@ using namespace Bp; /////////////////////////////////////////////////////////////////////////////// -MBPUpdateWorkTask::MBPUpdateWorkTask() +MBPUpdateWorkTask::MBPUpdateWorkTask(PxU64 contextId) : MBPTask(contextId) { } @@ -44,7 +44,7 @@ MBPUpdateWorkTask::~MBPUpdateWorkTask() { } -MBPPostUpdateWorkTask::MBPPostUpdateWorkTask() +MBPPostUpdateWorkTask::MBPPostUpdateWorkTask(PxU64 contextId) : MBPTask(contextId) { } diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.h b/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.h index 4993d536..9f392235 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.h +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpMBPTasks.h @@ -47,9 +47,10 @@ namespace physx class MBPTask : public Cm::Task, public shdfnd::UserAllocated { public: - MBPTask() : - mMBP (NULL), - mNumCpuTasks (0) + MBPTask(PxU64 contextId) : + Cm::Task (contextId), + mMBP (NULL), + mNumCpuTasks (0) {} PX_FORCE_INLINE void setBroadphase(Bp::BroadPhaseMBP* mbp) { mMBP = mbp; } @@ -70,7 +71,7 @@ namespace physx class MBPUpdateWorkTask : public MBPTask { public: - MBPUpdateWorkTask(); + MBPUpdateWorkTask(PxU64 contextId); ~MBPUpdateWorkTask(); // PxBaseTask virtual const char* getName() const { return "BpMBP.updateWork"; } @@ -89,7 +90,7 @@ namespace physx class MBPPostUpdateWorkTask : public MBPTask { public: - MBPPostUpdateWorkTask(); + MBPPostUpdateWorkTask(PxU64 contextId); // PxBaseTask virtual const char* getName() const { return "BpMBP.postUpdateWork"; } diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpSAPTasks.h b/PhysX_3.4/Source/LowLevelAABB/src/BpSAPTasks.h index 229f01dc..96442524 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpSAPTasks.h +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpSAPTasks.h @@ -44,7 +44,7 @@ namespace Bp { public: - SapUpdateWorkTask() + SapUpdateWorkTask(PxU64 contextId) : Cm::Task(contextId) { } @@ -72,7 +72,7 @@ namespace Bp { public: - SapPostUpdateWorkTask() + SapPostUpdateWorkTask(PxU64 contextId) : Cm::Task(contextId) { } diff --git a/PhysX_3.4/Source/LowLevelAABB/src/BpSimpleAABBManager.cpp b/PhysX_3.4/Source/LowLevelAABB/src/BpSimpleAABBManager.cpp index ad3adf60..355082bb 100644 --- a/PhysX_3.4/Source/LowLevelAABB/src/BpSimpleAABBManager.cpp +++ b/PhysX_3.4/Source/LowLevelAABB/src/BpSimpleAABBManager.cpp @@ -1514,7 +1514,7 @@ void SimpleAABBManager::reserveShapeSpace(PxU32 nbTotalBounds) #endif SimpleAABBManager::SimpleAABBManager(BroadPhase& bp, BoundsArray& boundsArray, Ps::Array<PxReal, Ps::VirtualAllocator>& contactDistance, PxU32 maxNbAggregates, PxU32 maxNbShapes, Ps::VirtualAllocator& allocator, PxU64 contextID) : - mPostBroadPhase (this, "postBroadPhase"), + mFinalizeUpdateTask (contextID), mChangedHandleMap (allocator), mGroups (allocator), mContactDistance (contactDistance), @@ -1832,10 +1832,15 @@ void SimpleAABBManager::handleOriginShift() // PT: TODO: check that aggregates code is correct here for(PxU32 i=0; i<mUsedSize; i++) { - if(!mAddedHandleMap.test(i) && mGroups[i] != PX_INVALID_U32) + if(mGroups[i] == PX_INVALID_U32) + continue; + { if(mVolumeData[i].isSingleActor()) - mUpdatedHandles.pushBack(i); // PT: TODO: BoundsIndex-to-ShapeHandle confusion here + { + if(!mAddedHandleMap.test(i)) + mUpdatedHandles.pushBack(i); // PT: TODO: BoundsIndex-to-ShapeHandle confusion here + } else if(mVolumeData[i].isAggregate()) { const AggregateHandle aggregateHandle = mVolumeData[i].getAggregate(); @@ -1846,7 +1851,8 @@ void SimpleAABBManager::handleOriginShift() aggregate->allocateBounds(); aggregate->computeBounds(mBoundsArray, mContactDistance.begin()); mBoundsArray.begin()[aggregate->mIndex] = aggregate->mBounds; - mUpdatedHandles.pushBack(i); // PT: TODO: BoundsIndex-to-ShapeHandle confusion here + if(!mAddedHandleMap.test(i)) + mUpdatedHandles.pushBack(i); // PT: TODO: BoundsIndex-to-ShapeHandle confusion here } } } @@ -1888,7 +1894,7 @@ void SimpleAABBManager::startAggregateBoundsComputationTasks(PxU32 nbToGo, PxU32 PxU32 start = 0; while(nbToGo) { - AggregateBoundsComputationTask* T = PX_PLACEMENT_NEW(flushPool.allocate(sizeof(AggregateBoundsComputationTask)), AggregateBoundsComputationTask()); + AggregateBoundsComputationTask* T = PX_PLACEMENT_NEW(flushPool.allocate(sizeof(AggregateBoundsComputationTask)), AggregateBoundsComputationTask(mContextID)); const PxU32 nb = nbToGo < nbAggregatesPerTask ? nbToGo : nbAggregatesPerTask; T->Init(this, start, nb, mDirtyAggregates.begin()); @@ -2096,20 +2102,18 @@ void SimpleAABBManager::finalizeUpdate(PxU32 numCpuTasks, PxcScratchAllocator* s mPersistentStateChanged = false; PX_ASSERT(updateData.isValid()); - mPostBroadPhase.setContinuation(continuation); - + //KS - skip broad phase if there are no updated shapes. if (updateData.getNumCreatedHandles() != 0 || updateData.getNumRemovedHandles() != 0 || updateData.getNumUpdatedHandles() != 0) - mBroadPhase.update(numCpuTasks, scratchAllocator, updateData, &mPostBroadPhase, narrowPhaseUnlockTask); - else if (narrowPhaseUnlockTask) + mBroadPhase.update(numCpuTasks, scratchAllocator, updateData, continuation, narrowPhaseUnlockTask); + else narrowPhaseUnlockTask->removeReference(); - mPostBroadPhase.removeReference(); } static PX_FORCE_INLINE void createOverlap(Ps::Array<AABBOverlap>* overlaps, const Ps::Array<VolumeData>& volumeData, PxU32 id0, PxU32 id1, ActorHandle handle) { // overlaps.pushBack(AABBOverlap(volumeData[id0].userData, volumeData[id1].userData, handle)); - PxU8 volumeType = PxMax(volumeData[id0].getVolumeType(), volumeData[id1].getVolumeType()); + const PxU8 volumeType = PxMax(volumeData[id0].getVolumeType(), volumeData[id1].getVolumeType()); overlaps[volumeType].pushBack(AABBOverlap(reinterpret_cast<void*>(size_t(id0)), reinterpret_cast<void*>(size_t(id1)), handle)); } @@ -2119,8 +2123,8 @@ static PX_FORCE_INLINE void deleteOverlap(Ps::Array<AABBOverlap>* overlaps, cons // PX_ASSERT(volumeData[id1].userData); if (volumeData[id0].getUserData() && volumeData[id1].getUserData()) // PT: TODO: no idea if this is the right thing to do or if it's normal to get null ptrs here { - PxU8 volumeType = PxMax(volumeData[id0].getVolumeType(), volumeData[id1].getVolumeType()); - // overlaps.pushBack(AABBOverlap(volumeData[id0].userData, volumeData[id1].userData, handle)); + const PxU8 volumeType = PxMax(volumeData[id0].getVolumeType(), volumeData[id1].getVolumeType()); +// overlaps.pushBack(AABBOverlap(volumeData[id0].userData, volumeData[id1].userData, handle)); overlaps[volumeType].pushBack(AABBOverlap(reinterpret_cast<void*>(size_t(id0)), reinterpret_cast<void*>(size_t(id1)), handle)); } } @@ -2440,7 +2444,7 @@ static void processAggregatePairs(AggPairMap& map, SimpleAABBManager& manager) } } -void SimpleAABBManager::postBroadPhase(PxBaseTask*) +void SimpleAABBManager::postBroadPhase(PxBaseTask*, PxBaseTask* narrowPhaseUnlockTask) { PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase", getContextId()); @@ -2449,33 +2453,52 @@ void SimpleAABBManager::postBroadPhase(PxBaseTask*) // PT: TODO: consider merging mCreatedOverlaps & mDestroyedOverlaps // PT: TODO: revisit memory management of mCreatedOverlaps & mDestroyedOverlaps + //KS - if we ran broad phase, fetch the results now + if (mAddedHandles.size() != 0 || mUpdatedHandles.size() != 0 || mRemovedHandles.size() != 0) + mBroadPhase.fetchBroadPhaseResults(narrowPhaseUnlockTask); + for (PxU32 i = 0; i < VolumeBuckets::eCOUNT; ++i) { resetOrClear(mCreatedOverlaps[i]); resetOrClear(mDestroyedOverlaps[i]); } -// processBPPairs<CreatedPairHandler>(mBroadPhase.getNbCreatedPairs(), mBroadPhase.getCreatedPairs(), *this); - processBPPairs<DeletedPairHandler>(mBroadPhase.getNbDeletedPairs(), mBroadPhase.getDeletedPairs(), *this); + { + PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase - process deleted pairs", getContextId()); +// processBPPairs<CreatedPairHandler>(mBroadPhase.getNbCreatedPairs(), mBroadPhase.getCreatedPairs(), *this); + processBPPairs<DeletedPairHandler>(mBroadPhase.getNbDeletedPairs(), mBroadPhase.getDeletedPairs(), *this); + } { - processAggregatePairs(mActorAggregatePairs, *this); - processAggregatePairs(mAggregateAggregatePairs, *this); + { + PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase - process actor-aggregate pairs", getContextId()); + processAggregatePairs(mActorAggregatePairs, *this); + } + { + PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase - process aggregate pairs", getContextId()); + processAggregatePairs(mAggregateAggregatePairs, *this); + } - const PxU32 size = mDirtyAggregates.size(); - for(PxU32 i=0;i<size;i++) { - Aggregate* aggregate = mDirtyAggregates[i]; - aggregate->resetDirtyState(); + PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase - aggregate self-collisions", getContextId()); + const PxU32 size = mDirtyAggregates.size(); + for(PxU32 i=0;i<size;i++) + { + Aggregate* aggregate = mDirtyAggregates[i]; + aggregate->resetDirtyState(); - if(aggregate->mSelfCollisionPairs) - updatePairs(*aggregate->mSelfCollisionPairs); + if(aggregate->mSelfCollisionPairs) + updatePairs(*aggregate->mSelfCollisionPairs); + } + resetOrClear(mDirtyAggregates); } - resetOrClear(mDirtyAggregates); } - processBPPairs<CreatedPairHandler>(mBroadPhase.getNbCreatedPairs(), mBroadPhase.getCreatedPairs(), *this); -// processBPPairs<DeletedPairHandler>(mBroadPhase.getNbDeletedPairs(), mBroadPhase.getDeletedPairs(), *this); + { + PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase - process created pairs", getContextId()); + processBPPairs<CreatedPairHandler>(mBroadPhase.getNbCreatedPairs(), mBroadPhase.getCreatedPairs(), *this); +// processBPPairs<DeletedPairHandler>(mBroadPhase.getNbDeletedPairs(), mBroadPhase.getDeletedPairs(), *this); + } // PT: TODO: revisit this // Filter out pairs in mDestroyedOverlaps that already exist in mCreatedOverlaps. This should be done better using bitmaps @@ -2483,6 +2506,8 @@ void SimpleAABBManager::postBroadPhase(PxBaseTask*) // We could also have a dedicated function "reinsertBroadPhase()", which would preserve the existing interactions at Sc-level. if(1) { + PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase - post-process", getContextId()); + PxU32 totalCreatedOverlaps = 0; for (PxU32 idx = 0; idx < VolumeBuckets::eCOUNT; ++idx) totalCreatedOverlaps += mCreatedOverlaps[idx].size(); @@ -2523,6 +2548,7 @@ void SimpleAABBManager::postBroadPhase(PxBaseTask*) // Handle out-of-bounds objects { + PX_PROFILE_ZONE("SimpleAABBManager::postBroadPhase - out-of-bounds", getContextId()); PxU32 nbObjects = mBroadPhase.getNbOutOfBoundsObjects(); const PxU32* objects = mBroadPhase.getOutOfBoundsObjects(); while(nbObjects--) |