aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/module/fieldsampler
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/module/fieldsampler
downloadphysx-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')
-rw-r--r--APEX_1.4/module/fieldsampler/cuda/include/common.h31
-rw-r--r--APEX_1.4/module/fieldsampler/cuda/include/fieldsampler.h39
-rw-r--r--APEX_1.4/module/fieldsampler/cuda/include/fieldsamplerInc.h155
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldBoundaryWrapper.h85
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldSamplerCommon.h386
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldSamplerManager.h133
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldSamplerPhysXMonitor.h171
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldSamplerQuery.h308
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldSamplerScene.h218
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldSamplerSceneWrapper.h206
-rw-r--r--APEX_1.4/module/fieldsampler/include/FieldSamplerWrapper.h149
-rw-r--r--APEX_1.4/module/fieldsampler/include/ModuleEventDefs.h26
-rw-r--r--APEX_1.4/module/fieldsampler/include/ModuleFieldSamplerImpl.h98
-rw-r--r--APEX_1.4/module/fieldsampler/include/ModuleGpuEventDefs.h26
-rw-r--r--APEX_1.4/module/fieldsampler/include/ModulePerfScope.h18
-rw-r--r--APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerModuleParameters.h230
-rw-r--r--APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerPhysXMonitorParams.h232
-rw-r--r--APEX_1.4/module/fieldsampler/include/autogen/ModuleFieldSamplerRegistration.h117
-rw-r--r--APEX_1.4/module/fieldsampler/src/FieldBoundaryWrapper.cpp45
-rw-r--r--APEX_1.4/module/fieldsampler/src/FieldSamplerManager.cpp329
-rw-r--r--APEX_1.4/module/fieldsampler/src/FieldSamplerPhysXMonitor.cpp354
-rw-r--r--APEX_1.4/module/fieldsampler/src/FieldSamplerQuery.cpp876
-rw-r--r--APEX_1.4/module/fieldsampler/src/FieldSamplerScene.cpp304
-rw-r--r--APEX_1.4/module/fieldsampler/src/FieldSamplerSceneWrapper.cpp143
-rw-r--r--APEX_1.4/module/fieldsampler/src/FieldSamplerWrapper.cpp177
-rw-r--r--APEX_1.4/module/fieldsampler/src/ModuleFieldSamplerImpl.cpp281
-rw-r--r--APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerModuleParameters.cpp318
-rw-r--r--APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerPhysXMonitorParams.cpp358
28 files changed, 5813 insertions, 0 deletions
diff --git a/APEX_1.4/module/fieldsampler/cuda/include/common.h b/APEX_1.4/module/fieldsampler/cuda/include/common.h
new file mode 100644
index 00000000..02332daa
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/cuda/include/common.h
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __COMMON_H__
+#define __COMMON_H__
+
+#define APEX_CUDA_MODULE_PREFIX FieldSampler_
+
+#include "ApexCuda.h"
+#include "InplaceTypes.h"
+
+#include "../include/FieldSamplerCommon.h"
+
+
+namespace physx
+{
+namespace apex
+{
+
+}
+} // namespace physx::apex
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/cuda/include/fieldsampler.h b/APEX_1.4/module/fieldsampler/cuda/include/fieldsampler.h
new file mode 100644
index 00000000..28e4896c
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/cuda/include/fieldsampler.h
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+
+APEX_CUDA_SURFACE_3D(surfRefGridAccum)
+
+
+APEX_CUDA_BOUND_KERNEL(APEX_CUDA_KERNEL_DEFAULT_CONFIG, clearKernel,
+ ((APEX_MEM_BLOCK(float4), g_accumField))((APEX_MEM_BLOCK(float4), g_accumVelocity))
+ )
+
+APEX_CUDA_BOUND_KERNEL(APEX_CUDA_KERNEL_DEFAULT_CONFIG, composeKernel,
+ ((APEX_MEM_BLOCK(float4), g_accumField))((APEX_MEM_BLOCK(const float4), g_accumVelocity))((APEX_MEM_BLOCK(const float4), g_velocity))((float, timestep))
+ )
+
+APEX_CUDA_FREE_KERNEL_3D(APEX_CUDA_KERNEL_DEFAULT_CONFIG, clearGridKernel,
+ ((uint32_t, numX))((uint32_t, numY))((uint32_t, numZ))
+ )
+
+APEX_CUDA_BOUND_KERNEL(APEX_CUDA_KERNEL_DEFAULT_CONFIG, applyParticlesKernel,
+ ((float4*, g_velocity))((const float4*, g_outField))
+ )
+
+#ifdef APEX_TEST
+
+APEX_CUDA_BOUND_KERNEL((), testParticleKernel,
+ ((float4*, g_position))((float4*, g_velocity))
+ ((uint32_t*, g_flag))
+ ((const float4*, g_initPosition))((const float4*, g_initVelocity))
+ )
+
+#endif \ No newline at end of file
diff --git a/APEX_1.4/module/fieldsampler/cuda/include/fieldsamplerInc.h b/APEX_1.4/module/fieldsampler/cuda/include/fieldsamplerInc.h
new file mode 100644
index 00000000..23a9c3fb
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/cuda/include/fieldsamplerInc.h
@@ -0,0 +1,155 @@
+/*
+ * 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.
+ */
+
+
+APEX_CUDA_SURFACE_3D(surfRefFieldSamplerGridAccum)
+
+
+#ifdef FIELD_SAMPLER_SEPARATE_KERNELS
+
+APEX_CUDA_BOUND_KERNEL(FIELD_SAMPLER_POINTS_KERNEL_CONFIG, fieldSamplerPointsKernel,
+ ((nvidia::fieldsampler::FieldSamplerKernelParams, baseParams))
+ ((APEX_MEM_BLOCK(float4), accumField))
+ ((APEX_MEM_BLOCK(float4), accumVelocity))
+ ((APEX_MEM_BLOCK(const float4), positionMass))
+ ((APEX_MEM_BLOCK(const float4), velocity))
+ ((nvidia::fieldsampler::FieldSamplerParamsEx, paramsEx))
+ ((InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams>, queryParamsHandle))
+ ((nvidia::fieldsampler::FieldSamplerKernelMode::Enum, kernelMode))
+ )
+APEX_CUDA_FREE_KERNEL_3D(FIELD_SAMPLER_GRID_KERNEL_CONFIG, fieldSamplerGridKernel,
+ ((nvidia::fieldsampler::FieldSamplerKernelParams, baseParams))
+ ((nvidia::fieldsampler::FieldSamplerGridKernelParams, gridParams))
+ ((nvidia::fieldsampler::FieldSamplerParamsEx, paramsEx))
+ ((InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams>, queryParamsHandle))
+ ((nvidia::fieldsampler::FieldSamplerKernelMode::Enum, kernelMode))
+ )
+
+#ifndef __CUDACC__
+#define LAUNCH_FIELD_SAMPLER_KERNEL( launchData ) \
+ const ApexCudaConstStorage& _storage_ = *getFieldSamplerCudaConstStorage(); \
+ InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams> queryParamsHandle = _storage_.mappedHandle( launchData.queryParamsHandle ); \
+ uint32_t fieldSamplerCount = launchData.fieldSamplerArray->size(); \
+ switch( launchData.kernelType ) \
+ { \
+ case nvidia::fieldsampler::FieldSamplerKernelType::POINTS: \
+ { \
+ const nvidia::fieldsampler::FieldSamplerPointsKernelLaunchDataIntl& data = static_cast<const nvidia::fieldsampler::FieldSamplerPointsKernelLaunchDataIntl&>(launchData); \
+ const nvidia::fieldsampler::FieldSamplerPointsKernelArgs* kernelArgs = static_cast<const nvidia::fieldsampler::FieldSamplerPointsKernelArgs*>(data.kernelArgs); \
+ for (uint32_t i = 0, activeIdx = 0; i < fieldSamplerCount; ++i) \
+ { \
+ const nvidia::fieldsampler::FieldSamplerWrapperGPU* wrapper = static_cast<const nvidia::fieldsampler::FieldSamplerWrapperGPU* >( (*data.fieldSamplerArray)[i].mFieldSamplerWrapper ); \
+ if (wrapper->isEnabled()) \
+ { \
+ nvidia::fieldsampler::FieldSamplerParamsEx paramsEx; \
+ paramsEx.paramsHandle = _storage_.mappedHandle( wrapper->getParamsHandle() ); \
+ paramsEx.multiplier = (*data.fieldSamplerArray)[i].mMultiplier; \
+ nvidia::fieldsampler::FieldSamplerKernelMode::Enum kernelMode = (++activeIdx == data.activeFieldSamplerCount) ? data.kernelMode : nvidia::fieldsampler::FieldSamplerKernelMode::DEFAULT; \
+ ON_LAUNCH_FIELD_SAMPLER_KERNEL( wrapper->getInternalFieldSampler(), wrapper->getInternalFieldSamplerDesc() ); \
+ SCENE_CUDA_OBJ(this, fieldSamplerPointsKernel)( data.stream, data.threadCount, \
+ *static_cast<const nvidia::fieldsampler::FieldSamplerKernelParams*>(kernelArgs), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->accumField, size_t(data.memRefSize)), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->accumVelocity, size_t(data.memRefSize)), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->positionMass, size_t(data.memRefSize), ApexCudaMemFlags::IN), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->velocity, size_t(data.memRefSize), ApexCudaMemFlags::IN), \
+ paramsEx, queryParamsHandle, kernelMode ); \
+ } \
+ } \
+ } \
+ return true; \
+ case nvidia::fieldsampler::FieldSamplerKernelType::GRID: \
+ { \
+ const nvidia::fieldsampler::FieldSamplerGridKernelLaunchDataIntl& data = static_cast<const nvidia::fieldsampler::FieldSamplerGridKernelLaunchDataIntl&>(launchData); \
+ const nvidia::fieldsampler::FieldSamplerGridKernelArgs* kernelArgs = static_cast<const nvidia::fieldsampler::FieldSamplerGridKernelArgs*>(data.kernelArgs); \
+ SCENE_CUDA_OBJ(this, surfRefFieldSamplerGridAccum).bindTo(*data.accumArray, ApexCudaMemFlags::IN_OUT); \
+ for (uint32_t i = 0, activeIdx = 0; i < fieldSamplerCount; ++i) \
+ { \
+ const nvidia::fieldsampler::FieldSamplerWrapperGPU* wrapper = static_cast<const nvidia::fieldsampler::FieldSamplerWrapperGPU* >( (*data.fieldSamplerArray)[i].mFieldSamplerWrapper ); \
+ if (wrapper->isEnabled() && wrapper->getInternalFieldSamplerDesc().gridSupportType == FieldSamplerGridSupportTypeIntl::VELOCITY_PER_CELL) \
+ { \
+ nvidia::fieldsampler::FieldSamplerParamsEx paramsEx; \
+ paramsEx.paramsHandle = _storage_.mappedHandle( wrapper->getParamsHandle() ); \
+ paramsEx.multiplier = (*data.fieldSamplerArray)[i].mMultiplier; \
+ nvidia::fieldsampler::FieldSamplerKernelMode::Enum kernelMode = (++activeIdx == data.activeFieldSamplerCount) ? data.kernelMode : nvidia::fieldsampler::FieldSamplerKernelMode::DEFAULT; \
+ ON_LAUNCH_FIELD_SAMPLER_KERNEL( wrapper->getInternalFieldSampler(), wrapper->getInternalFieldSamplerDesc() ); \
+ SCENE_CUDA_OBJ(this, fieldSamplerGridKernel)( data.stream, data.threadCountX, data.threadCountY, data.threadCountZ, \
+ *static_cast<const nvidia::fieldsampler::FieldSamplerKernelParams*>(kernelArgs), \
+ *static_cast<const nvidia::fieldsampler::FieldSamplerGridKernelParams*>(kernelArgs), \
+ paramsEx, queryParamsHandle, kernelMode ); \
+ } \
+ } \
+ SCENE_CUDA_OBJ(this, surfRefFieldSamplerGridAccum).unbind(); \
+ } \
+ return true; \
+ default: \
+ PX_ALWAYS_ASSERT(); \
+ return false; \
+ };
+#endif
+
+#else
+
+APEX_CUDA_BOUND_KERNEL(FIELD_SAMPLER_POINTS_KERNEL_CONFIG, fieldSamplerPointsKernel,
+ ((nvidia::fieldsampler::FieldSamplerKernelParams, baseParams))
+ ((APEX_MEM_BLOCK(float4), accumField))
+ ((APEX_MEM_BLOCK(float4), accumVelocity))
+ ((APEX_MEM_BLOCK(const float4), positionMass))
+ ((APEX_MEM_BLOCK(const float4), velocity))
+ ((InplaceHandle<nvidia::fieldsampler::FieldSamplerParamsExArray>, paramsExArrayHandle))
+ ((InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams>, queryParamsHandle))
+ ((nvidia::fieldsampler::FieldSamplerKernelMode::Enum, kernelMode))
+ )
+APEX_CUDA_FREE_KERNEL_3D(FIELD_SAMPLER_GRID_KERNEL_CONFIG, fieldSamplerGridKernel,
+ ((nvidia::fieldsampler::FieldSamplerKernelParams, baseParams))
+ ((nvidia::fieldsampler::FieldSamplerGridKernelParams, gridParams))
+ ((InplaceHandle<nvidia::fieldsampler::FieldSamplerParamsExArray>, paramsExArrayHandle))
+ ((InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams>, queryParamsHandle))
+ ((nvidia::fieldsampler::FieldSamplerKernelMode::Enum, kernelMode))
+ )
+
+#ifndef __CUDACC__
+#define LAUNCH_FIELD_SAMPLER_KERNEL( launchData ) \
+ const ApexCudaConstStorage& _storage_ = *getFieldSamplerCudaConstStorage(); \
+ InplaceHandle<nvidia::fieldsampler::FieldSamplerParamsExArray> paramsExArrayHandle = _storage_.mappedHandle( launchData.paramsExArrayHandle ); \
+ InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams> queryParamsHandle = _storage_.mappedHandle( launchData.queryParamsHandle ); \
+ switch( launchData.kernelType ) \
+ { \
+ case nvidia::fieldsampler::FieldSamplerKernelType::POINTS: \
+ { \
+ const nvidia::fieldsampler::FieldSamplerPointsKernelLaunchDataIntl& data = static_cast<const nvidia::fieldsampler::FieldSamplerPointsKernelLaunchDataIntl&>(launchData); \
+ const nvidia::fieldsampler::FieldSamplerPointsKernelArgs* kernelArgs = static_cast<const nvidia::fieldsampler::FieldSamplerPointsKernelArgs*>(data.kernelArgs); \
+ SCENE_CUDA_OBJ(this, fieldSamplerPointsKernel)( data.stream, data.threadCount, \
+ *static_cast<const nvidia::fieldsampler::FieldSamplerKernelParams*>(kernelArgs), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->accumField, size_t(data.memRefSize)), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->accumVelocity, size_t(data.memRefSize)), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->positionMass, size_t(data.memRefSize), ApexCudaMemFlags::IN), \
+ nvidia::apex::createApexCudaMemRef(kernelArgs->velocity, size_t(data.memRefSize), ApexCudaMemFlags::IN), \
+ paramsExArrayHandle, queryParamsHandle, data.kernelMode ); \
+ } \
+ return true; \
+ case nvidia::fieldsampler::FieldSamplerKernelType::GRID: \
+ { \
+ const nvidia::fieldsampler::FieldSamplerGridKernelLaunchDataIntl& data = static_cast<const nvidia::fieldsampler::FieldSamplerGridKernelLaunchDataIntl&>(launchData); \
+ const nvidia::fieldsampler::FieldSamplerGridKernelArgs* kernelArgs = static_cast<const nvidia::fieldsampler::FieldSamplerGridKernelArgs*>(data.kernelArgs); \
+ SCENE_CUDA_OBJ(this, surfRefFieldSamplerGridAccum).bindTo(*data.accumArray, ApexCudaMemFlags::IN_OUT); \
+ SCENE_CUDA_OBJ(this, fieldSamplerGridKernel)( data.stream, data.threadCountX, data.threadCountY, data.threadCountZ, \
+ *static_cast<const nvidia::fieldsampler::FieldSamplerKernelParams*>(kernelArgs), \
+ *static_cast<const nvidia::fieldsampler::FieldSamplerGridKernelParams*>(kernelArgs), \
+ paramsExArrayHandle, queryParamsHandle, data.kernelMode ); \
+ SCENE_CUDA_OBJ(this, surfRefFieldSamplerGridAccum).unbind(); \
+ } \
+ return true; \
+ default: \
+ PX_ALWAYS_ASSERT(); \
+ return false; \
+ };
+#endif
+
+#endif //FIELD_SAMPLER_SEPARATE_KERNELS
diff --git a/APEX_1.4/module/fieldsampler/include/FieldBoundaryWrapper.h b/APEX_1.4/module/fieldsampler/include/FieldBoundaryWrapper.h
new file mode 100644
index 00000000..fbaf10f5
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldBoundaryWrapper.h
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD_BOUNDARY_WRAPPER_H__
+#define __FIELD_BOUNDARY_WRAPPER_H__
+
+#include "Apex.h"
+#include "ApexSDKHelpers.h"
+#include "ApexActor.h"
+#include "FieldBoundaryIntl.h"
+
+#if APEX_CUDA_SUPPORT
+#include "ApexCudaWrapper.h"
+#endif
+
+#include "FieldSamplerCommon.h"
+
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+class FieldSamplerManager;
+
+
+class FieldBoundaryWrapper : public ApexResourceInterface, public ApexResource
+{
+public:
+ // ApexResourceInterface methods
+ void release();
+ void setListIndex(ResourceList& list, uint32_t index)
+ {
+ m_listIndex = index;
+ m_list = &list;
+ }
+ uint32_t getListIndex() const
+ {
+ return m_listIndex;
+ }
+
+ FieldBoundaryWrapper(ResourceList& list, FieldSamplerManager* manager, FieldBoundaryIntl* fieldBoundary, const FieldBoundaryDescIntl& fieldBoundaryDesc);
+
+ FieldBoundaryIntl* getInternalFieldBoundary() const
+ {
+ return mFieldBoundary;
+ }
+ PX_INLINE const FieldBoundaryDescIntl& getInternalFieldBoundaryDesc() const
+ {
+ return mFieldBoundaryDesc;
+ }
+
+ void update();
+
+ const nvidia::Array<FieldShapeDescIntl>& getFieldShapes() const
+ {
+ return mFieldShapes;
+ }
+ bool getFieldShapesChanged() const
+ {
+ return mFieldShapesChanged;
+ }
+
+protected:
+ FieldSamplerManager* mManager;
+
+ FieldBoundaryIntl* mFieldBoundary;
+ FieldBoundaryDescIntl mFieldBoundaryDesc;
+
+ nvidia::Array<FieldShapeDescIntl> mFieldShapes;
+ bool mFieldShapesChanged;
+};
+
+}
+} // end namespace nvidia::apex
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/FieldSamplerCommon.h b/APEX_1.4/module/fieldsampler/include/FieldSamplerCommon.h
new file mode 100644
index 00000000..8ef0b770
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldSamplerCommon.h
@@ -0,0 +1,386 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD_SAMPLER_COMMON_H__
+#define __FIELD_SAMPLER_COMMON_H__
+
+#include "PxVec3.h"
+#include "PxVec4.h"
+#include <PxMat44.h>
+
+#include <FieldSamplerIntl.h>
+#include <FieldBoundaryIntl.h>
+
+#include "PsArray.h"
+
+#if APEX_CUDA_SUPPORT
+#pragma warning(push)
+#pragma warning(disable:4201)
+#pragma warning(disable:4408)
+
+#include <vector_types.h>
+
+#pragma warning(pop)
+#endif
+
+#define FIELD_SAMPLER_MULTIPLIER_VALUE 1
+#define FIELD_SAMPLER_MULTIPLIER_WEIGHT 2
+//0, FIELD_SAMPLER_MULTIPLIER_VALUE or FIELD_SAMPLER_MULTIPLIER_WEIGHT
+#define FIELD_SAMPLER_MULTIPLIER FIELD_SAMPLER_MULTIPLIER_WEIGHT
+
+namespace nvidia
+{
+namespace apex
+{
+ class ApexCudaArray;
+}
+
+namespace fieldsampler
+{
+
+#define VELOCITY_WEIGHT_THRESHOLD 0.00001f
+
+struct FieldSamplerExecuteArgs
+{
+ physx::PxVec3 position;
+ float mass;
+ physx::PxVec3 velocity;
+
+ float elapsedTime;
+ uint32_t totalElapsedMS;
+};
+
+//struct FieldShapeParams
+#define INPLACE_TYPE_STRUCT_NAME FieldShapeParams
+#define INPLACE_TYPE_STRUCT_BASE FieldShapeDescIntl
+#define INPLACE_TYPE_STRUCT_FIELDS \
+ INPLACE_TYPE_FIELD(float, fade)
+#include INPLACE_TYPE_BUILD()
+
+
+//struct FieldShapeGroupParams
+#define INPLACE_TYPE_STRUCT_NAME FieldShapeGroupParams
+#define INPLACE_TYPE_STRUCT_FIELDS \
+ INPLACE_TYPE_FIELD(InplaceArray<FieldShapeParams>, shapeArray)
+#include INPLACE_TYPE_BUILD()
+
+
+//struct FieldSamplerParams
+#define INPLACE_TYPE_STRUCT_NAME FieldSamplerParams
+#define INPLACE_TYPE_STRUCT_FIELDS \
+ INPLACE_TYPE_FIELD(uint32_t, executeType) \
+ INPLACE_TYPE_FIELD(InplaceHandleBase, executeParamsHandle) \
+ INPLACE_TYPE_FIELD(InplaceEnum<FieldSamplerTypeIntl::Enum>, type) \
+ INPLACE_TYPE_FIELD(InplaceEnum<FieldSamplerGridSupportTypeIntl::Enum>, gridSupportType) \
+ INPLACE_TYPE_FIELD(float, dragCoeff) \
+ INPLACE_TYPE_FIELD(FieldShapeParams, includeShape) \
+ INPLACE_TYPE_FIELD(InplaceArray<InplaceHandle<FieldShapeGroupParams> >, excludeShapeGroupHandleArray)
+#include INPLACE_TYPE_BUILD()
+
+
+//struct FieldSamplerQueryParams
+#define INPLACE_TYPE_STRUCT_NAME FieldSamplerQueryParams
+#include INPLACE_TYPE_BUILD()
+
+
+//struct FieldSamplerParams
+#define INPLACE_TYPE_STRUCT_NAME FieldSamplerParamsEx
+#define INPLACE_TYPE_STRUCT_FIELDS \
+ INPLACE_TYPE_FIELD(InplaceHandle<FieldSamplerParams>, paramsHandle) \
+ INPLACE_TYPE_FIELD(float, multiplier)
+#include INPLACE_TYPE_BUILD()
+
+typedef InplaceArray< FieldSamplerParamsEx, false > FieldSamplerParamsExArray;
+
+
+#if APEX_CUDA_SUPPORT || defined(__CUDACC__)
+
+struct FieldSamplerKernelType
+{
+ enum Enum
+ {
+ POINTS,
+ GRID
+ };
+};
+
+struct FieldSamplerKernelParams
+{
+ float elapsedTime;
+ physx::PxVec3 cellSize;
+ uint32_t totalElapsedMS;
+};
+
+struct FieldSamplerGridKernelParams
+{
+ uint32_t numX, numY, numZ;
+
+ PxMat44 gridToWorld;
+
+ float mass;
+};
+
+
+struct FieldSamplerKernelArgs : FieldSamplerKernelParams
+{
+};
+
+struct FieldSamplerPointsKernelArgs : FieldSamplerKernelArgs
+{
+ float4* accumField;
+ float4* accumVelocity;
+ const float4* positionMass;
+ const float4* velocity;
+};
+
+struct FieldSamplerGridKernelArgs : FieldSamplerKernelArgs, FieldSamplerGridKernelParams
+{
+};
+
+struct FieldSamplerKernelMode
+{
+ enum Enum
+ {
+ DEFAULT = 0,
+ FINISH_PRIMARY = 1,
+ FINISH_SECONDARY = 2
+ };
+};
+
+#endif
+
+class FieldSamplerWrapper;
+
+struct FieldSamplerInfo
+{
+ FieldSamplerWrapper* mFieldSamplerWrapper;
+ float mMultiplier;
+};
+
+#if APEX_CUDA_SUPPORT
+
+struct FieldSamplerKernelLaunchDataIntl
+{
+ CUstream stream;
+ FieldSamplerKernelType::Enum kernelType;
+ const FieldSamplerKernelArgs* kernelArgs;
+ InplaceHandle<FieldSamplerQueryParams> queryParamsHandle;
+ InplaceHandle<FieldSamplerParamsExArray> paramsExArrayHandle;
+ const nvidia::Array<FieldSamplerInfo>* fieldSamplerArray;
+ uint32_t activeFieldSamplerCount;
+ FieldSamplerKernelMode::Enum kernelMode;
+};
+
+struct FieldSamplerPointsKernelLaunchDataIntl : FieldSamplerKernelLaunchDataIntl
+{
+ uint32_t threadCount;
+ uint32_t memRefSize;
+};
+
+struct FieldSamplerGridKernelLaunchDataIntl : FieldSamplerKernelLaunchDataIntl
+{
+ uint32_t threadCountX;
+ uint32_t threadCountY;
+ uint32_t threadCountZ;
+ ApexCudaArray* accumArray;
+};
+
+#endif
+
+APEX_CUDA_CALLABLE PX_INLINE float evalFade(float dist, float fade)
+{
+ float x = (1 - dist) / (fade + 1e-5f);
+ return physx::PxClamp<float>(x, 0, 1);
+}
+
+APEX_CUDA_CALLABLE PX_INLINE float evalFadeAntialiasing(float dist, float fade, float cellRadius)
+{
+ const float f = fade;
+ const float r = cellRadius;
+ const float x = dist - 1.0f;
+
+ float res = 0.0f;
+ //linear part
+ //if (x - r < -f)
+ {
+ const float a = PxMin(x - r, -f);
+ const float b = PxMin(x + r, -f);
+
+ res += (b - a);
+ }
+ //quadratic part
+ if (f >= 1e-5f)
+ {
+ //if (x - r < 0.0f && x + r > -f)
+ {
+ const float a = physx::PxClamp(x - r, -f, 0.0f);
+ const float b = physx::PxClamp(x + r, -f, 0.0f);
+
+ res += (a*a - b*b) / (2 * f);
+ }
+ }
+ return res / (2 * r);
+}
+
+
+APEX_CUDA_CALLABLE PX_INLINE float evalDistInShapeNONE(const FieldShapeDescIntl& /*shapeParams*/, const physx::PxVec3& /*worldPos*/)
+{
+ return 0.0f; //always inside
+}
+
+APEX_CUDA_CALLABLE PX_INLINE float evalDistInShapeSPHERE(const FieldShapeDescIntl& shapeParams, const physx::PxVec3& worldPos)
+{
+ const physx::PxVec3 shapePos = shapeParams.worldToShape.transform(worldPos);
+ const float radius = shapeParams.dimensions.x;
+ return shapePos.magnitude() / radius;
+}
+
+APEX_CUDA_CALLABLE PX_INLINE float evalDistInShapeBOX(const FieldShapeDescIntl& shapeParams, const physx::PxVec3& worldPos)
+{
+ const physx::PxVec3 shapePos = shapeParams.worldToShape.transform(worldPos);
+ const physx::PxVec3& halfSize = shapeParams.dimensions;
+ physx::PxVec3 unitPos(shapePos.x / halfSize.x, shapePos.y / halfSize.y, shapePos.z / halfSize.z);
+ return physx::PxVec3(physx::PxAbs(unitPos.x), physx::PxAbs(unitPos.y), physx::PxAbs(unitPos.z)).maxElement();
+}
+
+APEX_CUDA_CALLABLE PX_INLINE float evalDistInShapeCAPSULE(const FieldShapeDescIntl& shapeParams, const physx::PxVec3& worldPos)
+{
+ const physx::PxVec3 shapePos = shapeParams.worldToShape.transform(worldPos);
+ const float radius = shapeParams.dimensions.x;
+ const float halfHeight = shapeParams.dimensions.y * 0.5f;
+
+ physx::PxVec3 clampPos = shapePos;
+ clampPos.y -= physx::PxClamp(shapePos.y, -halfHeight, +halfHeight);
+
+ return clampPos.magnitude() / radius;
+}
+
+APEX_CUDA_CALLABLE PX_INLINE float evalDistInShape(const FieldShapeDescIntl& shapeParams, const physx::PxVec3& worldPos)
+{
+ switch (shapeParams.type)
+ {
+ case FieldShapeTypeIntl::NONE:
+ return evalDistInShapeNONE(shapeParams, worldPos);
+ case FieldShapeTypeIntl::SPHERE:
+ return evalDistInShapeSPHERE(shapeParams, worldPos);
+ case FieldShapeTypeIntl::BOX:
+ return evalDistInShapeBOX(shapeParams, worldPos);
+ case FieldShapeTypeIntl::CAPSULE:
+ return evalDistInShapeCAPSULE(shapeParams, worldPos);
+ default:
+ return 1.0f; //always outside
+ };
+}
+
+APEX_CUDA_CALLABLE PX_INLINE physx::PxVec3 scaleToShape(const FieldShapeDescIntl& shapeParams, const physx::PxVec3& worldVec)
+{
+ switch (shapeParams.type)
+ {
+ case FieldShapeTypeIntl::SPHERE:
+ case FieldShapeTypeIntl::CAPSULE:
+ {
+ const float radius = shapeParams.dimensions.x;
+ return physx::PxVec3(worldVec.x / radius, worldVec.y / radius, worldVec.z / radius);
+ }
+ case FieldShapeTypeIntl::BOX:
+ {
+ const physx::PxVec3& halfSize = shapeParams.dimensions;
+ return physx::PxVec3(worldVec.x / halfSize.x, worldVec.y / halfSize.y, worldVec.z / halfSize.z);
+ }
+ default:
+ return worldVec;
+ };
+}
+
+
+APEX_CUDA_CALLABLE PX_INLINE float evalWeightInShape(const FieldShapeParams& shapeParams, const physx::PxVec3& position)
+{
+ float dist = nvidia::fieldsampler::evalDistInShape(shapeParams, position);
+ return nvidia::fieldsampler::evalFade(dist, shapeParams.fade) * shapeParams.weight;
+}
+
+APEX_CUDA_CALLABLE PX_INLINE void accumFORCE(const FieldSamplerExecuteArgs& args,
+ const physx::PxVec3& field, float fieldW,
+ physx::PxVec4& accumAccel, physx::PxVec4& accumVelocity)
+{
+ PX_UNUSED(accumVelocity);
+
+ physx::PxVec3 newAccel = ((1 - accumAccel.w) * fieldW * args.elapsedTime / args.mass) * field;
+ accumAccel.x += newAccel.x;
+ accumAccel.y += newAccel.y;
+ accumAccel.z += newAccel.z;
+}
+
+APEX_CUDA_CALLABLE PX_INLINE void accumACCELERATION(const FieldSamplerExecuteArgs& args,
+ const physx::PxVec3& field, float fieldW,
+ physx::PxVec4& accumAccel, physx::PxVec4& accumVelocity)
+{
+ PX_UNUSED(accumVelocity);
+
+ physx::PxVec3 newAccel = ((1 - accumAccel.w) * fieldW * args.elapsedTime) * field;
+ accumAccel.x += newAccel.x;
+ accumAccel.y += newAccel.y;
+ accumAccel.z += newAccel.z;
+}
+
+APEX_CUDA_CALLABLE PX_INLINE void accumVELOCITY_DIRECT(const FieldSamplerExecuteArgs& args,
+ const physx::PxVec3& field, float fieldW,
+ physx::PxVec4& accumAccel, physx::PxVec4& accumVelocity)
+{
+ PX_UNUSED(args);
+
+ physx::PxVec3 newVelocity = ((1 - accumAccel.w) * fieldW) * field;
+ accumVelocity.x += newVelocity.x;
+ accumVelocity.y += newVelocity.y;
+ accumVelocity.z += newVelocity.z;
+ accumVelocity.w = PxMax(accumVelocity.w, fieldW);
+}
+
+APEX_CUDA_CALLABLE PX_INLINE void accumVELOCITY_DRAG(const FieldSamplerExecuteArgs& args, float dragCoeff,
+ const physx::PxVec3& field, float fieldW,
+ physx::PxVec4& accumAccel, physx::PxVec4& accumVelocity)
+{
+#if 1
+ const float dragFieldW = PxMin(fieldW * dragCoeff * args.elapsedTime / args.mass, 1.0f);
+ accumVELOCITY_DIRECT(args, field, dragFieldW, accumAccel, accumVelocity);
+#else
+ const physx::PxVec3 dragForce = (field - args.velocity) * dragCoeff;
+ accumFORCE(args, dragForce, fieldW, accumAccel, accumVelocity);
+#endif
+}
+
+
+} // namespace apex
+}
+#ifdef __CUDACC__
+
+template <int queryType>
+struct FieldSamplerExecutor;
+/*
+{
+ INPLACE_TEMPL_ARGS_DEF
+ static inline __device__ physx::PxVec3 func(const nvidia::fieldsampler::FieldSamplerParams* params, const nvidia::fieldsampler::FieldSamplerExecuteArgs& args, float& fieldWeight);
+};
+*/
+
+template <int queryType>
+struct FieldSamplerIncludeWeightEvaluator
+{
+ INPLACE_TEMPL_ARGS_DEF
+ static inline __device__ float func(const nvidia::fieldsampler::FieldSamplerParams* params, const physx::PxVec3& position, const physx::PxVec3& cellSize)
+ {
+ return nvidia::fieldsampler::evalWeightInShape(params->includeShape, position);
+ }
+};
+
+#endif
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/FieldSamplerManager.h b/APEX_1.4/module/fieldsampler/include/FieldSamplerManager.h
new file mode 100644
index 00000000..887a50c7
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldSamplerManager.h
@@ -0,0 +1,133 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD_SAMPLER_MANAGER_H__
+#define __FIELD_SAMPLER_MANAGER_H__
+
+#include "FieldSamplerManagerIntl.h"
+#include "FieldSamplerScene.h"
+#include "ApexGroupsFiltering.h"
+
+#if APEX_CUDA_SUPPORT
+#define CUDA_OBJ(name) SCENE_CUDA_OBJ(mManager->getScene(), name)
+#endif
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+PX_INLINE bool operator != (const PxFilterData& d1, const PxFilterData& d2)
+{
+ return d1.word0 != d2.word0 || d1.word1 != d2.word1 || d1.word2 != d2.word2 || d1.word3 != d2.word3;
+}
+
+class FieldSamplerScene;
+
+class FieldSamplerQuery;
+class FieldSamplerSceneWrapper;
+class FieldSamplerWrapper;
+class FieldBoundaryWrapper;
+
+class FieldSamplerManager : public FieldSamplerManagerIntl, public UserAllocated
+{
+public:
+ FieldSamplerManager(FieldSamplerScene* scene);
+ virtual ~FieldSamplerManager() {}
+
+ void submitTasks();
+ void setTaskDependencies();
+ void fetchResults();
+
+ /* FieldSamplerManager */
+ FieldSamplerQueryIntl* createFieldSamplerQuery(const FieldSamplerQueryDescIntl&);
+
+ void registerFieldSampler(FieldSamplerIntl* , const FieldSamplerDescIntl& , FieldSamplerSceneIntl*);
+ void unregisterFieldSampler(FieldSamplerIntl*);
+
+ void registerFieldBoundary(FieldBoundaryIntl* , const FieldBoundaryDescIntl&);
+ void unregisterFieldBoundary(FieldBoundaryIntl*);
+
+ void registerUnhandledParticleSystem(physx::PxActor*);
+ void unregisterUnhandledParticleSystem(physx::PxActor*);
+ bool isUnhandledParticleSystem(physx::PxActor*);
+
+ FieldSamplerScene* getScene() const
+ {
+ return mScene;
+ }
+ SceneIntl& getApexScene() const
+ {
+ return *mScene->mApexScene;
+ }
+
+ bool getFieldSamplerGroupsFiltering(const PxFilterData &o1,const PxFilterData &o2,float &weight) const;
+ void setFieldSamplerWeightedCollisionFilterCallback(FieldSamplerWeightedCollisionFilterCallback *callback)
+ {
+ mWeightedCallback = callback;
+ }
+
+ virtual bool doFieldSamplerFiltering(const PxFilterData &o1, const PxFilterData &o2, float &weight) const
+ {
+ return getFieldSamplerGroupsFiltering(o1, o2, weight);
+ }
+
+protected:
+ virtual FieldSamplerQuery* allocateFieldSamplerQuery(const FieldSamplerQueryDescIntl&) = 0;
+ virtual FieldSamplerSceneWrapper* allocateFieldSamplerSceneWrapper(FieldSamplerSceneIntl*) = 0;
+ virtual FieldSamplerWrapper* allocateFieldSamplerWrapper(FieldSamplerIntl* , const FieldSamplerDescIntl& , FieldSamplerSceneWrapper*) = 0;
+
+ static PX_INLINE void addFieldSamplerToQuery(FieldSamplerWrapper* fieldSamplerWrapper, FieldSamplerQuery* query);
+ void addAllFieldSamplersToQuery(FieldSamplerQuery*) const;
+
+ FieldSamplerScene* mScene;
+
+ ResourceList mFieldSamplerQueryList;
+ ResourceList mFieldSamplerSceneWrapperList;
+ ResourceList mFieldSamplerWrapperList;
+ ResourceList mFieldBoundaryWrapperList;
+
+ nvidia::Array<physx::PxActor*> mUnhandledParticleSystems;
+ FieldSamplerWeightedCollisionFilterCallback *mWeightedCallback;
+
+ bool mFieldSamplerGroupsFilteringChanged;
+
+ friend class FieldSamplerSceneWrapperGPU;
+};
+
+class FieldSamplerManagerCPU : public FieldSamplerManager
+{
+public:
+ FieldSamplerManagerCPU(FieldSamplerScene* scene) : FieldSamplerManager(scene) {}
+
+protected:
+ FieldSamplerQuery* allocateFieldSamplerQuery(const FieldSamplerQueryDescIntl&);
+ FieldSamplerSceneWrapper* allocateFieldSamplerSceneWrapper(FieldSamplerSceneIntl*);
+ FieldSamplerWrapper* allocateFieldSamplerWrapper(FieldSamplerIntl* , const FieldSamplerDescIntl& , FieldSamplerSceneWrapper*);
+};
+
+#if APEX_CUDA_SUPPORT
+class FieldSamplerManagerGPU : public FieldSamplerManager
+{
+public:
+ FieldSamplerManagerGPU(FieldSamplerScene* scene) : FieldSamplerManager(scene) {}
+
+protected:
+ FieldSamplerQuery* allocateFieldSamplerQuery(const FieldSamplerQueryDescIntl&);
+ FieldSamplerSceneWrapper* allocateFieldSamplerSceneWrapper(FieldSamplerSceneIntl*);
+ FieldSamplerWrapper* allocateFieldSamplerWrapper(FieldSamplerIntl* , const FieldSamplerDescIntl& , FieldSamplerSceneWrapper*);
+};
+#endif // APEX_CUDA_SUPPORT
+
+
+} // end namespace nvidia::apex
+}
+#endif // __FIELD_SAMPLER_MANAGER_H__
diff --git a/APEX_1.4/module/fieldsampler/include/FieldSamplerPhysXMonitor.h b/APEX_1.4/module/fieldsampler/include/FieldSamplerPhysXMonitor.h
new file mode 100644
index 00000000..30ff79c4
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldSamplerPhysXMonitor.h
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD__SAMPLER_PHYSX_MONITOR_H___
+#define __FIELD__SAMPLER_PHYSX_MONITOR_H___
+
+#include "Apex.h"
+#include <PsArray.h>
+
+#include "FieldSamplerSceneIntl.h"
+#include "FieldSamplerPhysXMonitorParams.h"
+
+#if PX_PHYSICS_VERSION_MAJOR == 3
+#include <PxScene.h>
+#endif
+
+namespace nvidia
+{
+namespace apex
+{
+class FieldSamplerQueryIntl;
+}
+
+namespace fieldsampler
+{
+
+class FieldSamplerScene;
+class FieldSamplerManager;
+
+
+struct ShapeData : public UserAllocated
+{
+ uint32_t fdIndex;
+ uint32_t rbIndex;
+ float mass;
+ PxVec3 pos;
+ PxVec3 vel;
+
+ static bool sortPredicate (ShapeData* sd1, ShapeData* sd2)
+ {
+ if (sd1 == 0) return false;
+ if (sd2 == 0) return true;
+ return sd1->fdIndex < sd2->fdIndex;
+ }
+};
+
+
+class FieldSamplerPhysXMonitor : public UserAllocated
+{
+private:
+
+
+public:
+ FieldSamplerPhysXMonitor(FieldSamplerScene& scene);
+ virtual ~FieldSamplerPhysXMonitor();
+
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ virtual void update();
+ virtual void updatePhysX();
+
+ /* PhysX scene management */
+ void setPhysXScene(PxScene* scene);
+ PX_INLINE PxScene* getPhysXScene() const
+ {
+ return mScene;
+ }
+
+ /* Toggle PhysX Monitor on/off */
+ PX_INLINE void enablePhysXMonitor(bool enable)
+ {
+ mEnable = enable;
+ }
+
+ /* Is PhysX Monitor enabled */
+ PX_INLINE bool isEnable()
+ {
+ return mEnable;
+ }
+
+ PX_INLINE void FieldSamplerPhysXMonitor::setPhysXFilterData(physx::PxFilterData filterData)
+ {
+ mFilterData = filterData;
+ }
+
+private:
+ FieldSamplerPhysXMonitor& operator=(const FieldSamplerPhysXMonitor&);
+
+ void getParticles(uint32_t taskId);
+ void updateParticles();
+ void getRigidBodies(uint32_t taskId);
+ void updateRigidBodies();
+ //void getCloth(PxTask& task, bool isDataOnDevice);
+ //void updateCloth();
+
+protected:
+
+ void commonInitArray();
+
+ FieldSamplerScene* mFieldSamplerScene;
+ FieldSamplerManager* mFieldSamplerManager;
+
+ PxScene* mScene;
+
+ FieldSamplerPhysXMonitorParams* mParams;
+
+ PxFilterData mFilterData;
+
+ //Particles
+ uint32_t mNumPS; //Number of particle systems
+ uint32_t mPCount; //Number of particles in buffer
+ Array<PxActor*> mParticleSystems;
+ Array<float> mPSMass;
+ Array<PxVec4> mPSOutField;
+ Array<PxVec3> mOutVelocities;
+ Array<uint32_t> mOutIndices;
+ Array<physx::PxParticleReadData*> mParticleReadData;
+ Array<FieldSamplerQueryIntl*> mPSFieldSamplerQuery;
+ Array<PxTaskID> mPSFieldSamplerTaskID;
+
+
+ //Rigid bodies
+ uint32_t mNumRB; //Number of rigid bodies
+ Array<PxActor*> mRBActors;
+ Array<ShapeData*> mRBIndex;
+ Array<PxVec4> mRBInPosition;
+ Array<PxVec4> mRBInVelocity;
+ Array<PxVec4> mRBOutField;
+ Array<PxFilterData> mRBFilterData;
+ Array<FieldSamplerQueryIntl*> mRBFieldSamplerQuery;
+
+ //Enable or disable PhysX Monitor
+ bool mEnable;
+
+public:
+ class RunAfterActorUpdateTask : public PxTask
+ {
+ public:
+ RunAfterActorUpdateTask(FieldSamplerPhysXMonitor& owner) : mOwner(owner) {}
+ const char* getName() const
+ {
+ return FSST_PHYSX_MONITOR_UPDATE;
+ }
+ void run()
+ {
+ mOwner.updatePhysX();
+ }
+
+ protected:
+ FieldSamplerPhysXMonitor& mOwner;
+
+ private:
+ RunAfterActorUpdateTask operator=(const RunAfterActorUpdateTask&);
+ };
+ RunAfterActorUpdateTask mTaskRunAfterActorUpdate;
+#endif
+};
+
+
+}
+} // end namespace nvidia::apex
+
+#endif
+
diff --git a/APEX_1.4/module/fieldsampler/include/FieldSamplerQuery.h b/APEX_1.4/module/fieldsampler/include/FieldSamplerQuery.h
new file mode 100644
index 00000000..65d2ba58
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldSamplerQuery.h
@@ -0,0 +1,308 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD_SAMPLER_QUERY_H__
+#define __FIELD_SAMPLER_QUERY_H__
+
+#include "Apex.h"
+#include "ApexSDKHelpers.h"
+#include "FieldSamplerQueryIntl.h"
+#include "FieldSamplerIntl.h"
+
+#if APEX_CUDA_SUPPORT
+#include "ApexCudaWrapper.h"
+#endif
+
+#include "FieldSamplerCommon.h"
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+class FieldSamplerManager;
+class FieldSamplerSceneWrapper;
+class FieldSamplerWrapper;
+
+class FieldSamplerQuery : public FieldSamplerQueryIntl, public ApexResourceInterface, public ApexResource
+{
+protected:
+
+ class SceneInfo : public ApexResourceInterface, public ApexResource
+ {
+ protected:
+ FieldSamplerQuery* mQuery;
+ FieldSamplerSceneWrapper* mSceneWrapper;
+ nvidia::Array<FieldSamplerInfo> mFieldSamplerArray;
+ bool mFieldSamplerArrayChanged;
+
+ uint32_t mEnabledFieldSamplerCount;
+
+ SceneInfo(ResourceList& list, FieldSamplerQuery* query, FieldSamplerSceneWrapper* sceneWrapper)
+ : mQuery(query), mSceneWrapper(sceneWrapper), mFieldSamplerArrayChanged(false), mEnabledFieldSamplerCount(0)
+ {
+ list.add(*this);
+ }
+
+ public:
+ FieldSamplerSceneWrapper* getSceneWrapper() const
+ {
+ return mSceneWrapper;
+ }
+
+ void addFieldSampler(FieldSamplerWrapper* fieldSamplerWrapper, float multiplier)
+ {
+ FieldSamplerInfo fsInfo;
+ fsInfo.mFieldSamplerWrapper = fieldSamplerWrapper;
+ fsInfo.mMultiplier = multiplier;
+ mFieldSamplerArray.pushBack(fsInfo);
+ mFieldSamplerArrayChanged = true;
+ }
+ bool removeFieldSampler(FieldSamplerWrapper* fieldSamplerWrapper)
+ {
+ const uint32_t size = mFieldSamplerArray.size();
+ for (uint32_t index = 0; index < size; ++index)
+ {
+ if (mFieldSamplerArray[index].mFieldSamplerWrapper == fieldSamplerWrapper)
+ {
+ mFieldSamplerArray.replaceWithLast(index);
+ mFieldSamplerArrayChanged = true;
+ return true;
+ }
+ }
+ return false;
+ }
+ void clearAllFieldSamplers()
+ {
+ mFieldSamplerArray.clear();
+ mFieldSamplerArrayChanged = true;
+ }
+ uint32_t getEnabledFieldSamplerCount() const
+ {
+ return mEnabledFieldSamplerCount;
+ }
+ const nvidia::Array<FieldSamplerInfo>& getFieldSamplerArray() const
+ {
+ return mFieldSamplerArray;
+ }
+
+ virtual bool update();
+
+ // ApexResourceInterface methods
+ void release()
+ {
+ delete this;
+ }
+ void setListIndex(ResourceList& list, uint32_t index)
+ {
+ m_listIndex = index;
+ m_list = &list;
+ }
+ uint32_t getListIndex() const
+ {
+ return m_listIndex;
+ }
+ };
+
+ SceneInfo* findSceneInfo(FieldSamplerSceneWrapper* sceneWrapper) const;
+
+ virtual SceneInfo* createSceneInfo(FieldSamplerSceneWrapper* sceneWrapper) = 0;
+
+ FieldSamplerQuery(const FieldSamplerQueryDescIntl& desc, ResourceList& list, FieldSamplerManager* manager);
+
+public:
+ virtual void update();
+
+ PX_INLINE void setOnStartCallback(FieldSamplerCallbackIntl* callback)
+ {
+ if (mOnStartCallback)
+ {
+ PX_DELETE(mOnStartCallback);
+ }
+ mOnStartCallback = callback;
+ }
+ PX_INLINE void setOnFinishCallback(FieldSamplerCallbackIntl* callback)
+ {
+ if (mOnFinishCallback)
+ {
+ PX_DELETE(mOnFinishCallback);
+ }
+ mOnFinishCallback = callback;
+ }
+
+ virtual void submitTasks() {}
+ virtual void setTaskDependencies() {}
+ virtual void fetchResults() {}
+
+ void release();
+ void destroy();
+
+ // ApexResourceInterface methods
+ void setListIndex(ResourceList& list, uint32_t index)
+ {
+ m_listIndex = index;
+ m_list = &list;
+ }
+ uint32_t getListIndex() const
+ {
+ return m_listIndex;
+ }
+
+ void setPhysXScene(PxScene*) {}
+ PxScene* getPhysXScene() const
+ {
+ return NULL;
+ }
+
+ bool addFieldSampler(FieldSamplerWrapper*);
+ bool removeFieldSampler(FieldSamplerWrapper*);
+ void clearAllFieldSamplers();
+
+ const FieldSamplerQueryDescIntl& getQueryDesc() const
+ {
+ return mQueryDesc;
+ }
+
+protected:
+ void submitFieldSamplerQuery(const FieldSamplerQueryDataIntl& data, PxTask*, PxTask* );
+
+ FieldSamplerManager* mManager;
+
+ FieldSamplerQueryDescIntl mQueryDesc;
+ FieldSamplerQueryDataIntl mQueryData;
+
+ ResourceList mSceneList;
+
+ nvidia::Array<SceneInfo*> mPrimarySceneList;
+ nvidia::Array<SceneInfo*> mSecondarySceneList;
+
+ ApexMirroredArray<PxVec4> mAccumVelocity;
+
+ FieldSamplerCallbackIntl* mOnStartCallback;
+ FieldSamplerCallbackIntl* mOnFinishCallback;
+
+ friend class FieldSamplerManager;
+};
+
+
+class FieldSamplerQueryCPU : public FieldSamplerQuery
+{
+public:
+ FieldSamplerQueryCPU(const FieldSamplerQueryDescIntl& desc, ResourceList& list, FieldSamplerManager* manager);
+ ~FieldSamplerQueryCPU();
+
+ // FieldSamplerQueryIntl methods
+ PxTaskID submitFieldSamplerQuery(const FieldSamplerQueryDataIntl& data, PxTaskID taskID);
+
+protected:
+ void execute();
+ void executeScene( const SceneInfo* sceneInfo,
+ const FieldSamplerIntl::ExecuteData& executeData,
+ PxVec4* accumField,
+ PxVec4* accumVelocity,
+ uint32_t positionStride,
+ uint32_t velocityStride,
+ uint32_t massStride);
+
+ uint32_t mExecuteCount;
+ nvidia::Array<PxVec3> mResultField;
+ nvidia::Array<float> mWeights;
+
+ PxTask* mTaskExecute;
+
+ friend class TaskExecute;
+
+ class SceneInfoCPU : public SceneInfo
+ {
+ public:
+ SceneInfoCPU(ResourceList& list, FieldSamplerQuery* query, FieldSamplerSceneWrapper* sceneWrapper)
+ : SceneInfo(list, query, sceneWrapper)
+ {
+ }
+ };
+
+ virtual SceneInfo* createSceneInfo(FieldSamplerSceneWrapper* sceneWrapper)
+ {
+ return PX_NEW(SceneInfoCPU)(mSceneList, this, sceneWrapper);
+ }
+
+};
+
+#if APEX_CUDA_SUPPORT
+
+class FieldSamplerQueryGPU : public FieldSamplerQueryCPU
+{
+public:
+ FieldSamplerQueryGPU(const FieldSamplerQueryDescIntl& desc, ResourceList& list, FieldSamplerManager* manager);
+ ~FieldSamplerQueryGPU();
+
+ // FieldSamplerQueryIntl methods
+ PxTaskID submitFieldSamplerQuery(const FieldSamplerQueryDataIntl& data, PxTaskID taskID);
+
+ PxVec3 executeFieldSamplerQueryOnGrid(const FieldSamplerQueryGridDataIntl&);
+
+protected:
+ bool launch(CUstream stream, int kernelIndex);
+ void prepare();
+ bool copy(CUstream stream, int kernelIndex);
+ void fetch();
+
+ PxTask* mTaskLaunch;
+ PxTask* mTaskPrepare;
+ PxTask* mTaskCopy;
+ PxTask* mTaskFetch;
+
+ ApexMirroredArray<PxVec4> mPositionMass;
+ ApexMirroredArray<PxVec4> mVelocity;
+ ApexMirroredArray<PxVec4> mAccumField;
+ PxGpuCopyDescQueue mCopyQueue;
+
+ friend class FieldSamplerQueryLaunchTask;
+ friend class FieldSamplerQueryPrepareTask;
+ friend class FieldSamplerQueryCopyTask;
+ friend class FieldSamplerQueryFetchTask;
+
+ class SceneInfoGPU : public SceneInfo
+ {
+ public:
+ SceneInfoGPU(ResourceList& list, FieldSamplerQuery* query, FieldSamplerSceneWrapper* sceneWrapper);
+
+ virtual bool update();
+
+ PX_INLINE InplaceHandle<nvidia::fieldsampler::FieldSamplerParamsExArray> getParamsHandle() const
+ {
+ PX_ASSERT(mParamsExArrayHandle.isNull() == false);
+ return mParamsExArrayHandle;
+ }
+ PX_INLINE InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams> getQueryParamsHandle() const
+ {
+ PX_ASSERT(mQueryParamsHandle.isNull() == false);
+ return mQueryParamsHandle;
+ }
+
+ private:
+ ApexCudaConstMemGroup mConstMemGroup;
+ InplaceHandle<nvidia::fieldsampler::FieldSamplerParamsExArray> mParamsExArrayHandle;
+ InplaceHandle<nvidia::fieldsampler::FieldSamplerQueryParams> mQueryParamsHandle;
+ };
+
+ virtual SceneInfo* createSceneInfo(FieldSamplerSceneWrapper* sceneWrapper)
+ {
+ return PX_NEW(SceneInfoGPU)(mSceneList, this, sceneWrapper);
+ }
+};
+
+#endif
+
+}
+} // end namespace nvidia::apex
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/FieldSamplerScene.h b/APEX_1.4/module/fieldsampler/include/FieldSamplerScene.h
new file mode 100644
index 00000000..1c63501f
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldSamplerScene.h
@@ -0,0 +1,218 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD_SAMPLER_SCENE_H__
+#define __FIELD_SAMPLER_SCENE_H__
+
+#include "Apex.h"
+
+#include "ModuleFieldSamplerImpl.h"
+#include "FieldSamplerSceneIntl.h"
+#include "FieldSamplerQueryIntl.h"
+#include "ApexSDKIntl.h"
+#include "ModuleIntl.h"
+#include "ApexContext.h"
+#include "ApexSDKHelpers.h"
+#include "PsArray.h"
+
+#include "PxTask.h"
+
+#if APEX_CUDA_SUPPORT
+#include "ApexCudaWrapper.h"
+#include "ApexCuda.h"
+#include "CudaModuleScene.h"
+
+#include "../cuda/include/common.h"
+
+#define SCENE_CUDA_OBJ(scene, name) static_cast<FieldSamplerSceneGPU*>(scene)->APEX_CUDA_OBJ_NAME(name)
+#endif
+
+
+namespace nvidia
+{
+namespace apex
+{
+class SceneIntl;
+}
+namespace fieldsampler
+{
+
+class ModuleFieldSamplerImpl;
+class FieldSamplerPhysXMonitor;
+class FieldSamplerManager;
+class FieldSamplerQuery;
+
+class FieldSamplerScene : public ModuleSceneIntl, public ApexContext, public ApexResourceInterface, public ApexResource
+{
+public:
+ FieldSamplerScene(ModuleFieldSamplerImpl& module, SceneIntl& scene, RenderDebugInterface* debugRender, ResourceList& list);
+ ~FieldSamplerScene();
+
+ /* ModuleSceneIntl */
+ void visualize();
+
+ PxScene* getModulePhysXScene() const
+ {
+ return mPhysXScene;
+ }
+ void setModulePhysXScene(PxScene*);
+ PxScene* mPhysXScene;
+
+ void submitTasks(float elapsedTime, float substepSize, uint32_t numSubSteps);
+ void setTaskDependencies();
+ void fetchResults();
+
+ virtual Module* getModule()
+ {
+ return mModule;
+ }
+
+ virtual SceneStats* getStats()
+ {
+ return 0;
+ }
+
+ bool lockRenderResources()
+ {
+ renderLockAllActors(); // Lock options not implemented yet
+ return true;
+ }
+
+ bool unlockRenderResources()
+ {
+ renderUnLockAllActors(); // Lock options not implemented yet
+ return true;
+ }
+
+ /* ApexResourceInterface */
+ uint32_t getListIndex() const
+ {
+ return m_listIndex;
+ }
+ void setListIndex(ResourceList& list, uint32_t index)
+ {
+ m_listIndex = index;
+ m_list = &list;
+ }
+ void release()
+ {
+ mModule->releaseModuleSceneIntl(*this);
+ }
+ SceneIntl& getApexScene() const
+ {
+ return *mApexScene;
+ }
+
+ FieldSamplerManagerIntl* getManager();
+
+ uint32_t createForceSampleBatch(uint32_t maxCount, const physx::PxFilterData filterData);
+ void releaseForceSampleBatch(uint32_t batchId);
+ void submitForceSampleBatch( 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);
+
+ /* Toggle PhysX Monitor on/off */
+ void enablePhysXMonitor(bool enable);
+
+ void setPhysXFilterData(physx::PxFilterData filterData);
+
+protected:
+ void destroy();
+
+ virtual FieldSamplerManager* createManager() = 0;
+
+ class TaskPhysXMonitorLoad : public PxTask
+ {
+ public:
+ TaskPhysXMonitorLoad() {}
+ const char* getName() const
+ {
+ return FSST_PHYSX_MONITOR_LOAD;
+ }
+ void run() {/* void task */};
+ };
+ TaskPhysXMonitorLoad mPhysXMonitorLoadTask;
+ class TaskPhysXMonitorFetch : public PxTask
+ {
+ public:
+ TaskPhysXMonitorFetch() {}
+ const char* getName() const
+ {
+ return FSST_PHYSX_MONITOR_FETCH;
+ }
+ void run() {/* void task */};
+ };
+ TaskPhysXMonitorFetch mPhysXMonitorFetchTask;
+
+ ModuleFieldSamplerImpl* mModule;
+ SceneIntl* mApexScene;
+ RenderDebugInterface* mDebugRender;
+ FieldSamplerPhysXMonitor* mPhysXMonitor;
+
+ FieldSamplerManager* mManager;
+
+ uint32_t mForceSampleBatchBufferSize;
+ uint32_t mForceSampleBatchBufferPos;
+ Array <FieldSamplerQuery*> mForceSampleBatchQuery;
+ Array <FieldSamplerQueryDataIntl> mForceSampleBatchQueryData;
+ Array <PxVec4> mForceSampleBatchPosition;
+ Array <PxVec4> mForceSampleBatchVelocity;
+ Array <float> mForceSampleBatchMass;
+
+ friend class ModuleFieldSamplerImpl;
+ friend class FieldSamplerManager;
+};
+
+class FieldSamplerSceneCPU : public FieldSamplerScene
+{
+public:
+ FieldSamplerSceneCPU(ModuleFieldSamplerImpl& module, SceneIntl& scene, RenderDebugInterface* debugRender, ResourceList& list);
+ ~FieldSamplerSceneCPU();
+
+protected:
+ virtual FieldSamplerManager* createManager();
+
+};
+
+#if APEX_CUDA_SUPPORT
+class FieldSamplerSceneGPU : public FieldSamplerScene, public CudaModuleScene
+{
+public:
+ FieldSamplerSceneGPU(ModuleFieldSamplerImpl& module, SceneIntl& scene, RenderDebugInterface* debugRender, ResourceList& list);
+ ~FieldSamplerSceneGPU();
+
+ void* getHeadCudaObj()
+ {
+ return CudaModuleScene::getHeadCudaObj();
+ }
+
+//CUDA module objects
+#include "../cuda/include/fieldsampler.h"
+
+ PxCudaContextManager* getCudaContext() const
+ {
+ return mCtxMgr;
+ }
+
+protected:
+ virtual FieldSamplerManager* createManager();
+
+ /* keep a convenience pointer to the cuda context manager */
+ PxCudaContextManager* mCtxMgr;
+};
+#endif
+
+}
+} // end namespace nvidia::apex
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/FieldSamplerSceneWrapper.h b/APEX_1.4/module/fieldsampler/include/FieldSamplerSceneWrapper.h
new file mode 100644
index 00000000..dce7f529
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldSamplerSceneWrapper.h
@@ -0,0 +1,206 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD_SAMPLER_SCENE_WRAPPER_H__
+#define __FIELD_SAMPLER_SCENE_WRAPPER_H__
+
+#include "Apex.h"
+#include "ApexSDKHelpers.h"
+#include "ApexActor.h"
+#include "FieldSamplerSceneIntl.h"
+
+#if APEX_CUDA_SUPPORT
+#include "ApexCudaWrapper.h"
+#endif
+
+#include "FieldSamplerCommon.h"
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+class FieldSamplerManager;
+class FieldSamplerWrapper;
+class FieldBoundaryWrapper;
+
+class FieldSamplerSceneWrapper : public ApexResourceInterface, public ApexResource
+{
+public:
+ // ApexResourceInterface methods
+ void release();
+ void setListIndex(ResourceList& list, uint32_t index)
+ {
+ m_listIndex = index;
+ m_list = &list;
+ }
+ uint32_t getListIndex() const
+ {
+ return m_listIndex;
+ }
+
+ FieldSamplerSceneWrapper(ResourceList& list, FieldSamplerManager* manager, FieldSamplerSceneIntl* fieldSamplerScene);
+
+ FieldSamplerSceneIntl* getInternalFieldSamplerScene() const
+ {
+ return mFieldSamplerScene;
+ }
+ const FieldSamplerSceneDescIntl& getInternalFieldSamplerSceneDesc() const
+ {
+ return mFieldSamplerSceneDesc;
+ }
+
+ virtual void update();
+ virtual void postUpdate() = 0;
+
+ class FieldBoundaryInfo;
+
+ FieldBoundaryInfo* addFieldBoundary(FieldBoundaryWrapper* fieldBoundaryWrapper);
+ void removeFieldBoundary(FieldBoundaryInfo* fieldBoundaryInfo);
+
+protected:
+ virtual FieldBoundaryInfo* createFieldBoundaryInfo(FieldBoundaryWrapper* fieldBoundaryWrapper) = 0;
+
+protected:
+ FieldSamplerManager* mManager;
+ FieldSamplerSceneIntl* mFieldSamplerScene;
+ FieldSamplerSceneDescIntl mFieldSamplerSceneDesc;
+
+ ResourceList mFieldBoundaryList;
+ bool mFieldBoundaryListChanged;
+};
+
+class FieldSamplerSceneWrapper::FieldBoundaryInfo : public ApexResourceInterface, public ApexResource
+{
+protected:
+ FieldBoundaryWrapper* mFieldBoundaryWrapper;
+ uint32_t mRefCount;
+
+ FieldBoundaryInfo(ResourceList& list, FieldBoundaryWrapper* fieldBoundaryWrapper)
+ : mFieldBoundaryWrapper(fieldBoundaryWrapper), mRefCount(0)
+ {
+ list.add(*this);
+ }
+
+public:
+ FieldBoundaryWrapper* getFieldBoundaryWrapper() const
+ {
+ return mFieldBoundaryWrapper;
+ }
+
+ virtual void update() {}
+
+ void addRef()
+ {
+ ++mRefCount;
+ }
+ bool releaseRef()
+ {
+ if (--mRefCount == 0)
+ {
+ release();
+ return true;
+ }
+ return false;
+ }
+
+ // ApexResourceInterface methods
+ void release()
+ {
+ delete this;
+ }
+ void setListIndex(ResourceList& list, uint32_t index)
+ {
+ m_listIndex = index;
+ m_list = &list;
+ }
+ uint32_t getListIndex() const
+ {
+ return m_listIndex;
+ }
+};
+
+/******************************** CPU Version ********************************/
+
+class FieldSamplerSceneWrapperCPU : public FieldSamplerSceneWrapper
+{
+public:
+ FieldSamplerSceneWrapperCPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerSceneIntl* fieldSamplerScene);
+
+ virtual void postUpdate() {}
+
+ class FieldBoundaryInfoCPU : public FieldBoundaryInfo
+ {
+ public:
+ FieldBoundaryInfoCPU(ResourceList& list, FieldBoundaryWrapper* fieldBoundaryWrapper)
+ : FieldBoundaryInfo(list, fieldBoundaryWrapper)
+ {
+ }
+ };
+
+protected:
+ virtual FieldBoundaryInfo* createFieldBoundaryInfo(FieldBoundaryWrapper* fieldBoundaryWrapper)
+ {
+ return PX_NEW(FieldBoundaryInfoCPU)(mFieldBoundaryList, fieldBoundaryWrapper);
+ }
+
+};
+
+/******************************** GPU Version ********************************/
+
+#if APEX_CUDA_SUPPORT
+class FieldSamplerSceneWrapperGPU : public FieldSamplerSceneWrapper
+{
+public:
+ FieldSamplerSceneWrapperGPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerSceneIntl* fieldSamplerScene);
+
+ virtual void postUpdate();
+
+ PX_INLINE ApexCudaConstStorage& getConstStorage()
+ {
+ return mConstStorage;
+ }
+
+ class FieldBoundaryInfoGPU : public FieldBoundaryInfo
+ {
+ public:
+ FieldBoundaryInfoGPU(ResourceList& list, FieldBoundaryWrapper* fieldBoundaryWrapper, ApexCudaConstStorage& constStorage);
+
+ virtual void update();
+
+ PX_INLINE InplaceHandle<FieldShapeGroupParams> getShapeGroupParamsHandle() const
+ {
+ PX_ASSERT(mFieldShapeGroupParamsHandle.isNull() == false);
+ return mFieldShapeGroupParamsHandle;
+ }
+
+ private:
+ ApexCudaConstMemGroup mConstMemGroup;
+ InplaceHandle<FieldShapeGroupParams> mFieldShapeGroupParamsHandle;
+ };
+
+protected:
+ virtual FieldBoundaryInfo* createFieldBoundaryInfo(FieldBoundaryWrapper* fieldBoundaryWrapper)
+ {
+ return PX_NEW(FieldBoundaryInfoGPU)(mFieldBoundaryList, fieldBoundaryWrapper, getConstStorage());
+ }
+
+private:
+ FieldSamplerSceneWrapperGPU& operator=(const FieldSamplerSceneWrapperGPU&);
+
+ ApexCudaConstStorage& mConstStorage;
+};
+#endif // APEX_CUDA_SUPPORT
+
+}
+} // end namespace nvidia::apex
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/FieldSamplerWrapper.h b/APEX_1.4/module/fieldsampler/include/FieldSamplerWrapper.h
new file mode 100644
index 00000000..4eebc10b
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/FieldSamplerWrapper.h
@@ -0,0 +1,149 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __FIELD_SAMPLER_WRAPPER_H__
+#define __FIELD_SAMPLER_WRAPPER_H__
+
+#include "Apex.h"
+#include "ApexSDKHelpers.h"
+#include "ApexActor.h"
+#include "FieldSamplerIntl.h"
+
+#if APEX_CUDA_SUPPORT
+#include "ApexCudaWrapper.h"
+#endif
+
+#include "FieldSamplerSceneWrapper.h"
+#include "FieldSamplerCommon.h"
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+class FieldSamplerManager;
+
+class FieldBoundaryWrapper;
+
+class FieldSamplerWrapper : public ApexResourceInterface, public ApexResource
+{
+public:
+ // ApexResourceInterface methods
+ void release();
+ void setListIndex(ResourceList& list, uint32_t index)
+ {
+ m_listIndex = index;
+ m_list = &list;
+ }
+ uint32_t getListIndex() const
+ {
+ return m_listIndex;
+ }
+
+ FieldSamplerWrapper(ResourceList& list, FieldSamplerManager* manager, FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper);
+
+ virtual void update();
+
+ PX_INLINE FieldSamplerIntl* getInternalFieldSampler() const
+ {
+ return mFieldSampler;
+ }
+ PX_INLINE const FieldSamplerDescIntl& getInternalFieldSamplerDesc() const
+ {
+ return mFieldSamplerDesc;
+ }
+ PX_INLINE FieldSamplerSceneWrapper* getFieldSamplerSceneWrapper() const
+ {
+ return mSceneWrapper;
+ }
+
+ bool addFieldBoundary(FieldBoundaryWrapper* wrapper);
+ bool removeFieldBoundary(FieldBoundaryWrapper* wrapper);
+
+ uint32_t getFieldBoundaryCount() const
+ {
+ return mFieldBoundaryInfoArray.size();
+ }
+ FieldBoundaryWrapper* getFieldBoundaryWrapper(uint32_t index) const
+ {
+ return mFieldBoundaryInfoArray[index]->getFieldBoundaryWrapper();
+ }
+
+ PX_INLINE const FieldShapeDescIntl& getInternalFieldSamplerShape() const
+ {
+ return mFieldSamplerShape;
+ }
+ PX_INLINE bool isFieldSamplerChanged() const
+ {
+ return mFieldSamplerShapeChanged;
+ }
+ PX_INLINE bool isEnabled() const
+ {
+ return mIsEnabled;
+ }
+ PX_INLINE bool isEnabledChanged() const
+ {
+ return (mIsEnabled != mIsEnabledLast);
+ }
+
+protected:
+ FieldSamplerManager* mManager;
+ FieldSamplerIntl* mFieldSampler;
+ FieldSamplerDescIntl mFieldSamplerDesc;
+
+ FieldShapeDescIntl mFieldSamplerShape;
+ bool mFieldSamplerShapeChanged;
+
+ FieldSamplerSceneWrapper* mSceneWrapper;
+ uint32_t mQueryRefCount;
+
+ nvidia::Array<FieldSamplerSceneWrapper::FieldBoundaryInfo*> mFieldBoundaryInfoArray;
+ bool mFieldBoundaryInfoArrayChanged;
+
+ bool mIsEnabled;
+ bool mIsEnabledLast;
+
+ friend class FieldSamplerManager;
+};
+
+
+class FieldSamplerWrapperCPU : public FieldSamplerWrapper
+{
+public:
+ FieldSamplerWrapperCPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper);
+
+private:
+};
+
+#if APEX_CUDA_SUPPORT
+class FieldSamplerWrapperGPU : public FieldSamplerWrapperCPU
+{
+public:
+ FieldSamplerWrapperGPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper);
+
+ virtual void update();
+
+ PX_INLINE InplaceHandle<FieldSamplerParams> getParamsHandle() const
+ {
+ PX_ASSERT(mFieldSamplerParamsHandle.isNull() == false);
+ return mFieldSamplerParamsHandle;
+ }
+
+private:
+ ApexCudaConstMemGroup mConstMemGroup;
+ InplaceHandle<FieldSamplerParams> mFieldSamplerParamsHandle;
+};
+#endif
+
+}
+} // end namespace nvidia::apex
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/ModuleEventDefs.h b/APEX_1.4/module/fieldsampler/include/ModuleEventDefs.h
new file mode 100644
index 00000000..583b50d1
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/ModuleEventDefs.h
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+
+// This file is used to define a list of AgPerfMon events.
+//
+// This file is included exclusively by ModulePerfScope.h
+// and by ModuleFoo.cpp, for the purpose of building
+// an enumeration (enum xx) and an array of strings ()
+// that contain the list of events.
+//
+// This file should only contain event definitions, using the
+// DEFINE_EVENT macro. E.g.:
+//
+// DEFINE_EVENT(sample_name_1)
+// DEFINE_EVENT(sample_name_2)
+// DEFINE_EVENT(sample_name_3)
+
+DEFINE_EVENT(FieldSamplerSceneFetchResults)
diff --git a/APEX_1.4/module/fieldsampler/include/ModuleFieldSamplerImpl.h b/APEX_1.4/module/fieldsampler/include/ModuleFieldSamplerImpl.h
new file mode 100644
index 00000000..b15f5189
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/ModuleFieldSamplerImpl.h
@@ -0,0 +1,98 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __MODULE_FIELD_SAMPLER_IMPL_H__
+#define __MODULE_FIELD_SAMPLER_IMPL_H__
+
+#include "Apex.h"
+#include "ModuleFieldSampler.h"
+#include "ApexSDKIntl.h"
+#include "ModuleIntl.h"
+#include "ModuleBase.h"
+
+#include "ApexSDKHelpers.h"
+#include "ApexRWLockable.h"
+#include "ModuleFieldSamplerRegistration.h"
+
+#include "ModuleFieldSamplerIntl.h"
+
+namespace nvidia
+{
+namespace apex
+{
+class SceneIntl;
+}
+
+namespace fieldsampler
+{
+
+class FieldSamplerScene;
+
+class ModuleFieldSamplerImpl : public ModuleFieldSampler, public ModuleFieldSamplerIntl, public ModuleBase, public ApexRWLockable
+{
+public:
+ APEX_RW_LOCKABLE_BOILERPLATE
+
+ ModuleFieldSamplerImpl(ApexSDKIntl* sdk);
+ ~ModuleFieldSamplerImpl();
+
+ FieldSamplerManagerIntl* getInternalFieldSamplerManager(const Scene& apexScene);
+
+ bool setFieldSamplerWeightedCollisionFilterCallback(const Scene& apexScene,FieldSamplerWeightedCollisionFilterCallback *callback);
+
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ void enablePhysXMonitor(const Scene& apexScene, bool enable);
+ void setPhysXMonitorFilterData(const Scene& apexScene, physx::PxFilterData filterData);
+#endif
+
+ uint32_t createForceSampleBatch(const Scene& apexScene, uint32_t maxCount, const physx::PxFilterData filterData);
+ void releaseForceSampleBatch(const Scene& apexScene, uint32_t batchId);
+ void 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);
+
+
+ // base class methods
+ void init(NvParameterized::Interface&);
+ NvParameterized::Interface* getDefaultModuleDesc();
+ void release()
+ {
+ ModuleBase::release();
+ }
+ void destroy();
+ const char* getName() const
+ {
+ return ModuleBase::getName();
+ }
+
+ ModuleSceneIntl* createInternalModuleScene(SceneIntl&, RenderDebugInterface*);
+ void releaseModuleSceneIntl(ModuleSceneIntl&);
+ AuthObjTypeID getModuleID() const;
+ RenderableIterator* createRenderableIterator(const Scene&);
+
+
+protected:
+ FieldSamplerScene* getFieldSamplerScene(const Scene& apexScene) const;
+
+ ResourceList mFieldSamplerScenes;
+
+private:
+
+ FieldSamplerModuleParameters* mModuleParams;
+};
+
+}
+} // end namespace nvidia::apex
+
+#endif // __MODULE_FIELD_SAMPLER_IMPL_H__
diff --git a/APEX_1.4/module/fieldsampler/include/ModuleGpuEventDefs.h b/APEX_1.4/module/fieldsampler/include/ModuleGpuEventDefs.h
new file mode 100644
index 00000000..faa6b9d4
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/ModuleGpuEventDefs.h
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+
+// This file is used to define a list of AgPerfMon events.
+//
+// This file is included exclusively by ModulePerfScope.h
+// and by ModuleFoo.cpp, for the purpose of building
+// an enumeration (enum xx) and an array of strings ()
+// that contain the list of events.
+//
+// This file should only contain event definitions, using the
+// DEFINE_EVENT macro. E.g.:
+//
+// DEFINE_GPU_EVENT(kernel_name_1)
+// DEFINE_GPU_EVENT(kernel_name_2)
+// DEFINE_GPU_EVENT(copy_name_1)
+
+DEFINE_GPU_EVENT(FieldSamplerKernel)
diff --git a/APEX_1.4/module/fieldsampler/include/ModulePerfScope.h b/APEX_1.4/module/fieldsampler/include/ModulePerfScope.h
new file mode 100644
index 00000000..2692f4ba
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/ModulePerfScope.h
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __MODULE_PERF_SCOPE_H___
+#define __MODULE_PERF_SCOPE_H___
+
+#define MODULE_NAMESPACE fieldsampler
+#include "ModuleProfileCommon.h"
+
+#endif \ No newline at end of file
diff --git a/APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerModuleParameters.h b/APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerModuleParameters.h
new file mode 100644
index 00000000..4267524c
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerModuleParameters.h
@@ -0,0 +1,230 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and 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.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2015 NVIDIA Corporation. All rights reserved.
+
+// This file was generated by NvParameterized/scripts/GenParameterized.pl
+
+
+#ifndef HEADER_FieldSamplerModuleParameters_h
+#define HEADER_FieldSamplerModuleParameters_h
+
+#include "NvParametersTypes.h"
+
+#ifndef NV_PARAMETERIZED_ONLY_LAYOUTS
+#include "nvparameterized/NvParameterized.h"
+#include "nvparameterized/NvParameterizedTraits.h"
+#include "NvParameters.h"
+#include "NvTraitsInternal.h"
+#endif
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+#if PX_VC
+#pragma warning(push)
+#pragma warning(disable: 4324) // structure was padded due to __declspec(align())
+#endif
+
+namespace FieldSamplerModuleParametersNS
+{
+
+
+
+struct ParametersStruct
+{
+
+ uint32_t unused;
+
+};
+
+static const uint32_t checksum[] = { 0xe3bea6f1, 0xd89e4c54, 0x40faae3e, 0x35941431, };
+
+} // namespace FieldSamplerModuleParametersNS
+
+#ifndef NV_PARAMETERIZED_ONLY_LAYOUTS
+class FieldSamplerModuleParameters : public NvParameterized::NvParameters, public FieldSamplerModuleParametersNS::ParametersStruct
+{
+public:
+ FieldSamplerModuleParameters(NvParameterized::Traits* traits, void* buf = 0, int32_t* refCount = 0);
+
+ virtual ~FieldSamplerModuleParameters();
+
+ virtual void destroy();
+
+ static const char* staticClassName(void)
+ {
+ return("FieldSamplerModuleParameters");
+ }
+
+ const char* className(void) const
+ {
+ return(staticClassName());
+ }
+
+ static const uint32_t ClassVersion = ((uint32_t)0 << 16) + (uint32_t)0;
+
+ static uint32_t staticVersion(void)
+ {
+ return ClassVersion;
+ }
+
+ uint32_t version(void) const
+ {
+ return(staticVersion());
+ }
+
+ static const uint32_t ClassAlignment = 8;
+
+ static const uint32_t* staticChecksum(uint32_t& bits)
+ {
+ bits = 8 * sizeof(FieldSamplerModuleParametersNS::checksum);
+ return FieldSamplerModuleParametersNS::checksum;
+ }
+
+ static void freeParameterDefinitionTable(NvParameterized::Traits* traits);
+
+ const uint32_t* checksum(uint32_t& bits) const
+ {
+ return staticChecksum(bits);
+ }
+
+ const FieldSamplerModuleParametersNS::ParametersStruct& parameters(void) const
+ {
+ FieldSamplerModuleParameters* tmpThis = const_cast<FieldSamplerModuleParameters*>(this);
+ return *(static_cast<FieldSamplerModuleParametersNS::ParametersStruct*>(tmpThis));
+ }
+
+ FieldSamplerModuleParametersNS::ParametersStruct& parameters(void)
+ {
+ return *(static_cast<FieldSamplerModuleParametersNS::ParametersStruct*>(this));
+ }
+
+ virtual NvParameterized::ErrorType getParameterHandle(const char* long_name, NvParameterized::Handle& handle) const;
+ virtual NvParameterized::ErrorType getParameterHandle(const char* long_name, NvParameterized::Handle& handle);
+
+ void initDefaults(void);
+
+protected:
+
+ virtual const NvParameterized::DefinitionImpl* getParameterDefinitionTree(void);
+ virtual const NvParameterized::DefinitionImpl* getParameterDefinitionTree(void) const;
+
+
+ virtual void getVarPtr(const NvParameterized::Handle& handle, void*& ptr, size_t& offset) const;
+
+private:
+
+ void buildTree(void);
+ void initDynamicArrays(void);
+ void initStrings(void);
+ void initReferences(void);
+ void freeDynamicArrays(void);
+ void freeStrings(void);
+ void freeReferences(void);
+
+ static bool mBuiltFlag;
+ static NvParameterized::MutexType mBuiltFlagMutex;
+};
+
+class FieldSamplerModuleParametersFactory : public NvParameterized::Factory
+{
+ static const char* const vptr;
+
+public:
+
+ virtual void freeParameterDefinitionTable(NvParameterized::Traits* traits)
+ {
+ FieldSamplerModuleParameters::freeParameterDefinitionTable(traits);
+ }
+
+ virtual NvParameterized::Interface* create(NvParameterized::Traits* paramTraits)
+ {
+ // placement new on this class using mParameterizedTraits
+
+ void* newPtr = paramTraits->alloc(sizeof(FieldSamplerModuleParameters), FieldSamplerModuleParameters::ClassAlignment);
+ if (!NvParameterized::IsAligned(newPtr, FieldSamplerModuleParameters::ClassAlignment))
+ {
+ NV_PARAM_TRAITS_WARNING(paramTraits, "Unaligned memory allocation for class FieldSamplerModuleParameters");
+ paramTraits->free(newPtr);
+ return 0;
+ }
+
+ memset(newPtr, 0, sizeof(FieldSamplerModuleParameters)); // always initialize memory allocated to zero for default values
+ return NV_PARAM_PLACEMENT_NEW(newPtr, FieldSamplerModuleParameters)(paramTraits);
+ }
+
+ virtual NvParameterized::Interface* finish(NvParameterized::Traits* paramTraits, void* bufObj, void* bufStart, int32_t* refCount)
+ {
+ if (!NvParameterized::IsAligned(bufObj, FieldSamplerModuleParameters::ClassAlignment)
+ || !NvParameterized::IsAligned(bufStart, FieldSamplerModuleParameters::ClassAlignment))
+ {
+ NV_PARAM_TRAITS_WARNING(paramTraits, "Unaligned memory allocation for class FieldSamplerModuleParameters");
+ return 0;
+ }
+
+ // Init NvParameters-part
+ // We used to call empty constructor of FieldSamplerModuleParameters here
+ // but it may call default constructors of members and spoil the data
+ NV_PARAM_PLACEMENT_NEW(bufObj, NvParameterized::NvParameters)(paramTraits, bufStart, refCount);
+
+ // Init vtable (everything else is already initialized)
+ *(const char**)bufObj = vptr;
+
+ return (FieldSamplerModuleParameters*)bufObj;
+ }
+
+ virtual const char* getClassName()
+ {
+ return (FieldSamplerModuleParameters::staticClassName());
+ }
+
+ virtual uint32_t getVersion()
+ {
+ return (FieldSamplerModuleParameters::staticVersion());
+ }
+
+ virtual uint32_t getAlignment()
+ {
+ return (FieldSamplerModuleParameters::ClassAlignment);
+ }
+
+ virtual const uint32_t* getChecksum(uint32_t& bits)
+ {
+ return (FieldSamplerModuleParameters::staticChecksum(bits));
+ }
+};
+#endif // NV_PARAMETERIZED_ONLY_LAYOUTS
+
+} // namespace fieldsampler
+} // namespace nvidia
+
+#if PX_VC
+#pragma warning(pop)
+#endif
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerPhysXMonitorParams.h b/APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerPhysXMonitorParams.h
new file mode 100644
index 00000000..037d7b3b
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/autogen/FieldSamplerPhysXMonitorParams.h
@@ -0,0 +1,232 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and 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.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2015 NVIDIA Corporation. All rights reserved.
+
+// This file was generated by NvParameterized/scripts/GenParameterized.pl
+
+
+#ifndef HEADER_FieldSamplerPhysXMonitorParams_h
+#define HEADER_FieldSamplerPhysXMonitorParams_h
+
+#include "NvParametersTypes.h"
+
+#ifndef NV_PARAMETERIZED_ONLY_LAYOUTS
+#include "nvparameterized/NvParameterized.h"
+#include "nvparameterized/NvParameterizedTraits.h"
+#include "NvParameters.h"
+#include "NvTraitsInternal.h"
+#endif
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+#if PX_VC
+#pragma warning(push)
+#pragma warning(disable: 4324) // structure was padded due to __declspec(align())
+#endif
+
+namespace FieldSamplerPhysXMonitorParamsNS
+{
+
+
+
+struct ParametersStruct
+{
+
+ uint32_t maxRBCount;
+ uint32_t maxPSCount;
+ uint32_t maxParticleCount;
+
+};
+
+static const uint32_t checksum[] = { 0x357a67e3, 0x9ed0cf4f, 0xd9fe5e4e, 0x532febb8, };
+
+} // namespace FieldSamplerPhysXMonitorParamsNS
+
+#ifndef NV_PARAMETERIZED_ONLY_LAYOUTS
+class FieldSamplerPhysXMonitorParams : public NvParameterized::NvParameters, public FieldSamplerPhysXMonitorParamsNS::ParametersStruct
+{
+public:
+ FieldSamplerPhysXMonitorParams(NvParameterized::Traits* traits, void* buf = 0, int32_t* refCount = 0);
+
+ virtual ~FieldSamplerPhysXMonitorParams();
+
+ virtual void destroy();
+
+ static const char* staticClassName(void)
+ {
+ return("FieldSamplerPhysXMonitorParams");
+ }
+
+ const char* className(void) const
+ {
+ return(staticClassName());
+ }
+
+ static const uint32_t ClassVersion = ((uint32_t)0 << 16) + (uint32_t)0;
+
+ static uint32_t staticVersion(void)
+ {
+ return ClassVersion;
+ }
+
+ uint32_t version(void) const
+ {
+ return(staticVersion());
+ }
+
+ static const uint32_t ClassAlignment = 8;
+
+ static const uint32_t* staticChecksum(uint32_t& bits)
+ {
+ bits = 8 * sizeof(FieldSamplerPhysXMonitorParamsNS::checksum);
+ return FieldSamplerPhysXMonitorParamsNS::checksum;
+ }
+
+ static void freeParameterDefinitionTable(NvParameterized::Traits* traits);
+
+ const uint32_t* checksum(uint32_t& bits) const
+ {
+ return staticChecksum(bits);
+ }
+
+ const FieldSamplerPhysXMonitorParamsNS::ParametersStruct& parameters(void) const
+ {
+ FieldSamplerPhysXMonitorParams* tmpThis = const_cast<FieldSamplerPhysXMonitorParams*>(this);
+ return *(static_cast<FieldSamplerPhysXMonitorParamsNS::ParametersStruct*>(tmpThis));
+ }
+
+ FieldSamplerPhysXMonitorParamsNS::ParametersStruct& parameters(void)
+ {
+ return *(static_cast<FieldSamplerPhysXMonitorParamsNS::ParametersStruct*>(this));
+ }
+
+ virtual NvParameterized::ErrorType getParameterHandle(const char* long_name, NvParameterized::Handle& handle) const;
+ virtual NvParameterized::ErrorType getParameterHandle(const char* long_name, NvParameterized::Handle& handle);
+
+ void initDefaults(void);
+
+protected:
+
+ virtual const NvParameterized::DefinitionImpl* getParameterDefinitionTree(void);
+ virtual const NvParameterized::DefinitionImpl* getParameterDefinitionTree(void) const;
+
+
+ virtual void getVarPtr(const NvParameterized::Handle& handle, void*& ptr, size_t& offset) const;
+
+private:
+
+ void buildTree(void);
+ void initDynamicArrays(void);
+ void initStrings(void);
+ void initReferences(void);
+ void freeDynamicArrays(void);
+ void freeStrings(void);
+ void freeReferences(void);
+
+ static bool mBuiltFlag;
+ static NvParameterized::MutexType mBuiltFlagMutex;
+};
+
+class FieldSamplerPhysXMonitorParamsFactory : public NvParameterized::Factory
+{
+ static const char* const vptr;
+
+public:
+
+ virtual void freeParameterDefinitionTable(NvParameterized::Traits* traits)
+ {
+ FieldSamplerPhysXMonitorParams::freeParameterDefinitionTable(traits);
+ }
+
+ virtual NvParameterized::Interface* create(NvParameterized::Traits* paramTraits)
+ {
+ // placement new on this class using mParameterizedTraits
+
+ void* newPtr = paramTraits->alloc(sizeof(FieldSamplerPhysXMonitorParams), FieldSamplerPhysXMonitorParams::ClassAlignment);
+ if (!NvParameterized::IsAligned(newPtr, FieldSamplerPhysXMonitorParams::ClassAlignment))
+ {
+ NV_PARAM_TRAITS_WARNING(paramTraits, "Unaligned memory allocation for class FieldSamplerPhysXMonitorParams");
+ paramTraits->free(newPtr);
+ return 0;
+ }
+
+ memset(newPtr, 0, sizeof(FieldSamplerPhysXMonitorParams)); // always initialize memory allocated to zero for default values
+ return NV_PARAM_PLACEMENT_NEW(newPtr, FieldSamplerPhysXMonitorParams)(paramTraits);
+ }
+
+ virtual NvParameterized::Interface* finish(NvParameterized::Traits* paramTraits, void* bufObj, void* bufStart, int32_t* refCount)
+ {
+ if (!NvParameterized::IsAligned(bufObj, FieldSamplerPhysXMonitorParams::ClassAlignment)
+ || !NvParameterized::IsAligned(bufStart, FieldSamplerPhysXMonitorParams::ClassAlignment))
+ {
+ NV_PARAM_TRAITS_WARNING(paramTraits, "Unaligned memory allocation for class FieldSamplerPhysXMonitorParams");
+ return 0;
+ }
+
+ // Init NvParameters-part
+ // We used to call empty constructor of FieldSamplerPhysXMonitorParams here
+ // but it may call default constructors of members and spoil the data
+ NV_PARAM_PLACEMENT_NEW(bufObj, NvParameterized::NvParameters)(paramTraits, bufStart, refCount);
+
+ // Init vtable (everything else is already initialized)
+ *(const char**)bufObj = vptr;
+
+ return (FieldSamplerPhysXMonitorParams*)bufObj;
+ }
+
+ virtual const char* getClassName()
+ {
+ return (FieldSamplerPhysXMonitorParams::staticClassName());
+ }
+
+ virtual uint32_t getVersion()
+ {
+ return (FieldSamplerPhysXMonitorParams::staticVersion());
+ }
+
+ virtual uint32_t getAlignment()
+ {
+ return (FieldSamplerPhysXMonitorParams::ClassAlignment);
+ }
+
+ virtual const uint32_t* getChecksum(uint32_t& bits)
+ {
+ return (FieldSamplerPhysXMonitorParams::staticChecksum(bits));
+ }
+};
+#endif // NV_PARAMETERIZED_ONLY_LAYOUTS
+
+} // namespace fieldsampler
+} // namespace nvidia
+
+#if PX_VC
+#pragma warning(pop)
+#endif
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/include/autogen/ModuleFieldSamplerRegistration.h b/APEX_1.4/module/fieldsampler/include/autogen/ModuleFieldSamplerRegistration.h
new file mode 100644
index 00000000..62baddf6
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/include/autogen/ModuleFieldSamplerRegistration.h
@@ -0,0 +1,117 @@
+/*
+ * 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.
+ */
+
+#ifndef MODULE_MODULEFIELDSAMPLERREGISTRATIONH_H
+#define MODULE_MODULEFIELDSAMPLERREGISTRATIONH_H
+
+#include "PsAllocator.h"
+#include "NvRegistrationsForTraitsBase.h"
+#include "nvparameterized/NvParameterizedTraits.h"
+#include "PxAssert.h"
+#include <stdint.h>
+
+// INCLUDE GENERATED FACTORIES
+#include "FieldSamplerPhysXMonitorParams.h"
+#include "FieldSamplerModuleParameters.h"
+
+
+// INCLUDE GENERATED CONVERSION
+
+
+namespace nvidia {
+namespace fieldsampler {
+
+
+class ModuleFieldSamplerRegistration : public NvParameterized::RegistrationsForTraitsBase
+{
+public:
+ static void invokeRegistration(NvParameterized::Traits* parameterizedTraits)
+ {
+ if (parameterizedTraits)
+ {
+ ModuleFieldSamplerRegistration().registerAll(*parameterizedTraits);
+ }
+ }
+
+ static void invokeUnregistration(NvParameterized::Traits* parameterizedTraits)
+ {
+ if (parameterizedTraits)
+ {
+ ModuleFieldSamplerRegistration().unregisterAll(*parameterizedTraits);
+ }
+ }
+
+ void registerAvailableFactories(NvParameterized::Traits& parameterizedTraits)
+ {
+ ::NvParameterized::Factory* factoriesToRegister[] = {
+// REGISTER GENERATED FACTORIES
+ new nvidia::fieldsampler::FieldSamplerPhysXMonitorParamsFactory(),
+ new nvidia::fieldsampler::FieldSamplerModuleParametersFactory(),
+
+ };
+
+ for (size_t i = 0; i < sizeof(factoriesToRegister)/sizeof(factoriesToRegister[0]); ++i)
+ {
+ parameterizedTraits.registerFactory(*factoriesToRegister[i]);
+ }
+ }
+
+ virtual void registerAvailableConverters(NvParameterized::Traits& parameterizedTraits)
+ {
+// REGISTER GENERATED CONVERSION
+PX_UNUSED(parameterizedTraits);
+
+ }
+
+ void unregisterAvailableFactories(NvParameterized::Traits& parameterizedTraits)
+ {
+ struct FactoryDesc
+ {
+ const char* name;
+ uint32_t version;
+ };
+
+ ::NvParameterized::Factory* factoriesToUnregister[] = {
+// UNREGISTER GENERATED FACTORIES
+ new nvidia::fieldsampler::FieldSamplerPhysXMonitorParamsFactory(),
+ new nvidia::fieldsampler::FieldSamplerModuleParametersFactory(),
+
+ };
+
+ for (size_t i = 0; i < sizeof(factoriesToUnregister)/sizeof(factoriesToUnregister[0]); ++i)
+ {
+ ::NvParameterized::Factory* removedFactory = parameterizedTraits.removeFactory(factoriesToUnregister[i]->getClassName(), factoriesToUnregister[i]->getVersion());
+ if (!removedFactory)
+ {
+ PX_ASSERT_WITH_MESSAGE(0, "Factory can not be removed!");
+ }
+ else
+ {
+ removedFactory->freeParameterDefinitionTable(&parameterizedTraits);
+ delete removedFactory;
+ delete factoriesToUnregister[i];
+ }
+ }
+ }
+
+ virtual void unregisterAvailableConverters(NvParameterized::Traits& parameterizedTraits)
+ {
+// UNREGISTER GENERATED CONVERSION
+PX_UNUSED(parameterizedTraits);
+
+ }
+
+};
+
+
+}
+} //nvidia::fieldsampler
+
+#endif
diff --git a/APEX_1.4/module/fieldsampler/src/FieldBoundaryWrapper.cpp b/APEX_1.4/module/fieldsampler/src/FieldBoundaryWrapper.cpp
new file mode 100644
index 00000000..ebeedc80
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/FieldBoundaryWrapper.cpp
@@ -0,0 +1,45 @@
+/*
+ * 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 "FieldBoundaryWrapper.h"
+#include "FieldSamplerManager.h"
+
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+FieldBoundaryWrapper::FieldBoundaryWrapper(ResourceList& list, FieldSamplerManager* manager, FieldBoundaryIntl* fieldBoundary, const FieldBoundaryDescIntl& fieldBoundaryDesc)
+ : mManager(manager)
+ , mFieldBoundary(fieldBoundary)
+ , mFieldBoundaryDesc(fieldBoundaryDesc)
+ , mFieldShapesChanged(false)
+{
+ list.add(*this);
+
+}
+
+void FieldBoundaryWrapper::release()
+{
+ delete this;
+}
+
+void FieldBoundaryWrapper::update()
+{
+ mFieldShapesChanged = mFieldBoundary->updateFieldBoundary(mFieldShapes);
+}
+
+}
+} // end namespace nvidia::apex
+
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
+
+
diff --git a/APEX_1.4/module/fieldsampler/src/FieldSamplerPhysXMonitor.cpp b/APEX_1.4/module/fieldsampler/src/FieldSamplerPhysXMonitor.cpp
new file mode 100644
index 00000000..e75c8700
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/FieldSamplerPhysXMonitor.cpp
@@ -0,0 +1,354 @@
+/*
+ * 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"
+
+#if PX_PHYSICS_VERSION_MAJOR == 3
+
+#include "ScopedPhysXLock.h"
+
+#include "PsSort.h"
+#include "FieldSamplerPhysXMonitor.h"
+#include "FieldSamplerScene.h"
+#include "FieldSamplerManager.h"
+#include "FieldSamplerQueryIntl.h"
+
+#include "extensions/PxShapeExt.h"
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+ using namespace physx;
+
+#pragma warning(disable: 4355) // 'this' : used in base member initializer list
+
+FieldSamplerPhysXMonitor::FieldSamplerPhysXMonitor(FieldSamplerScene& scene)
+ : mFieldSamplerScene(&scene)
+ , mNumPS(0)
+ , mNumRB(0)
+ , mEnable(false)
+ , mTaskRunAfterActorUpdate(*this)
+{
+ mFilterData.setToDefault();
+
+ mScene = mFieldSamplerScene->getModulePhysXScene();
+ mParams = static_cast<FieldSamplerPhysXMonitorParams*>(GetInternalApexSDK()->getParameterizedTraits()->createNvParameterized(FieldSamplerPhysXMonitorParams::staticClassName()));
+ mFieldSamplerManager = DYNAMIC_CAST(FieldSamplerManager*)(mFieldSamplerScene->getManager());
+
+ mRBIndex.reserve(mParams->maxRBCount);
+ mParticleSystems.resize(mParams->maxPSCount);
+
+ mPSOutField.resize(mParams->maxParticleCount);
+ mOutVelocities.resize(mParams->maxParticleCount);
+ mOutIndices.resize(mParams->maxParticleCount);
+
+ mRBOutField.resize(mParams->maxRBCount);
+
+ mRBActors.resize(mParams->maxRBCount);
+}
+
+
+FieldSamplerPhysXMonitor::~FieldSamplerPhysXMonitor()
+{
+ for (uint32_t i = 0; i < mPSFieldSamplerQuery.size(); i++)
+ {
+ if (mPSFieldSamplerQuery[i])
+ {
+ mPSFieldSamplerQuery[i]->release();
+ }
+ }
+ for (uint32_t i = 0; i < mRBFieldSamplerQuery.size(); i++)
+ {
+ if (mRBFieldSamplerQuery[i])
+ {
+ mRBFieldSamplerQuery[i]->release();
+ }
+ }
+ if(mParams)
+ {
+ mParams->destroy();
+ }
+}
+
+
+void FieldSamplerPhysXMonitor::setPhysXScene(PxScene* scene)
+{
+ mScene = scene;
+}
+
+
+void FieldSamplerPhysXMonitor::getParticles(uint32_t taskId)
+{
+ SCOPED_PHYSX_LOCK_READ(&mFieldSamplerScene->getApexScene());
+ float deltaTime = mFieldSamplerScene->getApexScene().getPhysXSimulateTime();
+ mPCount = 0;
+ mNumPS = mScene->getActors(physx::PxActorTypeFlag::ePARTICLE_SYSTEM, &mParticleSystems[0], mParams->maxPSCount);
+ for(uint32_t i = 0; i < mNumPS; i++)
+ if (!mFieldSamplerManager->isUnhandledParticleSystem(mParticleSystems[i]) && mParticleSystems[i]->is<PxParticleBase>())
+ {
+ if (mPSFieldSamplerQuery.size() == i)
+ {
+ FieldSamplerQueryDescIntl queryDesc;
+ queryDesc.maxCount = mParams->maxParticleCount;
+ queryDesc.samplerFilterData = mFilterData;
+ mPSFieldSamplerQuery.pushBack( mFieldSamplerManager->createFieldSamplerQuery(queryDesc) );
+ mPSFieldSamplerTaskID.pushBack(0);
+ mParticleReadData.pushBack(0);
+ mPSMass.pushBack(0.f);
+ }
+
+ PxParticleSystem* particleSystem = DYNAMIC_CAST(PxParticleSystem*)((mParticleSystems[i]));
+ mParticleReadData[i] = particleSystem->lockParticleReadData();
+ uint32_t numParticles;
+ if (mParticleReadData[i])
+ {
+ numParticles = mParticleReadData[i]->validParticleRange;
+ if(mPCount + numParticles >= mParams->maxParticleCount) break;
+
+ FieldSamplerQueryDataIntl queryData;
+ queryData.timeStep = deltaTime;
+ queryData.count = numParticles;
+ queryData.isDataOnDevice = false;
+
+ //hack for PhysX particle stride calculation
+ physx::PxStrideIterator<const PxVec3> positionIt(mParticleReadData[i]->positionBuffer);
+#ifdef WIN64
+ queryData.positionStrideBytes = (uint32_t)(-(int64_t)&*positionIt + (int64_t)&*(++positionIt));
+#else
+ queryData.positionStrideBytes = (uint32_t)(-(int32_t)&*positionIt + (int32_t)&*(++positionIt));
+#endif
+ queryData.velocityStrideBytes = queryData.positionStrideBytes;
+ queryData.massStrideBytes = 0;
+ queryData.pmaInPosition = (float*)&*(mParticleReadData[i]->positionBuffer);
+ queryData.pmaInVelocity = (float*)&*(mParticleReadData[i]->velocityBuffer);
+ queryData.pmaInIndices = 0;
+ mPSMass[i] = particleSystem->getParticleMass();
+ queryData.pmaInMass = &mPSMass[i];
+ queryData.pmaOutField = &mPSOutField[mPCount];
+ mPSFieldSamplerTaskID[i] = mPSFieldSamplerQuery[i]->submitFieldSamplerQuery(queryData, taskId);
+
+ mPCount += numParticles;
+ }
+ }
+}
+
+
+void FieldSamplerPhysXMonitor::updateParticles()
+{
+ uint32_t pCount = 0;
+ SCOPED_PHYSX_LOCK_WRITE(mFieldSamplerScene->getApexScene().getPhysXScene());
+ for(uint32_t i = 0; i < mNumPS; i++)
+ if (!mFieldSamplerManager->isUnhandledParticleSystem(mParticleSystems[i]))
+ {
+ PxParticleSystem* particleSystem = DYNAMIC_CAST(PxParticleSystem*)((mParticleSystems[i]));
+ uint32_t numParticles = PxMin(mParticleReadData[i]->validParticleRange, mParams->maxParticleCount);
+
+ uint32_t numUpdates = 0;
+
+ if (numParticles > 0)
+ {
+ for (uint32_t w = 0; w <= (mParticleReadData[i]->validParticleRange-1) >> 5; w++)
+ {
+ for (uint32_t b = mParticleReadData[i]->validParticleBitmap[w]; b; b &= b-1)
+ {
+ uint32_t index = (w << 5 | shdfnd::lowestSetBit(b));
+
+ PxVec3 diffVel = mPSOutField[pCount + index].getXYZ();
+ if (!diffVel.isZero())
+ {
+ const PxVec3& sourceVelocity = mParticleReadData[i]->velocityBuffer[index];
+ mOutVelocities[numUpdates] = sourceVelocity + diffVel;
+ mOutIndices[numUpdates] = index;
+ numUpdates++;
+ }
+ }
+ }
+ }
+ pCount += numParticles;
+ // return ownership of the buffers back to the SDK
+ mParticleReadData[i]->unlock();
+
+ if(pCount <= mParams->maxParticleCount && numUpdates > 0)
+ {
+ physx::PxStrideIterator<uint32_t> indices(&mOutIndices[0]);
+ physx::PxStrideIterator<PxVec3> outVelocities(&mOutVelocities[0]);
+ particleSystem->setVelocities(numUpdates, indices, outVelocities);
+ }
+ }
+}
+
+
+void FieldSamplerPhysXMonitor::getRigidBodies(uint32_t taskId)
+{
+ SCOPED_PHYSX_LOCK_READ(&mFieldSamplerScene->getApexScene());
+ float deltaTime = mFieldSamplerScene->getApexScene().getPhysXSimulateTime();
+
+ FieldSamplerQueryDataIntl queryData;
+ queryData.timeStep = deltaTime;
+ queryData.pmaInIndices = 0;
+
+ uint32_t rbCount = mScene->getActors(physx::PxActorTypeFlag::eRIGID_DYNAMIC, &mRBActors[0], mParams->maxRBCount);
+ Array<PxShape*> shapes;
+ mNumRB = 0;
+ mRBIndex.clear();
+ float weight = 1.f;
+
+ for (uint32_t i = 0; i < rbCount; i++)
+ {
+ physx::PxRigidDynamic* rb = (physx::PxRigidDynamic*)mRBActors[i];
+ if (rb->getRigidBodyFlags() == PxRigidBodyFlag::eKINEMATIC)
+ {
+ continue;
+ }
+ const PxVec3& cmPos = rb->getGlobalPose().p;
+ const PxVec3& velocity = rb->getLinearVelocity();
+ const PxVec3& rotation = rb->getAngularVelocity();
+ float mass = rb->getMass();
+
+ const uint32_t numShapes = rb->getNbShapes();
+ shapes.resize(numShapes);
+ if (numShapes == 0)
+ {
+ continue;
+ }
+ rb->getShapes(&shapes[0], numShapes);
+ for (uint32_t j = 0; j < numShapes && mNumRB < mParams->maxRBCount; j++)
+ {
+ PxFilterData filterData = shapes[j]->getQueryFilterData();
+ if (mFieldSamplerManager->getFieldSamplerGroupsFiltering(mFilterData, filterData, weight))
+ {
+ PxFilterData* current = mRBFilterData.find(filterData);
+ if (current == mRBFilterData.end())
+ {
+ mRBFilterData.pushBack(filterData);
+ current = &mRBFilterData.back();
+ FieldSamplerQueryDescIntl queryDesc;
+ queryDesc.maxCount = mParams->maxParticleCount;
+ queryDesc.samplerFilterData = filterData;
+ mRBFieldSamplerQuery.pushBack( mFieldSamplerManager->createFieldSamplerQuery(queryDesc) );
+ }
+
+ ShapeData* sd = PX_NEW(ShapeData)();
+ sd->fdIndex = (uint32_t)(current - &mRBFilterData[0]);
+ sd->rbIndex = i;
+ sd->mass = mass / numShapes;
+ sd->pos = PxShapeExt::getWorldBounds(*shapes[j], *rb).getCenter();
+ sd->vel = velocity + rotation.cross(sd->pos - cmPos);
+ mRBIndex.pushBack(sd);
+ ++mNumRB;
+ }
+ }
+ }
+
+ if (mNumRB == 0)
+ {
+ return;
+ }
+
+
+ sort(&mRBIndex[0], mNumRB, ShapeData::sortPredicate);
+
+ mRBInPosition.resize(mNumRB);
+ mRBInVelocity.resize(mNumRB);
+
+ uint32_t current(mRBIndex[0]->fdIndex);
+ uint32_t currentCount = 0;
+ uint32_t fdCount = 0;
+ for (uint32_t i = 0; i <= mNumRB; i++)
+ {
+ if (i == mNumRB || current != mRBIndex[i]->fdIndex)
+ {
+ queryData.count = currentCount;
+ queryData.isDataOnDevice = false;
+ queryData.massStrideBytes = sizeof(PxVec4);
+ queryData.positionStrideBytes = sizeof(PxVec4);
+ queryData.velocityStrideBytes = queryData.positionStrideBytes;
+
+ queryData.pmaInPosition = (float*)(&mRBInPosition[fdCount]);
+ queryData.pmaInVelocity = (float*)(&mRBInVelocity[fdCount]);
+ queryData.pmaInMass = &(mRBInPosition[fdCount].w);
+ queryData.pmaOutField = &mRBOutField[fdCount];
+
+ mRBFieldSamplerQuery[current]->submitFieldSamplerQuery(queryData, taskId);
+
+ fdCount += currentCount;
+ if (i != mNumRB)
+ {
+ current = mRBIndex[i]->fdIndex;
+ currentCount = 1;
+ }
+ }
+ else
+ {
+ currentCount++;
+ }
+ if (i < mNumRB)
+ {
+ mRBInPosition[i] = PxVec4 (mRBIndex[i]->pos, mRBIndex[i]->mass);
+ mRBInVelocity[i] = PxVec4 (mRBIndex[i]->vel, 0.f);
+ }
+ }
+}
+
+void FieldSamplerPhysXMonitor::updateRigidBodies()
+{
+ SCOPED_PHYSX_LOCK_WRITE(&mFieldSamplerScene->getApexScene());
+
+ for(uint32_t i = 0; i < mNumRB; i++)
+ {
+ physx::PxRigidDynamic* rb = (physx::PxRigidDynamic*)mRBActors[mRBIndex[i]->rbIndex];
+ const PxVec3 velocity = mRBOutField[i].getXYZ();
+ const PxVec3 rotation = mRBOutField[i].getXYZ().cross(mRBInPosition[i].getXYZ() - rb->getGlobalPose().p);
+ if (!velocity.isZero() || !rotation.isZero())
+ {
+ rb->setLinearVelocity(rb->getLinearVelocity() + velocity);
+ rb->setAngularVelocity(rb->getAngularVelocity() + rotation);
+ }
+
+ PX_DELETE(mRBIndex[i]);
+ }
+}
+
+
+void FieldSamplerPhysXMonitor::update()
+{
+ PxTaskManager* tm = mFieldSamplerScene->getApexScene().getTaskManager();
+ uint32_t taskId = tm->getNamedTask(FSST_PHYSX_MONITOR_LOAD);
+ if(mScene)
+ {
+ getParticles(taskId);
+
+ getRigidBodies(taskId);
+
+ //getCloth(task);
+ }
+ if(mNumPS > 0 || mNumRB > 0)
+ {
+ tm->submitNamedTask(&mTaskRunAfterActorUpdate, FSST_PHYSX_MONITOR_UPDATE);
+ mTaskRunAfterActorUpdate.startAfter(tm->getNamedTask(FSST_PHYSX_MONITOR_FETCH));
+ mTaskRunAfterActorUpdate.finishBefore(tm->getNamedTask(AST_PHYSX_SIMULATE));
+ }
+}
+
+void FieldSamplerPhysXMonitor::updatePhysX()
+{
+ updateParticles();
+ updateRigidBodies();
+}
+
+
+}
+} // end namespace nvidia::apex
+
+#endif
+
diff --git a/APEX_1.4/module/fieldsampler/src/FieldSamplerQuery.cpp b/APEX_1.4/module/fieldsampler/src/FieldSamplerQuery.cpp
new file mode 100644
index 00000000..bada10fc
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/FieldSamplerQuery.cpp
@@ -0,0 +1,876 @@
+/*
+ * 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 "FieldSamplerQuery.h"
+#include "FieldSamplerManager.h"
+#include "FieldSamplerWrapper.h"
+#include "FieldSamplerSceneWrapper.h"
+#include "FieldBoundaryWrapper.h"
+
+#include "SceneIntl.h"
+
+#if APEX_CUDA_SUPPORT
+#include "PxGpuTask.h"
+#endif
+
+#include "FieldSamplerCommon.h"
+
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+
+FieldSamplerQuery::FieldSamplerQuery(const FieldSamplerQueryDescIntl& desc, ResourceList& list, FieldSamplerManager* manager)
+ : mManager(manager)
+ , mQueryDesc(desc)
+ , mAccumVelocity(manager->getApexScene(), PX_ALLOC_INFO("mAccumVelocity", PARTICLES))
+ , mOnStartCallback(NULL)
+ , mOnFinishCallback(NULL)
+{
+ list.add(*this);
+}
+
+void FieldSamplerQuery::release()
+{
+ if (mInRelease)
+ {
+ return;
+ }
+ mInRelease = true;
+ destroy();
+}
+
+void FieldSamplerQuery::destroy()
+{
+ delete this;
+}
+
+
+FieldSamplerQuery::SceneInfo* FieldSamplerQuery::findSceneInfo(FieldSamplerSceneWrapper* sceneWrapper) const
+{
+ for (uint32_t i = 0; i < mSceneList.getSize(); ++i)
+ {
+ SceneInfo* sceneInfo = DYNAMIC_CAST(SceneInfo*)(mSceneList.getResource(i));
+ if (sceneInfo->getSceneWrapper() == sceneWrapper)
+ {
+ return sceneInfo;
+ }
+ }
+ return NULL;
+}
+
+
+bool FieldSamplerQuery::addFieldSampler(FieldSamplerWrapper* fieldSamplerWrapper)
+{
+ const FieldSamplerDescIntl& fieldSamplerDesc = fieldSamplerWrapper->getInternalFieldSamplerDesc();
+ float multiplier = 1.0f;
+ bool result = mManager->getFieldSamplerGroupsFiltering(mQueryDesc.samplerFilterData, fieldSamplerDesc.samplerFilterData, multiplier);
+ if (result)
+ {
+ FieldSamplerSceneWrapper* sceneWrapper = fieldSamplerWrapper->getFieldSamplerSceneWrapper();
+ SceneInfo* sceneInfo = findSceneInfo(sceneWrapper);
+ if (sceneInfo == NULL)
+ {
+ sceneInfo = createSceneInfo(sceneWrapper);
+ }
+ sceneInfo->addFieldSampler(fieldSamplerWrapper, multiplier);
+ }
+ return result;
+}
+
+bool FieldSamplerQuery::removeFieldSampler(FieldSamplerWrapper* fieldSamplerWrapper)
+{
+ FieldSamplerSceneWrapper* sceneWrapper = fieldSamplerWrapper->getFieldSamplerSceneWrapper();
+ SceneInfo* sceneInfo = findSceneInfo(sceneWrapper);
+ return (sceneInfo != NULL) ? sceneInfo->removeFieldSampler(fieldSamplerWrapper) : false;
+}
+
+void FieldSamplerQuery::clearAllFieldSamplers()
+{
+ for (uint32_t i = 0; i < mSceneList.getSize(); ++i)
+ {
+ SceneInfo* sceneInfo = DYNAMIC_CAST(SceneInfo*)(mSceneList.getResource(i));
+ sceneInfo->clearAllFieldSamplers();
+ }
+}
+
+void FieldSamplerQuery::submitFieldSamplerQuery(const FieldSamplerQueryDataIntl& data, PxTask* task, PxTask* readyTask)
+{
+ PX_UNUSED(readyTask);
+ for (uint32_t i = 0; i < mSceneList.getSize(); ++i)
+ {
+ SceneInfo* sceneInfo = DYNAMIC_CAST(SceneInfo*)(mSceneList.getResource(i));
+ FieldSamplerSceneIntl* niFieldSamplerScene = sceneInfo->getSceneWrapper()->getInternalFieldSamplerScene();
+ const PxTask* fieldSamplerReadyTask = niFieldSamplerScene->onSubmitFieldSamplerQuery(data, readyTask);
+ if (fieldSamplerReadyTask != 0)
+ {
+ task->startAfter(fieldSamplerReadyTask->getTaskID());
+ }
+ }
+}
+
+void FieldSamplerQuery::update()
+{
+ mPrimarySceneList.clear();
+ mSecondarySceneList.clear();
+
+ for (uint32_t i = 0; i < mSceneList.getSize(); ++i)
+ {
+ SceneInfo* sceneInfo = DYNAMIC_CAST(SceneInfo*)(mSceneList.getResource(i));
+ sceneInfo->update();
+
+ if (sceneInfo->getEnabledFieldSamplerCount() > 0 && (sceneInfo->getSceneWrapper()->getInternalFieldSamplerScene() != mQueryDesc.ownerFieldSamplerScene))
+ {
+ ((sceneInfo->getSceneWrapper()->getInternalFieldSamplerSceneDesc().isPrimary) ? mPrimarySceneList : mSecondarySceneList).pushBack(sceneInfo);
+ }
+ }
+}
+
+bool FieldSamplerQuery::SceneInfo::update()
+{
+ mEnabledFieldSamplerCount = 0;
+ for (uint32_t i = 0; i < mFieldSamplerArray.size(); ++i)
+ {
+ if (mFieldSamplerArray[i].mFieldSamplerWrapper->isEnabled())
+ {
+ ++mEnabledFieldSamplerCount;
+ }
+ if (mFieldSamplerArray[i].mFieldSamplerWrapper->isEnabledChanged())
+ {
+ mFieldSamplerArrayChanged = true;
+ }
+ }
+
+ if (mFieldSamplerArrayChanged)
+ {
+ mFieldSamplerArrayChanged = false;
+ return true;
+ }
+ return false;
+}
+/******************************** CPU Version ********************************/
+class TaskExecute : public PxTask, public UserAllocated
+{
+public:
+ TaskExecute(FieldSamplerQueryCPU* query) : mQuery(query) {}
+
+ const char* getName() const
+ {
+ return "FieldSamplerQueryCPU::TaskExecute";
+ }
+ void run()
+ {
+ mQuery->execute();
+ }
+
+protected:
+ FieldSamplerQueryCPU* mQuery;
+};
+
+FieldSamplerQueryCPU::FieldSamplerQueryCPU(const FieldSamplerQueryDescIntl& desc, ResourceList& list, FieldSamplerManager* manager)
+ : FieldSamplerQuery(desc, list, manager)
+{
+ mTaskExecute = PX_NEW(TaskExecute)(this);
+
+ mExecuteCount = 256;
+}
+
+FieldSamplerQueryCPU::~FieldSamplerQueryCPU()
+{
+ delete mTaskExecute;
+}
+
+PxTaskID FieldSamplerQueryCPU::submitFieldSamplerQuery(const FieldSamplerQueryDataIntl& data, PxTaskID taskID)
+{
+ PX_ASSERT(data.isDataOnDevice == false);
+ PX_ASSERT(data.count <= mQueryDesc.maxCount);
+ if (data.count == 0)
+ {
+ return taskID;
+ }
+ mQueryData = data;
+
+ mResultField.resize(mExecuteCount);
+ mWeights.resize(mExecuteCount);
+ mAccumVelocity.reserve(mQueryDesc.maxCount);
+
+ PxTaskManager* tm = mManager->getApexScene().getTaskManager();
+ tm->submitUnnamedTask(*mTaskExecute);
+
+ FieldSamplerQuery::submitFieldSamplerQuery(data, mTaskExecute, NULL);
+
+ mTaskExecute->finishBefore(taskID);
+ return mTaskExecute->getTaskID();
+}
+
+void FieldSamplerQueryCPU::execute()
+{
+ if (mOnStartCallback)
+ {
+ (*mOnStartCallback)(NULL);
+ }
+
+ FieldSamplerIntl::ExecuteData executeData;
+
+ executeData.position = mQueryData.pmaInPosition;
+ executeData.velocity = mQueryData.pmaInVelocity;
+ executeData.mass = mQueryData.pmaInMass;// + massOffset;
+ executeData.resultField = mResultField.begin();
+ executeData.positionStride = mQueryData.positionStrideBytes;
+ executeData.velocityStride = mQueryData.velocityStrideBytes;
+ executeData.massStride = mQueryData.massStrideBytes;
+ executeData.indicesMask = 0;
+
+ uint32_t beginIndex;
+ uint32_t* indices = &beginIndex;
+ if (mQueryData.pmaInIndices)
+ {
+ indices = mQueryData.pmaInIndices;
+ executeData.indicesMask = ~executeData.indicesMask;
+ }
+
+ for (uint32_t executeOffset = 0; executeOffset < mQueryData.count; executeOffset += mExecuteCount)
+ {
+ const uint32_t positionStride = mQueryData.positionStrideBytes / 4;
+ const uint32_t velocityStride = mQueryData.velocityStrideBytes / 4;
+ const uint32_t massStride = mQueryData.massStrideBytes / 4;
+ //const uint32_t offset = executeOffset * stride;
+ //const uint32_t massOffset = executeOffset * massStride;
+
+ beginIndex = executeOffset;
+ executeData.count = PxMin(mExecuteCount, mQueryData.count - executeOffset);
+ executeData.indices = indices + (executeOffset & executeData.indicesMask);
+
+ PxVec4* accumField = (PxVec4*)(mQueryData.pmaOutField);
+ PxVec4* accumVelocity = mAccumVelocity.getPtr() + executeOffset;
+ //clear accum
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ accumField[j] = PxVec4(0.0f);
+ accumVelocity[i] = PxVec4(0.0f);
+ }
+ for (uint32_t sceneIdx = 0; sceneIdx < mPrimarySceneList.size(); ++sceneIdx)
+ {
+ executeScene(mPrimarySceneList[sceneIdx], executeData, accumField, accumVelocity, positionStride, velocityStride, massStride);
+ }
+
+ //setup weights for secondary scenes
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ accumField[j].w = accumVelocity[i].w;
+ accumVelocity[i].w = 0.0f;
+ }
+ for (uint32_t sceneIdx = 0; sceneIdx < mSecondarySceneList.size(); ++sceneIdx)
+ {
+ executeScene(mSecondarySceneList[sceneIdx], executeData, accumField, accumVelocity, positionStride, velocityStride, massStride);
+ }
+
+ //compose accum field
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ float blend = accumField[j].w;
+ float velW = accumVelocity[i].w;
+ float weight = blend + velW * (1 - blend);
+ if (weight >= VELOCITY_WEIGHT_THRESHOLD)
+ {
+ PxVec3 result = accumField[j].getXYZ();
+ const PxVec3& velocity = *(PxVec3*)(executeData.velocity + j * velocityStride);
+ result += (accumVelocity[i].getXYZ() - weight * velocity);
+ accumField[j] = PxVec4(result, 0);
+ }
+ }
+ }
+
+ if (mOnFinishCallback)
+ {
+ (*mOnFinishCallback)(NULL);
+ }
+}
+
+void FieldSamplerQueryCPU::executeScene(const SceneInfo* sceneInfo,
+ const FieldSamplerIntl::ExecuteData& executeData,
+ PxVec4* accumField,
+ PxVec4* accumVelocity,
+ uint32_t positionStride,
+ uint32_t velocityStride,
+ uint32_t massStride)
+{
+ FieldSamplerExecuteArgs execArgs;
+ execArgs.elapsedTime = mQueryData.timeStep;
+ execArgs.totalElapsedMS = mManager->getApexScene().getTotalElapsedMS();
+
+ const nvidia::Array<FieldSamplerInfo>& fieldSamplerArray = sceneInfo->getFieldSamplerArray();
+ for (uint32_t fieldSamplerIdx = 0; fieldSamplerIdx < fieldSamplerArray.size(); ++fieldSamplerIdx)
+ {
+ const FieldSamplerWrapperCPU* fieldSampler = DYNAMIC_CAST(FieldSamplerWrapperCPU*)(fieldSamplerArray[fieldSamplerIdx].mFieldSamplerWrapper);
+ if (fieldSampler->isEnabled())
+ {
+ const float multiplier = fieldSamplerArray[fieldSamplerIdx].mMultiplier;
+ PX_UNUSED(multiplier);
+
+ const FieldSamplerDescIntl& desc = fieldSampler->getInternalFieldSamplerDesc();
+ if (desc.cpuSimulationSupport)
+ {
+ const FieldShapeDescIntl& shapeDesc = fieldSampler->getInternalFieldSamplerShape();
+ PX_ASSERT(shapeDesc.weight >= 0.0f && shapeDesc.weight <= 1.0f);
+
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ mWeights[i] = 0;
+ }
+
+ uint32_t boundaryCount = fieldSampler->getFieldBoundaryCount();
+ for (uint32_t boundaryIndex = 0; boundaryIndex < boundaryCount; ++boundaryIndex)
+ {
+ FieldBoundaryWrapper* fieldBoundaryWrapper = fieldSampler->getFieldBoundaryWrapper(boundaryIndex);
+
+ const nvidia::Array<FieldShapeDescIntl>& fieldShapes = fieldBoundaryWrapper->getFieldShapes();
+ for (uint32_t shapeIndex = 0; shapeIndex < fieldShapes.size(); ++shapeIndex)
+ {
+ const FieldShapeDescIntl& boundaryShapeDesc = fieldShapes[shapeIndex];
+ PX_ASSERT(boundaryShapeDesc.weight >= 0.0f && boundaryShapeDesc.weight <= 1.0f);
+
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ PxVec3* pos = (PxVec3*)(executeData.position + j * positionStride);
+ const float excludeWeight = evalFade(evalDistInShape(boundaryShapeDesc, *pos), 0.0f) * boundaryShapeDesc.weight;
+ mWeights[i] = PxMax(mWeights[i], excludeWeight);
+ }
+ }
+ }
+
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ PxVec3* pos = (PxVec3*)(executeData.position + j * positionStride);
+ const float includeWeight = evalFade(evalDistInShape(shapeDesc, *pos), desc.boundaryFadePercentage) * shapeDesc.weight;
+ const float excludeWeight = mWeights[i];
+ mWeights[i] = includeWeight * (1.0f - excludeWeight);
+#if FIELD_SAMPLER_MULTIPLIER == FIELD_SAMPLER_MULTIPLIER_WEIGHT
+ mWeights[i] *= multiplier;
+#endif
+ }
+
+ //execute field
+ fieldSampler->getInternalFieldSampler()->executeFieldSampler(executeData);
+
+#if FIELD_SAMPLER_MULTIPLIER == FIELD_SAMPLER_MULTIPLIER_VALUE
+ const float multiplier = fieldSamplerArray[fieldSamplerIdx].mMultiplier;
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ executeData.resultField[i] *= multiplier;
+ }
+#endif
+
+ //accum field
+ switch (desc.type)
+ {
+ case FieldSamplerTypeIntl::FORCE:
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ execArgs.position = *(PxVec3*)(executeData.position + j * positionStride);
+ execArgs.velocity = *(PxVec3*)(executeData.velocity + j * velocityStride);
+ execArgs.mass = *(executeData.mass + massStride * j);
+
+ accumFORCE(execArgs, executeData.resultField[i], mWeights[i], accumField[j], accumVelocity[i]);
+ }
+ break;
+ case FieldSamplerTypeIntl::ACCELERATION:
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ execArgs.position = *(PxVec3*)(executeData.position + j * positionStride);
+ execArgs.velocity = *(PxVec3*)(executeData.velocity + j * velocityStride);
+ execArgs.mass = *(executeData.mass + massStride * j);
+
+ accumACCELERATION(execArgs, executeData.resultField[i], mWeights[i], accumField[j], accumVelocity[i]);
+ }
+ break;
+ case FieldSamplerTypeIntl::VELOCITY_DRAG:
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ execArgs.position = *(PxVec3*)(executeData.position + j * positionStride);
+ execArgs.velocity = *(PxVec3*)(executeData.velocity + j * velocityStride);
+ execArgs.mass = *(executeData.mass + massStride * j);
+
+ accumVELOCITY_DRAG(execArgs, desc.dragCoeff, executeData.resultField[i], mWeights[i], accumField[j], accumVelocity[i]);
+ }
+ break;
+ case FieldSamplerTypeIntl::VELOCITY_DIRECT:
+ for (uint32_t i = 0; i < executeData.count; ++i)
+ {
+ uint32_t j = executeData.indices[i & executeData.indicesMask] + (i & ~executeData.indicesMask);
+ execArgs.position = *(PxVec3*)(executeData.position + j * positionStride);
+ execArgs.velocity = *(PxVec3*)(executeData.velocity + j * velocityStride);
+ execArgs.mass = *(executeData.mass + massStride * j);
+
+ accumVELOCITY_DIRECT(execArgs, executeData.resultField[i], mWeights[i], accumField[j], accumVelocity[i]);
+ }
+ break;
+ };
+ }
+ }
+ }
+
+}
+
+
+/******************************** GPU Version ********************************/
+#if APEX_CUDA_SUPPORT
+
+class FieldSamplerQueryLaunchTask : public PxGpuTask, public UserAllocated
+{
+public:
+ FieldSamplerQueryLaunchTask(FieldSamplerQueryGPU* query) : mQuery(query) {}
+ const char* getName() const
+ {
+ return "FieldSamplerQueryLaunchTask";
+ }
+ void run()
+ {
+ PX_ALWAYS_ASSERT();
+ }
+ bool launchInstance(CUstream stream, int kernelIndex)
+ {
+ return mQuery->launch(stream, kernelIndex);
+ }
+ PxGpuTaskHint::Enum getTaskHint() const
+ {
+ return PxGpuTaskHint::Kernel;
+ }
+
+protected:
+ FieldSamplerQueryGPU* mQuery;
+};
+
+class FieldSamplerQueryPrepareTask : public PxTask, public UserAllocated
+{
+public:
+ FieldSamplerQueryPrepareTask(FieldSamplerQueryGPU* query) : mQuery(query) {}
+
+ const char* getName() const
+ {
+ return "FieldSamplerQueryPrepareTask";
+ }
+ void run()
+ {
+ mQuery->prepare();
+ }
+
+protected:
+ FieldSamplerQueryGPU* mQuery;
+};
+
+class FieldSamplerQueryCopyTask : public PxGpuTask, public UserAllocated
+{
+public:
+ FieldSamplerQueryCopyTask(FieldSamplerQueryGPU* query) : mQuery(query) {}
+ const char* getName() const
+ {
+ return "FieldSamplerQueryCopyTask";
+ }
+ void run()
+ {
+ PX_ALWAYS_ASSERT();
+ }
+ bool launchInstance(CUstream stream, int kernelIndex)
+ {
+ return mQuery->copy(stream, kernelIndex);
+ }
+ PxGpuTaskHint::Enum getTaskHint() const
+ {
+ return PxGpuTaskHint::Kernel;
+ }
+
+protected:
+ FieldSamplerQueryGPU* mQuery;
+};
+
+class FieldSamplerQueryFetchTask : public PxTask, public UserAllocated
+{
+public:
+ FieldSamplerQueryFetchTask(FieldSamplerQueryGPU* query) : mQuery(query) {}
+
+ const char* getName() const
+ {
+ return "FieldSamplerQueryFetchTask";
+ }
+ void run()
+ {
+ mQuery->fetch();
+ }
+
+protected:
+ FieldSamplerQueryGPU* mQuery;
+};
+
+
+FieldSamplerQueryGPU::FieldSamplerQueryGPU(const FieldSamplerQueryDescIntl& desc, ResourceList& list, FieldSamplerManager* manager)
+ : FieldSamplerQueryCPU(desc, list, manager)
+ , mPositionMass(manager->getApexScene(), PX_ALLOC_INFO("mPositionMass", PARTICLES))
+ , mVelocity(manager->getApexScene(), PX_ALLOC_INFO("mVelocity", PARTICLES))
+ , mAccumField(manager->getApexScene(), PX_ALLOC_INFO("mAccumField", PARTICLES))
+ , mCopyQueue(*manager->getApexScene().getTaskManager()->getGpuDispatcher())
+{
+ mTaskLaunch = PX_NEW(FieldSamplerQueryLaunchTask)(this);
+ mTaskPrepare = PX_NEW(FieldSamplerQueryPrepareTask)(this);
+ mTaskCopy = PX_NEW(FieldSamplerQueryCopyTask)(this);
+ mTaskFetch = PX_NEW(FieldSamplerQueryFetchTask)(this);
+}
+
+FieldSamplerQueryGPU::~FieldSamplerQueryGPU()
+{
+ PX_DELETE(mTaskFetch);
+ PX_DELETE(mTaskCopy);
+ PX_DELETE(mTaskPrepare);
+ PX_DELETE(mTaskLaunch);
+}
+
+PxTaskID FieldSamplerQueryGPU::submitFieldSamplerQuery(const FieldSamplerQueryDataIntl& data, PxTaskID taskID)
+{
+ PX_ASSERT(data.count <= mQueryDesc.maxCount);
+ if (data.count == 0)
+ {
+ return taskID;
+ }
+ mQueryData = data;
+
+ if (!data.isDataOnDevice)
+ {
+ bool isWorkOnCPU = true;
+ // try to find FieldSampler which has no CPU implemntation (Turbulence for example)
+ for (uint32_t sceneIdx = 0; (sceneIdx < mPrimarySceneList.size() + mSecondarySceneList.size()) && isWorkOnCPU; ++sceneIdx)
+ {
+ const nvidia::Array<FieldSamplerInfo>& fsArray = sceneIdx < mPrimarySceneList.size()
+ ? mPrimarySceneList[sceneIdx]->getFieldSamplerArray()
+ : mSecondarySceneList[sceneIdx-mPrimarySceneList.size()]->getFieldSamplerArray();
+ for (uint32_t fsIdx = 0; fsIdx < fsArray.size() && isWorkOnCPU; fsIdx++)
+ {
+ if (fsArray[fsIdx].mFieldSamplerWrapper->isEnabled())
+ {
+ isWorkOnCPU = fsArray[fsIdx].mFieldSamplerWrapper->getInternalFieldSamplerDesc().cpuSimulationSupport;
+ }
+ }
+ }
+
+ // if all FSs can work on CPU we will execute FieldSamplerQuery on CPU
+ if (isWorkOnCPU)
+ {
+ return FieldSamplerQueryCPU::submitFieldSamplerQuery(data, taskID);
+ }
+
+ mPositionMass.reserve(mQueryDesc.maxCount, ApexMirroredPlace::CPU_GPU);
+ mVelocity.reserve(mQueryDesc.maxCount, ApexMirroredPlace::CPU_GPU);
+ mAccumField.reserve(mQueryDesc.maxCount, ApexMirroredPlace::CPU_GPU);
+ }
+ mAccumVelocity.reserve(mQueryDesc.maxCount, ApexMirroredPlace::CPU_GPU);
+
+ // if data on device or some FS can't work on CPU we will launch FieldSamplerQuery on GPU
+ PxTaskManager* tm = mManager->getApexScene().getTaskManager();
+ tm->submitUnnamedTask(*mTaskLaunch, PxTaskType::TT_GPU);
+
+ if (data.isDataOnDevice)
+ {
+ FieldSamplerQuery::submitFieldSamplerQuery(data, mTaskLaunch, NULL);
+
+ mTaskLaunch->finishBefore(taskID);
+ return mTaskLaunch->getTaskID();
+ }
+ else
+ {
+ FieldSamplerQueryDataIntl data4Device;
+ data4Device.timeStep = data.timeStep;
+ data4Device.count = data.count;
+ data4Device.isDataOnDevice = true;
+ data4Device.positionStrideBytes = sizeof(PxVec4);
+ data4Device.velocityStrideBytes = sizeof(PxVec4);
+ data4Device.massStrideBytes = sizeof(PxVec4);
+ data4Device.pmaInPosition = (float*)mPositionMass.getGpuPtr();
+ data4Device.pmaInVelocity = (float*)mVelocity.getGpuPtr();
+ data4Device.pmaInMass = &mPositionMass.getGpuPtr()->w;
+ data4Device.pmaOutField = mAccumField.getGpuPtr();
+ data4Device.pmaInIndices = 0;
+
+ FieldSamplerQuery::submitFieldSamplerQuery(data4Device, mTaskLaunch, mTaskCopy);
+
+ tm->submitUnnamedTask(*mTaskPrepare);
+ tm->submitUnnamedTask(*mTaskCopy, PxTaskType::TT_GPU);
+ tm->submitUnnamedTask(*mTaskFetch);
+
+ mTaskPrepare->finishBefore(mTaskCopy->getTaskID());
+ mTaskCopy->finishBefore(mTaskLaunch->getTaskID());
+ mTaskLaunch->finishBefore(mTaskFetch->getTaskID());
+ mTaskFetch->finishBefore(taskID);
+ return mTaskPrepare->getTaskID();
+ }
+}
+
+void FieldSamplerQueryGPU::prepare()
+{
+ const uint32_t positionStride = mQueryData.positionStrideBytes / sizeof(float);
+ const uint32_t velocityStride = mQueryData.velocityStrideBytes / sizeof(float);
+ const uint32_t massStride = mQueryData.massStrideBytes / sizeof(float);
+ for (uint32_t idx = 0; idx < mQueryData.count; idx++)
+ {
+ mPositionMass[idx] = PxVec4(*(PxVec3*)(mQueryData.pmaInPosition + idx * positionStride), *(mQueryData.pmaInMass + idx * massStride));
+ mVelocity[idx] = PxVec4(*(PxVec3*)(mQueryData.pmaInVelocity + idx * velocityStride), 0.f);
+ }
+}
+
+void FieldSamplerQueryGPU::fetch()
+{
+ for (uint32_t idx = 0; idx < mQueryData.count; idx++)
+ {
+ mQueryData.pmaOutField[idx] = mAccumField[idx];
+ }
+}
+
+bool FieldSamplerQueryGPU::copy(CUstream stream, int kernelIndex)
+{
+ if (kernelIndex == 0)
+ {
+ mCopyQueue.reset(stream, 4);
+ mPositionMass.copyHostToDeviceQ(mCopyQueue, mQueryData.count);
+ mVelocity.copyHostToDeviceQ(mCopyQueue, mQueryData.count);
+ mCopyQueue.flushEnqueued();
+ }
+ return false;
+}
+
+bool FieldSamplerQueryGPU::launch(CUstream stream, int kernelIndex)
+{
+ FieldSamplerPointsKernelArgs args;
+ args.elapsedTime = mQueryData.timeStep;
+ args.totalElapsedMS = mManager->getApexScene().getTotalElapsedMS();
+ if (mQueryData.isDataOnDevice)
+ {
+ args.positionMass = (float4*)mQueryData.pmaInPosition;
+ args.velocity = (float4*)mQueryData.pmaInVelocity;
+ args.accumField = (float4*)mQueryData.pmaOutField;
+ }
+ else
+ {
+ args.positionMass = (float4*)mPositionMass.getGpuPtr();
+ args.velocity = (float4*)mVelocity.getGpuPtr();
+ args.accumField = (float4*)mAccumField.getGpuPtr();
+ }
+ args.accumVelocity = (float4*)mAccumVelocity.getGpuPtr();
+
+ FieldSamplerPointsKernelLaunchDataIntl launchData;
+ launchData.stream = stream;
+ launchData.kernelType = FieldSamplerKernelType::POINTS;
+ launchData.kernelArgs = &args;
+ launchData.threadCount = mQueryData.count;
+ launchData.memRefSize = mQueryData.count;
+
+ if (kernelIndex == 0 && mOnStartCallback)
+ {
+ (*mOnStartCallback)(stream);
+ }
+
+ if (kernelIndex == 0)
+ {
+ CUDA_OBJ(clearKernel)(stream, mQueryData.count,
+ createApexCudaMemRef(args.accumField, launchData.memRefSize, ApexCudaMemFlags::OUT),
+ createApexCudaMemRef(args.accumVelocity, launchData.memRefSize, ApexCudaMemFlags::OUT));
+ return true;
+ }
+ --kernelIndex;
+
+ const uint32_t bothSceneCount = mPrimarySceneList.size() + mSecondarySceneList.size();
+ if (kernelIndex < (int) bothSceneCount)
+ {
+ SceneInfo* sceneInfo = (kernelIndex < (int) mPrimarySceneList.size())
+ ? mPrimarySceneList[(uint32_t)kernelIndex]
+ : mSecondarySceneList[(uint32_t)kernelIndex - mPrimarySceneList.size()];
+ SceneInfoGPU* sceneInfoGPU = DYNAMIC_CAST(SceneInfoGPU*)(sceneInfo);
+
+ launchData.kernelMode = FieldSamplerKernelMode::DEFAULT;
+ if (kernelIndex == (int) mPrimarySceneList.size() - 1)
+ {
+ launchData.kernelMode = FieldSamplerKernelMode::FINISH_PRIMARY;
+ }
+ if ((kernelIndex == (int) bothSceneCount - 1))
+ {
+ launchData.kernelMode = FieldSamplerKernelMode::FINISH_SECONDARY;
+ }
+
+ FieldSamplerSceneWrapperGPU* sceneWrapper = DYNAMIC_CAST(FieldSamplerSceneWrapperGPU*)(sceneInfo->getSceneWrapper());
+
+ launchData.queryParamsHandle = sceneInfoGPU->getQueryParamsHandle();
+ launchData.paramsExArrayHandle = sceneInfoGPU->getParamsHandle();
+ launchData.fieldSamplerArray = &sceneInfo->getFieldSamplerArray();
+ launchData.activeFieldSamplerCount = sceneInfo->getEnabledFieldSamplerCount();
+
+ sceneWrapper->getInternalFieldSamplerScene()->launchFieldSamplerCudaKernel(launchData);
+ return true;
+ }
+ kernelIndex -= bothSceneCount;
+
+ if (kernelIndex == 0)
+ {
+ CUDA_OBJ(composeKernel)(stream, mQueryData.count,
+ createApexCudaMemRef(args.accumField, launchData.memRefSize, ApexCudaMemFlags::IN_OUT),
+ createApexCudaMemRef((const float4*)args.accumVelocity, launchData.memRefSize, ApexCudaMemFlags::IN),
+ createApexCudaMemRef(args.velocity, launchData.memRefSize, ApexCudaMemFlags::IN),
+ args.elapsedTime);
+ return true;
+ }
+ --kernelIndex;
+
+ if (!mQueryData.isDataOnDevice)
+ {
+ mAccumField.copyDeviceToHostQ(mCopyQueue, mQueryData.count);
+ mCopyQueue.flushEnqueued();
+
+ PxTaskManager* tm = mManager->getApexScene().getTaskManager();
+ tm->getGpuDispatcher()->addCompletionPrereq(*mTaskFetch);
+ }
+
+ if (mOnFinishCallback)
+ {
+ (*mOnFinishCallback)(stream);
+ }
+ return false;
+}
+
+FieldSamplerQueryGPU::SceneInfoGPU::SceneInfoGPU(ResourceList& list, FieldSamplerQuery* query, FieldSamplerSceneWrapper* sceneWrapper)
+ : SceneInfo(list, query, sceneWrapper)
+ , mConstMemGroup(DYNAMIC_CAST(FieldSamplerSceneWrapperGPU*)(sceneWrapper)->getConstStorage())
+{
+ APEX_CUDA_CONST_MEM_GROUP_SCOPE(mConstMemGroup);
+
+ mQueryParamsHandle.alloc(_storage_);
+}
+
+bool FieldSamplerQueryGPU::SceneInfoGPU::update()
+{
+ if (FieldSamplerQuery::SceneInfo::update())
+ {
+ APEX_CUDA_CONST_MEM_GROUP_SCOPE(mConstMemGroup);
+
+ FieldSamplerParamsExArray paramsExArray;
+ mParamsExArrayHandle.allocOrFetch(_storage_, paramsExArray);
+ if (paramsExArray.resize(_storage_, mEnabledFieldSamplerCount))
+ {
+ for (uint32_t i = 0, enabledIdx = 0; i < mFieldSamplerArray.size(); ++i)
+ {
+ FieldSamplerWrapperGPU* fieldSamplerWrapper = DYNAMIC_CAST(FieldSamplerWrapperGPU*)(mFieldSamplerArray[i].mFieldSamplerWrapper);
+ if (fieldSamplerWrapper->isEnabled())
+ {
+ FieldSamplerParamsEx fsParamsEx;
+ fsParamsEx.paramsHandle = fieldSamplerWrapper->getParamsHandle();
+ fsParamsEx.multiplier = mFieldSamplerArray[i].mMultiplier;
+ PX_ASSERT(enabledIdx < mEnabledFieldSamplerCount);
+ paramsExArray.updateElem(_storage_, fsParamsEx, enabledIdx++);
+ }
+ }
+ mParamsExArrayHandle.update(_storage_, paramsExArray);
+ }
+ return true;
+ }
+ return false;
+}
+
+PxVec3 FieldSamplerQueryGPU::executeFieldSamplerQueryOnGrid(const FieldSamplerQueryGridDataIntl& data)
+{
+ FieldSamplerGridKernelArgs args;
+
+ args.numX = data.numX;
+ args.numY = data.numY;
+ args.numZ = data.numZ;
+
+ args.gridToWorld = data.gridToWorld;
+
+ args.mass = data.mass;
+ args.elapsedTime = data.timeStep;
+ args.cellSize = data.cellSize;
+ args.totalElapsedMS = mManager->getApexScene().getTotalElapsedMS();
+
+ FieldSamplerGridKernelLaunchDataIntl launchData;
+ launchData.stream = data.stream;
+ launchData.kernelType = FieldSamplerKernelType::GRID;
+ launchData.kernelArgs = &args;
+ launchData.threadCountX = data.numX;
+ launchData.threadCountY = data.numY;
+ launchData.threadCountZ = data.numZ;
+ launchData.accumArray = data.resultVelocity;
+
+
+ {
+ APEX_CUDA_SURFACE_SCOPE_BIND(surfRefGridAccum, *launchData.accumArray, ApexCudaMemFlags::OUT);
+
+ CUDA_OBJ(clearGridKernel)(data.stream, launchData.threadCountX, launchData.threadCountY, launchData.threadCountZ,
+ args.numX, args.numY, args.numZ);
+ }
+
+ PxVec3 velocity(0.0f);
+ for (uint32_t i = 0; i < mSecondarySceneList.size(); ++i)
+ {
+ SceneInfoGPU* sceneInfo = DYNAMIC_CAST(SceneInfoGPU*)(mSecondarySceneList[i]);
+ FieldSamplerSceneWrapperGPU* sceneWrapper = DYNAMIC_CAST(FieldSamplerSceneWrapperGPU*)(sceneInfo->getSceneWrapper());
+
+ launchData.activeFieldSamplerCount = 0;
+
+ const nvidia::Array<FieldSamplerInfo>& fieldSamplerArray = sceneInfo->getFieldSamplerArray();
+ for (uint32_t fieldSamplerIdx = 0; fieldSamplerIdx < fieldSamplerArray.size(); ++fieldSamplerIdx)
+ {
+ const FieldSamplerWrapperGPU* wrapper = static_cast<const FieldSamplerWrapperGPU* >( fieldSamplerArray[fieldSamplerIdx].mFieldSamplerWrapper );
+ if (wrapper->isEnabled())
+ {
+ switch (wrapper->getInternalFieldSamplerDesc().gridSupportType)
+ {
+ case FieldSamplerGridSupportTypeIntl::SINGLE_VELOCITY:
+ {
+ const FieldSamplerIntl* fieldSampler = wrapper->getInternalFieldSampler();
+ velocity += fieldSampler->queryFieldSamplerVelocity();
+ }
+ break;
+ case FieldSamplerGridSupportTypeIntl::VELOCITY_PER_CELL:
+ {
+ launchData.activeFieldSamplerCount += 1;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (launchData.activeFieldSamplerCount > 0)
+ {
+ launchData.queryParamsHandle = sceneInfo->getQueryParamsHandle();
+ launchData.paramsExArrayHandle = sceneInfo->getParamsHandle();
+ launchData.fieldSamplerArray = &sceneInfo->getFieldSamplerArray();
+ launchData.kernelMode = FieldSamplerKernelMode::DEFAULT;
+
+ sceneWrapper->getInternalFieldSamplerScene()->launchFieldSamplerCudaKernel(launchData);
+ }
+ }
+ return velocity;
+}
+
+
+#endif
+
+}
+} // end namespace nvidia::apex
+
diff --git a/APEX_1.4/module/fieldsampler/src/FieldSamplerScene.cpp b/APEX_1.4/module/fieldsampler/src/FieldSamplerScene.cpp
new file mode 100644
index 00000000..58c74ed7
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/FieldSamplerScene.cpp
@@ -0,0 +1,304 @@
+/*
+ * 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 "FieldSamplerScene.h"
+#include "FieldSamplerManager.h"
+#include "FieldSamplerQuery.h"
+#include "FieldSamplerPhysXMonitor.h"
+#include "SceneIntl.h"
+#include "RenderDebugInterface.h"
+#include "ModulePerfScope.h"
+
+#if APEX_CUDA_SUPPORT
+#include "PxGpuTask.h"
+#include "ApexCudaSource.h"
+#endif
+
+#include "Lock.h"
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+FieldSamplerScene::FieldSamplerScene(ModuleFieldSamplerImpl& module, SceneIntl& scene, RenderDebugInterface* debugRender, ResourceList& list)
+ : mModule(&module)
+ , mApexScene(&scene)
+ , mDebugRender(debugRender)
+ , mManager(NULL)
+ , mPhysXScene(NULL)
+ , mForceSampleBatchBufferPos(0)
+ , mForceSampleBatchBufferSize(0)
+{
+ list.add(*this); // Add self to module's list of FieldSamplerScenes
+}
+
+FieldSamplerScene::~FieldSamplerScene()
+{
+}
+
+void FieldSamplerScene::visualize()
+{
+#ifndef WITHOUT_DEBUG_VISUALIZE
+#endif
+}
+
+void FieldSamplerScene::destroy()
+{
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ PX_DELETE(mPhysXMonitor);
+#endif
+ PX_DELETE(mManager);
+
+ removeAllActors();
+ mApexScene->moduleReleased(*this);
+ delete this;
+}
+
+FieldSamplerManagerIntl* FieldSamplerScene::getManager()
+{
+ if (mManager == NULL)
+ {
+ mManager = createManager();
+ PX_ASSERT(mManager != NULL);
+ }
+ return mManager;
+}
+
+
+
+void FieldSamplerScene::setModulePhysXScene(PxScene* s)
+{
+ if (s)
+ {
+ mPhysXMonitor->setPhysXScene(s);
+ }
+ mPhysXScene = s;
+}
+
+
+void FieldSamplerScene::submitTasks(float /*elapsedTime*/, float /*substepSize*/, uint32_t /*numSubSteps*/)
+{
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ PxTaskManager* tm;
+ {
+ READ_LOCK(*mApexScene);
+ tm = mApexScene->getTaskManager();
+ }
+ tm->submitNamedTask(&mPhysXMonitorFetchTask, FSST_PHYSX_MONITOR_FETCH);
+ tm->submitNamedTask(&mPhysXMonitorLoadTask, FSST_PHYSX_MONITOR_LOAD);
+#endif
+ if (mManager != NULL)
+ {
+ mManager->submitTasks();
+ }
+}
+
+void FieldSamplerScene::setTaskDependencies()
+{
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ for (uint32_t i = 0; i < mForceSampleBatchQuery.size(); i++)
+ {
+ if (mForceSampleBatchQuery[i] && mForceSampleBatchQueryData[i].count > 0)
+ {
+ static_cast<FieldSamplerQueryIntl*>(mForceSampleBatchQuery[i])->submitFieldSamplerQuery(mForceSampleBatchQueryData[i], mApexScene->getTaskManager()->getNamedTask(FSST_PHYSX_MONITOR_LOAD));
+ mForceSampleBatchQueryData[i].count = 0;
+ }
+ mForceSampleBatchBufferPos = 0;
+ }
+ if (mPhysXMonitor->isEnable())
+ {
+ mPhysXMonitor->update();
+ }
+#endif
+ if (mManager != NULL)
+ {
+ mManager->setTaskDependencies();
+ }
+
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ // Just in case one of the scene conditions doesn't set a bounding dependency, let's not let these dangle
+ PxTaskManager* tm;
+ {
+ READ_LOCK(*mApexScene);
+ tm = mApexScene->getTaskManager();
+ }
+ mPhysXMonitorFetchTask.finishBefore(tm->getNamedTask(AST_PHYSX_FETCH_RESULTS));
+ mPhysXMonitorLoadTask.finishBefore(tm->getNamedTask(AST_PHYSX_FETCH_RESULTS));
+#endif
+}
+
+void FieldSamplerScene::fetchResults()
+{
+ if (mManager != NULL)
+ {
+ mManager->fetchResults();
+ }
+}
+
+#if PX_PHYSICS_VERSION_MAJOR == 3
+void FieldSamplerScene::enablePhysXMonitor(bool enable)
+{
+ PX_UNUSED(enable);
+ mPhysXMonitor->enablePhysXMonitor(enable);
+}
+
+void FieldSamplerScene::setPhysXFilterData(physx::PxFilterData filterData)
+{
+ mPhysXMonitor->setPhysXFilterData(filterData);
+}
+
+
+uint32_t FieldSamplerScene::createForceSampleBatch(uint32_t maxCount, const physx::PxFilterData filterData)
+{
+ mForceSampleBatchBufferSize += maxCount;
+ mForceSampleBatchPosition.resize(mForceSampleBatchBufferSize);
+ mForceSampleBatchVelocity.resize(mForceSampleBatchBufferSize);
+ mForceSampleBatchMass.resize(mForceSampleBatchBufferSize);
+
+ FieldSamplerQueryDescIntl desc;
+ desc.maxCount = maxCount;
+ desc.samplerFilterData = filterData;
+ //SceneInfo* sceneInfo = DYNAMIC_CAST(SceneInfo*)(mSceneList.getResource(i));
+ //InternalFieldSamplerScene* niFieldSamplerScene = sceneInfo->getSceneWrapper()->getInternalFieldSamplerScene();
+ //desc.ownerFieldSamplerScene = this;
+
+
+ uint32_t id = 0;
+ while (id < mForceSampleBatchQuery.size() && mForceSampleBatchQuery[id])
+ {
+ id++;
+ }
+ if (id == mForceSampleBatchQuery.size())
+ {
+ mForceSampleBatchQuery.pushBack(0);
+ FieldSamplerQueryDataIntl data;
+ data.count = 0;
+ mForceSampleBatchQueryData.pushBack(data);
+ }
+ mForceSampleBatchQuery[id] = static_cast<FieldSamplerQuery*>(mManager->createFieldSamplerQuery(desc));
+ return id;
+}
+
+
+void FieldSamplerScene::releaseForceSampleBatch(uint32_t batchId)
+{
+ if (batchId < mForceSampleBatchQuery.size() && mForceSampleBatchQuery[batchId])
+ {
+ mForceSampleBatchBufferSize -= mForceSampleBatchQuery[batchId]->getQueryDesc().maxCount;
+ mForceSampleBatchPosition.resize(mForceSampleBatchBufferSize);
+ mForceSampleBatchVelocity.resize(mForceSampleBatchBufferSize);
+ mForceSampleBatchMass.resize(mForceSampleBatchBufferSize);
+
+ mForceSampleBatchQuery[batchId]->release();
+ mForceSampleBatchQuery[batchId] = 0;
+ }
+}
+
+
+void FieldSamplerScene::submitForceSampleBatch( 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)
+{
+ PX_UNUSED(forcesStride);
+ PX_ASSERT(forcesStride == sizeof(PxVec4));
+ PX_ASSERT(indices);
+ if (batchId >= mForceSampleBatchQuery.size() || mForceSampleBatchQuery[batchId] == 0) return;
+
+ uint32_t maxIndices = indices[numIndices - 1] + 1; //supposed that indices are sorted
+ for (uint32_t i = 0; i < maxIndices; i++)
+ {
+ mForceSampleBatchPosition[mForceSampleBatchBufferPos + i] = *(PxVec4*)((uint8_t*)positions + i * positionsStride);
+ mForceSampleBatchVelocity[mForceSampleBatchBufferPos + i] = *(PxVec4*)((uint8_t*)velocities + i * velocitiesStride);
+ mForceSampleBatchMass[mForceSampleBatchBufferPos + i] = *(float*)((uint8_t*)mass + i * massStride);
+ }
+
+ FieldSamplerQueryDataIntl& data = mForceSampleBatchQueryData[batchId];
+ data.count = numIndices;
+ data.isDataOnDevice = false;
+ data.positionStrideBytes = sizeof(PxVec4);
+ data.velocityStrideBytes = sizeof(PxVec4);
+ data.massStrideBytes = massStride ? sizeof(float) : 0;
+ data.pmaInMass = (float*)&mForceSampleBatchMass[mForceSampleBatchBufferPos];
+ data.pmaInPosition = (float*)&mForceSampleBatchPosition[mForceSampleBatchBufferPos];
+ data.pmaInVelocity = (float*)&mForceSampleBatchVelocity[mForceSampleBatchBufferPos];
+ data.pmaInIndices = (uint32_t*)indices;
+ data.pmaOutField = forces;
+ data.timeStep = getApexScene().getPhysXSimulateTime();
+
+ mForceSampleBatchBufferPos += maxIndices;
+}
+
+#endif
+
+/******************************** CPU Version ********************************/
+
+
+FieldSamplerSceneCPU::FieldSamplerSceneCPU(ModuleFieldSamplerImpl& module, SceneIntl& scene, RenderDebugInterface* debugRender, ResourceList& list) :
+ FieldSamplerScene(module, scene, debugRender, list)
+{
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ mPhysXMonitor = PX_NEW(FieldSamplerPhysXMonitor)(*this);
+#endif
+}
+
+FieldSamplerSceneCPU::~FieldSamplerSceneCPU()
+{
+}
+
+FieldSamplerManager* FieldSamplerSceneCPU::createManager()
+{
+ return PX_NEW(FieldSamplerManagerCPU)(this);
+}
+
+/******************************** GPU Version ********************************/
+
+#if APEX_CUDA_SUPPORT
+
+FieldSamplerSceneGPU::FieldSamplerSceneGPU(ModuleFieldSamplerImpl& module, SceneIntl& scene, RenderDebugInterface* debugRender, ResourceList& list)
+ : FieldSamplerScene(module, scene, debugRender, list)
+ , CudaModuleScene(scene, *mModule, APEX_CUDA_TO_STR(APEX_CUDA_MODULE_PREFIX))
+{
+#if PX_PHYSICS_VERSION_MAJOR == 3
+ mPhysXMonitor = PX_NEW(FieldSamplerPhysXMonitor)(*this);
+#endif
+ {
+ PxGpuDispatcher* gd = mApexScene->getTaskManager()->getGpuDispatcher();
+ PX_ASSERT(gd != NULL);
+ mCtxMgr = gd->getCudaContextManager();
+ PxScopedCudaLock _lock_(*mCtxMgr);
+
+//CUDA module objects
+#include "../cuda/include/fieldsampler.h"
+ }
+}
+
+FieldSamplerSceneGPU::~FieldSamplerSceneGPU()
+{
+ CudaModuleScene::destroy(*mApexScene);
+}
+
+FieldSamplerManager* FieldSamplerSceneGPU::createManager()
+{
+ return PX_NEW(FieldSamplerManagerGPU)(this);
+}
+
+#endif
+
+}
+} // end namespace nvidia::apex
+
+
diff --git a/APEX_1.4/module/fieldsampler/src/FieldSamplerSceneWrapper.cpp b/APEX_1.4/module/fieldsampler/src/FieldSamplerSceneWrapper.cpp
new file mode 100644
index 00000000..405462e7
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/FieldSamplerSceneWrapper.cpp
@@ -0,0 +1,143 @@
+/*
+ * 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 "FieldSamplerSceneWrapper.h"
+#include "FieldSamplerManager.h"
+#include "FieldBoundaryWrapper.h"
+#include "FieldSamplerWrapper.h"
+
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+FieldSamplerSceneWrapper::FieldSamplerSceneWrapper(ResourceList& list, FieldSamplerManager* manager, FieldSamplerSceneIntl* fieldSamplerScene)
+ : mManager(manager)
+ , mFieldSamplerScene(fieldSamplerScene)
+ , mFieldBoundaryListChanged(false)
+{
+ mFieldSamplerScene->getFieldSamplerSceneDesc(mFieldSamplerSceneDesc);
+
+ list.add(*this);
+}
+
+void FieldSamplerSceneWrapper::release()
+{
+ delete this;
+}
+
+FieldSamplerSceneWrapper::FieldBoundaryInfo* FieldSamplerSceneWrapper::addFieldBoundary(FieldBoundaryWrapper* fieldBoundaryWrapper)
+{
+ FieldBoundaryInfo* fieldBoundaryInfo = NULL;
+ for (uint32_t i = 0; i < mFieldBoundaryList.getSize(); ++i)
+ {
+ FieldBoundaryInfo* info = DYNAMIC_CAST(FieldBoundaryInfo*)(mFieldBoundaryList.getResource(i));
+ if (info->getFieldBoundaryWrapper() == fieldBoundaryWrapper)
+ {
+ fieldBoundaryInfo = info;
+ break;
+ }
+ }
+ if (fieldBoundaryInfo == NULL)
+ {
+ fieldBoundaryInfo = createFieldBoundaryInfo(fieldBoundaryWrapper);
+ mFieldBoundaryListChanged = true;
+ }
+ fieldBoundaryInfo->addRef();
+ return fieldBoundaryInfo;
+}
+
+void FieldSamplerSceneWrapper::removeFieldBoundary(FieldBoundaryInfo* fieldBoundaryInfo)
+{
+ if (fieldBoundaryInfo->releaseRef())
+ {
+ mFieldBoundaryListChanged = true;
+ }
+}
+
+void FieldSamplerSceneWrapper::update()
+{
+ for (uint32_t i = 0; i < mFieldBoundaryList.getSize(); ++i)
+ {
+ FieldBoundaryInfo* info = DYNAMIC_CAST(FieldBoundaryInfo*)(mFieldBoundaryList.getResource(i));
+ info->update();
+ }
+}
+
+/******************************** CPU Version ********************************/
+FieldSamplerSceneWrapperCPU::FieldSamplerSceneWrapperCPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerSceneIntl* fieldSamplerScene)
+ : FieldSamplerSceneWrapper(list, manager, fieldSamplerScene)
+{
+}
+
+/******************************** GPU Version ********************************/
+#if APEX_CUDA_SUPPORT
+
+FieldSamplerSceneWrapperGPU::FieldSamplerSceneWrapperGPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerSceneIntl* fieldSamplerScene)
+ : FieldSamplerSceneWrapper(list, manager, fieldSamplerScene)
+ , mConstStorage(*fieldSamplerScene->getFieldSamplerCudaConstStorage())
+{
+}
+
+void FieldSamplerSceneWrapperGPU::postUpdate()
+{
+ PxCudaContextManager* ctx = DYNAMIC_CAST(FieldSamplerSceneGPU*)(mManager->getScene())->getCudaContext();
+ PxScopedCudaLock _lock_(*ctx);
+
+ getConstStorage().copyToDevice(ctx, 0);
+}
+
+
+FieldSamplerSceneWrapperGPU::FieldBoundaryInfoGPU::FieldBoundaryInfoGPU(ResourceList& list, FieldBoundaryWrapper* fieldBoundaryWrapper, ApexCudaConstStorage& constStorage)
+ : FieldBoundaryInfo(list, fieldBoundaryWrapper)
+ , mConstMemGroup(constStorage)
+{
+ APEX_CUDA_CONST_MEM_GROUP_SCOPE(mConstMemGroup);
+ mFieldShapeGroupParamsHandle.alloc(_storage_);
+}
+
+void FieldSamplerSceneWrapperGPU::FieldBoundaryInfoGPU::update()
+{
+ if (mFieldBoundaryWrapper->getFieldShapesChanged())
+ {
+ APEX_CUDA_CONST_MEM_GROUP_SCOPE(mConstMemGroup);
+
+ FieldShapeGroupParams shapeGroupParams;
+ mFieldShapeGroupParamsHandle.fetch(_storage_, shapeGroupParams);
+
+ const nvidia::Array<FieldShapeDescIntl>& shapes = mFieldBoundaryWrapper->getFieldShapes();
+ uint32_t shapeCount = shapes.size();
+ shapeGroupParams.shapeArray.resize(_storage_, shapeCount);
+ for (uint32_t i = 0; i < shapeCount; ++i)
+ {
+ FieldShapeParams elem;
+ elem.type = shapes[i].type;
+ elem.dimensions = shapes[i].dimensions;
+ elem.worldToShape = shapes[i].worldToShape;
+ PX_ASSERT(shapes[i].weight >= 0.0f && shapes[i].weight <= 1.0f);
+ elem.weight = PxClamp(shapes[i].weight, 0.0f, 1.0f);
+ elem.fade = 0;
+
+ shapeGroupParams.shapeArray.updateElem(_storage_, elem, i);
+ }
+
+ mFieldShapeGroupParamsHandle.update(_storage_, shapeGroupParams);
+ }
+}
+
+#endif // APEX_CUDA_SUPPORT
+
+}
+} // end namespace nvidia::apex
+
diff --git a/APEX_1.4/module/fieldsampler/src/FieldSamplerWrapper.cpp b/APEX_1.4/module/fieldsampler/src/FieldSamplerWrapper.cpp
new file mode 100644
index 00000000..94d18a76
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/FieldSamplerWrapper.cpp
@@ -0,0 +1,177 @@
+/*
+ * 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 "FieldSamplerWrapper.h"
+#include "FieldBoundaryWrapper.h"
+#include "FieldSamplerManager.h"
+#include "FieldSamplerSceneWrapper.h"
+
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+
+FieldSamplerWrapper::FieldSamplerWrapper(ResourceList& list, FieldSamplerManager* manager, FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper)
+ : mManager(manager)
+ , mFieldSampler(fieldSampler)
+ , mFieldSamplerDesc(fieldSamplerDesc)
+ , mFieldSamplerShapeChanged(false)
+ , mSceneWrapper(fieldSamplerSceneWrapper)
+ , mQueryRefCount(0)
+ , mFieldBoundaryInfoArrayChanged(true)
+ , mIsEnabled(false)
+ , mIsEnabledLast(false)
+{
+ list.add(*this);
+
+ //set default shape weight to 1
+ mFieldSamplerShape.weight = 1;
+}
+
+void FieldSamplerWrapper::release()
+{
+ for (uint32_t i = 0; i < mFieldBoundaryInfoArray.size(); ++i)
+ {
+ FieldSamplerSceneWrapper::FieldBoundaryInfo* fieldBoundaryInfo = mFieldBoundaryInfoArray[i];
+ mSceneWrapper->removeFieldBoundary(fieldBoundaryInfo);
+ }
+
+ delete this;
+}
+
+bool FieldSamplerWrapper::addFieldBoundary(FieldBoundaryWrapper* fieldBoundaryWrapper)
+{
+ const FieldBoundaryDescIntl& fieldBoundaryDesc = fieldBoundaryWrapper->getInternalFieldBoundaryDesc();
+
+ float weight;
+ if (mManager->getFieldSamplerGroupsFiltering(fieldBoundaryDesc.boundaryFilterData, mFieldSamplerDesc.boundaryFilterData,weight))
+ {
+ FieldSamplerSceneWrapper::FieldBoundaryInfo* fieldBoundaryInfo =
+ mSceneWrapper->addFieldBoundary(fieldBoundaryWrapper);
+
+ mFieldBoundaryInfoArray.pushBack(fieldBoundaryInfo);
+ mFieldBoundaryInfoArrayChanged = true;
+ return true;
+ }
+ return false;
+}
+
+bool FieldSamplerWrapper::removeFieldBoundary(FieldBoundaryWrapper* fieldBoundaryWrapper)
+{
+ for (uint32_t i = 0; i < mFieldBoundaryInfoArray.size(); ++i)
+ {
+ FieldSamplerSceneWrapper::FieldBoundaryInfo* fieldBoundaryInfo = mFieldBoundaryInfoArray[i];
+ if (fieldBoundaryInfo->getFieldBoundaryWrapper() == fieldBoundaryWrapper)
+ {
+ mSceneWrapper->removeFieldBoundary(fieldBoundaryInfo);
+
+ mFieldBoundaryInfoArray.replaceWithLast(i);
+ mFieldBoundaryInfoArrayChanged = true;
+ return true;
+ }
+ }
+ return false;
+}
+
+void FieldSamplerWrapper::update()
+{
+ mIsEnabledLast = mIsEnabled;
+ mFieldSamplerShapeChanged = mFieldSampler->updateFieldSampler(mFieldSamplerShape, mIsEnabled);
+ if (!mIsEnabledLast && mIsEnabled)
+ {
+ mFieldSamplerShapeChanged = true;
+ }
+ else if (!mIsEnabled)
+ {
+ mFieldSamplerShapeChanged = false;
+ }
+}
+
+/******************************** CPU Version ********************************/
+
+FieldSamplerWrapperCPU::FieldSamplerWrapperCPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper)
+ : FieldSamplerWrapper(list, manager, fieldSampler, fieldSamplerDesc, fieldSamplerSceneWrapper)
+{
+}
+
+/******************************** GPU Version ********************************/
+#if APEX_CUDA_SUPPORT
+
+FieldSamplerWrapperGPU::FieldSamplerWrapperGPU(ResourceList& list, FieldSamplerManager* manager, FieldSamplerIntl* fieldSampler, const FieldSamplerDescIntl& fieldSamplerDesc, FieldSamplerSceneWrapper* fieldSamplerSceneWrapper)
+ : FieldSamplerWrapperCPU(list, manager, fieldSampler, fieldSamplerDesc, fieldSamplerSceneWrapper)
+ , mConstMemGroup(DYNAMIC_CAST(FieldSamplerSceneWrapperGPU*)(fieldSamplerSceneWrapper)->getConstStorage())
+{
+}
+
+void FieldSamplerWrapperGPU::update()
+{
+ FieldSamplerWrapper::update();
+ if (mFieldSamplerShapeChanged || mFieldBoundaryInfoArrayChanged)
+ {
+ APEX_CUDA_CONST_MEM_GROUP_SCOPE(mConstMemGroup);
+
+ FieldSamplerParams params;
+ if (mFieldSamplerParamsHandle.allocOrFetch(_storage_, params))
+ {
+ //only on alloc
+ params.type = mFieldSamplerDesc.type;
+ params.gridSupportType = mFieldSamplerDesc.gridSupportType;
+ params.dragCoeff = mFieldSamplerDesc.dragCoeff;
+
+ params.includeShape.fade = PxClamp(mFieldSamplerDesc.boundaryFadePercentage, 0.0f, 1.0f);
+ }
+
+ if (mFieldSamplerShapeChanged)
+ {
+ FieldSamplerIntl::CudaExecuteInfo executeInfo;
+ mFieldSampler->getFieldSamplerCudaExecuteInfo(executeInfo);
+
+ params.executeType = executeInfo.executeType;
+ params.executeParamsHandle = executeInfo.executeParamsHandle;
+
+ params.includeShape.type = mFieldSamplerShape.type;
+ params.includeShape.dimensions = mFieldSamplerShape.dimensions;
+ params.includeShape.worldToShape = mFieldSamplerShape.worldToShape;
+ PX_ASSERT(mFieldSamplerShape.weight >= 0.0f && mFieldSamplerShape.weight <= 1.0f);
+ params.includeShape.weight = PxClamp(mFieldSamplerShape.weight, 0.0f, 1.0f);
+ }
+
+ if (mFieldBoundaryInfoArrayChanged)
+ {
+ uint32_t shapeGroupCount = mFieldBoundaryInfoArray.size();
+ if (params.excludeShapeGroupHandleArray.resize(_storage_, shapeGroupCount))
+ {
+ for (uint32_t shapeGroupIndex = 0; shapeGroupIndex < shapeGroupCount; ++shapeGroupIndex)
+ {
+ FieldSamplerSceneWrapperGPU::FieldBoundaryInfoGPU* fieldBoundaryInfo =
+ static_cast<FieldSamplerSceneWrapperGPU::FieldBoundaryInfoGPU*>(mFieldBoundaryInfoArray[shapeGroupIndex]);
+
+ InplaceHandle<FieldShapeGroupParams> elem = fieldBoundaryInfo->getShapeGroupParamsHandle();
+ params.excludeShapeGroupHandleArray.updateElem(_storage_, elem, shapeGroupIndex);
+ }
+ }
+
+ mFieldBoundaryInfoArrayChanged = false;
+ }
+
+ mFieldSamplerParamsHandle.update(_storage_, params);
+ }
+}
+
+#endif
+
+}
+} // end namespace nvidia::apex
+
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
diff --git a/APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerModuleParameters.cpp b/APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerModuleParameters.cpp
new file mode 100644
index 00000000..2b76ff70
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerModuleParameters.cpp
@@ -0,0 +1,318 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and 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.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2015 NVIDIA Corporation. All rights reserved.
+
+// This file was generated by NvParameterized/scripts/GenParameterized.pl
+
+
+#include "FieldSamplerModuleParameters.h"
+#include <string.h>
+#include <stdlib.h>
+
+using namespace NvParameterized;
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+using namespace FieldSamplerModuleParametersNS;
+
+const char* const FieldSamplerModuleParametersFactory::vptr =
+ NvParameterized::getVptr<FieldSamplerModuleParameters, FieldSamplerModuleParameters::ClassAlignment>();
+
+const uint32_t NumParamDefs = 2;
+static NvParameterized::DefinitionImpl* ParamDefTable; // now allocated in buildTree [NumParamDefs];
+
+
+static const size_t ParamLookupChildrenTable[] =
+{
+ 1,
+};
+
+#define TENUM(type) nvidia::##type
+#define CHILDREN(index) &ParamLookupChildrenTable[index]
+static const NvParameterized::ParamLookupNode ParamLookupTable[NumParamDefs] =
+{
+ { TYPE_STRUCT, false, 0, CHILDREN(0), 1 },
+ { TYPE_U32, false, (size_t)(&((ParametersStruct*)0)->unused), NULL, 0 }, // unused
+};
+
+
+bool FieldSamplerModuleParameters::mBuiltFlag = false;
+NvParameterized::MutexType FieldSamplerModuleParameters::mBuiltFlagMutex;
+
+FieldSamplerModuleParameters::FieldSamplerModuleParameters(NvParameterized::Traits* traits, void* buf, int32_t* refCount) :
+ NvParameters(traits, buf, refCount)
+{
+ //mParameterizedTraits->registerFactory(className(), &FieldSamplerModuleParametersFactoryInst);
+
+ if (!buf) //Do not init data if it is inplace-deserialized
+ {
+ initDynamicArrays();
+ initStrings();
+ initReferences();
+ initDefaults();
+ }
+}
+
+FieldSamplerModuleParameters::~FieldSamplerModuleParameters()
+{
+ freeStrings();
+ freeReferences();
+ freeDynamicArrays();
+}
+
+void FieldSamplerModuleParameters::destroy()
+{
+ // We cache these fields here to avoid overwrite in destructor
+ bool doDeallocateSelf = mDoDeallocateSelf;
+ NvParameterized::Traits* traits = mParameterizedTraits;
+ int32_t* refCount = mRefCount;
+ void* buf = mBuffer;
+
+ this->~FieldSamplerModuleParameters();
+
+ NvParameters::destroy(this, traits, doDeallocateSelf, refCount, buf);
+}
+
+const NvParameterized::DefinitionImpl* FieldSamplerModuleParameters::getParameterDefinitionTree(void)
+{
+ if (!mBuiltFlag) // Double-checked lock
+ {
+ NvParameterized::MutexType::ScopedLock lock(mBuiltFlagMutex);
+ if (!mBuiltFlag)
+ {
+ buildTree();
+ }
+ }
+
+ return(&ParamDefTable[0]);
+}
+
+const NvParameterized::DefinitionImpl* FieldSamplerModuleParameters::getParameterDefinitionTree(void) const
+{
+ FieldSamplerModuleParameters* tmpParam = const_cast<FieldSamplerModuleParameters*>(this);
+
+ if (!mBuiltFlag) // Double-checked lock
+ {
+ NvParameterized::MutexType::ScopedLock lock(mBuiltFlagMutex);
+ if (!mBuiltFlag)
+ {
+ tmpParam->buildTree();
+ }
+ }
+
+ return(&ParamDefTable[0]);
+}
+
+NvParameterized::ErrorType FieldSamplerModuleParameters::getParameterHandle(const char* long_name, Handle& handle) const
+{
+ ErrorType Ret = NvParameters::getParameterHandle(long_name, handle);
+ if (Ret != ERROR_NONE)
+ {
+ return(Ret);
+ }
+
+ size_t offset;
+ void* ptr;
+
+ getVarPtr(handle, ptr, offset);
+
+ if (ptr == NULL)
+ {
+ return(ERROR_INDEX_OUT_OF_RANGE);
+ }
+
+ return(ERROR_NONE);
+}
+
+NvParameterized::ErrorType FieldSamplerModuleParameters::getParameterHandle(const char* long_name, Handle& handle)
+{
+ ErrorType Ret = NvParameters::getParameterHandle(long_name, handle);
+ if (Ret != ERROR_NONE)
+ {
+ return(Ret);
+ }
+
+ size_t offset;
+ void* ptr;
+
+ getVarPtr(handle, ptr, offset);
+
+ if (ptr == NULL)
+ {
+ return(ERROR_INDEX_OUT_OF_RANGE);
+ }
+
+ return(ERROR_NONE);
+}
+
+void FieldSamplerModuleParameters::getVarPtr(const Handle& handle, void*& ptr, size_t& offset) const
+{
+ ptr = getVarPtrHelper(&ParamLookupTable[0], const_cast<FieldSamplerModuleParameters::ParametersStruct*>(&parameters()), handle, offset);
+}
+
+
+/* Dynamic Handle Indices */
+
+void FieldSamplerModuleParameters::freeParameterDefinitionTable(NvParameterized::Traits* traits)
+{
+ if (!traits)
+ {
+ return;
+ }
+
+ if (!mBuiltFlag) // Double-checked lock
+ {
+ return;
+ }
+
+ NvParameterized::MutexType::ScopedLock lock(mBuiltFlagMutex);
+
+ if (!mBuiltFlag)
+ {
+ return;
+ }
+
+ for (uint32_t i = 0; i < NumParamDefs; ++i)
+ {
+ ParamDefTable[i].~DefinitionImpl();
+ }
+
+ traits->free(ParamDefTable);
+
+ mBuiltFlag = false;
+}
+
+#define PDEF_PTR(index) (&ParamDefTable[index])
+
+void FieldSamplerModuleParameters::buildTree(void)
+{
+
+ uint32_t allocSize = sizeof(NvParameterized::DefinitionImpl) * NumParamDefs;
+ ParamDefTable = (NvParameterized::DefinitionImpl*)(mParameterizedTraits->alloc(allocSize));
+ memset(ParamDefTable, 0, allocSize);
+
+ for (uint32_t i = 0; i < NumParamDefs; ++i)
+ {
+ NV_PARAM_PLACEMENT_NEW(ParamDefTable + i, NvParameterized::DefinitionImpl)(*mParameterizedTraits);
+ }
+
+ // Initialize DefinitionImpl node: nodeIndex=0, longName=""
+ {
+ NvParameterized::DefinitionImpl* ParamDef = &ParamDefTable[0];
+ ParamDef->init("", TYPE_STRUCT, "STRUCT", true);
+
+#ifdef NV_PARAMETERIZED_HIDE_DESCRIPTIONS
+
+#else
+
+ static HintImpl HintTable[1];
+ static Hint* HintPtrTable[1] = { &HintTable[0], };
+ HintTable[0].init("shortDescription", "This class is used for initializing the ModuleFieldSampler.", true);
+ ParamDefTable[0].setHints((const NvParameterized::Hint**)HintPtrTable, 1);
+
+#endif /* NV_PARAMETERIZED_HIDE_DESCRIPTIONS */
+
+
+
+
+
+ }
+
+ // Initialize DefinitionImpl node: nodeIndex=1, longName="unused"
+ {
+ NvParameterized::DefinitionImpl* ParamDef = &ParamDefTable[1];
+ ParamDef->init("unused", TYPE_U32, NULL, true);
+
+#ifdef NV_PARAMETERIZED_HIDE_DESCRIPTIONS
+
+#else
+
+ static HintImpl HintTable[1];
+ static Hint* HintPtrTable[1] = { &HintTable[0], };
+ HintTable[0].init("shortDescription", "No parameters necessary", true);
+ ParamDefTable[1].setHints((const NvParameterized::Hint**)HintPtrTable, 1);
+
+#endif /* NV_PARAMETERIZED_HIDE_DESCRIPTIONS */
+
+
+
+
+
+ }
+
+ // SetChildren for: nodeIndex=0, longName=""
+ {
+ static Definition* Children[1];
+ Children[0] = PDEF_PTR(1);
+
+ ParamDefTable[0].setChildren(Children, 1);
+ }
+
+ mBuiltFlag = true;
+
+}
+void FieldSamplerModuleParameters::initStrings(void)
+{
+}
+
+void FieldSamplerModuleParameters::initDynamicArrays(void)
+{
+}
+
+void FieldSamplerModuleParameters::initDefaults(void)
+{
+
+ freeStrings();
+ freeReferences();
+ freeDynamicArrays();
+ unused = uint32_t(0);
+
+ initDynamicArrays();
+ initStrings();
+ initReferences();
+}
+
+void FieldSamplerModuleParameters::initReferences(void)
+{
+}
+
+void FieldSamplerModuleParameters::freeDynamicArrays(void)
+{
+}
+
+void FieldSamplerModuleParameters::freeStrings(void)
+{
+}
+
+void FieldSamplerModuleParameters::freeReferences(void)
+{
+}
+
+} // namespace fieldsampler
+} // namespace nvidia
diff --git a/APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerPhysXMonitorParams.cpp b/APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerPhysXMonitorParams.cpp
new file mode 100644
index 00000000..06762a63
--- /dev/null
+++ b/APEX_1.4/module/fieldsampler/src/autogen/FieldSamplerPhysXMonitorParams.cpp
@@ -0,0 +1,358 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and 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.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2015 NVIDIA Corporation. All rights reserved.
+
+// This file was generated by NvParameterized/scripts/GenParameterized.pl
+
+
+#include "FieldSamplerPhysXMonitorParams.h"
+#include <string.h>
+#include <stdlib.h>
+
+using namespace NvParameterized;
+
+namespace nvidia
+{
+namespace fieldsampler
+{
+
+using namespace FieldSamplerPhysXMonitorParamsNS;
+
+const char* const FieldSamplerPhysXMonitorParamsFactory::vptr =
+ NvParameterized::getVptr<FieldSamplerPhysXMonitorParams, FieldSamplerPhysXMonitorParams::ClassAlignment>();
+
+const uint32_t NumParamDefs = 4;
+static NvParameterized::DefinitionImpl* ParamDefTable; // now allocated in buildTree [NumParamDefs];
+
+
+static const size_t ParamLookupChildrenTable[] =
+{
+ 1, 2, 3,
+};
+
+#define TENUM(type) nvidia::##type
+#define CHILDREN(index) &ParamLookupChildrenTable[index]
+static const NvParameterized::ParamLookupNode ParamLookupTable[NumParamDefs] =
+{
+ { TYPE_STRUCT, false, 0, CHILDREN(0), 3 },
+ { TYPE_U32, false, (size_t)(&((ParametersStruct*)0)->maxRBCount), NULL, 0 }, // maxRBCount
+ { TYPE_U32, false, (size_t)(&((ParametersStruct*)0)->maxPSCount), NULL, 0 }, // maxPSCount
+ { TYPE_U32, false, (size_t)(&((ParametersStruct*)0)->maxParticleCount), NULL, 0 }, // maxParticleCount
+};
+
+
+bool FieldSamplerPhysXMonitorParams::mBuiltFlag = false;
+NvParameterized::MutexType FieldSamplerPhysXMonitorParams::mBuiltFlagMutex;
+
+FieldSamplerPhysXMonitorParams::FieldSamplerPhysXMonitorParams(NvParameterized::Traits* traits, void* buf, int32_t* refCount) :
+ NvParameters(traits, buf, refCount)
+{
+ //mParameterizedTraits->registerFactory(className(), &FieldSamplerPhysXMonitorParamsFactoryInst);
+
+ if (!buf) //Do not init data if it is inplace-deserialized
+ {
+ initDynamicArrays();
+ initStrings();
+ initReferences();
+ initDefaults();
+ }
+}
+
+FieldSamplerPhysXMonitorParams::~FieldSamplerPhysXMonitorParams()
+{
+ freeStrings();
+ freeReferences();
+ freeDynamicArrays();
+}
+
+void FieldSamplerPhysXMonitorParams::destroy()
+{
+ // We cache these fields here to avoid overwrite in destructor
+ bool doDeallocateSelf = mDoDeallocateSelf;
+ NvParameterized::Traits* traits = mParameterizedTraits;
+ int32_t* refCount = mRefCount;
+ void* buf = mBuffer;
+
+ this->~FieldSamplerPhysXMonitorParams();
+
+ NvParameters::destroy(this, traits, doDeallocateSelf, refCount, buf);
+}
+
+const NvParameterized::DefinitionImpl* FieldSamplerPhysXMonitorParams::getParameterDefinitionTree(void)
+{
+ if (!mBuiltFlag) // Double-checked lock
+ {
+ NvParameterized::MutexType::ScopedLock lock(mBuiltFlagMutex);
+ if (!mBuiltFlag)
+ {
+ buildTree();
+ }
+ }
+
+ return(&ParamDefTable[0]);
+}
+
+const NvParameterized::DefinitionImpl* FieldSamplerPhysXMonitorParams::getParameterDefinitionTree(void) const
+{
+ FieldSamplerPhysXMonitorParams* tmpParam = const_cast<FieldSamplerPhysXMonitorParams*>(this);
+
+ if (!mBuiltFlag) // Double-checked lock
+ {
+ NvParameterized::MutexType::ScopedLock lock(mBuiltFlagMutex);
+ if (!mBuiltFlag)
+ {
+ tmpParam->buildTree();
+ }
+ }
+
+ return(&ParamDefTable[0]);
+}
+
+NvParameterized::ErrorType FieldSamplerPhysXMonitorParams::getParameterHandle(const char* long_name, Handle& handle) const
+{
+ ErrorType Ret = NvParameters::getParameterHandle(long_name, handle);
+ if (Ret != ERROR_NONE)
+ {
+ return(Ret);
+ }
+
+ size_t offset;
+ void* ptr;
+
+ getVarPtr(handle, ptr, offset);
+
+ if (ptr == NULL)
+ {
+ return(ERROR_INDEX_OUT_OF_RANGE);
+ }
+
+ return(ERROR_NONE);
+}
+
+NvParameterized::ErrorType FieldSamplerPhysXMonitorParams::getParameterHandle(const char* long_name, Handle& handle)
+{
+ ErrorType Ret = NvParameters::getParameterHandle(long_name, handle);
+ if (Ret != ERROR_NONE)
+ {
+ return(Ret);
+ }
+
+ size_t offset;
+ void* ptr;
+
+ getVarPtr(handle, ptr, offset);
+
+ if (ptr == NULL)
+ {
+ return(ERROR_INDEX_OUT_OF_RANGE);
+ }
+
+ return(ERROR_NONE);
+}
+
+void FieldSamplerPhysXMonitorParams::getVarPtr(const Handle& handle, void*& ptr, size_t& offset) const
+{
+ ptr = getVarPtrHelper(&ParamLookupTable[0], const_cast<FieldSamplerPhysXMonitorParams::ParametersStruct*>(&parameters()), handle, offset);
+}
+
+
+/* Dynamic Handle Indices */
+
+void FieldSamplerPhysXMonitorParams::freeParameterDefinitionTable(NvParameterized::Traits* traits)
+{
+ if (!traits)
+ {
+ return;
+ }
+
+ if (!mBuiltFlag) // Double-checked lock
+ {
+ return;
+ }
+
+ NvParameterized::MutexType::ScopedLock lock(mBuiltFlagMutex);
+
+ if (!mBuiltFlag)
+ {
+ return;
+ }
+
+ for (uint32_t i = 0; i < NumParamDefs; ++i)
+ {
+ ParamDefTable[i].~DefinitionImpl();
+ }
+
+ traits->free(ParamDefTable);
+
+ mBuiltFlag = false;
+}
+
+#define PDEF_PTR(index) (&ParamDefTable[index])
+
+void FieldSamplerPhysXMonitorParams::buildTree(void)
+{
+
+ uint32_t allocSize = sizeof(NvParameterized::DefinitionImpl) * NumParamDefs;
+ ParamDefTable = (NvParameterized::DefinitionImpl*)(mParameterizedTraits->alloc(allocSize));
+ memset(ParamDefTable, 0, allocSize);
+
+ for (uint32_t i = 0; i < NumParamDefs; ++i)
+ {
+ NV_PARAM_PLACEMENT_NEW(ParamDefTable + i, NvParameterized::DefinitionImpl)(*mParameterizedTraits);
+ }
+
+ // Initialize DefinitionImpl node: nodeIndex=0, longName=""
+ {
+ NvParameterized::DefinitionImpl* ParamDef = &ParamDefTable[0];
+ ParamDef->init("", TYPE_STRUCT, "STRUCT", true);
+
+
+
+
+
+
+ }
+
+ // Initialize DefinitionImpl node: nodeIndex=1, longName="maxRBCount"
+ {
+ NvParameterized::DefinitionImpl* ParamDef = &ParamDefTable[1];
+ ParamDef->init("maxRBCount", TYPE_U32, NULL, true);
+
+#ifdef NV_PARAMETERIZED_HIDE_DESCRIPTIONS
+
+#else
+
+ static HintImpl HintTable[1];
+ static Hint* HintPtrTable[1] = { &HintTable[0], };
+ HintTable[0].init("shortDescription", "Maximum number of rigid bodies in scene", true);
+ ParamDefTable[1].setHints((const NvParameterized::Hint**)HintPtrTable, 1);
+
+#endif /* NV_PARAMETERIZED_HIDE_DESCRIPTIONS */
+
+
+
+
+
+ }
+
+ // Initialize DefinitionImpl node: nodeIndex=2, longName="maxPSCount"
+ {
+ NvParameterized::DefinitionImpl* ParamDef = &ParamDefTable[2];
+ ParamDef->init("maxPSCount", TYPE_U32, NULL, true);
+
+#ifdef NV_PARAMETERIZED_HIDE_DESCRIPTIONS
+
+#else
+
+ static HintImpl HintTable[1];
+ static Hint* HintPtrTable[1] = { &HintTable[0], };
+ HintTable[0].init("shortDescription", "Maximum number of particle systems in scene", true);
+ ParamDefTable[2].setHints((const NvParameterized::Hint**)HintPtrTable, 1);
+
+#endif /* NV_PARAMETERIZED_HIDE_DESCRIPTIONS */
+
+
+
+
+
+ }
+
+ // Initialize DefinitionImpl node: nodeIndex=3, longName="maxParticleCount"
+ {
+ NvParameterized::DefinitionImpl* ParamDef = &ParamDefTable[3];
+ ParamDef->init("maxParticleCount", TYPE_U32, NULL, true);
+
+#ifdef NV_PARAMETERIZED_HIDE_DESCRIPTIONS
+
+#else
+
+ static HintImpl HintTable[1];
+ static Hint* HintPtrTable[1] = { &HintTable[0], };
+ HintTable[0].init("shortDescription", "Maximum number of particles in scene", true);
+ ParamDefTable[3].setHints((const NvParameterized::Hint**)HintPtrTable, 1);
+
+#endif /* NV_PARAMETERIZED_HIDE_DESCRIPTIONS */
+
+
+
+
+
+ }
+
+ // SetChildren for: nodeIndex=0, longName=""
+ {
+ static Definition* Children[3];
+ Children[0] = PDEF_PTR(1);
+ Children[1] = PDEF_PTR(2);
+ Children[2] = PDEF_PTR(3);
+
+ ParamDefTable[0].setChildren(Children, 3);
+ }
+
+ mBuiltFlag = true;
+
+}
+void FieldSamplerPhysXMonitorParams::initStrings(void)
+{
+}
+
+void FieldSamplerPhysXMonitorParams::initDynamicArrays(void)
+{
+}
+
+void FieldSamplerPhysXMonitorParams::initDefaults(void)
+{
+
+ freeStrings();
+ freeReferences();
+ freeDynamicArrays();
+ maxRBCount = uint32_t(10000);
+ maxPSCount = uint32_t(128);
+ maxParticleCount = uint32_t(100000);
+
+ initDynamicArrays();
+ initStrings();
+ initReferences();
+}
+
+void FieldSamplerPhysXMonitorParams::initReferences(void)
+{
+}
+
+void FieldSamplerPhysXMonitorParams::freeDynamicArrays(void)
+{
+}
+
+void FieldSamplerPhysXMonitorParams::freeStrings(void)
+{
+}
+
+void FieldSamplerPhysXMonitorParams::freeReferences(void)
+{
+}
+
+} // namespace fieldsampler
+} // namespace nvidia