aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/module/fieldsampler/src/ModuleFieldSamplerImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'APEX_1.4/module/fieldsampler/src/ModuleFieldSamplerImpl.cpp')
-rw-r--r--APEX_1.4/module/fieldsampler/src/ModuleFieldSamplerImpl.cpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/APEX_1.4/module/fieldsampler/src/ModuleFieldSamplerImpl.cpp b/APEX_1.4/module/fieldsampler/src/ModuleFieldSamplerImpl.cpp
new file mode 100644
index 00000000..7634c180
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/ModuleFieldSamplerImpl.cpp
@@ -0,0 +1,281 @@
+/*
+ * 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 "ModuleFieldSamplerImpl.h"
+#include "ModuleFieldSamplerRegistration.h"
+#include "FieldSamplerScene.h"
+#include "FieldSamplerManager.h"
+#include "SceneIntl.h"
+#include "PsMemoryBuffer.h"
+#include "ModulePerfScope.h"
+using namespace fieldsampler;
+
+#include "ApexSDKIntl.h"
+#include "ApexUsingNamespace.h"
+
+#include "Lock.h"
+
+#include "ReadCheck.h"
+#include "WriteCheck.h"
+
+namespace nvidia
+{
+namespace apex
+{
+
+#if defined(_USRDLL)
+
+/* Modules don't have to link against the framework, they keep their own */
+ApexSDKIntl* gApexSdk = 0;
+ApexSDK* GetApexSDK()
+{
+ return gApexSdk;
+}
+ApexSDKIntl* GetInternalApexSDK()
+{
+ return gApexSdk;
+}
+
+APEX_API Module* CALL_CONV createModule(
+ ApexSDKIntl* inSdk,
+ ModuleIntl** niRef,
+ uint32_t APEXsdkVersion,
+ uint32_t PhysXsdkVersion,
+ ApexCreateError* errorCode)
+{
+ if (APEXsdkVersion != APEX_SDK_VERSION)
+ {
+ if (errorCode)
+ {
+ *errorCode = APEX_CE_WRONG_VERSION;
+ }
+ return NULL;
+ }
+
+ if (PhysXsdkVersion != PX_PHYSICS_VERSION)
+ {
+ if (errorCode)
+ {
+ *errorCode = APEX_CE_WRONG_VERSION;
+ }
+ return NULL;
+ }
+
+ gApexSdk = inSdk;
+ ModuleFieldSamplerImpl* impl = PX_NEW(ModuleFieldSampler)(inSdk);
+ *niRef = (ModuleIntl*) impl;
+ return (Module*) impl;
+}
+
+#else
+/* Statically linking entry function */
+void instantiateModuleFieldSampler()
+{
+ ApexSDKIntl* sdk = GetInternalApexSDK();
+ nvidia::fieldsampler::ModuleFieldSamplerImpl* impl = PX_NEW(fieldsampler::ModuleFieldSamplerImpl)(sdk);
+ sdk->registerExternalModule((Module*) impl, (ModuleIntl*) impl);
+}
+#endif // `defined(_USRDLL)
+}
+
+namespace fieldsampler
+{
+/* === ModuleFieldSamplerImpl Implementation === */
+ModuleFieldSamplerImpl::ModuleFieldSamplerImpl(ApexSDKIntl* sdk)
+{
+ mName = "FieldSampler";
+ mSdk = sdk;
+ mApiProxy = this;
+ mModuleParams = NULL;
+
+ /* Register the NvParameterized factories */
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ ModuleFieldSamplerRegistration::invokeRegistration(traits);
+}
+
+ModuleFieldSamplerImpl::~ModuleFieldSamplerImpl()
+{
+}
+
+void ModuleFieldSamplerImpl::destroy()
+{
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+
+ if (mModuleParams)
+ {
+ mModuleParams->destroy();
+ mModuleParams = NULL;
+ }
+
+ ModuleBase::destroy();
+
+ if (traits)
+ {
+ /* Remove the NvParameterized factories */
+ ModuleFieldSamplerRegistration::invokeUnregistration(traits);
+ }
+
+ delete this;
+}
+
+void ModuleFieldSamplerImpl::init(NvParameterized::Interface&)
+{
+}
+
+NvParameterized::Interface* ModuleFieldSamplerImpl::getDefaultModuleDesc()
+{
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+
+ if (!mModuleParams)
+ {
+ mModuleParams = DYNAMIC_CAST(FieldSamplerModuleParameters*)
+ (traits->createNvParameterized("FieldSamplerModuleParameters"));
+ PX_ASSERT(mModuleParams);
+ }
+ else
+ {
+ mModuleParams->initDefaults();
+ }
+
+ return mModuleParams;
+}
+
+FieldSamplerManagerIntl* ModuleFieldSamplerImpl::getInternalFieldSamplerManager(const Scene& apexScene)
+{
+ FieldSamplerScene* scene = ModuleFieldSamplerImpl::getFieldSamplerScene(apexScene);
+ return scene->getManager();
+}
+
+
+AuthObjTypeID ModuleFieldSamplerImpl::getModuleID() const
+{
+ return 0;
+}
+
+
+/* == Example Scene methods == */
+ModuleSceneIntl* ModuleFieldSamplerImpl::createInternalModuleScene(SceneIntl& scene, RenderDebugInterface* debugRender)
+{
+#if APEX_CUDA_SUPPORT
+ READ_LOCK(scene);
+ if (scene.getTaskManager()->getGpuDispatcher() && scene.isUsingCuda())
+ {
+ return PX_NEW(FieldSamplerSceneGPU)(*this, scene, debugRender, mFieldSamplerScenes);
+ }
+ else
+#endif
+ return PX_NEW(FieldSamplerSceneCPU)(*this, scene, debugRender, mFieldSamplerScenes);
+}
+
+void ModuleFieldSamplerImpl::releaseModuleSceneIntl(ModuleSceneIntl& scene)
+{
+ FieldSamplerScene* es = DYNAMIC_CAST(FieldSamplerScene*)(&scene);
+ es->destroy();
+}
+
+nvidia::fieldsampler::FieldSamplerScene* ModuleFieldSamplerImpl::getFieldSamplerScene(const Scene& apexScene) const
+{
+ for (uint32_t i = 0 ; i < mFieldSamplerScenes.getSize() ; i++)
+ {
+ FieldSamplerScene* es = DYNAMIC_CAST(FieldSamplerScene*)(mFieldSamplerScenes.getResource(i));
+ if (es->mApexScene == &apexScene)
+ {
+ return es;
+ }
+ }
+
+ PX_ASSERT(!"Unable to locate an appropriate FieldSamplerScene");
+ return NULL;
+}
+
+RenderableIterator* ModuleFieldSamplerImpl::createRenderableIterator(const Scene& apexScene)
+{
+ FieldSamplerScene* es = getFieldSamplerScene(apexScene);
+ if (es)
+ {
+ return es->createRenderableIterator();
+ }
+
+ return NULL;
+}
+
+
+
+bool ModuleFieldSamplerImpl::setFieldSamplerWeightedCollisionFilterCallback(const Scene& apexScene,FieldSamplerWeightedCollisionFilterCallback *callback)
+{
+ WRITE_ZONE();
+ FieldSamplerScene* scene = getFieldSamplerScene(apexScene);
+ if (scene != NULL)
+ {
+ DYNAMIC_CAST(FieldSamplerManager*)(scene->getManager())->setFieldSamplerWeightedCollisionFilterCallback(callback);
+ return true;
+ }
+ return false;
+
+}
+
+#if PX_PHYSICS_VERSION_MAJOR == 3
+void ModuleFieldSamplerImpl::enablePhysXMonitor(const Scene& apexScene, bool enable)
+{
+ WRITE_ZONE();
+ getFieldSamplerScene(apexScene)->enablePhysXMonitor(enable);
+}
+
+void ModuleFieldSamplerImpl::setPhysXMonitorFilterData(const Scene& apexScene, physx::PxFilterData filterData)
+{
+ WRITE_ZONE();
+ getFieldSamplerScene(apexScene)->setPhysXFilterData(filterData);
+}
+#endif
+
+uint32_t ModuleFieldSamplerImpl::createForceSampleBatch(const Scene& apexScene, uint32_t maxCount, const physx::PxFilterData filterData)
+{
+ WRITE_ZONE();
+ FieldSamplerScene* fsScene = getFieldSamplerScene(apexScene);
+ if (fsScene)
+ {
+ return fsScene->createForceSampleBatch(maxCount, filterData);
+ }
+ return (uint32_t)~0;
+}
+
+
+void ModuleFieldSamplerImpl::releaseForceSampleBatch(const Scene& apexScene, uint32_t batchId)
+{
+ WRITE_ZONE();
+ FieldSamplerScene* fsScene = getFieldSamplerScene(apexScene);
+ if (fsScene)
+ {
+ fsScene->releaseForceSampleBatch(batchId);
+ }
+}
+
+
+void ModuleFieldSamplerImpl::submitForceSampleBatch(const Scene& apexScene, uint32_t batchId,
+ PxVec4* forces, const uint32_t forcesStride,
+ const PxVec3* positions, const uint32_t positionsStride,
+ const PxVec3* velocities, const uint32_t velocitiesStride,
+ const float* mass, const uint32_t massStride,
+ const uint32_t* indices, const uint32_t numIndices)
+{
+ WRITE_ZONE();
+ FieldSamplerScene* fsScene = getFieldSamplerScene(apexScene);
+ if (fsScene)
+ {
+ fsScene->submitForceSampleBatch(batchId, forces, forcesStride, positions, positionsStride, velocities, velocitiesStride, mass, massStride, indices, numIndices);
+ }
+}
+
+
+}
+} // end namespace nvidia::apex