aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/PhysX/src
diff options
context:
space:
mode:
Diffstat (limited to 'PhysX_3.4/Source/PhysX/src')
-rw-r--r--PhysX_3.4/Source/PhysX/src/NpScene.cpp129
-rw-r--r--PhysX_3.4/Source/PhysX/src/NpScene.h10
-rw-r--r--PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp14
-rw-r--r--PhysX_3.4/Source/PhysX/src/NpSceneQueries.h11
4 files changed, 162 insertions, 2 deletions
diff --git a/PhysX_3.4/Source/PhysX/src/NpScene.cpp b/PhysX_3.4/Source/PhysX/src/NpScene.cpp
index 52b89e21..4ba6334a 100644
--- a/PhysX_3.4/Source/PhysX/src/NpScene.cpp
+++ b/PhysX_3.4/Source/PhysX/src/NpScene.cpp
@@ -99,12 +99,17 @@ NpSceneQueries::NpSceneQueries(const PxSceneDesc& desc) :
mSQManager (mScene, desc.staticStructure, desc.dynamicStructure, desc.dynamicTreeRebuildRateHint, desc.limits),
mCachedRaycastFuncs (Gu::getRaycastFuncTable()),
mCachedSweepFuncs (Gu::getSweepFuncTable()),
- mCachedOverlapFuncs (Gu::getOverlapFuncTable())
+ mCachedOverlapFuncs (Gu::getOverlapFuncTable()),
+ mSceneQueriesStaticPrunerUpdate (getContextId(), 0, "NpSceneQueries.sceneQueriesStaticPrunerUpdate"),
+ mSceneQueriesDynamicPrunerUpdate(getContextId(), 0, "NpSceneQueries.sceneQueriesDynamicPrunerUpdate"),
+ mSceneQueryUpdateMode (desc.sceneQueryUpdateMode)
#if PX_SUPPORT_PVD
, mSingleSqCollector (mScene, false),
mBatchedSqCollector (mScene, true)
#endif
{
+ mSceneQueriesStaticPrunerUpdate.setObject(this);
+ mSceneQueriesDynamicPrunerUpdate.setObject(this);
}
NpScene::NpScene(const PxSceneDesc& desc) :
@@ -124,6 +129,7 @@ NpScene::NpScene(const PxSceneDesc& desc) :
mClientBehaviorFlags (PX_DEBUG_EXP("sceneBehaviorFlags")),
mSceneCompletion (getContextId(), mPhysicsDone),
mCollisionCompletion (getContextId(), mCollisionDone),
+ mSceneQueriesCompletion (getContextId(), mSceneQueriesDone),
mSceneExecution (getContextId(), 0, "NpScene.execution"),
mSceneCollide (getContextId(), 0, "NpScene.collide"),
mSceneAdvance (getContextId(), 0, "NpScene.solve"),
@@ -133,6 +139,7 @@ NpScene::NpScene(const PxSceneDesc& desc) :
mConcurrentReadCount (0),
mConcurrentErrorCount (0),
mCurrentWriter (0),
+ mSceneQueriesUpdateRunning (false),
mHasSimulatedOnce (false),
mBetweenFetchResults (false)
{
@@ -2246,7 +2253,11 @@ void NpScene::fetchResultsPostContactCallbacks()
SqRefFinder sqRefFinder;
mScene.getScScene().syncSceneQueryBounds(mSQManager.getDynamicBoundsSync(), sqRefFinder);
- mSQManager.afterSync(!(getFlagsFast()&PxSceneFlag::eSUPPRESS_EAGER_SCENE_QUERY_REFIT));
+ // A.B. temp check if eSUPPRESS_EAGER_SCENE_QUERY_REFIT was set and update mode not, then replicate the flag to the enum
+ PxSceneQueryUpdateMode::Enum updateMode = getSceneQueryUpdateModeFast();
+ if((getFlagsFast() & PxSceneFlag::eSUPPRESS_EAGER_SCENE_QUERY_REFIT) && updateMode == PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_ENABLED)
+ updateMode = PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_DISABLED;
+ mSQManager.afterSync(updateMode);
#if PX_DEBUG && 0
mSQManager.validateSimUpdates();
@@ -2683,6 +2694,18 @@ void NpScene::releaseVolumeCache(NpVolumeCache* volumeCache)
PX_DELETE(static_cast<NpVolumeCache*>(volumeCache));
}
+void NpScene::setSceneQueryUpdateMode(PxSceneQueryUpdateMode::Enum updateMode)
+{
+ NP_WRITE_CHECK(this);
+ mSceneQueryUpdateMode = updateMode;
+}
+
+PxSceneQueryUpdateMode::Enum NpScene::getSceneQueryUpdateMode() const
+{
+ NP_READ_CHECK(this);
+ return mSceneQueryUpdateMode;
+}
+
void NpScene::setDynamicTreeRebuildRateHint(PxU32 dynamicTreeRebuildRateHint)
{
PX_CHECK_AND_RETURN((dynamicTreeRebuildRateHint >= 4), "PxScene::setDynamicTreeRebuildRateHint(): Param has to be >= 4!");
@@ -3174,6 +3197,108 @@ PxPvdSceneClient* NpScene::getScenePvdClient()
}
#endif
+void NpScene::sceneQueriesUpdate(physx::PxBaseTask* completionTask, bool controlSimulation)
+{
+ PX_SIMD_GUARD;
+
+ bool runUpdateTasks[PruningIndex::eCOUNT] = {true, true};
+ {
+ // write guard must end before scene queries tasks kicks off worker threads
+ NP_WRITE_CHECK(this);
+
+ PX_PROFILE_START_CROSSTHREAD("Basic.sceneQueriesUpdate", getContextId());
+
+ if(mSceneQueriesUpdateRunning)
+ {
+ //fetchSceneQueries doesn't get called
+ Ps::getFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, "PxScene::fetchSceneQueries was not called!");
+ return;
+ }
+
+ // flush scene queries updates
+ mSQManager.flushUpdates();
+
+ // prepare scene queries for build - copy bounds
+ runUpdateTasks[PruningIndex::eSTATIC] = mSQManager.prepareSceneQueriesUpdate(PruningIndex::eSTATIC);
+ runUpdateTasks[PruningIndex::eDYNAMIC] = mSQManager.prepareSceneQueriesUpdate(PruningIndex::eDYNAMIC);
+
+ mSceneQueriesUpdateRunning = true;
+ }
+
+ {
+ PX_PROFILE_ZONE("Sim.sceneQueriesTaskSetup", getContextId());
+
+ if (controlSimulation)
+ {
+ {
+ PX_PROFILE_ZONE("Sim.resetDependencies", getContextId());
+ // Only reset dependencies, etc if we own the TaskManager. Will be false
+ // when an NpScene is controlled by an APEX scene.
+ mTaskManager->resetDependencies();
+ }
+ mTaskManager->startSimulation();
+ }
+
+ mSceneQueriesCompletion.setContinuation(*mTaskManager, completionTask);
+ if(runUpdateTasks[PruningIndex::eSTATIC])
+ mSceneQueriesStaticPrunerUpdate.setContinuation(&mSceneQueriesCompletion);
+ if(runUpdateTasks[PruningIndex::eDYNAMIC])
+ mSceneQueriesDynamicPrunerUpdate.setContinuation(&mSceneQueriesCompletion);
+
+ mSceneQueriesCompletion.removeReference();
+ if(runUpdateTasks[PruningIndex::eSTATIC])
+ mSceneQueriesStaticPrunerUpdate.removeReference();
+ if(runUpdateTasks[PruningIndex::eDYNAMIC])
+ mSceneQueriesDynamicPrunerUpdate.removeReference();
+ }
+}
+
+bool NpScene::checkSceneQueriesInternal(bool block)
+{
+ PX_PROFILE_ZONE("Basic.checkSceneQueries", getContextId());
+ return mSceneQueriesDone.wait(block ? Ps::Sync::waitForever : 0);
+}
+
+bool NpScene::checkQueries(bool block)
+{
+ return checkSceneQueriesInternal(block);
+}
+
+bool NpScene::fetchQueries(bool block)
+{
+ if(!mSceneQueriesUpdateRunning)
+ {
+ //fetchSceneQueries doesn't get called
+ Ps::getFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__,
+ "PxScene::fetchQueries: fetchQueries() called illegally! It must be called after sceneQueriesUpdate()");
+ return false;
+ }
+
+ if(!checkSceneQueriesInternal(block))
+ return false;
+
+ {
+ PX_SIMD_GUARD;
+
+ NP_WRITE_CHECK(this);
+
+ // we use cross thread profile here, to show the event in cross thread view
+ // PT: TODO: why do we want to show it in the cross thread view?
+ PX_PROFILE_START_CROSSTHREAD("Basic.fetchQueries", getContextId());
+
+ // flush updates and commit if work is done
+ mSQManager.flushUpdates();
+
+ PX_PROFILE_STOP_CROSSTHREAD("Basic.fetchQueries", getContextId());
+ PX_PROFILE_STOP_CROSSTHREAD("Basic.sceneQueriesUpdate", getContextId());
+
+ mSceneQueriesDone.reset();
+ mSceneQueriesUpdateRunning = false;
+ }
+ return true;
+}
+
+
PxBatchQuery* NpScene::createBatchQuery(const PxBatchQueryDesc& desc)
{
PX_PROFILE_ZONE("API.createBatchQuery", getContextId());
diff --git a/PhysX_3.4/Source/PhysX/src/NpScene.h b/PhysX_3.4/Source/PhysX/src/NpScene.h
index 4c07f38e..a5e9ca65 100644
--- a/PhysX_3.4/Source/PhysX/src/NpScene.h
+++ b/PhysX_3.4/Source/PhysX/src/NpScene.h
@@ -237,6 +237,11 @@ class NpScene : public NpSceneQueries, public Ps::UserAllocated
virtual void setDynamicTreeRebuildRateHint(PxU32 dynamicTreeRebuildRateHint);
virtual PxU32 getDynamicTreeRebuildRateHint() const;
virtual void forceDynamicTreeRebuild(bool rebuildStaticStructure, bool rebuildDynamicStructure);
+ virtual void sceneQueriesUpdate(physx::PxBaseTask* completionTask, bool controlSimulation);
+ virtual bool checkQueries(bool block);
+ virtual bool fetchQueries(bool block);
+ virtual void setSceneQueryUpdateMode(PxSceneQueryUpdateMode::Enum updateMode);
+ virtual PxSceneQueryUpdateMode::Enum getSceneQueryUpdateMode() const;
virtual void setSolverBatchSize(PxU32 solverBatchSize);
virtual PxU32 getSolverBatchSize(void) const;
@@ -365,6 +370,7 @@ class NpScene : public NpSceneQueries, public Ps::UserAllocated
private:
bool checkResultsInternal(bool block);
bool checkCollisionInternal(bool block);
+ bool checkSceneQueriesInternal(bool block);
void simulateOrCollide(PxReal elapsedTime, physx::PxBaseTask* completionTask, void* scratchBlock, PxU32 scratchBlockSize, bool controlSimulation, const char* invalidCallMsg, Sc::SimulationStage::Enum simStage);
void addRigidStatic(NpRigidStatic& , bool hasPrunerStructure = false);
@@ -422,6 +428,7 @@ private:
Ps::Sync mPhysicsDone; // physics thread signals this when update ready
Ps::Sync mCollisionDone; // physics thread signals this when all collisions ready
+ Ps::Sync mSceneQueriesDone; // physics thread signals this when all scene queries update ready
//legacy timing settings:
@@ -469,6 +476,7 @@ private:
PxTaskManager* mTaskManager;
SceneCompletion mSceneCompletion;
SceneCompletion mCollisionCompletion;
+ SceneCompletion mSceneQueriesCompletion;
SceneExecution mSceneExecution;
SceneCollide mSceneCollide;
SceneAdvance mSceneAdvance;
@@ -485,6 +493,8 @@ private:
Ps::Thread::Id mCurrentWriter;
Ps::ReadWriteLock mRWLock;
+ bool mSceneQueriesUpdateRunning;
+
bool mHasSimulatedOnce;
bool mBetweenFetchResults;
};
diff --git a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp
index 45202c2d..a50844c6 100644
--- a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp
+++ b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp
@@ -819,6 +819,20 @@ bool NpSceneQueries::multiQuery(
}
}
+void NpSceneQueries::sceneQueriesStaticPrunerUpdate(PxBaseTask* )
+{
+ PX_PROFILE_ZONE("SceneQuery.sceneQueriesStaticPrunerUpdate", getContextId());
+ // run pruner build only, this will build the new tree only, no commit happens
+ mSQManager.sceneQueryBuildStep(PruningIndex::eSTATIC);
+}
+
+void NpSceneQueries::sceneQueriesDynamicPrunerUpdate(PxBaseTask*)
+{
+ PX_PROFILE_ZONE("SceneQuery.sceneQueriesDynamicPrunerUpdate", getContextId());
+ // run pruner build only, this will build the new tree only, no commit happens
+ mSQManager.sceneQueryBuildStep(PruningIndex::eDYNAMIC);
+}
+
//explicit template instantiation
template bool NpSceneQueries::multiQuery<PxRaycastHit>(const MultiQueryInput&, PxHitCallback<PxRaycastHit>&, PxHitFlags, const PxQueryCache*, const PxQueryFilterData&, PxQueryFilterCallback*, BatchQueryFilterData*) const;
template bool NpSceneQueries::multiQuery<PxOverlapHit>(const MultiQueryInput&, PxHitCallback<PxOverlapHit>&, PxHitFlags, const PxQueryCache*, const PxQueryFilterData&, PxQueryFilterCallback*, BatchQueryFilterData*) const;
diff --git a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h
index e2ceaf83..b30b7b51 100644
--- a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h
+++ b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h
@@ -176,6 +176,10 @@ public:
PX_FORCE_INLINE const Scb::Scene& getScene() const { return mScene; }
PX_FORCE_INLINE PxU32 getFlagsFast() const { return mScene.getFlags(); }
PX_FORCE_INLINE Sq::SceneQueryManager& getSceneQueryManagerFast() { return mSQManager; }
+ PX_FORCE_INLINE PxSceneQueryUpdateMode::Enum getSceneQueryUpdateModeFast() const { return mSceneQueryUpdateMode; }
+
+ void sceneQueriesStaticPrunerUpdate(PxBaseTask* continuation);
+ void sceneQueriesDynamicPrunerUpdate(PxBaseTask* continuation);
Scb::Scene mScene;
Sq::SceneQueryManager mSQManager;
@@ -184,6 +188,13 @@ public:
const Gu::GeomSweepFuncs& mCachedSweepFuncs;
const Gu::GeomOverlapTable* mCachedOverlapFuncs;
+ typedef Cm::DelegateTask<NpSceneQueries, &NpSceneQueries::sceneQueriesStaticPrunerUpdate> SceneQueriesStaticPrunerUpdate;
+ typedef Cm::DelegateTask<NpSceneQueries, &NpSceneQueries::sceneQueriesDynamicPrunerUpdate> SceneQueriesDynamicPrunerUpdate;
+ SceneQueriesStaticPrunerUpdate mSceneQueriesStaticPrunerUpdate;
+ SceneQueriesDynamicPrunerUpdate mSceneQueriesDynamicPrunerUpdate;
+
+ PxSceneQueryUpdateMode::Enum mSceneQueryUpdateMode;
+
#if PX_SUPPORT_PVD
public:
//Scene query and hits for pvd, collected in current frame