aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/module/particles/src/ModuleParticlesImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'APEX_1.4/module/particles/src/ModuleParticlesImpl.cpp')
-rw-r--r--APEX_1.4/module/particles/src/ModuleParticlesImpl.cpp4341
1 files changed, 4341 insertions, 0 deletions
diff --git a/APEX_1.4/module/particles/src/ModuleParticlesImpl.cpp b/APEX_1.4/module/particles/src/ModuleParticlesImpl.cpp
new file mode 100644
index 00000000..79f2024a
--- /dev/null
+++ b/APEX_1.4/module/particles/src/ModuleParticlesImpl.cpp
@@ -0,0 +1,4341 @@
+/*
+ * 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"
+
+#define SAFE_MODULE_RELEASE(x) if ( x ) { ModuleIntl *m = mSdk->getInternalModule(x); PX_ASSERT(m); m->setParent(NULL); x->release(); x = NULL; }
+
+/* === ModuleParticlesImpl DLL Setup === */
+
+#pragma warning(disable:4505)
+
+#include "ModuleParticlesImpl.h"
+#include "ModuleParticlesRegistration.h"
+#include "ModulePerfScope.h"
+#include "ParticlesScene.h"
+#include "SceneIntl.h"
+#include "PxMaterial.h"
+#include "ModuleTurbulenceFS.h"
+#include "PsMemoryBuffer.h"
+
+#include "ApexSDKIntl.h"
+#include "ApexUsingNamespace.h"
+#include "Apex.h"
+#include "nvparameterized/NvParamUtils.h"
+#include "ApexEmitterAssetParameters.h"
+#include "EmitterGeomSphereParams.h"
+#include "IofxAssetParameters.h"
+#include "SpriteIofxParameters.h"
+#include "ViewDirectionSortingModifierParams.h"
+#include "SimpleScaleModifierParams.h"
+#include "InitialColorModifierParams.h"
+#include "TurbulenceFSAssetParams.h"
+#include "BasicIOSAssetParam.h"
+#include "EmitterAsset.h"
+#include "GroundEmitterAsset.h"
+#include "ImpactEmitterAsset.h"
+#include "IofxAsset.h"
+#include "BasicIosAsset.h"
+#include "ParticleIosAsset.h"
+#include "TurbulenceFSAsset.h"
+#include "EmitterGeomBoxParams.h"
+#include "RandomScaleModifierParams.h"
+#include "RandomRotationModifierParams.h"
+#include "ColorVsLifeCompositeModifierParams.h"
+#include "ScaleVsLife2DModifierParams.h"
+#include "FloatMath.h"
+#include "JetFSActor.h"
+#include "WindFSActor.h"
+#include "AttractorFSActor.h"
+#include "BasicFSAsset.h"
+#include "JetFSAssetParams.h"
+#include "WindFSAssetParams.h"
+#include "NoiseFSAssetParams.h"
+#include "VortexFSAssetParams.h"
+#include "OrientScaleAlongScreenVelocityModifierParams.h"
+#include "RandomRotationModifierParams.h"
+#include "RotationRateModifierParams.h"
+#include "RotationRateVsLifeModifierParams.h"
+#include "EffectPackageActorImpl.h"
+#include "AttractorFSAssetParams.h"
+#include "FluidParticleSystemParams.h"
+#include "ModuleParticleIosRegistration.h"
+#include "MeshIofxParameters.h"
+#include "SimpleScaleModifierParams.h"
+#include "RotationModifierParams.h"
+#include "ScaleVsLife3DModifierParams.h"
+#include "ForceFieldAssetParams.h"
+#include "RadialForceFieldKernelParams.h"
+#include "ForceFieldFalloffParams.h"
+#include "ForceFieldNoiseParams.h"
+#include "HeatSourceAsset.h"
+#include "SubstanceSourceAsset.h"
+#include "VelocitySourceAsset.h"
+#include "ForceFieldAsset.h"
+#include "EffectPackageAssetParams.h"
+#include "FlameEmitterAsset.h"
+#include "FlameEmitterAssetParams.h"
+
+#include "ViewDirectionSortingModifierParams.h"
+#include "RandomSubtextureModifierParams.h"
+#include "UserOpaqueMesh.h"
+#include "HeatSourceAssetParams.h"
+#include "HeatSourceGeomSphereParams.h"
+#include "SubstanceSourceAssetParams.h"
+#include "VelocitySourceAssetParams.h"
+#include "PxPhysics.h"
+#include "EffectPackageData.h"
+
+#define SAFE_DESTROY(x) if ( x ) { x->destroy(); x = NULL; }
+
+
+#if PX_X86
+
+#define LINK_KERNEL(name) "/include:_"#name
+#define LINK_S2_KERNEL(name) "/include:_"#name"_templ$0 /include:_"#name"_templ$1"
+
+#elif PX_X64
+
+#define LINK_KERNEL(name) "/include:"#name
+#define LINK_S2_KERNEL(name) "/include:"#name"_templ$0 /include:"#name"_templ$1"
+
+#endif
+
+#if APEX_CUDA_SUPPORT
+
+#pragma comment(linker, LINK_S2_KERNEL(BasicFS_fieldSamplerGridKernel))
+#pragma comment(linker, LINK_S2_KERNEL(BasicFS_fieldSamplerPointsKernel))
+
+#pragma comment(linker, LINK_KERNEL(BasicIOS_compactKernel))
+#pragma comment(linker, LINK_KERNEL(BasicIOS_histogramKernel))
+#pragma comment(linker, LINK_KERNEL(BasicIOS_mergeHistogramKernel))
+#pragma comment(linker, LINK_KERNEL(BasicIOS_reduceKernel))
+#pragma comment(linker, LINK_KERNEL(BasicIOS_scanKernel))
+#pragma comment(linker, LINK_S2_KERNEL(BasicIOS_simulateApplyFieldKernel))
+#pragma comment(linker, LINK_S2_KERNEL(BasicIOS_simulateKernel))
+#pragma comment(linker, LINK_KERNEL(BasicIOS_stateKernel))
+
+#pragma comment(linker, LINK_KERNEL(FieldSampler_applyParticlesKernel))
+#pragma comment(linker, LINK_KERNEL(FieldSampler_clearGridKernel))
+#pragma comment(linker, LINK_KERNEL(FieldSampler_clearKernel))
+#pragma comment(linker, LINK_KERNEL(FieldSampler_composeKernel))
+
+#pragma comment(linker, LINK_S2_KERNEL(ForceField_fieldSamplerGridKernel))
+#pragma comment(linker, LINK_S2_KERNEL(ForceField_fieldSamplerPointsKernel))
+
+#pragma comment(linker, LINK_KERNEL(IOFX_actorRangeKernel))
+#pragma comment(linker, LINK_KERNEL(IOFX_bboxKernel))
+#pragma comment(linker, LINK_S2_KERNEL(IOFX_meshModifiersKernel))
+#pragma comment(linker, LINK_KERNEL(IOFX_newRadixSortBlockKernel))
+#pragma comment(linker, LINK_KERNEL(IOFX_newRadixSortStepKernel))
+#pragma comment(linker, LINK_KERNEL(IOFX_radixSortStepKernel))
+#pragma comment(linker, LINK_S2_KERNEL(IOFX_makeSortKeys))
+#pragma comment(linker, LINK_S2_KERNEL(IOFX_remapKernel))
+#pragma comment(linker, LINK_S2_KERNEL(IOFX_spriteModifiersKernel))
+#pragma comment(linker, LINK_S2_KERNEL(IOFX_spriteTextureModifiersKernel))
+#pragma comment(linker, LINK_S2_KERNEL(IOFX_volumeMigrationKernel))
+
+#pragma comment(linker, LINK_KERNEL(ParticleIOS_compactKernel))
+#pragma comment(linker, LINK_KERNEL(ParticleIOS_histogramKernel))
+#pragma comment(linker, LINK_KERNEL(ParticleIOS_mergeHistogramKernel))
+#pragma comment(linker, LINK_KERNEL(ParticleIOS_reduceKernel))
+#pragma comment(linker, LINK_KERNEL(ParticleIOS_scanKernel))
+#pragma comment(linker, LINK_S2_KERNEL(ParticleIOS_simulateApplyFieldKernel))
+#pragma comment(linker, LINK_S2_KERNEL(ParticleIOS_simulateKernel))
+#pragma comment(linker, LINK_KERNEL(ParticleIOS_stateKernel))
+
+#endif
+
+namespace nvidia
+{
+namespace apex
+{
+
+
+void instantiateModuleBasicIos();
+void instantiateModuleEmitter();
+void instantiateModuleIofx();
+void instantiateModuleFieldSampler();
+void instantiateModuleParticleIos();
+void instantiateModuleForceField();
+void instantiateModuleBasicFS();
+
+static const char* getAuthoringTypeName(const char* className)
+{
+ const char* ret = NULL;
+
+ if (nvidia::strcmp(className, "BasicIOSAssetParam") == 0)
+ {
+ ret = BASIC_IOS_AUTHORING_TYPE_NAME;
+ }
+ else if (nvidia::strcmp(className, "IofxAssetParameters") == 0)
+ {
+ ret = IOFX_AUTHORING_TYPE_NAME;
+ }
+ else if (nvidia::strcmp(className, "ParticleIosAssetParam") == 0)
+ {
+ ret = PARTICLE_IOS_AUTHORING_TYPE_NAME;
+ }
+
+
+ PX_ASSERT(ret);
+ return ret;
+}
+
+#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;
+}
+
+static PxTransform getPose(float x, float y, float z, float rotX, float rotY, float rotZ)
+{
+ PxTransform ret;
+ ret.p = PxVec3(x, y, z);
+ fm_eulerToQuat(rotX * FM_DEG_TO_RAD, rotY * FM_DEG_TO_RAD, rotZ * FM_DEG_TO_RAD, &ret.q.x);
+ return ret;
+}
+
+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;
+ }
+
+ /* Setup common module global variables */
+ gApexSdk = inSdk;
+ particles::ModuleParticlesImpl* impl = PX_NEW(particles::ModuleParticlesImpl)(inSdk);
+ *niRef = (ModuleIntl*) impl;
+ return (Module*) impl;
+}
+
+#else
+/* Statically linking entry function */
+void instantiateModuleParticles()
+{
+ ApexSDKIntl* sdk = GetInternalApexSDK();
+ particles::ModuleParticlesImpl* impl = PX_NEW(particles::ModuleParticlesImpl)(sdk);
+ sdk->registerExternalModule((Module*) impl, (ModuleIntl*) impl);
+}
+#endif // `defined(_USRDLL)
+
+}
+
+namespace particles
+{
+
+/* === ModuleParticlesImpl Implementation === */
+
+#ifdef WITHOUT_APEX_AUTHORING
+
+class ParticlesAssetDummyAuthoring : public AssetAuthoring, public UserAllocated
+{
+public:
+ ParticlesAssetDummyAuthoring(ModuleParticlesImpl* module, ResourceList& list, NvParameterized::Interface* params, const char* name)
+ {
+ PX_UNUSED(module);
+ PX_UNUSED(list);
+ PX_UNUSED(params);
+ PX_UNUSED(name);
+ }
+
+ ParticlesAssetDummyAuthoring(ModuleParticlesImpl* module, ResourceList& list, const char* name)
+ {
+ PX_UNUSED(module);
+ PX_UNUSED(list);
+ PX_UNUSED(name);
+ }
+
+ ParticlesAssetDummyAuthoring(ModuleParticlesImpl* module, ResourceList& list)
+ {
+ PX_UNUSED(module);
+ PX_UNUSED(list);
+ }
+
+ virtual void release()
+ {
+ destroy();
+ }
+
+ // internal
+ void destroy()
+ {
+ delete this;
+ }
+
+ const char* getName(void) const
+ {
+ return NULL;
+ }
+
+
+ /**
+ * \brief Prepares a fully authored Asset Authoring object for a specified platform
+ */
+ virtual bool prepareForPlatform(nvidia::apex::PlatformTag)
+ {
+ PX_ASSERT(0);
+ return false;
+ }
+
+ /**
+ * \brief Save asset's NvParameterized interface, may return NULL
+ */
+ virtual NvParameterized::Interface* getNvParameterized()
+ {
+ PX_ASSERT(0);
+ return NULL;
+ }
+
+ virtual NvParameterized::Interface* releaseAndReturnNvParameterizedInterface(void)
+ {
+ PX_ALWAYS_ASSERT();
+ return NULL;
+ }
+
+ virtual void setToolString(const char* toolName, const char* toolVersion, uint32_t toolChangelist)
+ {
+ PX_ALWAYS_ASSERT();
+ PX_UNUSED(toolName);
+ PX_UNUSED(toolVersion);
+ PX_UNUSED(toolChangelist);
+ }
+};
+
+typedef ApexAuthorableObject<ModuleParticlesImpl, ParticlesAsset, ParticlesAssetDummyAuthoring> ParticlesAO;
+
+#else
+typedef ApexAuthorableObject<ModuleParticlesImpl, ParticlesAsset, ParticlesAssetAuthoring> ParticlesAO;
+#endif
+
+
+AuthObjTypeID EffectPackageAssetImpl::mAssetTypeID; // Static class member of ParticlesAsset
+
+#ifdef WITHOUT_APEX_AUTHORING
+
+class EffectPackageAssetDummyAuthoring : public AssetAuthoring, public UserAllocated
+{
+public:
+ EffectPackageAssetDummyAuthoring(ModuleParticlesImpl* module, ResourceList& list, NvParameterized::Interface* params, const char* name)
+ {
+ PX_UNUSED(module);
+ PX_UNUSED(list);
+ PX_UNUSED(params);
+ PX_UNUSED(name);
+ }
+
+ EffectPackageAssetDummyAuthoring(ModuleParticlesImpl* module, ResourceList& list, const char* name)
+ {
+ PX_UNUSED(module);
+ PX_UNUSED(list);
+ PX_UNUSED(name);
+ }
+
+ EffectPackageAssetDummyAuthoring(ModuleParticlesImpl* module, ResourceList& list)
+ {
+ PX_UNUSED(module);
+ PX_UNUSED(list);
+ }
+
+ virtual void release()
+ {
+ destroy();
+ }
+
+ // internal
+ void destroy()
+ {
+ delete this;
+ }
+
+ const char* getName(void) const
+ {
+ return NULL;
+ }
+
+ /**
+ * \brief Returns the name of this APEX authorable object type
+ */
+ virtual const char* getObjTypeName() const
+ {
+ return EffectPackageAssetImpl::getClassName();
+ }
+
+ /**
+ * \brief Prepares a fully authored Asset Authoring object for a specified platform
+ */
+ virtual bool prepareForPlatform(nvidia::apex::PlatformTag)
+ {
+ PX_ASSERT(0);
+ return false;
+ }
+
+ /**
+ * \brief Save asset's NvParameterized interface, may return NULL
+ */
+ virtual NvParameterized::Interface* getNvParameterized()
+ {
+ PX_ASSERT(0);
+ return NULL;
+ }
+
+ virtual NvParameterized::Interface* releaseAndReturnNvParameterizedInterface(void)
+ {
+ PX_ALWAYS_ASSERT();
+ return NULL;
+ }
+
+ virtual void setToolString(const char* toolName, const char* toolVersion, uint32_t toolChangelist)
+ {
+ PX_ALWAYS_ASSERT();
+ PX_UNUSED(toolName);
+ PX_UNUSED(toolVersion);
+ PX_UNUSED(toolChangelist);
+ }
+};
+
+typedef ApexAuthorableObject<ModuleParticlesImpl, EffectPackageAssetImpl, EffectPackageAssetDummyAuthoring> EffectPackageAO;
+
+#else
+typedef ApexAuthorableObject<ModuleParticlesImpl, EffectPackageAssetImpl, EffectPackageAssetAuthoringImpl> EffectPackageAO;
+#endif
+
+
+//********************************************************************
+
+#define MODULE_PARENT(x) if ( x ) { ModuleIntl *m = mSdk->getInternalModule(x); PX_ASSERT(m); m->setParent(this); m->setCreateOk(false); }
+
+ModuleParticlesImpl::ModuleParticlesImpl(ApexSDKIntl* inSdk)
+{
+ mSdk = inSdk;
+
+ PxPhysics *sdk = mSdk->getPhysXSDK();
+ mDefaultMaterial = sdk->createMaterial(1, 1, 1);
+
+ instantiateModuleBasicIos(); // Instantiate the BasicIOS module statically
+ mModuleBasicIos = mSdk->createModule("BasicIOS");
+ PX_ASSERT(mModuleBasicIos);
+ MODULE_PARENT(mModuleBasicIos);
+
+ instantiateModuleEmitter(); // Instantiate the Emitter module statically
+ mModuleEmitter = mSdk->createModule("Emitter");
+ PX_ASSERT(mModuleEmitter);
+ MODULE_PARENT(mModuleEmitter);
+
+ instantiateModuleIofx(); // Instantiate the IOFX module statically
+ mModuleIofx = mSdk->createModule("IOFX");
+ PX_ASSERT(mModuleIofx);
+ MODULE_PARENT(mModuleIofx);
+
+ instantiateModuleFieldSampler(); // Instantiate the field sampler module statically
+ mModuleFieldSampler = mSdk->createModule("FieldSampler");
+ PX_ASSERT(mModuleFieldSampler);
+ MODULE_PARENT(mModuleFieldSampler);
+
+ instantiateModuleBasicFS(); // Instantiate the BasicFS module statically
+ mModuleBasicFS = mSdk->createModule("BasicFS");
+ PX_ASSERT(mModuleBasicFS);
+ MODULE_PARENT(mModuleBasicFS);
+
+ instantiateModuleParticleIos(); // PhysX 3.x only : Instantiate the ParticleIOS module
+ mModuleParticleIos = mSdk->createModule("ParticleIOS");
+ PX_ASSERT(mModuleParticleIos);
+ MODULE_PARENT(mModuleParticleIos);
+
+ instantiateModuleForceField(); // PhysX 3.x only : Instantiate the ForceField module
+ mModuleForceField = mSdk->createModule("ForceField");
+ PX_ASSERT(mModuleForceField);
+ MODULE_PARENT(mModuleForceField);
+
+
+ mName = "Particles";
+ mApiProxy = this;
+ mModuleParams = NULL;
+ mTurbulenceModule = NULL;
+ mGraphicsMaterialsDatabase = NULL;
+ mEnableScreenCulling = false;
+ mZnegative = false;
+ mUseEmitterPool = false;
+
+ mEffectPackageIOSDatabaseParams = NULL;
+ mEffectPackageIOFXDatabaseParams = NULL;
+ mEffectPackageEmitterDatabaseParams = NULL;
+ mEffectPackageDatabaseParams = NULL;
+ mEffectPackageFieldSamplerDatabaseParams = NULL;
+
+ {
+ /* Register asset type and create a namespace for it's assets */
+ const char* pName = EffectPackageAssetParams::staticClassName();
+ EffectPackageAO* eAO = PX_NEW(EffectPackageAO)(this, mEffectPackageAuthorableObjects, pName);
+ EffectPackageAssetImpl::mAssetTypeID = eAO->getResID();
+ }
+
+ /* Register the NvParameterized factories */
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ ModuleParticlesRegistration::invokeRegistration(traits);
+
+ {
+ uint32_t count = mSdk->getNbModules();
+ Module** modules = mSdk->getModules();
+ for (uint32_t i = 0; i < count; i++)
+ {
+ Module* m = modules[i];
+ const char* name = m->getName();
+ if (nvidia::strcmp(name, "TurbulenceFS") == 0)
+ {
+ mTurbulenceModule = static_cast< ModuleTurbulenceFS*>(m);
+ break;
+ }
+ }
+ }
+}
+
+ModuleParticlesImpl::~ModuleParticlesImpl()
+{
+ if ( mDefaultMaterial )
+ {
+ mDefaultMaterial->release();
+ }
+}
+
+void ModuleParticlesImpl::destroy()
+{
+ // release the NvParameterized factory
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+
+ if (mModuleParams)
+ {
+ mModuleParams->destroy();
+ mModuleParams = NULL;
+ }
+
+ SAFE_DESTROY(mEffectPackageIOSDatabaseParams);
+ SAFE_DESTROY(mEffectPackageIOFXDatabaseParams);
+ SAFE_DESTROY(mEffectPackageEmitterDatabaseParams);
+ SAFE_DESTROY(mEffectPackageDatabaseParams);
+ SAFE_DESTROY(mEffectPackageFieldSamplerDatabaseParams);
+ SAFE_DESTROY(mGraphicsMaterialsDatabase);
+
+ ModuleBase::destroy();
+
+ if (traits)
+ {
+ /* Remove the NvParameterized factories */
+ ModuleParticlesRegistration::invokeUnregistration(traits);
+ }
+
+ SAFE_MODULE_RELEASE(mModuleBasicIos);
+ SAFE_MODULE_RELEASE(mModuleEmitter);
+ SAFE_MODULE_RELEASE(mModuleIofx);
+ SAFE_MODULE_RELEASE(mModuleFieldSampler);
+ SAFE_MODULE_RELEASE(mModuleBasicFS);
+ SAFE_MODULE_RELEASE(mModuleParticleIos); // PhysX 3.x only : Instantiate the ParticleIOS module
+ SAFE_MODULE_RELEASE(mModuleForceField); // PhysX 3.x only : Instantiate the ForceField module
+
+ // clear before deletion, so that we don't call back into releaseModuleSceneIntl during "delete this"
+ mParticlesScenes.clear();
+
+ delete this;
+
+
+}
+
+NvParameterized::Interface* ModuleParticlesImpl::getDefaultModuleDesc()
+{
+ WRITE_ZONE();
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+
+ if (!mModuleParams)
+ {
+ mModuleParams = DYNAMIC_CAST(ParticlesModuleParameters*)
+ (traits->createNvParameterized("ParticlesModuleParameters"));
+ PX_ASSERT(mModuleParams);
+ }
+ else
+ {
+ mModuleParams->initDefaults();
+ }
+
+ return mModuleParams;
+}
+
+void ModuleParticlesImpl::init(const ModuleParticlesDesc& expDesc)
+{
+ WRITE_ZONE();
+ mModuleValue = expDesc.moduleValue;
+}
+
+AuthObjTypeID ModuleParticlesImpl::getParticlesAssetTypeID() const
+{
+// TODO return ParticlesAsset::mAssetTypeID;
+ return 0;
+}
+AuthObjTypeID ModuleParticlesImpl::getModuleID() const
+{
+ READ_ZONE();
+// return ParticlesAsset::mAssetTypeID;
+// TODO
+ return 0;
+}
+
+
+/* == Particles Scene methods == */
+ModuleSceneIntl* ModuleParticlesImpl::createInternalModuleScene(SceneIntl& scene, RenderDebugInterface* renderDebug)
+{
+ ModuleSceneIntl* ret = PX_NEW(ParticlesScene)(*this, scene, renderDebug, mParticlesScenes);
+ mScenes.pushBack(ret);
+
+ return ret;
+}
+
+void ModuleParticlesImpl::releaseModuleSceneIntl(ModuleSceneIntl& scene)
+{
+ for (uint32_t i = 0; i < mScenes.size(); ++i)
+ {
+ if (mScenes[i] == &scene)
+ {
+ mScenes.remove(i);
+ break;
+ }
+ }
+ ParticlesScene* es = DYNAMIC_CAST(ParticlesScene*)(&scene);
+ es->destroy();
+
+}
+
+uint32_t ModuleParticlesImpl::forceLoadAssets()
+{
+ uint32_t loadedAssetCount = 0;
+
+ for (uint32_t i = 0; i < mAuthorableObjects.getSize(); i++)
+ {
+ AuthorableObjectIntl* ao = static_cast<AuthorableObjectIntl*>(mAuthorableObjects.getResource(i));
+ loadedAssetCount += ao->forceLoadAssets();
+ }
+
+ for (uint32_t i = 0; i < mEffectPackageAuthorableObjects.getSize(); i++)
+ {
+ AuthorableObjectIntl* ao = static_cast<AuthorableObjectIntl*>(mEffectPackageAuthorableObjects.getResource(i));
+ loadedAssetCount += ao->forceLoadAssets();
+ }
+
+
+ return loadedAssetCount;
+}
+
+ParticlesScene* ModuleParticlesImpl::getParticlesScene(const Scene& apexScene)
+{
+ for (uint32_t i = 0 ; i < mParticlesScenes.getSize() ; i++)
+ {
+ ParticlesScene* es = DYNAMIC_CAST(ParticlesScene*)(mParticlesScenes.getResource(i));
+ if (es->mApexScene == &apexScene)
+ {
+ return es;
+ }
+ }
+
+ PX_ASSERT(!"Unable to locate an appropriate ParticlesScene");
+ return NULL;
+}
+
+RenderableIterator* ModuleParticlesImpl::createRenderableIterator(const Scene& apexScene)
+{
+ WRITE_ZONE();
+ ParticlesScene* es = getParticlesScene(apexScene);
+ if (es)
+ {
+ return es->createRenderableIterator();
+ }
+
+ return NULL;
+}
+
+const NvParameterized::Interface* ModuleParticlesImpl::locateVolumeRenderMaterialData(const char* name) const
+{
+ const NvParameterized::Interface* ret = NULL;
+
+ if (mGraphicsMaterialsDatabase)
+ {
+ EffectPackageGraphicsMaterialsParams* d = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ for (int32_t i = 0; i < d->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface *ei = d->GraphicsMaterials.buf[i];
+ if ( ei && nvidia::strcmp(ei->className(),"VolumeRenderMaterialData") == 0 )
+ {
+ VolumeRenderMaterialData* e = static_cast< VolumeRenderMaterialData*>(ei);
+ if (e)
+ {
+ if (e->Name && nvidia::stricmp(e->Name, name) == 0)
+ {
+ ret = e;
+ break;
+ }
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+
+
+const NvParameterized::Interface* ModuleParticlesImpl::locateGraphicsMaterialData(const char* name) const
+{
+ READ_ZONE();
+ const NvParameterized::Interface* ret = NULL;
+
+ if (mGraphicsMaterialsDatabase)
+ {
+ EffectPackageGraphicsMaterialsParams* d = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ for (int32_t i = 0; i < d->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface *ei = d->GraphicsMaterials.buf[i];
+ if ( ei && nvidia::strcmp(ei->className(),"GraphicsMaterialData") == 0 || nvidia::strcmp(ei->className(),"VolumeRenderMaterialData") == 0 )
+ {
+ GraphicsMaterialData* e = static_cast< GraphicsMaterialData*>(ei);
+ if (e)
+ {
+ if (e->Name && nvidia::stricmp(e->Name, name) == 0)
+ {
+ ret = e;
+ break;
+ }
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+static bool isUnique(Array< const char* > &nameList, const char* baseName)
+{
+ bool ret = true;
+ for (uint32_t i = 0; i < nameList.size(); i++)
+ {
+ if (nvidia::stricmp(baseName, nameList[i]) == 0)
+ {
+ ret = false;
+ break;
+ }
+ }
+ return ret;
+}
+
+static const char* getUniqueName(Array< const char* > &nameList, const char* baseName)
+{
+ const char* ret = baseName;
+
+ if (baseName == NULL || strlen(baseName) == 0)
+ {
+ baseName = "default";
+ }
+ if (!isUnique(nameList, baseName))
+ {
+ static char uniqueName[512];
+ strncpy(uniqueName, baseName, 512);
+ for (uint32_t i = 1; i < 1000; i++)
+ {
+ sprintf_s(uniqueName, 512, "%s%d", baseName, i);
+ if (isUnique(nameList, uniqueName))
+ {
+ ret = uniqueName;
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
+
+bool ModuleParticlesImpl::setEffectPackageGraphicsMaterialsDatabase(const NvParameterized::Interface* dataBase)
+{
+ WRITE_ZONE();
+ bool ret = false;
+ if (dataBase)
+ {
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ if (nvidia::strcmp(dataBase->className(), EffectPackageGraphicsMaterialsParams::staticClassName()) == 0 && dataBase != mGraphicsMaterialsDatabase)
+ {
+ if (mGraphicsMaterialsDatabase)
+ {
+ mGraphicsMaterialsDatabase->destroy();
+ mGraphicsMaterialsDatabase = NULL;
+ }
+ dataBase->clone(mGraphicsMaterialsDatabase);
+ if ( mGraphicsMaterialsDatabase == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ mGraphicsMaterialsDatabase = traits->createNvParameterized(EffectPackageGraphicsMaterialsParams::staticClassName());
+ }
+ ret = true;
+ }
+ else
+ {
+ // add it to the end of the existing array..
+ if (nvidia::strcmp(dataBase->className(), GraphicsMaterialData::staticClassName()) == 0 || nvidia::strcmp(dataBase->className(), VolumeRenderMaterialData::staticClassName()) == 0 )
+ {
+ bool revised = false;
+ const char* itemName = dataBase->name();
+ EffectPackageGraphicsMaterialsParams* d = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsMaterials.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ const char *materialName=NULL;
+ if ( nvidia::strcmp(ei->className(),"GraphicsMaterialData") == 0 )
+ {
+ GraphicsMaterialData* ed = static_cast< GraphicsMaterialData*>(ei);
+ materialName = ed->Name.buf;
+ }
+ else if ( nvidia::strcmp(ei->className(),"VolumeRenderMaterialData") == 0 )
+ {
+ VolumeRenderMaterialData* ed = static_cast< VolumeRenderMaterialData*>(ei);
+ materialName = ed->Name.buf;
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT();
+ }
+ if ( materialName && nvidia::stricmp(materialName, itemName) == 0)
+ {
+ ei->copy(*dataBase);
+ revised = true;
+ ret = true;
+ break;
+ }
+ }
+ if (!revised && mGraphicsMaterialsDatabase)
+ {
+ int32_t arraySize = d->GraphicsMaterials.arraySizes[0];
+ NvParameterized::Handle handle(mGraphicsMaterialsDatabase);
+ NvParameterized::ErrorType err = handle.getParameter("GraphicsMaterials");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(arraySize + 1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = NULL;
+ NvParameterized::ErrorType err = dataBase->clone(ei);
+ if ( err != NvParameterized::ERROR_NONE || ei == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ else
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ d->GraphicsMaterials.buf[arraySize] = ei;
+ }
+ ret = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (mGraphicsMaterialsDatabase)
+ {
+ EffectPackageGraphicsMaterialsParams* ds = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ if (ds->GraphicsMaterials.arraySizes[0] == 0)
+ {
+ NvParameterized::Handle handle(mGraphicsMaterialsDatabase);
+ NvParameterized::ErrorType err = handle.getParameter("GraphicsMaterials");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ NvParameterized::Interface* ei;
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ ei = traits->createNvParameterized(GraphicsMaterialData::staticClassName());
+ ds->GraphicsMaterials.buf[0] = ei;
+ ei = traits->createNvParameterized(VolumeRenderMaterialData::staticClassName());
+ ds->GraphicsMaterials.buf[1] = ei;
+ }
+ }
+
+ Array< const char* > nameList;
+ for (int32_t i = 0; i < ds->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface *ei = ds->GraphicsMaterials.buf[i];
+ if ( !ei )
+ continue;
+ const char *materialName=NULL;
+ if ( nvidia::strcmp(ei->className(),"GraphicsMaterialData") == 0 )
+ {
+ GraphicsMaterialData* e = static_cast< GraphicsMaterialData*>(ei);
+ if (e)
+ {
+ materialName = e->Name;
+ }
+ }
+ else if ( nvidia::strcmp(ei->className(),"VolumeRenderMaterialData") == 0 )
+ {
+ VolumeRenderMaterialData* e = static_cast< VolumeRenderMaterialData*>(ei);
+ if (e)
+ {
+ materialName = e->Name.buf;
+ }
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT();
+ }
+ if ( materialName )
+ {
+ for (uint32_t j = 0; j < nameList.size(); j++)
+ {
+ if (nvidia::stricmp(nameList[j], materialName) == 0)
+ {
+ NvParameterized::Handle handle(ei);
+ NvParameterized::ErrorType err = handle.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ materialName = getUniqueName(nameList, materialName);
+ handle.setParamString(materialName);
+ ret = true;
+ break;
+ }
+ }
+ }
+ nameList.pushBack(materialName);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+
+const NvParameterized::Interface* ModuleParticlesImpl::getEffectPackageGraphicsMaterialsDatabase(void) const
+{
+ READ_ZONE();
+ return mGraphicsMaterialsDatabase;
+}
+
+
+NvParameterized::Interface* ModuleParticlesImpl::locateResource(const char* resourceName, const char* nameSpace)
+{
+ WRITE_ZONE();
+ NvParameterized::Interface* ret = NULL;
+
+ if (mEffectPackageDatabaseParams == NULL)
+ {
+ return NULL;
+ }
+
+ if (nvidia::strcmp(nameSpace, PARTICLES_EFFECT_PACKAGE_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageDatabaseParams* d = static_cast< EffectPackageDatabaseParams*>(mEffectPackageDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->EffectPackages.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->EffectPackages.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ EffectPackageData* ed = static_cast< EffectPackageData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ ret = ed->EffectPackage;
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, APEX_MATERIALS_NAME_SPACE) == 0 || nvidia::strcmp(nameSpace,"GraphicsMaterialData") == 0 )
+ {
+ EffectPackageGraphicsMaterialsParams* d = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsMaterials.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if ( nvidia::strcmp(ei->className(),"GraphicsMaterialData") == 0 )
+ {
+ GraphicsMaterialData* ed = static_cast< GraphicsMaterialData*>(ei);
+ if ( nvidia::strcmp(ed->Name,resourceName) == 0 )
+ {
+ ret = ei;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, APEX_VOLUME_RENDER_MATERIALS_NAME_SPACE) == 0 || nvidia::strcmp(nameSpace,"VolumeRenderMaterialData") == 0 )
+ {
+ EffectPackageGraphicsMaterialsParams* d = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsMaterials.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if ( nvidia::strcmp(ei->className(),"VolumeRenderMaterialData") == 0 )
+ {
+ VolumeRenderMaterialData* ed = static_cast< VolumeRenderMaterialData*>(ei);
+ if ( nvidia::strcmp(ed->Name,resourceName) == 0 )
+ {
+ ret = ei;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, IOFX_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "GraphicsEffectData") == 0 )
+ {
+ EffectPackageIOFXDatabaseParams* d = static_cast< EffectPackageIOFXDatabaseParams*>(mEffectPackageIOFXDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsEffects.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsEffects.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ GraphicsEffectData* ed = static_cast< GraphicsEffectData*>(ei);
+ if (nvidia::stricmp(resourceName, ed->Name) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, IOFX_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->IOFX;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, "ParticleSimulationData") == 0)
+ {
+ EffectPackageIOSDatabaseParams* d = static_cast< EffectPackageIOSDatabaseParams*>(mEffectPackageIOSDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->ParticleSimulations.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ ret = ei;
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, BASIC_IOS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageIOSDatabaseParams* d = static_cast< EffectPackageIOSDatabaseParams*>(mEffectPackageIOSDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->ParticleSimulations.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData*>(ei);
+ if (nvidia::strcmp(ed->IOS->className(), basicios::BasicIOSAssetParam::staticClassName()) == 0)
+ {
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ ret = ed->IOS;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, PARTICLE_IOS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageIOSDatabaseParams* d = static_cast< EffectPackageIOSDatabaseParams*>(mEffectPackageIOSDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->ParticleSimulations.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData*>(ei);
+ if (nvidia::strcmp(ed->IOS->className(), pxparticleios::ParticleIosAssetParam::staticClassName()) == 0)
+ {
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ ret = ed->IOS;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, EMITTER_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace,"EmitterData") == 0 )
+ {
+ EffectPackageEmitterDatabaseParams* d = static_cast< EffectPackageEmitterDatabaseParams*>(mEffectPackageEmitterDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->Emitters.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->Emitters.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ EmitterData* ed = static_cast< EmitterData*>(ei);
+ if (nvidia::stricmp(resourceName, ed->Name) == 0)
+ {
+ if ( nvidia::strcmp(nameSpace, EMITTER_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->Emitter;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, HEAT_SOURCE_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "HeatSourceData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), HeatSourceData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ HeatSourceData* ed = static_cast< HeatSourceData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, HEAT_SOURCE_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->HeatSource;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, SUBSTANCE_SOURCE_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "SubstanceSourceData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), SubstanceSourceData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ SubstanceSourceData* ed = static_cast< SubstanceSourceData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, SUBSTANCE_SOURCE_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->SubstanceSource;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, VELOCITY_SOURCE_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "VelocitySourceData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), VelocitySourceData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ VelocitySourceData* ed = static_cast< VelocitySourceData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, VELOCITY_SOURCE_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->VelocitySource;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, JET_FS_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "JetFieldSamplerData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), JetFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ JetFieldSamplerData* ed = static_cast< JetFieldSamplerData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, JET_FS_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->JetFieldSampler;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, WIND_FS_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "WindFieldSamplerData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), WindFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ WindFieldSamplerData* ed = static_cast< WindFieldSamplerData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, WIND_FS_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->WindFieldSampler;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, VORTEX_FS_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "VortexFieldSamplerData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), VortexFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ VortexFieldSamplerData* ed = static_cast< VortexFieldSamplerData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, VORTEX_FS_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->VortexFieldSampler;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, NOISE_FS_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "NoiseFieldSamplerData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), NoiseFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ NoiseFieldSamplerData* ed = static_cast< NoiseFieldSamplerData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, NOISE_FS_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->NoiseFieldSampler;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, ATTRACTOR_FS_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "AttractorFieldSamplerData") == 0 )
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), AttractorFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ AttractorFieldSamplerData* ed = static_cast< AttractorFieldSamplerData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, ATTRACTOR_FS_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->AttractorFieldSampler;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, TURBULENCE_FS_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "TurbulenceFieldSamplerData") == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), TurbulenceFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ TurbulenceFieldSamplerData* ed = static_cast< TurbulenceFieldSamplerData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, TURBULENCE_FS_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->TurbulenceFieldSampler;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, FORCEFIELD_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "ForceFieldData") == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), ForceFieldData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ ForceFieldData* ed = static_cast< ForceFieldData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, FORCEFIELD_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->ForceField;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, FLAME_EMITTER_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, "FlameEmitterData") == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), FlameEmitterData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ FlameEmitterData* ed = static_cast< FlameEmitterData*>(ei);
+ if (nvidia::stricmp(ed->Name, resourceName) == 0)
+ {
+ if (nvidia::strcmp(nameSpace, FLAME_EMITTER_AUTHORING_TYPE_NAME) == 0 )
+ {
+ ret = ed->FlameEmitter;
+ }
+ else
+ {
+ ret = ed;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+
+
+
+const char** ModuleParticlesImpl::getResourceNames(const char* nameSpace, uint32_t& nameCount, const char** &variants)
+{
+ READ_ZONE();
+ const char** ret = NULL;
+
+ variants = NULL;
+ mTempNames.clear();
+ mTempVariantNames.clear();
+
+ if (nvidia::strcmp(nameSpace, IOFX_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageIOFXDatabaseParams* d = static_cast< EffectPackageIOFXDatabaseParams*>(mEffectPackageIOFXDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsEffects.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsEffects.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ GraphicsEffectData* ed = static_cast< GraphicsEffectData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(IOFX_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, APEX_MATERIALS_NAME_SPACE) == 0)
+ {
+ EffectPackageGraphicsMaterialsParams* d = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsMaterials.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if ( nvidia::strcmp(ei->className(),"GraphicsMaterialData") == 0 )
+ {
+ GraphicsMaterialData* ed = static_cast< GraphicsMaterialData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(APEX_MATERIALS_NAME_SPACE);
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, APEX_VOLUME_RENDER_MATERIALS_NAME_SPACE) == 0)
+ {
+ EffectPackageGraphicsMaterialsParams* d = static_cast< EffectPackageGraphicsMaterialsParams*>(mGraphicsMaterialsDatabase);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsMaterials.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsMaterials.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if ( nvidia::strcmp(ei->className(),"VolumeRenderMaterialData") == 0 )
+ {
+ VolumeRenderMaterialData* ed = static_cast< VolumeRenderMaterialData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(APEX_VOLUME_RENDER_MATERIALS_NAME_SPACE);
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, BASIC_IOS_AUTHORING_TYPE_NAME) == 0 || nvidia::strcmp(nameSpace, PARTICLE_IOS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageIOSDatabaseParams* d = static_cast< EffectPackageIOSDatabaseParams*>(mEffectPackageIOSDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->ParticleSimulations.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ if (nvidia::strcmp(ed->IOS->className(), basicios::BasicIOSAssetParam::staticClassName()) == 0)
+ {
+ mTempVariantNames.pushBack(BASIC_IOS_AUTHORING_TYPE_NAME);
+ }
+ else
+ {
+ mTempVariantNames.pushBack(PARTICLE_IOS_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, EMITTER_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageEmitterDatabaseParams* d = static_cast< EffectPackageEmitterDatabaseParams*>(mEffectPackageEmitterDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->Emitters.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->Emitters.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ EmitterData* ed = static_cast< EmitterData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(EMITTER_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, HEAT_SOURCE_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), HeatSourceData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ HeatSourceData* ed = static_cast< HeatSourceData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(HEAT_SOURCE_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, SUBSTANCE_SOURCE_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), SubstanceSourceData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ SubstanceSourceData* ed = static_cast< SubstanceSourceData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(SUBSTANCE_SOURCE_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, VELOCITY_SOURCE_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), VelocitySourceData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ VelocitySourceData* ed = static_cast< VelocitySourceData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(SUBSTANCE_SOURCE_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, JET_FS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), JetFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ JetFieldSamplerData* ed = static_cast< JetFieldSamplerData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(JET_FS_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, WIND_FS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), WindFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ WindFieldSamplerData* ed = static_cast< WindFieldSamplerData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(WIND_FS_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, NOISE_FS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), NoiseFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ NoiseFieldSamplerData* ed = static_cast< NoiseFieldSamplerData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(NOISE_FS_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, VORTEX_FS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), VortexFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ VortexFieldSamplerData* ed = static_cast< VortexFieldSamplerData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(VORTEX_FS_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, ATTRACTOR_FS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), AttractorFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ AttractorFieldSamplerData* ed = static_cast< AttractorFieldSamplerData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(ATTRACTOR_FS_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, TURBULENCE_FS_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), TurbulenceFieldSamplerData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ TurbulenceFieldSamplerData* ed = static_cast< TurbulenceFieldSamplerData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(TURBULENCE_FS_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, FORCEFIELD_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), ForceFieldData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ ForceFieldData* ed = static_cast< ForceFieldData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(FORCEFIELD_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else if (nvidia::strcmp(nameSpace, FLAME_EMITTER_AUTHORING_TYPE_NAME) == 0)
+ {
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), FlameEmitterData::staticClassName()) != 0)
+ {
+ continue;
+ }
+ FlameEmitterData* ed = static_cast< FlameEmitterData*>(ei);
+ mTempNames.pushBack(ed->Name);
+ mTempVariantNames.pushBack(FLAME_EMITTER_AUTHORING_TYPE_NAME);
+ }
+ }
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT();
+ }
+
+ nameCount = mTempNames.size();
+ if (nameCount)
+ {
+ ret = &mTempNames[0];
+ variants = &mTempVariantNames[0];
+ }
+
+ return ret;
+}
+
+
+bool ModuleParticlesImpl::setEffectPackageIOSDatabase(const NvParameterized::Interface* dataBase)
+{
+ WRITE_ZONE();
+ bool ret = false;
+
+ if (dataBase)
+ {
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ const char* className = dataBase->className();
+ if (nvidia::strcmp(className, basicios::BasicIOSAssetParam::staticClassName()) == 0 || nvidia::strcmp(className, pxparticleios::ParticleIosAssetParam::staticClassName()) == 0)
+ {
+ bool revised = false;
+ const char* itemName = dataBase->name() ? dataBase->name() : "defaultBasicIOS";
+ EffectPackageIOSDatabaseParams* d = static_cast< EffectPackageIOSDatabaseParams*>(mEffectPackageIOSDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->ParticleSimulations.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData*>(ei);
+ if (nvidia::stricmp(ed->Name.buf, itemName) == 0)
+ {
+ ed->IOS->copy(*dataBase);
+ initParticleSimulationData(ed);
+ revised = true;
+ ret = true;
+ break;
+ }
+ }
+ }
+ if (!revised && mEffectPackageIOSDatabaseParams)
+ {
+ int32_t arraySize = d->ParticleSimulations.arraySizes[0];
+ NvParameterized::Handle handle(mEffectPackageIOSDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("ParticleSimulations");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(arraySize + 1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(ParticleSimulationData::staticClassName());
+ if (ei)
+ {
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData*>(ei);
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ d->ParticleSimulations.buf[arraySize] = ei;
+ ed->IOS = NULL;
+ NvParameterized::ErrorType err = dataBase->clone(ed->IOS);
+ if ( err != NvParameterized::ERROR_NONE || ed->IOS == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ else
+ {
+ initParticleSimulationData(ed);
+ }
+ }
+ ret = true;
+ }
+ }
+ }
+ else if (nvidia::strcmp(dataBase->className(), EffectPackageIOSDatabaseParams::staticClassName()) == 0)
+ {
+ if (mEffectPackageIOSDatabaseParams && mEffectPackageIOSDatabaseParams != dataBase)
+ {
+ mEffectPackageIOSDatabaseParams->destroy();
+ mEffectPackageIOSDatabaseParams = NULL;
+ }
+ if (mEffectPackageIOSDatabaseParams == NULL)
+ {
+ dataBase->clone(mEffectPackageIOSDatabaseParams);
+ if ( mEffectPackageIOSDatabaseParams == NULL)
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ mEffectPackageIOSDatabaseParams = traits->createNvParameterized(EffectPackageIOSDatabaseParams::staticClassName());
+ }
+ }
+
+ EffectPackageIOSDatabaseParams* d = static_cast< EffectPackageIOSDatabaseParams*>(mEffectPackageIOSDatabaseParams);
+ if ( d )
+ {
+ if (d->ParticleSimulations.arraySizes[0] == 0)
+ {
+ NvParameterized::Handle handle(mEffectPackageIOSDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("ParticleSimulations");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(3);
+
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ // create the default BasicIOS
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(ParticleSimulationData::staticClassName());
+ d->ParticleSimulations.buf[0] = ei;
+ ParticleSimulationData* psd = static_cast< ParticleSimulationData*>(ei);
+ if (psd)
+ {
+ NvParameterized::setParamString(*ei, "Name", "defaultBasicIOS");
+ psd->IOS = traits->createNvParameterized(basicios::BasicIOSAssetParam::staticClassName());
+ }
+ }
+ // create the default SimpleParticleIOS
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(ParticleSimulationData::staticClassName());
+ d->ParticleSimulations.buf[1] = ei;
+ ParticleSimulationData* psd = static_cast< ParticleSimulationData*>(ei);
+ if (psd)
+ {
+ NvParameterized::setParamString(*ei, "Name", "defaultSimpleParticleIOS");
+ psd->IOS = traits->createNvParameterized(pxparticleios::ParticleIosAssetParam::staticClassName());
+ pxparticleios::ParticleIosAssetParam* pia = static_cast< pxparticleios::ParticleIosAssetParam*>(psd->IOS);
+ if (pia)
+ {
+ pia->particleType = traits->createNvParameterized(pxparticleios::SimpleParticleSystemParams::staticClassName());
+ }
+ }
+ }
+ // create the default FluidParticleIOS
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(ParticleSimulationData::staticClassName());
+ d->ParticleSimulations.buf[2] = ei;
+ ParticleSimulationData* psd = static_cast< ParticleSimulationData*>(ei);
+
+ if (psd)
+ {
+ NvParameterized::setParamString(*ei, "Name", "defaultFluidParticleIOS");
+ psd->IOS = traits->createNvParameterized(pxparticleios::ParticleIosAssetParam::staticClassName());
+ pxparticleios::ParticleIosAssetParam* pia = static_cast< pxparticleios::ParticleIosAssetParam*>(psd->IOS);
+
+ if (pia)
+ {
+ pia->particleType = traits->createNvParameterized(pxparticleios::FluidParticleSystemParams::staticClassName());
+ pxparticleios::FluidParticleSystemParams* fp = static_cast< pxparticleios::FluidParticleSystemParams*>(pia->particleType);
+ if (fp)
+ {
+ fp->restParticleDistance = 0.1f;
+ fp->stiffness = 8;
+ fp->viscosity = 5;
+ }
+ pia->maxParticleCount = 200000;
+ pia->particleRadius = 1;
+ pia->maxInjectedParticleCount = 0.1f;
+ pia->maxMotionDistance = 0.2;
+ pia->contactOffset = 0.008f;
+ pia->restOffset = 0.004f;
+ pia->gridSize = 1.5f;
+ pia->damping = 0;
+ pia->externalAcceleration = PxVec3(0, 0, 0);
+ pia->projectionPlaneNormal = PxVec3(0, 1, 0);
+ pia->projectionPlaneDistance = 0;
+ pia->particleMass = 0.1f;
+ pia->restitution = 0.15f;
+ pia->dynamicFriction = 0.008f;
+ pia->staticFriction = 0.1f;
+ pia->CollisionTwoway = false;
+ pia->CollisionWithDynamicActors = true;
+ pia->Enable = true;
+ pia->ProjectToPlane = false;
+ pia->PerParticleRestOffset = false;
+ pia->PerParticleCollisionCacheHint = false;
+ }
+ }
+ }
+ ret = true;
+ }
+ }
+
+ Array< const char* > nameList;
+ for (int32_t i = 0; i < d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ ParticleSimulationData* e = static_cast< ParticleSimulationData*>(d->ParticleSimulations.buf[i]);
+ if (e)
+ {
+ for (uint32_t j = 0; j < nameList.size(); j++)
+ {
+ if (nvidia::stricmp(nameList[j], e->Name) == 0)
+ {
+ NvParameterized::Handle handle(e);
+ NvParameterized::ErrorType err = handle.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ handle.setParamString(getUniqueName(nameList, e->Name));
+ ret = true;
+ break;
+ }
+ }
+ }
+ nameList.pushBack(e->Name);
+ }
+ }
+
+
+ for (uint32_t i = 0; i < (uint32_t)d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData* >(d->ParticleSimulations.buf[i]);
+ PX_ASSERT(ed);
+ if (ed && initParticleSimulationData(ed))
+ {
+ ret = true;
+ }
+ }
+ }
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT(); // not a valid NvParameterized interface
+ }
+ if (fixupNamedReferences())
+ {
+ ret = true;
+ }
+ }
+ return ret;
+}
+
+static void initColor(iofx::ColorVsLifeCompositeModifierParamsNS::colorLifeStruct_Type& c, float lifeRemaining, float red, float green, float blue, float alpha)
+{
+ c.lifeRemaining = lifeRemaining;
+ c.color.x = red;
+ c.color.y = green;
+ c.color.z = blue;
+ c.color.w = alpha;
+}
+
+static void initScale(iofx::ScaleVsLife2DModifierParamsNS::scaleLifeStruct_Type& s, float lifetime, float scalex, float scaley)
+{
+ s.lifeRemaining = lifetime;
+ s.scale.x = scalex;
+ s.scale.y = scaley;
+}
+
+
+bool ModuleParticlesImpl::setEffectPackageIOFXDatabase(const NvParameterized::Interface* dataBase)
+{
+ WRITE_ZONE();
+ bool ret = false;
+
+ if (dataBase)
+ {
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ const char* className = dataBase->className();
+ if (nvidia::strcmp(className, iofx::IofxAssetParameters::staticClassName()) == 0)
+ {
+ bool revised = false;
+ const char* itemName = dataBase->name();
+ EffectPackageIOFXDatabaseParams* d = static_cast< EffectPackageIOFXDatabaseParams*>(mEffectPackageIOFXDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsEffects.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->GraphicsEffects.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ GraphicsEffectData* ed = static_cast< GraphicsEffectData*>(ei);
+ if (nvidia::stricmp(ed->Name.buf, itemName) == 0)
+ {
+ ed->IOFX->copy(*dataBase);
+ revised = true;
+ ret = true;
+ break;
+ }
+ }
+ }
+ if (!revised && mEffectPackageIOFXDatabaseParams)
+ {
+ int32_t arraySize = d->GraphicsEffects.arraySizes[0];
+ NvParameterized::Handle handle(mEffectPackageIOFXDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("GraphicsEffects");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(arraySize + 1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(GraphicsEffectData::staticClassName());
+ if (ei)
+ {
+ GraphicsEffectData* ed = static_cast< GraphicsEffectData*>(ei);
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ d->GraphicsEffects.buf[arraySize] = ei;
+ ed->IOFX = NULL;
+ dataBase->clone(ed->IOFX);
+ if ( ed->IOFX == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ ret = true;
+ }
+ }
+ }
+ else if (nvidia::strcmp(dataBase->className(), EffectPackageIOFXDatabaseParams::staticClassName()) == 0)
+ {
+ if (mEffectPackageIOFXDatabaseParams && mEffectPackageIOFXDatabaseParams != dataBase)
+ {
+ mEffectPackageIOFXDatabaseParams->destroy();
+ mEffectPackageIOFXDatabaseParams = NULL;
+ }
+ if (mEffectPackageIOFXDatabaseParams == NULL)
+ {
+ dataBase->clone(mEffectPackageIOFXDatabaseParams);
+ if ( mEffectPackageIOFXDatabaseParams == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ mEffectPackageIOFXDatabaseParams = traits->createNvParameterized(EffectPackageIOFXDatabaseParams::staticClassName());
+ }
+ }
+ EffectPackageIOFXDatabaseParams* d = static_cast< EffectPackageIOFXDatabaseParams*>(mEffectPackageIOFXDatabaseParams);
+ if ( d )
+ {
+ if (d->GraphicsEffects.arraySizes[0] == 0)
+ {
+ NvParameterized::Handle handle(mEffectPackageIOFXDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("GraphicsEffects");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(GraphicsEffectData::staticClassName());
+ d->GraphicsEffects.buf[0] = ei;
+ if (ei)
+ {
+ GraphicsEffectData* ged = static_cast< GraphicsEffectData*>(ei);
+ if (ged)
+ {
+ NvParameterized::setParamString(*ei, "Name", "defaultSpriteIOFX");
+ ged->IOFX = traits->createNvParameterized(iofx::IofxAssetParameters::staticClassName());
+ iofx::IofxAssetParameters* iofx = static_cast< iofx::IofxAssetParameters*>(ged->IOFX);
+ if (iofx)
+ {
+ iofx->iofxType = traits->createNvParameterized(iofx::SpriteIofxParameters::staticClassName());
+ iofx->renderOutput.useFloat4Color = true;
+ }
+ }
+ }
+ }
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(GraphicsEffectData::staticClassName());
+ d->GraphicsEffects.buf[1] = ei;
+ if (ei)
+ {
+ GraphicsEffectData* ged = static_cast< GraphicsEffectData*>(ei);
+ if (ged)
+ {
+ NvParameterized::setParamString(*ei, "Name", "defaultMeshIOFX");
+ ged->IOFX = traits->createNvParameterized(iofx::IofxAssetParameters::staticClassName());
+ iofx::IofxAssetParameters* iofx = static_cast< iofx::IofxAssetParameters*>(ged->IOFX);
+ if (iofx)
+ {
+ iofx->iofxType = traits->createNvParameterized(iofx::MeshIofxParameters::staticClassName());
+ iofx->renderOutput.useFloat4Color = true;
+ }
+ }
+ }
+ }
+
+ ret = true;
+ }
+ }
+
+
+ Array< const char* > nameList;
+ for (int32_t i = 0; i < d->GraphicsEffects.arraySizes[0]; i++)
+ {
+ GraphicsEffectData* e = static_cast< GraphicsEffectData*>(d->GraphicsEffects.buf[i]);
+ if (e)
+ {
+ for (uint32_t j = 0; j < nameList.size(); j++)
+ {
+ if (nvidia::stricmp(nameList[j], e->Name) == 0)
+ {
+ NvParameterized::Handle handle(e);
+ NvParameterized::ErrorType err = handle.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ handle.setParamString(getUniqueName(nameList, e->Name));
+ ret = true;
+ break;
+ }
+ }
+ }
+ nameList.pushBack(e->Name);
+ }
+ }
+
+
+ for (uint32_t i = 0; i < (uint32_t)d->GraphicsEffects.arraySizes[0]; i++)
+ {
+ GraphicsEffectData* ed = static_cast< GraphicsEffectData*>(d->GraphicsEffects.buf[i]);
+ // first, see if it's assigned to a sprite IOFX without valid default values...
+ {
+ iofx::IofxAssetParameters* ae = static_cast< iofx::IofxAssetParameters*>(ed->IOFX);
+ if (ae)
+ {
+ if (nvidia::strcmp(ae->iofxType->className(), iofx::SpriteIofxParameters::staticClassName()) == 0)
+ {
+ iofx::SpriteIofxParameters* iofxP = static_cast< iofx::SpriteIofxParameters*>(ae->iofxType);
+ if (iofxP->spawnModifierList.arraySizes[0] == 0 && iofxP->continuousModifierList.arraySizes[0] == 0)
+ {
+ ed->IOFX->destroy();
+ ed->IOFX = NULL;
+ ret = true;
+ }
+ }
+ }
+ }
+
+ if (ed->IOFX == NULL)
+ {
+ ed->IOFX = traits->createNvParameterized(iofx::IofxAssetParameters::staticClassName());
+ iofx::IofxAssetParameters* ae = static_cast< iofx::IofxAssetParameters*>(ed->IOFX);
+ if (ae)
+ {
+ ae->renderOutput.useFloat4Color = true;
+ NvParameterized::Interface* iofx = traits->createNvParameterized(iofx::SpriteIofxParameters::staticClassName());
+ ae->iofxType = iofx;
+ iofx::SpriteIofxParameters* iofxP = static_cast< iofx::SpriteIofxParameters*>(iofx);
+ if (iofxP)
+ {
+ {
+ NvParameterized::Handle handle(iofx);
+ NvParameterized::ErrorType err = handle.getParameter("spriteMaterialName");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ err = handle.initParamRef(APEX_MATERIALS_NAME_SPACE, true);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ iofxP->spriteMaterialName->setName("defaultGraphicsMaterial");
+ }
+ }
+ }
+
+ {
+ NvParameterized::Handle handle(iofx);
+ NvParameterized::ErrorType err = handle.getParameter("spawnModifierList");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(4);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ iofxP->spawnModifierList.buf[0] = traits->createNvParameterized(iofx::InitialColorModifierParams::staticClassName());
+ iofxP->spawnModifierList.buf[1] = traits->createNvParameterized(iofx::RandomRotationModifierParams::staticClassName());
+ iofxP->spawnModifierList.buf[2] = traits->createNvParameterized(iofx::RandomSubtextureModifierParams::staticClassName());
+ iofxP->spawnModifierList.buf[3] = traits->createNvParameterized(iofx::RandomScaleModifierParams::staticClassName());
+ }
+ }
+
+ {
+ NvParameterized::Handle handle(iofx);
+ NvParameterized::ErrorType err = handle.getParameter("continuousModifierList");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ iofxP->continuousModifierList.buf[0] = traits->createNvParameterized(iofx::ViewDirectionSortingModifierParams::staticClassName());
+ }
+ }
+ }
+ }
+ ret = true;
+ }
+ if (ed->IOFX)
+ {
+ iofx::IofxAssetParameters* ae = static_cast< iofx::IofxAssetParameters*>(ed->IOFX);
+ if (ae->iofxType)
+ {
+ ae->renderOutput.useFloat4Color = true;
+ const char* c = ae->iofxType->className();
+ if (c && nvidia::strcmp(c, "MeshIofxParameters") == 0)
+ {
+ iofx::MeshIofxParameters* m = static_cast< iofx::MeshIofxParameters*>(ae->iofxType);
+ if (m->renderMeshList.arraySizes[0] == 0)
+ {
+ ret = true;
+ NvParameterized::Handle handle(m);
+ NvParameterized::ErrorType err = handle.getParameter("renderMeshList");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ iofx::MeshIofxParametersNS::meshProperties_Type& t = m->renderMeshList.buf[0];
+ t.weight = 1;
+ NvParameterized::Handle elementHandle(m);
+ err = handle.getChildHandle(0, elementHandle);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ NvParameterized::Handle item(*elementHandle.getInterface());
+ NvParameterized::ErrorType err = elementHandle.getChildHandle(elementHandle.getInterface(), "meshAssetName", item);
+ PX_ASSERT(err == NvParameterized:: ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ err = item.initParamRef(APEX_OPAQUE_MESH_NAME_SPACE,true);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ t.meshAssetName->setName("SampleMesh.apx");
+ }
+ }
+ }
+ // initialize the spawn modifier list
+ {
+ NvParameterized::Handle handle(m);
+ NvParameterized::ErrorType err = handle.getParameter("spawnModifierList");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ m->spawnModifierList.buf[0] = traits->createNvParameterized(iofx::SimpleScaleModifierParams::staticClassName());
+ iofx::SimpleScaleModifierParams* ss = static_cast< iofx::SimpleScaleModifierParams*>(m->spawnModifierList.buf[0]);
+ if (ss)
+ {
+ ss->scaleFactor = PxVec3(1, 1, 1);
+ m->spawnModifierList.buf[1] = traits->createNvParameterized(iofx::RotationModifierParams::staticClassName());
+ NvParameterized::setParamEnum(*m->spawnModifierList.buf[1], "rollType", "SPHERICAL");
+ }
+ }
+ }
+ // initialize the continuous modifier list
+ {
+ NvParameterized::Handle handle(m);
+ NvParameterized::ErrorType err = handle.getParameter("continuousModifierList");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ // init RotationModifierParams
+ {
+ m->continuousModifierList.buf[0] = traits->createNvParameterized(iofx::RotationModifierParams::staticClassName());
+ if (m->continuousModifierList.buf[0])
+ {
+ NvParameterized::setParamEnum(*m->continuousModifierList.buf[0], "rollType", "SPHERICAL");
+ iofx::RotationModifierParams* rmp = static_cast< iofx::RotationModifierParams*>(m->continuousModifierList.buf[0]);
+ rmp->maxRotationRatePerSec = 0;
+ rmp->maxSettleRatePerSec = 1;
+ rmp->collisionRotationMultiplier = 1;
+ rmp->inAirRotationMultiplier = 1;
+ }
+ }
+ {
+ m->continuousModifierList.buf[1] = traits->createNvParameterized(iofx::ScaleVsLife3DModifierParams::staticClassName());
+ if (m->continuousModifierList.buf[1])
+ {
+ NvParameterized::Handle h(m->continuousModifierList.buf[1]);
+ err = h.getParameter("controlPoints");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = h.resizeArray(3);
+ iofx::ScaleVsLife3DModifierParams& svl = *(static_cast< iofx::ScaleVsLife3DModifierParams*>(m->continuousModifierList.buf[1]));
+ svl.controlPoints.buf[0].lifeRemaining = 0;
+ svl.controlPoints.buf[0].scale = PxVec3(0, 0, 0);
+
+ svl.controlPoints.buf[1].lifeRemaining = 0.5f;
+ svl.controlPoints.buf[1].scale = PxVec3(1, 1, 1);
+
+ svl.controlPoints.buf[2].lifeRemaining = 1;
+ svl.controlPoints.buf[2].scale = PxVec3(0, 0, 0);
+
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT();
+ }
+ }
+
+
+ return ret;
+
+}
+
+bool ModuleParticlesImpl::setEffectPackageEmitterDatabase(const NvParameterized::Interface* dataBase)
+{
+ WRITE_ZONE();
+ bool ret = false;
+
+ if (dataBase)
+ {
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ const char* className = dataBase->className();
+ if (nvidia::strcmp(className, emitter::ApexEmitterAssetParameters::staticClassName()) == 0)
+ {
+ bool revised = false;
+ const char* itemName = dataBase->name();
+ EffectPackageEmitterDatabaseParams* d = static_cast< EffectPackageEmitterDatabaseParams*>(mEffectPackageEmitterDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->Emitters.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->Emitters.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ EmitterData* ed = static_cast< EmitterData*>(ei);
+ if (nvidia::stricmp(ed->Name.buf, itemName) == 0)
+ {
+ ed->Emitter->copy(*dataBase);
+ revised = true;
+ ret = true;
+ break;
+ }
+ }
+ }
+ if (!revised && mEffectPackageEmitterDatabaseParams)
+ {
+ int32_t arraySize = d->Emitters.arraySizes[0];
+ NvParameterized::Handle handle(mEffectPackageEmitterDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("Emitters");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(arraySize + 1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(EmitterData::staticClassName());
+ if (ei)
+ {
+ EmitterData* ed = static_cast< EmitterData*>(ei);
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ d->Emitters.buf[arraySize] = ei;
+ ed->Emitter = NULL;
+ dataBase->clone(ed->Emitter);
+ if ( ed->Emitter == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ ret = true;
+ }
+ }
+ }
+ else if (nvidia::strcmp(dataBase->className(), EffectPackageEmitterDatabaseParams::staticClassName()) == 0)
+ {
+ if (mEffectPackageEmitterDatabaseParams && mEffectPackageEmitterDatabaseParams != dataBase)
+ {
+ mEffectPackageEmitterDatabaseParams->destroy();
+ mEffectPackageEmitterDatabaseParams = NULL;
+ }
+ if (mEffectPackageEmitterDatabaseParams == NULL)
+ {
+ dataBase->clone(mEffectPackageEmitterDatabaseParams);
+ if ( mEffectPackageEmitterDatabaseParams == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ mEffectPackageEmitterDatabaseParams = traits->createNvParameterized(EffectPackageEmitterDatabaseParams::staticClassName());
+ }
+ }
+
+ EffectPackageEmitterDatabaseParams* d = static_cast< EffectPackageEmitterDatabaseParams*>(mEffectPackageEmitterDatabaseParams);
+ if ( d )
+ {
+ if (d->Emitters.arraySizes[0] == 0)
+ {
+ NvParameterized::Handle handle(mEffectPackageEmitterDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("Emitters");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(EmitterData::staticClassName());
+ d->Emitters.buf[0] = ei;
+ ret = true;
+ }
+ }
+
+
+ Array< const char* > nameList;
+ for (int32_t i = 0; i < d->Emitters.arraySizes[0]; i++)
+ {
+ EmitterData* e = static_cast< EmitterData*>(d->Emitters.buf[i]);
+ if (e)
+ {
+ for (uint32_t j = 0; j < nameList.size(); j++)
+ {
+ if (nvidia::stricmp(nameList[j], e->Name) == 0)
+ {
+ NvParameterized::Handle handle(e);
+ NvParameterized::ErrorType err = handle.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ handle.setParamString(getUniqueName(nameList, e->Name));
+ ret = true;
+ break;
+ }
+ }
+ }
+ nameList.pushBack(e->Name);
+ }
+ }
+
+ for (uint32_t i = 0; i < (uint32_t)d->Emitters.arraySizes[0]; i++)
+ {
+ EmitterData* ed = static_cast< EmitterData*>(d->Emitters.buf[i]);
+ if (ed->Emitter == NULL)
+ {
+ ed->Emitter = traits->createNvParameterized(emitter::ApexEmitterAssetParameters::staticClassName());
+ // Modify "static_cast<emitter::ApexEmitterAssetParameters*>(ed->Emitter)" if default ApexEmitterAssetParameters initialisation is insufficiently
+ ret = true;
+ }
+ if (ed->Emitter)
+ {
+ emitter::ApexEmitterAssetParameters* ae = static_cast< emitter::ApexEmitterAssetParameters*>(ed->Emitter);
+ NvParameterized::Handle handle(ed->Emitter);
+ NvParameterized::ErrorType err = ed->Emitter->getParameterHandle("iofxAssetName", handle);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* val = NULL;
+ err = handle.getParamRef(val);
+ if (val == NULL)
+ {
+ err = handle.initParamRef(IOFX_AUTHORING_TYPE_NAME,true);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ char scratch[512];
+ sprintf_s(scratch, 512, "defaultSpriteIOFX");
+ ae->iofxAssetName->setName(scratch);
+ }
+ }
+ }
+ }
+ if (ed->Emitter)
+ {
+ emitter::ApexEmitterAssetParameters* ae = static_cast< emitter::ApexEmitterAssetParameters*>(ed->Emitter);
+ NvParameterized::Handle handle(ed->Emitter);
+ NvParameterized::ErrorType err = ed->Emitter->getParameterHandle("iosAssetName", handle);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* val = NULL;
+ err = handle.getParamRef(val);
+ if (val == NULL)
+ {
+ err = handle.initParamRef(BASIC_IOS_AUTHORING_TYPE_NAME,true);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ char scratch[512];
+ sprintf_s(scratch, 512, "defaultBasicIOS");
+ ae->iosAssetName->setName(scratch);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT(); // invalid NvParameterized::Interface passed in
+ }
+ }
+
+
+ return ret;
+}
+
+enum FieldSamplerType
+{
+ FST_NONE,
+ FST_FORCE_FIELD,
+ FST_HEAT_SOURCE,
+ FST_SUBSTANCE_SOURCE,
+ FST_JET,
+ FST_ATTRACTOR,
+ FST_TURBULENCE,
+ FST_NOISE,
+ FST_VORTEX,
+ FST_WIND,
+ FST_VELOCITY_SOURCE,
+ FST_FLAME_EMITTER,
+ FST_LAST
+};
+
+static FieldSamplerType getFieldSamplerType(const NvParameterized::Interface* iface)
+{
+ FieldSamplerType ret = FST_NONE;
+
+ if (iface)
+ {
+ const char* className = iface->className();
+ if (nvidia::strcmp(className, forcefield::ForceFieldAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_FORCE_FIELD;
+ }
+ else if (nvidia::strcmp(className, turbulencefs::HeatSourceAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_HEAT_SOURCE;
+ }
+ else if (nvidia::strcmp(className, turbulencefs::SubstanceSourceAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_SUBSTANCE_SOURCE;
+ }
+ else if (nvidia::strcmp(className, turbulencefs::VelocitySourceAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_VELOCITY_SOURCE;
+ }
+ else if (nvidia::strcmp(className, basicfs::JetFSAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_JET;
+ }
+ else if (nvidia::strcmp(className, basicfs::WindFSAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_WIND;
+ }
+ else if (nvidia::strcmp(className, basicfs::NoiseFSAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_NOISE;
+ }
+ else if (nvidia::strcmp(className, basicfs::VortexFSAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_VORTEX;
+ }
+ else if (nvidia::strcmp(className, basicfs::AttractorFSAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_ATTRACTOR;
+ }
+ else if (nvidia::strcmp(className, turbulencefs::TurbulenceFSAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_TURBULENCE;
+ }
+ else if (nvidia::strcmp(className, turbulencefs::FlameEmitterAssetParams::staticClassName()) == 0)
+ {
+ ret = FST_FLAME_EMITTER;
+ }
+ else if (nvidia::strcmp(className, particles::ForceFieldData::staticClassName()) == 0)
+ {
+ ret = FST_FORCE_FIELD;
+ }
+ else if (nvidia::strcmp(className, particles::HeatSourceData::staticClassName()) == 0)
+ {
+ ret = FST_HEAT_SOURCE;
+ }
+ else if (nvidia::strcmp(className, particles::SubstanceSourceData::staticClassName()) == 0)
+ {
+ ret = FST_SUBSTANCE_SOURCE;
+ }
+ else if (nvidia::strcmp(className, particles::VelocitySourceData::staticClassName()) == 0)
+ {
+ ret = FST_VELOCITY_SOURCE;
+ }
+ else if (nvidia::strcmp(className, particles::AttractorFieldSamplerData::staticClassName()) == 0)
+ {
+ ret = FST_ATTRACTOR;
+ }
+ else if (nvidia::strcmp(className, particles::JetFieldSamplerData::staticClassName()) == 0)
+ {
+ ret = FST_JET;
+ }
+ else if (nvidia::strcmp(className, particles::WindFieldSamplerData::staticClassName()) == 0)
+ {
+ ret = FST_WIND;
+ }
+ else if (nvidia::strcmp(className, particles::NoiseFieldSamplerData::staticClassName()) == 0)
+ {
+ ret = FST_NOISE;
+ }
+ else if (nvidia::strcmp(className, particles::TurbulenceFieldSamplerData::staticClassName()) == 0)
+ {
+ ret = FST_TURBULENCE;
+ }
+ else if (nvidia::strcmp(className, particles::VortexFieldSamplerData::staticClassName()) == 0)
+ {
+ ret = FST_VORTEX;
+ }
+ else if (nvidia::strcmp(className, particles::FlameEmitterData::staticClassName()) == 0)
+ {
+ ret = FST_FLAME_EMITTER;
+ }
+ }
+
+ return ret;
+}
+
+static NvParameterized::Interface* getFieldSamplerData(FieldSamplerType fst, NvParameterized::Traits* traits, const NvParameterized::Interface* dataBase)
+{
+ NvParameterized::Interface* ret = NULL;
+
+ const char* itemName = dataBase->name();
+ NvParameterized::ErrorType err;
+
+ switch (fst)
+ {
+ case FST_FORCE_FIELD:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(ForceFieldData::staticClassName());
+ ForceFieldData* ed = static_cast< ForceFieldData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->ForceField = NULL;
+ dataBase->clone(ed->ForceField);
+ if ( ed->ForceField == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_HEAT_SOURCE:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(HeatSourceData::staticClassName());
+ HeatSourceData* ed = static_cast< HeatSourceData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->HeatSource = NULL;
+ dataBase->clone(ed->HeatSource);
+ if ( ed->HeatSource == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_SUBSTANCE_SOURCE:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(SubstanceSourceData::staticClassName());
+ SubstanceSourceData* ed = static_cast< SubstanceSourceData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->SubstanceSource = NULL;
+ dataBase->clone(ed->SubstanceSource);
+ if ( ed->SubstanceSource == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_VELOCITY_SOURCE:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(VelocitySourceData::staticClassName());
+ VelocitySourceData* ed = static_cast< VelocitySourceData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->VelocitySource = NULL;
+ dataBase->clone(ed->VelocitySource);
+ if ( ed->VelocitySource == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_ATTRACTOR:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(AttractorFieldSamplerData::staticClassName());
+ AttractorFieldSamplerData* ed = static_cast< AttractorFieldSamplerData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->AttractorFieldSampler = NULL;
+ dataBase->clone(ed->AttractorFieldSampler);
+ if ( ed->AttractorFieldSampler == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_VORTEX:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(VortexFieldSamplerData::staticClassName());
+ VortexFieldSamplerData* ed = static_cast< VortexFieldSamplerData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->VortexFieldSampler = NULL;
+ dataBase->clone(ed->VortexFieldSampler);
+ if ( ed->VortexFieldSampler == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_NOISE:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(NoiseFieldSamplerData::staticClassName());
+ NoiseFieldSamplerData* ed = static_cast< NoiseFieldSamplerData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->NoiseFieldSampler = NULL;
+ dataBase->clone(ed->NoiseFieldSampler);
+ if ( ed->NoiseFieldSampler == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_JET:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(JetFieldSamplerData::staticClassName());
+ JetFieldSamplerData* ed = static_cast< JetFieldSamplerData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->JetFieldSampler = NULL;
+ dataBase->clone(ed->JetFieldSampler);
+ if ( ed->JetFieldSampler == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_WIND:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(WindFieldSamplerData::staticClassName());
+ WindFieldSamplerData* ed = static_cast< WindFieldSamplerData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->WindFieldSampler = NULL;
+ dataBase->clone(ed->WindFieldSampler);
+ if ( ed->WindFieldSampler == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_TURBULENCE:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(TurbulenceFieldSamplerData::staticClassName());
+ TurbulenceFieldSamplerData* ed = static_cast< TurbulenceFieldSamplerData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->TurbulenceFieldSampler = NULL;
+ dataBase->clone(ed->TurbulenceFieldSampler);
+ if ( ed->TurbulenceFieldSampler == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+ case FST_FLAME_EMITTER:
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(FlameEmitterData::staticClassName());
+ FlameEmitterData* ed = static_cast< FlameEmitterData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ ret = ei;
+ ed->FlameEmitter = NULL;
+ dataBase->clone(ed->FlameEmitter);
+ if ( ed->FlameEmitter == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ }
+ break;
+
+ default:
+ PX_ALWAYS_ASSERT(); // not yet implemented!
+ break;
+ }
+
+ return ret;
+}
+
+bool ModuleParticlesImpl::fixFieldSamplerCollisionFilterNames(NvParameterized::Interface *iface)
+{
+ bool ret = false;
+
+ FieldSamplerType fst = getFieldSamplerType(iface);
+ NvParameterized::Interface *asset = NULL;
+
+ const char *filterName=NULL;
+
+ switch (fst)
+ {
+ case FST_FORCE_FIELD:
+ {
+ ForceFieldData* ed = static_cast< ForceFieldData*>(iface);
+ asset = ed->ForceField;
+ filterName = "ForceFieldFS=all";
+ }
+ break;
+ case FST_HEAT_SOURCE:
+ {
+ HeatSourceData *ed = static_cast< HeatSourceData *>(iface);
+ asset = ed->HeatSource;
+ filterName = "HeatSource=all";
+ }
+ break;
+ case FST_SUBSTANCE_SOURCE:
+ {
+ SubstanceSourceData *ed = static_cast< SubstanceSourceData *>(iface);
+ asset = ed->SubstanceSource;
+ filterName = "SubstanceSource=all";
+ }
+ break;
+ case FST_VELOCITY_SOURCE:
+ {
+ VelocitySourceData *ed = static_cast< VelocitySourceData *>(iface);
+ asset = ed->VelocitySource;
+ filterName = "VelocitySource=all";
+ }
+ break;
+ case FST_ATTRACTOR:
+ {
+ AttractorFieldSamplerData* ed = static_cast< AttractorFieldSamplerData*>(iface);
+ asset = ed->AttractorFieldSampler;
+ filterName = "AttractorFS=all";
+ }
+ break;
+ case FST_VORTEX:
+ {
+ VortexFieldSamplerData* ed = static_cast< VortexFieldSamplerData*>(iface);
+ asset = ed->VortexFieldSampler;
+ filterName = "VortexFS=all";
+ }
+ break;
+ case FST_NOISE:
+ {
+ NoiseFieldSamplerData* ed = static_cast< NoiseFieldSamplerData*>(iface);
+ asset = ed->NoiseFieldSampler;
+ filterName = "NoiseFS=all";
+ }
+ break;
+ case FST_JET:
+ {
+ JetFieldSamplerData* ed = static_cast< JetFieldSamplerData*>(iface);
+ asset = ed->JetFieldSampler;
+ filterName = "JetFS=all";
+ }
+ break;
+ case FST_WIND:
+ {
+ WindFieldSamplerData* ed = static_cast< WindFieldSamplerData*>(iface);
+ asset = ed->WindFieldSampler;
+ filterName = "WindFS=all";
+ }
+ break;
+ case FST_TURBULENCE:
+ {
+ TurbulenceFieldSamplerData* ed = static_cast< TurbulenceFieldSamplerData*>(iface);
+ asset = ed->TurbulenceFieldSampler;
+ filterName = "TurbulenceFS=all";
+ }
+ break;
+ case FST_FLAME_EMITTER:
+ {
+ FlameEmitterData *ed = static_cast< FlameEmitterData *>(iface);
+ asset = ed->FlameEmitter;
+ filterName = "FlameEmitter=all";
+ }
+ break;
+ default:
+ //PX_ASSERT(0);
+ break;
+ }
+ if ( asset && filterName )
+ {
+ const char *fieldBoundaryFilterDataName=NULL;
+ const char *fieldSamplerFilterDataName=NULL;
+ bool ok = NvParameterized::getParamString(*asset,"fieldSamplerFilterDataName",fieldSamplerFilterDataName);
+ PX_ASSERT( ok );
+ ok = NvParameterized::getParamString(*asset,"fieldBoundaryFilterDataName",fieldBoundaryFilterDataName);
+ if ( ok )
+ {
+ if ( fieldBoundaryFilterDataName == NULL || fieldBoundaryFilterDataName[0] == 0 || nvidia::strcmp(fieldBoundaryFilterDataName,"defaultFieldBoundaryFilterDataName") == 0 )
+ {
+ NvParameterized::setParamString(*asset,"fieldBoundaryFilterDataName",filterName);
+ ret = true;
+ }
+ }
+ if ( fieldSamplerFilterDataName == NULL || fieldSamplerFilterDataName[0] == 0 || nvidia::strcmp(fieldSamplerFilterDataName,"defaultFieldSamplerFilterDataName") == 0 )
+ {
+ NvParameterized::setParamString(*asset,"fieldSamplerFilterDataName",filterName);
+ ret = true;
+ }
+ if ( fst == FST_TURBULENCE )
+ {
+ const char *collisionFilterDataName=NULL;
+ bool ok = NvParameterized::getParamString(*asset,"collisionFilterDataName",collisionFilterDataName);
+ PX_UNUSED( ok );
+ PX_ASSERT( ok );
+ if ( collisionFilterDataName == NULL || collisionFilterDataName[0] == 0 || nvidia::strcmp(collisionFilterDataName,"defaultTurbulenceCollisionFilterDataName") == 0 )
+ {
+ NvParameterized::setParamString(*asset,"collisionFilterDataName",filterName);
+ ret = true;
+ }
+ }
+ }
+ return ret;
+}
+
+static void setNamedReference(NvParameterized::Interface* parentInterface, const char* parentName, const char* authoringTypeName)
+{
+ NvParameterized::Handle handle(parentInterface);
+ NvParameterized::ErrorType err = parentInterface->getParameterHandle(parentName, handle);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ err = handle.initParamRef(authoringTypeName,true);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ }
+}
+
+
+
+bool ModuleParticlesImpl::setEffectPackageFieldSamplerDatabase(const NvParameterized::Interface* dataBase)
+{
+ WRITE_ZONE();
+ bool ret = false;
+
+ if (dataBase)
+ {
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ FieldSamplerType fst = getFieldSamplerType(dataBase);
+ if (fst != FST_NONE)
+ {
+ bool revised = false;
+ const char* itemName = dataBase->name();
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->FieldSamplers.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ const char* dataName;
+ NvParameterized::getParamString(*ei, "Name", dataName);
+ if (nvidia::stricmp(dataName, itemName) == 0)
+ {
+ ei->destroy();
+ d->FieldSamplers.buf[i] = getFieldSamplerData(fst, traits, dataBase);
+ fixFieldSamplerCollisionFilterNames( d->FieldSamplers.buf[i] );
+ revised = true;
+ ret = true;
+ break;
+ }
+ }
+ }
+ if (!revised && mEffectPackageFieldSamplerDatabaseParams)
+ {
+ int32_t arraySize = d->FieldSamplers.arraySizes[0];
+ NvParameterized::Handle handle(mEffectPackageFieldSamplerDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("FieldSamplers");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(arraySize + 1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ d->FieldSamplers.buf[arraySize] = getFieldSamplerData(fst, traits, dataBase);
+ fixFieldSamplerCollisionFilterNames( d->FieldSamplers.buf[arraySize] );
+ }
+ }
+ }
+ else if (nvidia::strcmp(dataBase->className(), EffectPackageFieldSamplerDatabaseParams::staticClassName()) == 0)
+ {
+ if (mEffectPackageFieldSamplerDatabaseParams && mEffectPackageFieldSamplerDatabaseParams != dataBase)
+ {
+ mEffectPackageFieldSamplerDatabaseParams->destroy();
+ mEffectPackageFieldSamplerDatabaseParams = NULL;
+ }
+
+ if (mEffectPackageFieldSamplerDatabaseParams == NULL)
+ {
+ dataBase->clone(mEffectPackageFieldSamplerDatabaseParams);
+ if ( mEffectPackageFieldSamplerDatabaseParams == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ mEffectPackageFieldSamplerDatabaseParams = traits->createNvParameterized(EffectPackageFieldSamplerDatabaseParams::staticClassName());
+ }
+ }
+
+ EffectPackageFieldSamplerDatabaseParams* d = static_cast< EffectPackageFieldSamplerDatabaseParams*>(mEffectPackageFieldSamplerDatabaseParams);
+ if ( d )
+ {
+ if (d->FieldSamplers.arraySizes[0] == 0)
+ {
+ NvParameterized::Handle handle(mEffectPackageFieldSamplerDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("FieldSamplers");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(11);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ NvParameterized::Interface* ei;
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ ei = traits->createNvParameterized(AttractorFieldSamplerData::staticClassName());
+ d->FieldSamplers.buf[0] = ei;
+
+ ei = traits->createNvParameterized(ForceFieldData::staticClassName());
+ d->FieldSamplers.buf[1] = ei;
+
+ ei = traits->createNvParameterized(HeatSourceData::staticClassName());
+ d->FieldSamplers.buf[2] = ei;
+
+ ei = traits->createNvParameterized(JetFieldSamplerData::staticClassName());
+ d->FieldSamplers.buf[3] = ei;
+
+ ei = traits->createNvParameterized(TurbulenceFieldSamplerData::staticClassName());
+ d->FieldSamplers.buf[4] = ei;
+
+ ei = traits->createNvParameterized(VortexFieldSamplerData::staticClassName());
+ d->FieldSamplers.buf[5] = ei;
+
+ ei = traits->createNvParameterized(NoiseFieldSamplerData::staticClassName());
+ d->FieldSamplers.buf[6] = ei;
+
+ ei = traits->createNvParameterized(SubstanceSourceData::staticClassName());
+ d->FieldSamplers.buf[7] = ei;
+
+ ei = traits->createNvParameterized(WindFieldSamplerData::staticClassName());
+ d->FieldSamplers.buf[8] = ei;
+
+ ei = traits->createNvParameterized(VelocitySourceData::staticClassName());
+ d->FieldSamplers.buf[9] = ei;
+
+ ei = traits->createNvParameterized(FlameEmitterData::staticClassName());
+ d->FieldSamplers.buf[10] = ei;
+
+ ret = true;
+ }
+ }
+
+
+ Array< const char* > nameList;
+ for (int32_t i = 0; i < d->FieldSamplers.arraySizes[0]; i++)
+ {
+ ForceFieldData* e = static_cast< ForceFieldData*>(d->FieldSamplers.buf[i]);
+ if (e)
+ {
+ for (uint32_t j = 0; j < nameList.size(); j++)
+ {
+ if (nvidia::stricmp(nameList[j], e->Name) == 0)
+ {
+ NvParameterized::Handle handle(e);
+ NvParameterized::ErrorType err = handle.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ handle.setParamString(getUniqueName(nameList, e->Name));
+ ret = true;
+ break;
+ }
+ }
+ }
+ nameList.pushBack(e->Name);
+ }
+ }
+
+
+ for (uint32_t i = 0; i < (uint32_t)d->FieldSamplers.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* iface = d->FieldSamplers.buf[i];
+ FieldSamplerType fst = getFieldSamplerType(iface);
+ switch (fst)
+ {
+ case FST_FORCE_FIELD:
+ {
+ ForceFieldData* ed = static_cast< ForceFieldData*>(d->FieldSamplers.buf[i]);
+ if (ed->ForceField == NULL)
+ {
+ ed->ForceField = traits->createNvParameterized(forcefield::ForceFieldAssetParams::staticClassName());
+ ret = true;
+ }
+ forcefield::ForceFieldAssetParams* fap = static_cast< forcefield::ForceFieldAssetParams*>(ed->ForceField);
+ if (fap && fap->strength == 0 && fap->lifetime == 0) // initialize the forcefield to reasonable values; if lifetime is zero, then the force field is not considered initalized.
+ {
+ ret = true;
+ fap->defScale = 1;
+ fap->strength = 20.0f;
+ fap->lifetime = 1000;
+
+ fap->includeShapeParameters.dimensions = PxVec3(5, 5, 5);
+
+ //TODO: Verify correctness of changes, add case for GenericForceFieldKernelType
+ if (fap->forceFieldKernelType == NULL)
+ {
+ fap->forceFieldKernelType = traits->createNvParameterized(forcefield::RadialForceFieldKernelParams::staticClassName());
+ forcefield::RadialForceFieldKernelParams* rfap = static_cast< forcefield::RadialForceFieldKernelParams*>(fap->forceFieldKernelType);
+ if (rfap)
+ {
+ rfap->falloffParameters = traits->createNvParameterized(forcefield::ForceFieldFalloffParams::staticClassName());
+ forcefield::ForceFieldFalloffParams* ffp = static_cast< forcefield::ForceFieldFalloffParams*>(rfap->falloffParameters);
+ rfap->noiseParameters = traits->createNvParameterized(forcefield::ForceFieldNoiseParams::staticClassName());
+ forcefield::ForceFieldNoiseParams* fnp = static_cast< forcefield::ForceFieldNoiseParams*>(rfap->noiseParameters);
+
+ ffp->multiplier = 0.5f;
+ ffp->start = 100;
+ ffp->end = 0;
+
+ fnp->strength = 0.01f;
+ fnp->spaceScale = 8;
+ fnp->timeScale = 1;
+ fnp->octaves = 3;
+ }
+ }
+ }
+ }
+ break;
+ case FST_HEAT_SOURCE:
+ {
+ HeatSourceData* ed = static_cast< HeatSourceData*>(d->FieldSamplers.buf[i]);
+ if (ed->HeatSource == NULL)
+ {
+ ed->HeatSource = traits->createNvParameterized(turbulencefs::HeatSourceAssetParams::staticClassName());
+ ret = true;
+ }
+ turbulencefs::HeatSourceAssetParams* ap = static_cast< turbulencefs::HeatSourceAssetParams*>(ed->HeatSource);
+ if (ap && ap->geometryType == NULL)
+ {
+ ap->averageTemperature = 4;
+ ap->stdTemperature = 2;
+ ap->geometryType = traits->createNvParameterized(turbulencefs::HeatSourceGeomSphereParams::staticClassName());
+ ret = true;
+ }
+ }
+ break;
+ case FST_SUBSTANCE_SOURCE:
+ {
+ SubstanceSourceData* ed = static_cast< SubstanceSourceData*>(d->FieldSamplers.buf[i]);
+ if (ed->SubstanceSource == NULL)
+ {
+ ed->SubstanceSource = traits->createNvParameterized(turbulencefs::SubstanceSourceAssetParams::staticClassName());
+ ret = true;
+ }
+ turbulencefs::SubstanceSourceAssetParams* ap = static_cast< turbulencefs::SubstanceSourceAssetParams*>(ed->SubstanceSource);
+ if (ap && ap->geometryType == NULL)
+ {
+ ap->averageDensity = 32;
+ ap->stdDensity = 16;
+ ap->geometryType = traits->createNvParameterized(turbulencefs::HeatSourceGeomSphereParams::staticClassName());
+ ret = true;
+ }
+ }
+ break;
+ case FST_VELOCITY_SOURCE:
+ {
+ VelocitySourceData* ed = static_cast< VelocitySourceData*>(d->FieldSamplers.buf[i]);
+ if (ed->VelocitySource == NULL)
+ {
+ ed->VelocitySource = traits->createNvParameterized(turbulencefs::VelocitySourceAssetParams::staticClassName());
+ ret = true;
+ }
+ turbulencefs::VelocitySourceAssetParams* ap = static_cast< turbulencefs::VelocitySourceAssetParams*>(ed->VelocitySource);
+ if (ap && ap->geometryType == NULL)
+ {
+ ap->geometryType = traits->createNvParameterized(turbulencefs::HeatSourceGeomSphereParams::staticClassName());
+ ret = true;
+ }
+ }
+ break;
+ case FST_ATTRACTOR:
+ {
+ AttractorFieldSamplerData* ed = static_cast< AttractorFieldSamplerData*>(d->FieldSamplers.buf[i]);
+ if (ed->AttractorFieldSampler == NULL)
+ {
+ ed->AttractorFieldSampler = traits->createNvParameterized(basicfs::AttractorFSAssetParams::staticClassName());
+ basicfs::AttractorFSAssetParams* a = static_cast< basicfs::AttractorFSAssetParams*>(ed->AttractorFieldSampler);
+ if (a)
+ {
+ a->boundaryFadePercentage = 0.3f;
+ a->radius = 2;
+ a->constFieldStrength = 20;
+ a->variableFieldStrength = 1;
+ }
+ ret = true;
+ }
+ }
+ break;
+ case FST_VORTEX:
+ {
+ VortexFieldSamplerData* ed = static_cast< VortexFieldSamplerData*>(d->FieldSamplers.buf[i]);
+ if (ed->VortexFieldSampler == NULL)
+ {
+ ed->VortexFieldSampler = traits->createNvParameterized(basicfs::VortexFSAssetParams::staticClassName());
+ basicfs::VortexFSAssetParams* j = static_cast< basicfs::VortexFSAssetParams*>(ed->VortexFieldSampler);
+ if (j)
+ {
+ j->boundaryFadePercentage = 0.1f;
+ j->height = 1;
+ j->bottomRadius = 1;
+ j->topRadius = 1;
+ j->rotationalStrength = 4;
+ j->radialStrength = 4;
+ j->liftStrength = 1;
+ }
+ ret = true;
+ }
+ }
+ break;
+ case FST_NOISE:
+ {
+ NoiseFieldSamplerData* ed = static_cast< NoiseFieldSamplerData*>(d->FieldSamplers.buf[i]);
+ if (ed->NoiseFieldSampler == NULL)
+ {
+ ed->NoiseFieldSampler = traits->createNvParameterized(basicfs::NoiseFSAssetParams::staticClassName());
+ ret = true;
+ }
+ }
+ break;
+ case FST_JET:
+ {
+ JetFieldSamplerData* ed = static_cast< JetFieldSamplerData*>(d->FieldSamplers.buf[i]);
+ if (ed->JetFieldSampler == NULL)
+ {
+ ed->JetFieldSampler = traits->createNvParameterized(basicfs::JetFSAssetParams::staticClassName());
+ basicfs::JetFSAssetParams* j = static_cast< basicfs::JetFSAssetParams*>(ed->JetFieldSampler);
+ if (j)
+ {
+ j->defaultScale = 1;
+ j->boundaryFadePercentage = 0.3f;
+ j->fieldDirection = PxVec3(1, 0, 0);
+ j->fieldDirectionDeviationAngle = 0;
+ j->fieldDirectionOscillationPeriod = 0;
+ j->fieldStrength = 10;
+ j->fieldStrengthDeviationPercentage = 0;
+ j->fieldStrengthOscillationPeriod = 0;
+ j->gridShapeRadius = 2;
+ j->gridShapeHeight = 2;
+ j->gridBoundaryFadePercentage = 0.01f;
+ j->nearRadius = 0.1f;
+ j->pivotRadius = 0.2f;
+ j->farRadius = 4;
+ j->directionalStretch = 1;
+ j->averageStartDistance = 1;
+ j->averageEndDistance = 5;
+ j->noisePercentage = 0.1f;
+ j->noiseTimeScale = 1;
+ j->noiseOctaves = 1;
+ }
+ ret = true;
+ }
+ }
+ break;
+ case FST_WIND:
+ {
+ WindFieldSamplerData* ed = static_cast< WindFieldSamplerData*>(d->FieldSamplers.buf[i]);
+ if (ed->WindFieldSampler == NULL)
+ {
+ ed->WindFieldSampler = traits->createNvParameterized(basicfs::WindFSAssetParams::staticClassName());
+ basicfs::WindFSAssetParams* j = static_cast< basicfs::WindFSAssetParams*>(ed->WindFieldSampler);
+ if (j)
+ {
+ // TODO initialize to reasonable default values
+ }
+ ret = true;
+ }
+ }
+ break;
+ case FST_TURBULENCE:
+ {
+ TurbulenceFieldSamplerData* ed = static_cast< TurbulenceFieldSamplerData*>(d->FieldSamplers.buf[i]);
+ if (ed->TurbulenceFieldSampler == NULL)
+ {
+ ed->TurbulenceFieldSampler = traits->createNvParameterized(turbulencefs::TurbulenceFSAssetParams::staticClassName());
+ turbulencefs::TurbulenceFSAssetParams* fs = static_cast< turbulencefs::TurbulenceFSAssetParams*>(ed->TurbulenceFieldSampler);
+ if (fs)
+ {
+ fs->gridSizeWorld = PxVec3(15, 15, 15);
+ fs->updatesPerFrame = 1;
+ fs->angularVelocityMultiplier = 1;
+ fs->angularVelocityClamp = 100000;
+ fs->linearVelocityMultiplier = 1;
+ fs->linearVelocityClamp = 100000;
+ fs->boundaryFadePercentage = 0.3f;
+ fs->boundarySizePercentage = 1;
+ fs->maxCollidingObjects = 32;
+ fs->maxHeatSources = 8;
+ fs->dragCoeff = 0;
+ fs->externalVelocity = PxVec3(0, 0, 0);
+ fs->fieldVelocityMultiplier = 1;
+ fs->fieldVelocityWeight = 0.75;
+ fs->useHeat = true;
+ fs->heatParams.temperatureBasedForceMultiplier = 0.02f;
+ fs->heatParams.ambientTemperature = 0;
+ fs->heatParams.heatForceDirection = PxVec3(0, 1, 0);
+ fs->isEnabledOptimizedLOD = false;
+ fs->updatesPerFrame = 1.f;
+ fs->noiseParams.noiseStrength = 0;
+ fs->noiseParams.noiseSpacePeriod = PxVec3(0.9f, 0.9f, 0.9f);
+ fs->noiseParams.noiseTimePeriod = 10;
+ fs->noiseParams.noiseOctaves = 1;
+ fs->dragCoeffForRigidBody = 0;
+ fs->fluidViscosity = 0;
+ }
+
+ ret = true;
+ }
+ }
+ break;
+ case FST_FLAME_EMITTER:
+ {
+ FlameEmitterData* ed = static_cast< FlameEmitterData*>(d->FieldSamplers.buf[i]);
+ if (ed->FlameEmitter == NULL)
+ {
+ ed->FlameEmitter = traits->createNvParameterized(turbulencefs::FlameEmitterAssetParams::staticClassName());
+ ret = true;
+ }
+ }
+ break;
+ default:
+ PX_ALWAYS_ASSERT(); // not yet implemented
+ break;
+ }
+ if ( fixFieldSamplerCollisionFilterNames( iface ) )
+ {
+ ret = true;
+ }
+ }
+ }
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT(); // invalid NvParameterized::Interface passed in
+ }
+ }
+
+
+ return ret;
+}
+
+
+static void initPathData(NvParameterized::Interface *ei,RigidBodyEffectNS::EffectProperties_Type &ep,bool &ret)
+{
+ if ( ep.Path.Scale.arraySizes[0] == 0 )
+ {
+ NvParameterized::Handle handle(ei);
+ NvParameterized::ErrorType err = handle.getParameter("EffectProperties.Path.Scale");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ RigidBodyEffectNS::ControlPoint_Type &c1 = ep.Path.Scale.buf[0];
+ RigidBodyEffectNS::ControlPoint_Type &c2 = ep.Path.Scale.buf[1];
+
+ c1.x = 0;
+ c1.y = 1;
+
+ c2.x = 1;
+ c2.y = 1;
+ ret = true;
+ }
+ }
+ if ( ep.Path.Speed.arraySizes[0] == 0 )
+ {
+ NvParameterized::Handle handle(ei);
+ NvParameterized::ErrorType err = handle.getParameter("EffectProperties.Path.Speed");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ RigidBodyEffectNS::ControlPoint_Type &c1 = ep.Path.Speed.buf[0];
+ RigidBodyEffectNS::ControlPoint_Type &c2 = ep.Path.Speed.buf[1];
+
+ c1.x = 0;
+ c1.y = 1;
+
+ c2.x = 1;
+ c2.y = 1;
+ ret = true;
+ }
+ }
+}
+
+static void initPathData(NvParameterized::Interface *ei,RigidBodyEffectNS::EffectPath_Type &Path,bool &ret)
+{
+ if ( Path.Scale.arraySizes[0] == 0 )
+ {
+ NvParameterized::Handle handle(ei);
+ NvParameterized::ErrorType err = handle.getParameter("Path.Scale");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ RigidBodyEffectNS::ControlPoint_Type &c1 = Path.Scale.buf[0];
+ RigidBodyEffectNS::ControlPoint_Type &c2 = Path.Scale.buf[1];
+
+ c1.x = 0;
+ c1.y = 1;
+
+ c2.x = 1;
+ c2.y = 1;
+ ret = true;
+ }
+ }
+ if ( Path.Speed.arraySizes[0] == 0 )
+ {
+ NvParameterized::Handle handle(ei);
+ NvParameterized::ErrorType err = handle.getParameter("Path.Speed");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(2);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ RigidBodyEffectNS::ControlPoint_Type &c1 = Path.Speed.buf[0];
+ RigidBodyEffectNS::ControlPoint_Type &c2 = Path.Speed.buf[1];
+
+ c1.x = 0;
+ c1.y = 1;
+
+ c2.x = 1;
+ c2.y = 1;
+ ret = true;
+ }
+ }
+}
+
+
+bool ModuleParticlesImpl::setEffectPackageDatabase(const NvParameterized::Interface* dataBase)
+{
+ WRITE_ZONE();
+ bool ret = false;
+
+ if (dataBase)
+ {
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+ const char* className = dataBase->className();
+ if (nvidia::strcmp(className, EffectPackageAssetParams::staticClassName()) == 0)
+ {
+ bool revised = false;
+ const char* itemName = dataBase->name();
+ EffectPackageDatabaseParams* d = static_cast< EffectPackageDatabaseParams*>(mEffectPackageDatabaseParams);
+ for (uint32_t i = 0; i < (uint32_t)d->EffectPackages.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->EffectPackages.buf[i];
+ EffectPackageData* ed = static_cast< EffectPackageData*>(ei);
+ if (nvidia::stricmp(ed->Name.buf, itemName) == 0)
+ {
+ ed->EffectPackage->copy(*dataBase);
+ revised = true;
+ ret = true;
+ break;
+ }
+ }
+ if (!revised && mEffectPackageDatabaseParams)
+ {
+ int32_t arraySize = d->EffectPackages.arraySizes[0];
+ NvParameterized::Handle handle(mEffectPackageDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("EffectPackages");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(arraySize + 1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(EffectPackageData::staticClassName());
+ EffectPackageData* ed = static_cast< EffectPackageData*>(ei);
+ if (ed)
+ {
+ NvParameterized::Handle item(ei);
+ err = item.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ item.setParamString(itemName);
+ ei->setName(itemName);
+ d->EffectPackages.buf[arraySize] = ei;
+ dataBase->clone(ed->EffectPackage);
+ if ( ed->EffectPackage == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ }
+ }
+ ret = true;
+ }
+ }
+ }
+ else if (nvidia::strcmp(className, EffectPackageDatabaseParams::staticClassName()) == 0)
+ {
+ if (mEffectPackageDatabaseParams && mEffectPackageDatabaseParams != dataBase)
+ {
+ mEffectPackageDatabaseParams->destroy();
+ mEffectPackageDatabaseParams = NULL;
+ }
+ if (mEffectPackageDatabaseParams == NULL)
+ {
+ dataBase->clone(mEffectPackageDatabaseParams);
+ if ( mEffectPackageDatabaseParams == NULL )
+ {
+ APEX_DEBUG_WARNING("Failed to clone asset.");
+ mEffectPackageDatabaseParams = traits->createNvParameterized(EffectPackageDatabaseParams::staticClassName());
+ }
+ }
+ }
+ // initialize anything which needs default values assigned...
+ if ( mEffectPackageDatabaseParams )
+ {
+ EffectPackageDatabaseParams* d = static_cast< EffectPackageDatabaseParams*>(mEffectPackageDatabaseParams);
+
+ {
+ if (d->EffectPackages.arraySizes[0] == 0)
+ {
+ NvParameterized::Handle handle(mEffectPackageDatabaseParams);
+ NvParameterized::ErrorType err = handle.getParameter("EffectPackages");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(EffectPackageData::staticClassName());
+ EffectPackageData* ed = static_cast< EffectPackageData*>(ei);
+ d->EffectPackages.buf[0] = ei;
+ if (ed)
+ {
+ ed->EffectPackage = traits->createNvParameterized(EffectPackageAssetParams::staticClassName());
+ EffectPackageAssetParams* p = static_cast< EffectPackageAssetParams*>(ed->EffectPackage);
+ if (p->Effects.arraySizes[0] == 0 && p)
+ {
+ NvParameterized::Handle handle(p);
+ NvParameterized::ErrorType err = handle.getParameter("Effects");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ err = handle.resizeArray(1);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* ei = traits->createNvParameterized(EmitterEffect::staticClassName());
+ p->Effects.buf[0] = ei;
+ ret = true;
+ }
+ }
+ }
+ ret = true;
+ }
+ }
+ Array< const char* > nameList;
+ for (int32_t i = 0; i < d->EffectPackages.arraySizes[0]; i++)
+ {
+ EffectPackageData* e = static_cast< EffectPackageData*>(d->EffectPackages.buf[i]);
+ if (e)
+ {
+ for (uint32_t j = 0; j < nameList.size(); j++)
+ {
+ if (nvidia::stricmp(nameList[j], e->Name) == 0)
+ {
+ NvParameterized::Handle handle(e);
+ NvParameterized::ErrorType err = handle.getParameter("Name");
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ handle.setParamString(getUniqueName(nameList, e->Name));
+ ret = true;
+ break;
+ }
+ }
+ }
+ nameList.pushBack(e->Name);
+ }
+ }
+
+
+
+ for (uint32_t i = 0; i < (uint32_t)d->EffectPackages.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->EffectPackages.buf[i];
+ EffectPackageData* d = static_cast< EffectPackageData*>(ei);
+
+
+ EffectPackageAssetParams* p = static_cast< EffectPackageAssetParams*>(d->EffectPackage);
+ if (p == NULL)
+ {
+ NvParameterized::Interface* ep = traits->createNvParameterized(EffectPackageAssetParams::staticClassName());
+ p = static_cast< EffectPackageAssetParams*>(ep);
+ d->EffectPackage = ep;
+ }
+
+ {
+ RigidBodyEffectNS::EffectPath_Type &path = *(RigidBodyEffectNS::EffectPath_Type *)&p->Path;
+ initPathData(d->EffectPackage,path,ret);
+ }
+
+
+
+ for (uint32_t i = 0; i < (uint32_t)p->Effects.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = p->Effects.buf[i];
+ if (!ei)
+ {
+ continue;
+ }
+ if (nvidia::strcmp(ei->className(), EmitterEffect::staticClassName()) == 0)
+ {
+ EmitterEffect* e = static_cast< EmitterEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->Emitter == NULL)
+ {
+ setNamedReference(ei, "Emitter", EMITTER_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->Emitter);
+ e->Emitter->setName("defaultEmitter");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), RigidBodyEffect::staticClassName()) == 0)
+ {
+ RigidBodyEffect* e = static_cast< RigidBodyEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = e->EffectProperties;
+ initPathData(ei,ep,ret);
+ }
+ else if (nvidia::strcmp(ei->className(), HeatSourceEffect::staticClassName()) == 0)
+ {
+ HeatSourceEffect* e = static_cast< HeatSourceEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->HeatSource == NULL)
+ {
+ setNamedReference(ei, "HeatSource", HEAT_SOURCE_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->HeatSource);
+ e->HeatSource->setName("defaultHeatSource");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), SubstanceSourceEffect::staticClassName()) == 0)
+ {
+ SubstanceSourceEffect* e = static_cast< SubstanceSourceEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->SubstanceSource == NULL)
+ {
+ setNamedReference(ei, "SubstanceSource", SUBSTANCE_SOURCE_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->SubstanceSource);
+ e->SubstanceSource->setName("defaultSubstanceSource");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), VelocitySourceEffect::staticClassName()) == 0)
+ {
+ VelocitySourceEffect* e = static_cast< VelocitySourceEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->VelocitySource == NULL)
+ {
+ setNamedReference(ei, "VelocitySource", VELOCITY_SOURCE_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->VelocitySource);
+ e->VelocitySource->setName("defaultVelocitySource");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), JetFieldSamplerEffect::staticClassName()) == 0)
+ {
+ JetFieldSamplerEffect* e = static_cast< JetFieldSamplerEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->JetFieldSampler == NULL)
+ {
+ setNamedReference(ei, "JetFieldSampler", JET_FS_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->JetFieldSampler);
+ e->JetFieldSampler->setName("defaultJetFieldSampler");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), WindFieldSamplerEffect::staticClassName()) == 0)
+ {
+ WindFieldSamplerEffect* e = static_cast< WindFieldSamplerEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->WindFieldSampler == NULL)
+ {
+ setNamedReference(ei, "WindFieldSampler", WIND_FS_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->WindFieldSampler);
+ e->WindFieldSampler->setName("defaultWindFieldSampler");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), NoiseFieldSamplerEffect::staticClassName()) == 0)
+ {
+ NoiseFieldSamplerEffect* e = static_cast< NoiseFieldSamplerEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->NoiseFieldSampler == NULL)
+ {
+ setNamedReference(ei, "NoiseFieldSampler", NOISE_FS_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->NoiseFieldSampler);
+ e->NoiseFieldSampler->setName("defaultNoiseFieldSampler");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), VortexFieldSamplerEffect::staticClassName()) == 0)
+ {
+ VortexFieldSamplerEffect* e = static_cast< VortexFieldSamplerEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->VortexFieldSampler == NULL)
+ {
+ setNamedReference(ei, "VortexFieldSampler", VORTEX_FS_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->VortexFieldSampler);
+ e->VortexFieldSampler->setName("defaultVortexFieldSampler");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), AttractorFieldSamplerEffect::staticClassName()) == 0)
+ {
+ AttractorFieldSamplerEffect* e = static_cast< AttractorFieldSamplerEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->AttractorFieldSampler == NULL)
+ {
+ setNamedReference(ei, "AttractorFieldSampler", ATTRACTOR_FS_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->AttractorFieldSampler);
+ e->AttractorFieldSampler->setName("defaultAttractorFieldSampler");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), TurbulenceFieldSamplerEffect::staticClassName()) == 0)
+ {
+ TurbulenceFieldSamplerEffect* e = static_cast< TurbulenceFieldSamplerEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->TurbulenceFieldSampler == NULL)
+ {
+ setNamedReference(ei, "TurbulenceFieldSampler", TURBULENCE_FS_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->TurbulenceFieldSampler);
+ e->TurbulenceFieldSampler->setName("defaultTurbulenceFieldSampler");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), ForceFieldEffect::staticClassName()) == 0)
+ {
+ ForceFieldEffect* e = static_cast< ForceFieldEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->ForceField == NULL)
+ {
+ setNamedReference(ei, "ForceField", FORCEFIELD_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->ForceField);
+ e->ForceField->setName("defaultForceField");
+ ret = true;
+ }
+ }
+ else if (nvidia::strcmp(ei->className(), FlameEmitterEffect::staticClassName()) == 0)
+ {
+ FlameEmitterEffect* e = static_cast< FlameEmitterEffect*>(ei);
+ RigidBodyEffectNS::EffectProperties_Type &ep = *(RigidBodyEffectNS::EffectProperties_Type *)&e->EffectProperties;
+ initPathData(ei,ep,ret);
+ if (e->FlameEmitter == NULL)
+ {
+ setNamedReference(ei, "FlameEmitter", FLAME_EMITTER_AUTHORING_TYPE_NAME);
+ PX_ASSERT(e->FlameEmitter);
+ e->FlameEmitter->setName("defaultFlameEmitter");
+ ret = true;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+
+ return ret;
+}
+
+
+bool ModuleParticlesImpl::fixupNamedReferences(void)
+{
+ bool ret = false;
+
+ if (mEffectPackageEmitterDatabaseParams)
+ {
+ EffectPackageEmitterDatabaseParams* d = static_cast< EffectPackageEmitterDatabaseParams*>(mEffectPackageEmitterDatabaseParams);
+
+ for (int32_t i = 0; i < d->Emitters.arraySizes[0]; i++)
+ {
+ EmitterData* ed = static_cast< EmitterData*>(d->Emitters.buf[i]);
+
+ if (ed->Emitter)
+ {
+ NvParameterized::Handle handle(ed->Emitter);
+ NvParameterized::ErrorType err = ed->Emitter->getParameterHandle("iosAssetName", handle);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ NvParameterized::Interface* val = NULL;
+ err = handle.getParamRef(val);
+ // ok..need to see if it has changed!
+ if (val)
+ {
+ const char* refName = val->name();
+ EffectPackageIOSDatabaseParams* d = static_cast< EffectPackageIOSDatabaseParams*>(mEffectPackageIOSDatabaseParams);
+ for (uint32_t i = 0; i < (uint32_t)d->ParticleSimulations.arraySizes[0]; i++)
+ {
+ NvParameterized::Interface* ei = d->ParticleSimulations.buf[i];
+ emitter::ApexEmitterAssetParameters* ae = static_cast< emitter::ApexEmitterAssetParameters*>(ed->Emitter);
+ ParticleSimulationData* ed = static_cast< ParticleSimulationData*>(ei);
+ if (nvidia::stricmp(ed->Name.buf, refName) == 0)
+ {
+ NvParameterized::Interface* ios = ed->IOS;
+ if ( ios )
+ {
+ const char* paramRef = getAuthoringTypeName(ios->className());
+ err = handle.initParamRef(paramRef,true);
+ PX_ASSERT(err == NvParameterized::ERROR_NONE);
+ if (err == NvParameterized::ERROR_NONE)
+ {
+ ae->iosAssetName->setName(ed->Name.buf);
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+bool ModuleParticlesImpl::initParticleSimulationData(ParticleSimulationData* ed)
+{
+ bool ret = false;
+
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+
+ if (ed->IOS == NULL)
+ {
+ ed->IOS = traits->createNvParameterized(basicios::BasicIOSAssetParam::staticClassName());
+ basicios::BasicIOSAssetParam* ios = static_cast< basicios::BasicIOSAssetParam*>(ed->IOS);
+ if (ios)
+ {
+ ios->restDensity = 1;
+ ios->particleRadius = 0.1f;
+ ios->maxParticleCount = 16384;
+ ios->maxInjectedParticleCount = 0.05;
+ ios->sceneGravityScale = 1;
+ ios->externalAcceleration.x = 0;
+ ios->externalAcceleration.y = 0;
+ ios->externalAcceleration.z = 0;
+ ios->particleMass.center = 1;
+ ios->particleMass.spread = 0;
+ ios->staticCollision = true;
+ ios->restitutionForStaticShapes = 0.2f;
+ ios->dynamicCollision = true;
+ ios->restitutionForDynamicShapes = 0.2f;
+ ios->collisionDistanceMultiplier = 1;
+ ios->collisionThreshold = 0.001f;
+ ios->collisionWithConvex = true;
+ ios->collisionWithTriangleMesh = false;
+ }
+ ret = true;
+ }
+
+ if (ed->IOS && nvidia::strcmp(ed->IOS->className(), "ParticleIosAssetParam") == 0)
+ {
+ pxparticleios::ParticleIosAssetParam* p = static_cast< pxparticleios::ParticleIosAssetParam*>(ed->IOS);
+ if (p->particleType == NULL)
+ {
+ p->particleType = traits->createNvParameterized(pxparticleios::FluidParticleSystemParams::staticClassName());
+ ret = true;
+ }
+ }
+
+ if ( ed->IOS )
+ {
+ if ( nvidia::strcmp(ed->IOS->className(), "ParticleIosAssetParam") == 0 )
+ {
+ const char *filterName = "ParticlesSimple=all";
+ pxparticleios::ParticleIosAssetParam* p = static_cast< pxparticleios::ParticleIosAssetParam*>(ed->IOS);
+ if (p->particleType && nvidia::strcmp(p->particleType->className(), pxparticleios::FluidParticleSystemParams::staticClassName()) == 0 )
+ {
+ filterName = "ParticlesFluid=all";
+ }
+
+ {
+ const char *value=NULL;
+ NvParameterized::getParamString(*ed->IOS,"simulationFilterData",value);
+ if ( value == NULL || value[0] == 0 )
+ {
+ NvParameterized::setParamString(*ed->IOS,"simulationFilterData",filterName);
+ ret = true;
+ }
+ }
+ {
+ const char *value=NULL;
+ NvParameterized::getParamString(*ed->IOS,"fieldSamplerFilterData",value);
+ if ( value == NULL || value[0] == 0 )
+ {
+ NvParameterized::setParamString(*ed->IOS,"fieldSamplerFilterData",filterName);
+ ret = true;
+ }
+ }
+ }
+ else
+ {
+ const char *filterName = "ParticlesBasicIOS=all";
+ {
+ const char *value=NULL;
+ NvParameterized::getParamString(*ed->IOS,"collisionFilterDataName",value);
+ if ( value == NULL || value[0] == 0 )
+ {
+ NvParameterized::setParamString(*ed->IOS,"collisionFilterDataName",filterName);
+ ret = true;
+ }
+ }
+ {
+ const char *value=NULL;
+ NvParameterized::getParamString(*ed->IOS,"fieldSamplerFilterDataName",value);
+ if ( value == NULL || value[0] == 0 )
+ {
+ NvParameterized::setParamString(*ed->IOS,"fieldSamplerFilterDataName",filterName);
+ ret = true;
+ }
+ }
+
+ }
+ }
+ return ret;
+}
+
+void ModuleParticlesImpl::resetEmitterPool(void)
+{
+ WRITE_ZONE();
+ for (uint32_t i = 0; i < mScenes.size(); i++)
+ {
+ ParticlesScene* ds = static_cast< ParticlesScene*>(mScenes[i]);
+ ds->resetEmitterPool();
+ }
+}
+
+#define MODULE_CHECK(x) if ( x == module ) { x = NULL; }
+
+/**
+Notification from ApexSDK when a module has been released
+*/
+void ModuleParticlesImpl::notifyChildGone(ModuleIntl* imodule)
+{
+ Module* module = mSdk->getModule(imodule);
+ PX_ASSERT(module);
+ MODULE_CHECK(mModuleBasicIos);
+ MODULE_CHECK(mModuleEmitter);
+ MODULE_CHECK(mModuleIofx);
+ MODULE_CHECK(mModuleFieldSampler);
+ MODULE_CHECK(mModuleBasicFS);
+ MODULE_CHECK(mModuleParticleIos); // PhysX 3.x only : Instantiate the ParticleIOS module
+ MODULE_CHECK(mModuleForceField); // PhysX 3.x only : Instantiate the ForceField module
+};
+
+// This is a notification that the ApexSDK is being released. During the shutdown process
+// the APEX SDK will automatically release all currently registered modules; therefore we are no longer
+// responsible for releasing these modules ourselves.
+
+#define SAFE_MODULE_NULL(x) if ( x ) { ModuleIntl *m = mSdk->getInternalModule(x); PX_ASSERT(m); m->setParent(NULL); x = NULL; }
+
+void ModuleParticlesImpl::notifyReleaseSDK(void)
+{
+ SAFE_MODULE_NULL(mModuleBasicIos);
+ SAFE_MODULE_NULL(mModuleEmitter);
+ SAFE_MODULE_NULL(mModuleIofx);
+ SAFE_MODULE_NULL(mModuleFieldSampler);
+ SAFE_MODULE_NULL(mModuleBasicFS);
+ SAFE_MODULE_NULL(mModuleParticleIos); // PhysX 3.x only : Instantiate the ParticleIOS module
+ SAFE_MODULE_NULL(mModuleForceField); // PhysX 3.x only : Instantiate the ForceField module
+}
+
+void ModuleParticlesImpl::initializeDefaultDatabases(void)
+{
+ WRITE_ZONE();
+ /* Register the NvParameterized factories */
+ NvParameterized::Traits* traits = mSdk->getParameterizedTraits();
+
+ if (mTurbulenceModule == NULL)
+ {
+ uint32_t count = mSdk->getNbModules();
+ Module** modules = mSdk->getModules();
+ for (uint32_t i = 0; i < count; i++)
+ {
+ Module* m = modules[i];
+ const char* name = m->getName();
+ if (nvidia::strcmp(name, "TurbulenceFS") == 0)
+ {
+ mTurbulenceModule = static_cast< ModuleTurbulenceFS*>(m);
+ break;
+ }
+ }
+ }
+
+ // Initialize the effect package databases
+ if (mEffectPackageIOSDatabaseParams == NULL)
+ {
+ NvParameterized::Interface* iface = traits->createNvParameterized(EffectPackageIOSDatabaseParams::staticClassName());
+ if (iface)
+ {
+ setEffectPackageIOSDatabase(iface);
+ iface->destroy();
+ }
+ }
+ if (mEffectPackageIOFXDatabaseParams == NULL)
+ {
+ NvParameterized::Interface* iface = traits->createNvParameterized(EffectPackageIOFXDatabaseParams::staticClassName());
+ if (iface)
+ {
+ setEffectPackageIOFXDatabase(iface);
+ iface->destroy();
+ }
+ }
+ if (mEffectPackageEmitterDatabaseParams == NULL)
+ {
+ NvParameterized::Interface* iface = traits->createNvParameterized(EffectPackageEmitterDatabaseParams::staticClassName());
+ if (iface)
+ {
+ setEffectPackageEmitterDatabase(iface);
+ iface->destroy();
+ }
+ }
+ if (mEffectPackageFieldSamplerDatabaseParams == NULL)
+ {
+ NvParameterized::Interface* iface = traits->createNvParameterized(EffectPackageFieldSamplerDatabaseParams::staticClassName());
+ setEffectPackageFieldSamplerDatabase(iface);
+ iface->destroy();
+ }
+ if (mEffectPackageDatabaseParams == NULL)
+ {
+ NvParameterized::Interface* iface = traits->createNvParameterized(EffectPackageDatabaseParams::staticClassName());
+ if (iface)
+ {
+ setEffectPackageDatabase(iface);
+ iface->destroy();
+ }
+ }
+ if (mGraphicsMaterialsDatabase == NULL)
+ {
+ NvParameterized::Interface* iface = traits->createNvParameterized(EffectPackageGraphicsMaterialsParams::staticClassName());
+ if (iface)
+ {
+ setEffectPackageGraphicsMaterialsDatabase(iface);
+ iface->destroy();
+ }
+ }
+
+}
+
+#define MODULE_NAME_CHECK(x) if ( x ) { if ( nvidia::strcmp(x->getName(),moduleName) == 0) ret = x; }
+
+nvidia::apex::Module* ModuleParticlesImpl::getModule(const char* moduleName)
+{
+ READ_ZONE();
+ nvidia::apex::Module* ret = NULL;
+ MODULE_NAME_CHECK(mModuleBasicIos);
+ MODULE_NAME_CHECK(mModuleEmitter);
+ MODULE_NAME_CHECK(mModuleIofx);
+ MODULE_NAME_CHECK(mModuleFieldSampler);
+ MODULE_NAME_CHECK(mModuleBasicFS);
+ MODULE_NAME_CHECK(mModuleParticleIos);
+ MODULE_NAME_CHECK(mModuleForceField);
+ return ret;
+}
+
+}
+} // end namespace nvidia
+