00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef NVBLASTEXTAUTHORINGBONDGENERATORIMPL_H
00030 #define NVBLASTEXTAUTHORINGBONDGENERATORIMPL_H
00031
00032 #include "NvBlastExtAuthoringBondGenerator.h"
00033 #include "NvBlastExtAuthoringFractureTool.h"
00034 #include <PxPlane.h>
00035 #include <NvBlastExtAuthoringConvexMeshBuilder.h>
00036 #include <vector>
00037 #include <set>
00038
00039 namespace Nv
00040 {
00041 namespace Blast
00042 {
00043
00048 class BlastBondGeneratorImpl : public BlastBondGenerator
00049 {
00050 public:
00051
00052 BlastBondGeneratorImpl(ConvexMeshBuilder* builder)
00053 : mConvexMeshBuilder(builder) {};
00054
00055 virtual void release() override;
00056
00057 virtual int32_t buildDescFromInternalFracture(FractureTool* tool, const bool* chunkIsSupport,
00058 NvBlastBondDesc*& resultBondDescs, NvBlastChunkDesc*& resultChunkDescriptors) override;
00059
00060 virtual int32_t createBondBetweenMeshes(uint32_t meshACount, const Triangle* meshA, uint32_t meshBCount, const Triangle* meshB,
00061 NvBlastBond& resultBond, BondGenerationConfig conf) override;
00062
00063 virtual int32_t createBondBetweenMeshes(uint32_t meshCount, const uint32_t* geometryOffset, const Triangle* geometry,
00064 uint32_t overlapsCount, const uint32_t* overlapsA, const uint32_t* overlapsB,
00065 NvBlastBondDesc*& resultBond, BondGenerationConfig cfg) override;
00066
00067 virtual int32_t bondsFromPrefractured(uint32_t meshCount, const uint32_t* geometryOffset, const Triangle* geometry,
00068 const bool* chunkIsSupport, NvBlastBondDesc*& resultBondDescs,
00069 BondGenerationConfig conf) override;
00070
00071 virtual int32_t bondsFromPrefractured(uint32_t meshCount, const uint32_t* convexHullOffset, const CollisionHull** chunkHulls,
00072 const bool* chunkIsSupport, const uint32_t* meshGroups, NvBlastBondDesc*& resultBondDescs, float maxSeparation) override;
00073
00074
00075
00076 private:
00077 float processWithMidplanes(TriangleProcessor* trProcessor, const Triangle* mA, uint32_t mavc, const Triangle* mB, uint32_t mbvc, const CollisionHull* hull1, const CollisionHull* hull2,
00078 const std::vector<physx::PxVec3>& hull1p, const std::vector<physx::PxVec3>& hull2p,
00079 physx::PxVec3& normal, physx::PxVec3& centroid, float maxRelSeparation);
00080
00081 int32_t createFullBondListAveraged( uint32_t meshCount, const uint32_t* geometryOffset, const Triangle* geometry, const CollisionHull** chunkHulls,
00082 const bool* supportFlags, const uint32_t* meshGroups, NvBlastBondDesc*& resultBondDescs, BondGenerationConfig conf, std::set<std::pair<uint32_t, uint32_t> >* pairNotToTest = nullptr);
00083 int32_t createFullBondListExact( uint32_t meshCount, const uint32_t* geometryOffset, const Triangle* geometry,
00084 const bool* supportFlags, NvBlastBondDesc*& resultBondDescs, BondGenerationConfig conf);
00085 int32_t createFullBondListExactInternal(uint32_t meshCount, const uint32_t* geometryOffset, const Triangle* geometry,
00086 std::vector<PlaneChunkIndexer>& planeTriangleMapping , NvBlastBondDesc*& resultBondDescs);
00087 int32_t createBondForcedInternal( const std::vector<physx::PxVec3>& hull0, const std::vector<physx::PxVec3>& hull1,const CollisionHull& cHull0,
00088 const CollisionHull& cHull1, physx::PxBounds3 bound0, physx::PxBounds3 bound1, NvBlastBond& resultBond, float overlapping);
00089
00090 void buildGeometryCache(uint32_t meshCount, const uint32_t* geometryOffset, const Triangle* geometry);
00091 void resetGeometryCache();
00092
00093 ConvexMeshBuilder* mConvexMeshBuilder;
00094
00095 std::vector<std::vector<Triangle> > mGeometryCache;
00096
00097 std::vector<PlaneChunkIndexer> mPlaneCache;
00098 std::vector<CollisionHull*> mCHullCache;
00099 std::vector<std::vector<physx::PxVec3> > mHullsPointsCache;
00100 std::vector<physx::PxBounds3 > mBoundsCache;
00101
00102
00103 };
00104
00105 }
00106 }
00107
00108 #endif // NVBLASTEXTAUTHORINGBONDGENERATORIMPL_H