aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/module/destructible/include/ModuleDestructibleImpl.h
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/module/destructible/include/ModuleDestructibleImpl.h
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'APEX_1.4/module/destructible/include/ModuleDestructibleImpl.h')
-rw-r--r--APEX_1.4/module/destructible/include/ModuleDestructibleImpl.h556
1 files changed, 556 insertions, 0 deletions
diff --git a/APEX_1.4/module/destructible/include/ModuleDestructibleImpl.h b/APEX_1.4/module/destructible/include/ModuleDestructibleImpl.h
new file mode 100644
index 00000000..24131733
--- /dev/null
+++ b/APEX_1.4/module/destructible/include/ModuleDestructibleImpl.h
@@ -0,0 +1,556 @@
+/*
+ * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved.
+ *
+ * NVIDIA CORPORATION and its licensors retain all intellectual property
+ * and proprietary rights in and to this software, related documentation
+ * and any modifications thereto. Any use, reproduction, disclosure or
+ * distribution of this software and related documentation without an express
+ * license agreement from NVIDIA CORPORATION is strictly prohibited.
+ */
+
+
+#ifndef __MODULE_DESTRUCTIBLE_IMPL_H__
+#define __MODULE_DESTRUCTIBLE_IMPL_H__
+
+#include "Apex.h"
+#include "ApexSDKIntl.h"
+#include "ModuleIntl.h"
+#include "ModuleBase.h"
+
+#include "FractureTools.h"
+
+#include "ModuleDestructible.h"
+
+#include "DestructibleActorJoint.h"
+#include "DestructibleAssetImpl.h"
+#include "PsMutex.h"
+#include "ApexAuthorableObject.h"
+
+#include "ApexSDKCachedDataImpl.h"
+#include "ApexRWLockable.h"
+#include "ReadCheck.h"
+#include "WriteCheck.h"
+#include "ApexRand.h"
+
+#include "ModuleDestructibleRegistration.h"
+#ifndef USE_DESTRUCTIBLE_RWLOCK
+#define USE_DESTRUCTIBLE_RWLOCK 0
+#endif
+
+#define DECLARE_DISABLE_COPY_AND_ASSIGN(Class) private: Class(const Class &); Class & operator = (const Class &);
+
+namespace nvidia
+{
+namespace destructible
+{
+
+/*** SyncParams ***/
+typedef UserDestructibleSyncHandler<DamageEventHeader> UserDamageEventHandler;
+typedef UserDestructibleSyncHandler<FractureEventHeader> UserFractureEventHandler;
+typedef UserDestructibleSyncHandler<ChunkTransformHeader> UserChunkMotionHandler;
+
+class DestructibleActorImpl;
+class DestructibleScene;
+
+class DestructibleModuleCachedData : public ModuleCachedDataIntl, public UserAllocated
+{
+public:
+ DestructibleModuleCachedData(AuthObjTypeID moduleID);
+ virtual ~DestructibleModuleCachedData();
+
+ virtual AuthObjTypeID getModuleID() const
+ {
+ return mModuleID;
+ }
+
+ virtual NvParameterized::Interface* getCachedDataForAssetAtScale(Asset& asset, const PxVec3& scale);
+ virtual PxFileBuf& serialize(PxFileBuf& stream) const;
+ virtual PxFileBuf& deserialize(PxFileBuf& stream);
+ virtual void clear(bool force = true);
+
+ void clearAssetCollisionSet(const DestructibleAssetImpl& asset);
+ physx::Array<PxConvexMesh*>* getConvexMeshesForActor(const DestructibleActorImpl& destructible); // increments ref counts
+ void releaseReferencesToConvexMeshesForActor(const DestructibleActorImpl& destructible); // decrements ref counts
+
+ // The DestructibleActor::cacheModuleData() method needs to avoid incrementing the ref count
+ physx::Array<PxConvexMesh*>* getConvexMeshesForScale(const DestructibleAssetImpl& asset, const PxVec3& scale, bool incRef = true);
+
+ DestructibleAssetCollision* getAssetCollisionSet(const DestructibleAssetImpl& asset);
+
+ virtual PxFileBuf& serializeSingleAsset(Asset& asset, PxFileBuf& stream);
+ virtual PxFileBuf& deserializeSingleAsset(Asset& asset, PxFileBuf& stream);
+private:
+ DestructibleAssetCollision* findAssetCollisionSet(const char* name);
+
+ struct Version
+ {
+ enum Enum
+ {
+ First = 0,
+
+ Count,
+ Current = Count - 1
+ };
+ };
+
+ AuthObjTypeID mModuleID;
+ physx::Array<DestructibleAssetCollision*> mAssetCollisionSets;
+};
+
+class ModuleDestructibleImpl : public ModuleDestructible, public ModuleIntl, public ModuleBase, public ApexRWLockable
+{
+public:
+ APEX_RW_LOCKABLE_BOILERPLATE
+
+ ModuleDestructibleImpl(ApexSDKIntl* sdk);
+ ~ModuleDestructibleImpl();
+
+ void destroy();
+
+ // base class methods
+ void init(NvParameterized::Interface& desc);
+ NvParameterized::Interface* getDefaultModuleDesc();
+ void release()
+ {
+ ModuleBase::release();
+ }
+ const char* getName() const
+ {
+ READ_ZONE();
+ return ModuleBase::getName();
+ }
+ bool isInitialized()
+ {
+ return m_isInitialized;
+ }
+
+ bool setRenderLockMode(RenderLockMode::Enum, Scene&);
+
+ RenderLockMode::Enum getRenderLockMode(const Scene&) const;
+
+ bool lockModuleSceneRenderLock(Scene&);
+
+ bool unlockModuleSceneRenderLock(Scene&);
+
+ void setIntValue(uint32_t parameterIndex, uint32_t value);
+ ModuleSceneIntl* createInternalModuleScene(SceneIntl&, RenderDebugInterface*);
+ void releaseModuleSceneIntl(ModuleSceneIntl&);
+ uint32_t forceLoadAssets();
+ AuthObjTypeID getModuleID() const;
+ RenderableIterator* createRenderableIterator(const Scene&);
+
+ DestructibleActorJoint* createDestructibleActorJoint(const DestructibleActorJointDesc&, Scene&);
+ bool isDestructibleActorJointActive(const DestructibleActorJoint*, Scene&) const;
+
+ void setMaxDynamicChunkIslandCount(uint32_t maxCount);
+ void setMaxChunkCount(uint32_t maxCount);
+
+ void setSortByBenefit(bool sortByBenefit);
+ void setMaxChunkDepthOffset(uint32_t offset);
+ void setMaxChunkSeparationLOD(float separationLOD);
+
+ void setChunkReport(UserChunkReport* chunkReport);
+ void setImpactDamageReportCallback(UserImpactDamageReport* impactDamageReport);
+ void setChunkReportBitMask(uint32_t chunkReportBitMask);
+ void setDestructiblePhysXActorReport(UserDestructiblePhysXActorReport* destructiblePhysXActorReport);
+ void setChunkReportMaxFractureEventDepth(uint32_t chunkReportMaxFractureEventDepth);
+ void scheduleChunkStateEventCallback(DestructibleCallbackSchedule::Enum chunkStateEventCallbackSchedule);
+ void setChunkCrumbleReport(UserChunkParticleReport* chunkCrumbleReport);
+ void setChunkDustReport(UserChunkParticleReport* chunkDustReport);
+ void setWorldSupportPhysXScene(Scene& apexScene, PxScene* physxScene);
+
+ bool owns(const PxRigidActor* actor) const;
+#if APEX_RUNTIME_FRACTURE
+ bool isRuntimeFractureShape(const PxShape& shape) const;
+#endif
+
+ DestructibleActor* getDestructibleAndChunk(const PxShape* shape, int32_t* chunkIndex) const;
+
+ void applyRadiusDamage(Scene& scene, float damage, float momentum,
+ const PxVec3& position, float radius, bool falloff);
+
+ void setMaxActorCreatesPerFrame(uint32_t maxActorsPerFrame);
+ void setMaxFracturesProcessedPerFrame(uint32_t maxActorsPerFrame);
+ void setValidBoundsPadding(float);
+
+#if 0 // dead code
+ void releaseBufferedConvexMeshes();
+#endif
+
+ ModuleCachedDataIntl* getModuleDataCache()
+ {
+ return mCachedData;
+ }
+
+ PX_INLINE NvParameterized::Interface* getApexDestructiblePreviewParams(void) const
+ {
+ return mApexDestructiblePreviewParams;
+ }
+
+ void setUseLegacyChunkBoundsTesting(bool useLegacyChunkBoundsTesting);
+ bool getUseLegacyChunkBoundsTesting() const
+ {
+ return mUseLegacyChunkBoundsTesting;
+ }
+
+ void setUseLegacyDamageRadiusSpread(bool useLegacyDamageRadiusSpread);
+ bool getUseLegacyDamageRadiusSpread() const
+ {
+ return mUseLegacyDamageRadiusSpread;
+ }
+
+ bool setMassScaling(float massScale, float scaledMassExponent, Scene& apexScene);
+
+ void invalidateBounds(const PxBounds3* bounds, uint32_t boundsCount, Scene& apexScene);
+
+ void setDamageApplicationRaycastFlags(nvidia::DestructibleActorRaycastFlags::Enum flags, Scene& apexScene);
+
+ bool setChunkCollisionHullCookingScale(const PxVec3& scale);
+
+ PxVec3 getChunkCollisionHullCookingScale() const { READ_ZONE(); return mChunkCollisionHullCookingScale; }
+
+ virtual class FractureToolsAPI* getFractureTools() const
+ {
+ READ_ZONE();
+#ifdef WITHOUT_APEX_AUTHORING
+ APEX_DEBUG_WARNING("FractureTools are not available in release builds.");
+#endif
+ return (FractureToolsAPI*)mFractureTools;
+ }
+
+ DestructibleModuleParameters* getModuleParameters()
+ {
+ return mModuleParams;
+ }
+
+#if 0 // dead code
+ physx::Array<PxConvexMesh*> convexMeshKillList;
+#endif
+
+private:
+ // Private interface, used by Destructible* classes
+
+ DestructibleScene* getDestructibleScene(const Scene& apexScene) const;
+
+ bool m_isInitialized;
+
+ // Max chunk depth offset (for LOD) - effectively reduces the max chunk depth in all destructibles by this number
+ uint32_t m_maxChunkDepthOffset;
+ // Where in the assets' min-max range to place the lifetime and max. separation
+ float m_maxChunkSeparationLOD;
+ float m_validBoundsPadding;
+ uint32_t m_maxFracturesProcessedPerFrame;
+ uint32_t m_maxActorsCreateablePerFrame;
+ uint32_t m_dynamicActorFIFOMax;
+ uint32_t m_chunkFIFOMax;
+ bool m_sortByBenefit;
+ UserChunkReport* m_chunkReport;
+ UserImpactDamageReport* m_impactDamageReport;
+ uint32_t m_chunkReportBitMask;
+ UserDestructiblePhysXActorReport* m_destructiblePhysXActorReport;
+ uint32_t m_chunkReportMaxFractureEventDepth;
+ DestructibleCallbackSchedule::Enum m_chunkStateEventCallbackSchedule;
+ UserChunkParticleReport* m_chunkCrumbleReport;
+ UserChunkParticleReport* m_chunkDustReport;
+
+ float m_massScale;
+ float m_scaledMassExponent;
+
+ ResourceList m_destructibleSceneList;
+
+ ResourceList mAuthorableObjects;
+
+ NvParameterized::Interface* mApexDestructiblePreviewParams;
+ DestructibleModuleParameters* mModuleParams;
+
+ DestructibleModuleCachedData* mCachedData;
+
+ nvidia::QDSRand mRandom;
+
+ bool mUseLegacyChunkBoundsTesting;
+ bool mUseLegacyDamageRadiusSpread;
+
+ PxVec3 mChunkCollisionHullCookingScale;
+
+ class FractureTools* mFractureTools;
+
+ /*** ModuleDestructibleImpl::SyncParams ***/
+public:
+ bool setSyncParams(UserDamageEventHandler * userDamageEventHandler, UserFractureEventHandler * userFractureEventHandler, UserChunkMotionHandler * userChunkMotionHandler);
+public:
+ class SyncParams
+ {
+ friend bool ModuleDestructibleImpl::setSyncParams(UserDamageEventHandler *, UserFractureEventHandler *, UserChunkMotionHandler *);
+ public:
+ SyncParams();
+ ~SyncParams();
+ UserDamageEventHandler * getUserDamageEventHandler() const;
+ UserFractureEventHandler * getUserFractureEventHandler() const;
+ UserChunkMotionHandler * getUserChunkMotionHandler() const;
+ template<typename T> uint32_t getSize() const;
+ private:
+ DECLARE_DISABLE_COPY_AND_ASSIGN(SyncParams);
+ UserDamageEventHandler * userDamageEventHandler;
+ UserFractureEventHandler * userFractureEventHandler;
+ UserChunkMotionHandler * userChunkMotionHandler;
+ };
+ const ModuleDestructibleImpl::SyncParams & getSyncParams() const;
+private:
+ SyncParams mSyncParams;
+
+private:
+ friend class DestructibleActorImpl;
+ friend class DestructibleActorJointImpl;
+ friend class DestructibleAssetImpl;
+ friend class DestructibleStructure;
+ friend class DestructibleScene;
+ friend class DestructibleContactReport;
+ friend class DestructibleContactModify;
+ friend class ApexDamageEventReportDataImpl;
+ friend struct DestructibleNXActorCreator;
+};
+
+
+
+#ifndef WITHOUT_APEX_AUTHORING
+// API for FractureTools from our shared/internal code
+class FractureTools : public nvidia::apex::FractureToolsAPI, public UserAllocated
+{
+public:
+ virtual ~FractureTools() {};
+
+ virtual ::FractureTools::CutoutSet* createCutoutSet()
+ {
+ return ::FractureTools::createCutoutSet();
+ }
+
+ virtual void buildCutoutSet(::FractureTools::CutoutSet& cutoutSet, const uint8_t* pixelBuffer, uint32_t bufferWidth, uint32_t bufferHeight, float snapThreshold, bool periodic)
+ {
+ return ::FractureTools::buildCutoutSet(cutoutSet, pixelBuffer, bufferWidth, bufferHeight, snapThreshold, periodic);
+ }
+
+ virtual bool calculateCutoutUVMapping(const nvidia::ExplicitRenderTriangle& triangle, PxMat33& theMapping)
+ {
+ return ::FractureTools::calculateCutoutUVMapping(triangle, theMapping);
+ }
+
+ virtual bool calculateCutoutUVMapping(nvidia::ExplicitHierarchicalMesh& hMesh, const PxVec3& targetDirection, PxMat33& theMapping)
+ {
+ return ::FractureTools::calculateCutoutUVMapping(hMesh, targetDirection, theMapping);
+ }
+
+ virtual bool createVoronoiSplitMesh
+ (
+ nvidia::ExplicitHierarchicalMesh& hMesh,
+ nvidia::ExplicitHierarchicalMesh& iHMeshCore,
+ bool exportCoreMesh,
+ int32_t coreMeshImprintSubmeshIndex,
+ const ::FractureTools::MeshProcessingParameters& meshProcessingParams,
+ const ::FractureTools::FractureVoronoiDesc& desc,
+ const CollisionDesc& collisionDesc,
+ uint32_t randomSeed,
+ nvidia::IProgressListener& progressListener,
+ volatile bool* cancel = NULL
+ )
+ {
+ return ::FractureTools::createVoronoiSplitMesh(hMesh, iHMeshCore, exportCoreMesh, coreMeshImprintSubmeshIndex, meshProcessingParams, desc, collisionDesc, randomSeed, progressListener, cancel);
+ }
+
+ virtual uint32_t createVoronoiSitesInsideMesh
+ (
+ nvidia::ExplicitHierarchicalMesh& hMesh,
+ PxVec3* siteBuffer,
+ uint32_t* siteChunkIndices,
+ uint32_t siteCount,
+ uint32_t* randomSeed,
+ uint32_t* microgridSize,
+ BSPOpenMode::Enum meshMode,
+ nvidia::IProgressListener& progressListener,
+ uint32_t chunkIndex = 0xFFFFFFFF
+ )
+ {
+ return ::FractureTools::createVoronoiSitesInsideMesh(hMesh, siteBuffer, siteChunkIndices, siteCount, randomSeed, microgridSize, meshMode, progressListener, chunkIndex);
+ }
+
+ virtual uint32_t createScatterMeshSites
+ (
+ uint8_t* meshIndices,
+ PxMat44* relativeTransforms,
+ uint32_t* chunkMeshStarts,
+ uint32_t scatterMeshInstancesBufferSize,
+ nvidia::ExplicitHierarchicalMesh& hMesh,
+ uint32_t targetChunkCount,
+ const uint16_t* targetChunkIndices,
+ uint32_t* randomSeed,
+ uint32_t scatterMeshAssetCount,
+ nvidia::RenderMeshAsset** scatterMeshAssets,
+ const uint32_t* minCount,
+ const uint32_t* maxCount,
+ const float* minScales,
+ const float* maxScales,
+ const float* maxAngles
+ )
+ {
+ return ::FractureTools::createScatterMeshSites(meshIndices, relativeTransforms, chunkMeshStarts, scatterMeshInstancesBufferSize, hMesh, targetChunkCount,
+ targetChunkIndices, randomSeed, scatterMeshAssetCount, scatterMeshAssets, minCount, maxCount, minScales, maxScales, maxAngles);
+ }
+
+ virtual void visualizeVoronoiCells
+ (
+ nvidia::RenderDebugInterface& debugRender,
+ const PxVec3* sites,
+ uint32_t siteCount,
+ const uint32_t* cellColors,
+ uint32_t cellColorCount,
+ const PxBounds3& bounds,
+ uint32_t cellIndex = 0xFFFFFFFF
+ )
+ {
+ ::FractureTools::visualizeVoronoiCells(debugRender, sites, siteCount, cellColors, cellColorCount, bounds, cellIndex);
+ }
+
+ virtual bool buildExplicitHierarchicalMesh
+ (
+ nvidia::ExplicitHierarchicalMesh& iHMesh,
+ const nvidia::ExplicitRenderTriangle* meshTriangles,
+ uint32_t meshTriangleCount,
+ const nvidia::ExplicitSubmeshData* submeshData,
+ uint32_t submeshCount,
+ uint32_t* meshPartition = NULL,
+ uint32_t meshPartitionCount = 0,
+ int32_t* parentIndices = NULL,
+ uint32_t parentIndexCount = 0
+
+ )
+ {
+ return ::FractureTools::buildExplicitHierarchicalMesh(iHMesh, meshTriangles, meshTriangleCount, submeshData, submeshCount, meshPartition, meshPartitionCount, parentIndices, parentIndexCount);
+ }
+
+ virtual void setBSPTolerances
+ (
+ float linearTolerance,
+ float angularTolerance,
+ float baseTolerance,
+ float clipTolerance,
+ float cleaningTolerance
+ )
+ {
+ ::FractureTools::setBSPTolerances(linearTolerance, angularTolerance, baseTolerance, clipTolerance, cleaningTolerance);
+ }
+
+ virtual void setBSPBuildParameters
+ (
+ float logAreaSigmaThreshold,
+ uint32_t testSetSize,
+ float splitWeight,
+ float imbalanceWeight
+ )
+ {
+ ::FractureTools::setBSPBuildParameters(logAreaSigmaThreshold, testSetSize, splitWeight, imbalanceWeight);
+ }
+
+ virtual bool buildExplicitHierarchicalMeshFromRenderMeshAsset(nvidia::ExplicitHierarchicalMesh& iHMesh, const nvidia::RenderMeshAsset& renderMeshAsset, uint32_t maxRootDepth = UINT32_MAX)
+ {
+ return ::FractureTools::buildExplicitHierarchicalMeshFromRenderMeshAsset(iHMesh, renderMeshAsset, maxRootDepth);
+ }
+
+ virtual bool buildExplicitHierarchicalMeshFromDestructibleAsset(nvidia::ExplicitHierarchicalMesh& iHMesh, const nvidia::DestructibleAsset& destructibleAsset, uint32_t maxRootDepth = UINT32_MAX)
+ {
+ return ::FractureTools::buildExplicitHierarchicalMeshFromDestructibleAsset(iHMesh, destructibleAsset, maxRootDepth);
+ }
+
+ virtual bool createHierarchicallySplitMesh
+ (
+ nvidia::ExplicitHierarchicalMesh& hMesh,
+ nvidia::ExplicitHierarchicalMesh& iHMeshCore,
+ bool exportCoreMesh,
+ int32_t coreMeshImprintSubmeshIndex,
+ const ::FractureTools::MeshProcessingParameters& meshProcessingParams,
+ const ::FractureTools::FractureSliceDesc& desc,
+ const CollisionDesc& collisionDesc,
+ uint32_t randomSeed,
+ nvidia::IProgressListener& progressListener,
+ volatile bool* cancel = NULL
+ )
+ {
+ return ::FractureTools::createHierarchicallySplitMesh(hMesh, iHMeshCore, exportCoreMesh, coreMeshImprintSubmeshIndex, meshProcessingParams, desc, collisionDesc, randomSeed, progressListener, cancel);
+ }
+
+ virtual bool createChippedMesh
+ (
+ nvidia::ExplicitHierarchicalMesh& hMesh,
+ const ::FractureTools::MeshProcessingParameters& meshProcessingParams,
+ const ::FractureTools::FractureCutoutDesc& desc,
+ const ::FractureTools::CutoutSet& iCutoutSet,
+ const ::FractureTools::FractureSliceDesc& sliceDesc,
+ const ::FractureTools::FractureVoronoiDesc& voronoiDesc,
+ const CollisionDesc& collisionDesc,
+ uint32_t randomSeed,
+ nvidia::IProgressListener& progressListener,
+ volatile bool* cancel = NULL
+ )
+ {
+ return ::FractureTools::createChippedMesh(hMesh, meshProcessingParams, desc, iCutoutSet, sliceDesc, voronoiDesc, collisionDesc, randomSeed, progressListener, cancel);
+ }
+
+ virtual bool hierarchicallySplitChunk
+ (
+ nvidia::ExplicitHierarchicalMesh& hMesh,
+ uint32_t chunkIndex,
+ const ::FractureTools::MeshProcessingParameters& meshProcessingParams,
+ const ::FractureTools::FractureSliceDesc& desc,
+ const CollisionDesc& collisionDesc,
+ uint32_t* randomSeed,
+ nvidia::IProgressListener& progressListener,
+ volatile bool* cancel = NULL
+ )
+ {
+ return ::FractureTools::hierarchicallySplitChunk(hMesh, chunkIndex, meshProcessingParams, desc, collisionDesc, randomSeed, progressListener, cancel);
+ }
+
+ virtual bool voronoiSplitChunk
+ (
+ nvidia::ExplicitHierarchicalMesh& hMesh,
+ uint32_t chunkIndex,
+ const ::FractureTools::MeshProcessingParameters& meshProcessingParams,
+ const ::FractureTools::FractureVoronoiDesc& desc,
+ const CollisionDesc& collisionDesc,
+ uint32_t* randomSeed,
+ nvidia::IProgressListener& progressListener,
+ volatile bool* cancel = NULL
+ )
+ {
+ return ::FractureTools::voronoiSplitChunk(hMesh, chunkIndex, meshProcessingParams, desc, collisionDesc, randomSeed, progressListener, cancel);
+ }
+
+ virtual bool buildSliceMesh
+ (
+ IntersectMesh& intersectMesh,
+ nvidia::ExplicitHierarchicalMesh& referenceMesh,
+ const PxPlane& slicePlane,
+ const ::FractureTools::NoiseParameters& noiseParameters,
+ uint32_t randomSeed
+ )
+ {
+ return ::FractureTools::buildSliceMesh(intersectMesh, referenceMesh, slicePlane, noiseParameters, randomSeed);
+ }
+
+ virtual nvidia::ExplicitHierarchicalMesh* createExplicitHierarchicalMesh()
+ {
+ return ::FractureTools::createExplicitHierarchicalMesh();
+ }
+
+ virtual nvidia::ExplicitHierarchicalMesh::ConvexHull* createExplicitHierarchicalMeshConvexHull()
+ {
+ return ::FractureTools::createExplicitHierarchicalMeshConvexHull();
+ }
+};
+#endif
+
+
+
+}
+} // end namespace nvidia
+
+
+#endif // __MODULE_DESTRUCTIBLE_IMPL_H__