diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/module/fieldsampler/src/FieldSamplerManager.cpp | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'APEX_1.4/module/fieldsampler/src/FieldSamplerManager.cpp')
| -rw-r--r-- | APEX_1.4/module/fieldsampler/src/FieldSamplerManager.cpp | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/APEX_1.4/module/fieldsampler/src/FieldSamplerManager.cpp b/APEX_1.4/module/fieldsampler/src/FieldSamplerManager.cpp new file mode 100644 index 00000000..a7c83f88 --- /dev/null +++ b/APEX_1.4/module/fieldsampler/src/FieldSamplerManager.cpp @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + + +#include "ApexDefs.h" +#include "Apex.h" + +#include "FieldSamplerManager.h" + +#include "FieldSamplerQuery.h" +#include "FieldSamplerSceneWrapper.h" +#include "FieldSamplerWrapper.h" +#include "FieldBoundaryWrapper.h" + +#include "SceneIntl.h" + +namespace nvidia +{ +namespace fieldsampler +{ + +FieldSamplerManager::FieldSamplerManager(FieldSamplerScene* scene) + : mScene(scene) + , mFieldSamplerGroupsFilteringChanged(true) +{ + mWeightedCallback = NULL; +} + + +PX_INLINE void FieldSamplerManager::addFieldSamplerToQuery(FieldSamplerWrapper* fieldSamplerWrapper, FieldSamplerQuery* query) +{ + if (query->addFieldSampler(fieldSamplerWrapper)) + { + fieldSamplerWrapper->mQueryRefCount += 1; + } +} + +void FieldSamplerManager::addAllFieldSamplersToQuery(FieldSamplerQuery* query) const +{ + for (uint32_t i = 0; i < mFieldSamplerWrapperList.getSize(); ++i) + { + addFieldSamplerToQuery(static_cast<FieldSamplerWrapper*>(mFieldSamplerWrapperList.getResource(i)), query); + } +} + +void FieldSamplerManager::submitTasks() +{ + if (mFieldSamplerGroupsFilteringChanged) + { + mFieldSamplerGroupsFilteringChanged = false; + + //clear queryRefCounts + for (uint32_t i = 0; i < mFieldSamplerWrapperList.getSize(); ++i) + { + FieldSamplerWrapper* fieldSamplerWrapper = static_cast<FieldSamplerWrapper*>(mFieldSamplerWrapperList.getResource(i)); + fieldSamplerWrapper->mQueryRefCount = 0; + } + + //rebuild all connection based on changed collision checking + for (uint32_t i = 0; i < mFieldSamplerQueryList.getSize(); ++i) + { + FieldSamplerQuery* query = DYNAMIC_CAST(FieldSamplerQuery*)(mFieldSamplerQueryList.getResource(i)); + query->clearAllFieldSamplers(); + addAllFieldSamplersToQuery(query); + } + } + + for (uint32_t i = 0; i < mFieldSamplerQueryList.getSize(); ++i) + { + FieldSamplerQuery* query = DYNAMIC_CAST(FieldSamplerQuery*)(mFieldSamplerQueryList.getResource(i)); + query->submitTasks(); + } +} + +void FieldSamplerManager::setTaskDependencies() +{ + for (uint32_t i = 0; i < mFieldSamplerQueryList.getSize(); ++i) + { + FieldSamplerQuery* query = DYNAMIC_CAST(FieldSamplerQuery*)(mFieldSamplerQueryList.getResource(i)); + query->setTaskDependencies(); + } + + //update + for (uint32_t i = 0; i < mFieldBoundaryWrapperList.getSize(); ++i) + { + FieldBoundaryWrapper* wrapper = DYNAMIC_CAST(FieldBoundaryWrapper*)(mFieldBoundaryWrapperList.getResource(i)); + wrapper->update(); + } + for (uint32_t i = 0; i < mFieldSamplerWrapperList.getSize(); ++i) + { + FieldSamplerWrapper* wrapper = DYNAMIC_CAST(FieldSamplerWrapper*)(mFieldSamplerWrapperList.getResource(i)); + wrapper->update(); + } + for (uint32_t i = 0; i < mFieldSamplerSceneWrapperList.getSize(); ++i) + { + FieldSamplerSceneWrapper* wrapper = DYNAMIC_CAST(FieldSamplerSceneWrapper*)(mFieldSamplerSceneWrapperList.getResource(i)); + wrapper->update(); + } + for (uint32_t i = 0; i < mFieldSamplerQueryList.getSize(); ++i) + { + FieldSamplerQuery* query = DYNAMIC_CAST(FieldSamplerQuery*)(mFieldSamplerQueryList.getResource(i)); + query->update(); + } + + //postUpdate + for (uint32_t i = 0; i < mFieldSamplerSceneWrapperList.getSize(); ++i) + { + FieldSamplerSceneWrapper* wrapper = DYNAMIC_CAST(FieldSamplerSceneWrapper*)(mFieldSamplerSceneWrapperList.getResource(i)); + wrapper->postUpdate(); + } +} + +void FieldSamplerManager::fetchResults() +{ + for (uint32_t i = 0; i < mFieldSamplerQueryList.getSize(); ++i) + { + FieldSamplerQuery* query = DYNAMIC_CAST(FieldSamplerQuery*)(mFieldSamplerQueryList.getResource(i)); + query->fetchResults(); + } +} + + +FieldSamplerQueryIntl* FieldSamplerManager::createFieldSamplerQuery(const FieldSamplerQueryDescIntl& desc) +{ + FieldSamplerQuery* query = allocateFieldSamplerQuery(desc); + if (query) + { + addAllFieldSamplersToQuery(query); + } + return query; +} + +void FieldSamplerManager::registerFieldSampler(FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneIntl* fieldSamplerScene) +{ + FieldSamplerSceneWrapper* fieldSamplerSceneWrapper = NULL; + //find FieldSamplerSceneWrapper + for (uint32_t i = 0; i < mFieldSamplerSceneWrapperList.getSize(); ++i) + { + FieldSamplerSceneWrapper* wrapper = DYNAMIC_CAST(FieldSamplerSceneWrapper*)(mFieldSamplerSceneWrapperList.getResource(i)); + if (wrapper->getInternalFieldSamplerScene() == fieldSamplerScene) + { + fieldSamplerSceneWrapper = wrapper; + break; + } + } + if (fieldSamplerSceneWrapper == NULL) + { + fieldSamplerSceneWrapper = allocateFieldSamplerSceneWrapper(fieldSamplerScene); + } + PX_ASSERT(fieldSamplerSceneWrapper != NULL); + + FieldSamplerWrapper* fieldSamplerWrapper = allocateFieldSamplerWrapper(fieldSampler, fieldSamplerDesc, fieldSamplerSceneWrapper); + PX_ASSERT(fieldSamplerWrapper != NULL); + + // add all mFieldBoundaryWrapperList + for (uint32_t i = 0; i < mFieldBoundaryWrapperList.getSize(); ++i) + { + FieldBoundaryWrapper* wrapper = DYNAMIC_CAST(FieldBoundaryWrapper*)(mFieldBoundaryWrapperList.getResource(i)); + fieldSamplerWrapper->addFieldBoundary(wrapper); + } + + for (uint32_t i = 0; i < mFieldSamplerQueryList.getSize(); ++i) + { + FieldSamplerQuery* query = DYNAMIC_CAST(FieldSamplerQuery*)(mFieldSamplerQueryList.getResource(i)); + addFieldSamplerToQuery(fieldSamplerWrapper, query); + } +} + +void FieldSamplerManager::unregisterFieldSampler(FieldSamplerIntl* fieldSampler) +{ + FieldSamplerWrapper* fieldSamplerWrapper = NULL; + //find FieldSamplerWrapper + for (uint32_t i = 0; i < mFieldSamplerWrapperList.getSize(); ++i) + { + FieldSamplerWrapper* wrapper = static_cast<FieldSamplerWrapper*>(mFieldSamplerWrapperList.getResource(i)); + if (wrapper->getInternalFieldSampler() == fieldSampler) + { + fieldSamplerWrapper = wrapper; + break; + } + } + if (fieldSamplerWrapper != NULL) + { + for (uint32_t i = 0; i < mFieldSamplerQueryList.getSize(); ++i) + { + FieldSamplerQuery* query = DYNAMIC_CAST(FieldSamplerQuery*)(mFieldSamplerQueryList.getResource(i)); + query->removeFieldSampler(fieldSamplerWrapper); + } + fieldSamplerWrapper->release(); + } +} + +void FieldSamplerManager::registerFieldBoundary(FieldBoundaryIntl* fieldBoundary, const FieldBoundaryDescIntl& fieldBoundaryDesc) +{ + FieldBoundaryWrapper* fieldBoundaryWrapper = PX_NEW(FieldBoundaryWrapper)(mFieldBoundaryWrapperList, this, fieldBoundary, fieldBoundaryDesc); + if (fieldBoundaryWrapper) + { + for (uint32_t i = 0; i < mFieldSamplerWrapperList.getSize(); ++i) + { + static_cast<FieldSamplerWrapper*>(mFieldSamplerWrapperList.getResource(i))->addFieldBoundary(fieldBoundaryWrapper); + } + } +} +void FieldSamplerManager::unregisterFieldBoundary(FieldBoundaryIntl* fieldBoundary) +{ + FieldBoundaryWrapper* fieldBoundaryWrapper = 0; + for (uint32_t i = 0; i < mFieldBoundaryWrapperList.getSize(); ++i) + { + FieldBoundaryWrapper* wrapper = static_cast<FieldBoundaryWrapper*>(mFieldBoundaryWrapperList.getResource(i)); + if (wrapper->getInternalFieldBoundary() == fieldBoundary) + { + fieldBoundaryWrapper = wrapper; + break; + } + } + if (fieldBoundaryWrapper != 0) + { + for (uint32_t i = 0; i < mFieldSamplerWrapperList.getSize(); ++i) + { + static_cast<FieldSamplerWrapper*>(mFieldSamplerWrapperList.getResource(i))->removeFieldBoundary(fieldBoundaryWrapper); + } + fieldBoundaryWrapper->release(); + } +} + +void FieldSamplerManager::registerUnhandledParticleSystem(physx::PxActor* actor) +{ + if (!isUnhandledParticleSystem(actor)) + { + mUnhandledParticleSystems.pushBack(actor); + } +} + +void FieldSamplerManager::unregisterUnhandledParticleSystem(physx::PxActor* actor) +{ + mUnhandledParticleSystems.findAndReplaceWithLast(actor); +} + +bool FieldSamplerManager::isUnhandledParticleSystem(physx::PxActor* actor) +{ + for (uint32_t i = 0; i < mUnhandledParticleSystems.size(); i++) + if (mUnhandledParticleSystems[i] == actor) + { + return true; + } + return false; +} + +bool FieldSamplerManager::getFieldSamplerGroupsFiltering(const PxFilterData &o1,const PxFilterData &o2,float &weight) const +{ + bool ret = true; + + weight = 1.0f; + if ( mScene ) + { + if ( mWeightedCallback ) + { + ret = mWeightedCallback->fieldSamplerWeightedCollisionFilter(o1,o2,weight); + } + else + { + physx::PxScene *scene = mScene->getModulePhysXScene(); + scene->lockRead(__FILE__,__LINE__); + physx::PxSimulationFilterShader shader = scene->getFilterShader(); + scene->unlockRead(); + if ( shader ) + { + physx::PxFilterObjectAttributes atr0 = 0; + physx::PxFilterObjectAttributes atr1 = 0; + physx::PxPairFlags pairFlags; + physx::PxFilterFlags result = (*shader)(atr0,o1,atr1,o2,pairFlags,NULL,0); + if ( result & (physx::PxFilterFlag::eKILL | physx::PxFilterFlag::eSUPPRESS) ) + { + ret = false; + } + } + } + } + return ret; +} + + + + +/******************************** CPU Version ********************************/ + +FieldSamplerQuery* FieldSamplerManagerCPU::allocateFieldSamplerQuery(const FieldSamplerQueryDescIntl& desc) +{ + return PX_NEW(FieldSamplerQueryCPU)(desc, mFieldSamplerQueryList, this); +} +FieldSamplerSceneWrapper* FieldSamplerManagerCPU::allocateFieldSamplerSceneWrapper(FieldSamplerSceneIntl* fieldSamplerScene) +{ + return PX_NEW(FieldSamplerSceneWrapperCPU)(mFieldSamplerSceneWrapperList, this, fieldSamplerScene); +} +FieldSamplerWrapper* FieldSamplerManagerCPU::allocateFieldSamplerWrapper(FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper) +{ + return PX_NEW(FieldSamplerWrapperCPU)(mFieldSamplerWrapperList, this, fieldSampler, fieldSamplerDesc, fieldSamplerSceneWrapper); +} + +/******************************** GPU Version ********************************/ + +#if APEX_CUDA_SUPPORT + +FieldSamplerQuery* FieldSamplerManagerGPU::allocateFieldSamplerQuery(const FieldSamplerQueryDescIntl& desc) +{ + return PX_NEW(FieldSamplerQueryGPU)(desc, mFieldSamplerQueryList, this); +} +FieldSamplerSceneWrapper* FieldSamplerManagerGPU::allocateFieldSamplerSceneWrapper(FieldSamplerSceneIntl* fieldSamplerScene) +{ + return PX_NEW(FieldSamplerSceneWrapperGPU)(mFieldSamplerSceneWrapperList, this, fieldSamplerScene); +} +FieldSamplerWrapper* FieldSamplerManagerGPU::allocateFieldSamplerWrapper(FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper) +{ + return PX_NEW(FieldSamplerWrapperGPU)(mFieldSamplerWrapperList, this, fieldSampler, fieldSamplerDesc, fieldSamplerSceneWrapper); +} + +#endif // APEX_CUDA_SUPPORT + +} +} // end namespace nvidia::apex + + |