00001 #pragma once
00002 #include "NvBlastExtAuthoringTypes.h"
00003 #include "NvBlastExtAuthoringInternalCommon.h"
00004 #include "NvBlastExtAuthoringAccelerator.h"
00005 #include "NvBlastExtRT.h"
00006 #include <map>
00007
00008 using physx::PxVec3;
00009 using physx::PxVec2;
00010
00011
00012 namespace Nv
00013 {
00014 namespace Blast
00015 {
00016 class Mesh;
00017
00018 class VertexWelding
00019 {
00020 public:
00021
00022 typedef int32_t (VertexWelding::*LOCATE_CALLBACK)(const Vertex& v, uint32_t bucket, bool& isAllDataTheSame);
00023
00024 VertexWelding(uint32_t maxVertexCount, uint32_t maxBucketCount, float gridCellSize, float weldEpsilon, float auxEpsilon, LOCATE_CALLBACK clb);
00025
00026 const Vertex* getVertices() const
00027 {
00028 return vertex.data();
00029 }
00030 uint32_t getVerticesCount() const
00031 {
00032 return vertex.size();
00033 }
00034 void reset();
00035 int32_t WeldVertex(const Vertex *v);
00036
00037 int32_t LocateVertexInBucket(const Vertex& v, uint32_t bucket, bool& isAllDataTheSame);
00038
00039 int32_t LocateVertexInBucketOnlyPosition(const Vertex& v, uint32_t bucket, bool& isAllDataTheSame);
00040
00041
00042 private:
00043
00044
00045 int32_t ComputeHashBucketIndex(int32_t x, int32_t y, int32_t z);
00046
00047 void AddVertexToBucket(const Vertex& v, uint32_t bucket);
00048
00049 std::vector<int32_t> first;
00050 std::vector<int32_t> next;
00051 std::vector<Vertex> vertex;
00052
00053 const uint32_t maxVertexCount;
00054 const uint32_t maxBucketCount;
00055 const float gridCellSizeInv;
00056 const float weldEpsilon;
00057 const float auxEpsilon;
00058
00059 LOCATE_CALLBACK locateCallback;
00060 };
00061
00062 class BooleanToolV2 : public Fracturer
00063 {
00064 public:
00065
00066 struct Mode
00067 {
00068 int32_t ca, cb, ci;
00069 Mode() { ca = 0; cb = 0; ci = -1; };
00070 Mode(int32_t a, int32_t b, int32_t c) : ca(a), cb(b), ci(c)
00071 {
00072 }
00073
00074 static Mode Intersection()
00075 {
00076 return Mode(0, 0, 1);
00077 }
00078
00082 static Mode Union()
00083 {
00084 return Mode(1, 1, -1);
00085 }
00089 static Mode Difference()
00090 {
00091 return Mode(1, 0, -1);
00092 }
00093 };
00094
00095 BooleanToolV2();
00096
00097 void release();
00098
00103 const Mesh* mMeshA;
00104 const Mesh* mMeshB;
00105 SpatialAccelerator* mAccelA;
00106 SpatialAccelerator* mAccelB;
00107
00108
00109
00110
00114 void makeFacetFacetTests(BooleanToolOutputData* outputData, int32_t threadId, int32_t threadCount);
00115 void retain(bool isA, BooleanToolOutputData* outputData, int32_t threadId, int32_t threadCount,
00116 const DamagePattern* pattern = nullptr, int32_t chunk = -1);
00117
00121
00122
00123
00124 private:
00125
00126 int32_t computeV03(const PxVec3& point);
00127 int32_t computeV30(const PxVec3& point);
00128
00129
00133 void computeRetained(const Mesh* mesh, const physx::PxBounds3& bMeshBoudning,
00134 int32_t(BooleanToolV2::*computeV3)(const physx::PxVec3&), int32_t btC, int32_t btCI, int32_t parentFacetOffset,
00135 BooleanToolOutputData* outputData, int32_t threadId, int32_t threadCount,
00136 struct FaceOrientation* fo = nullptr, const std::vector<bool>* validAdjacentFacet = nullptr);
00137
00138
00140
00143 float* sx1;
00144 float* sy1;
00145 float* ex1;
00146 float* ey1;
00147 float* px1;
00148 float* py1;
00149 float* pt1;
00150 float* resy1;
00151 int32_t* winding1;
00152 int32_t* projectedWinding1;
00153
00154
00155 float* sx2;
00156 float* sy2;
00157 float* ex2;
00158 float* ey2;
00159 float* px2;
00160 float* py2;
00161 float* pt2;
00162 float* resy2;
00163 int32_t* winding2;
00164 int32_t* projectedWinding2;
00165
00166 uint32_t* edgeFacetTestA;
00167 uint32_t* edgeFacetTestB;
00168
00169
00173 int32_t* edgeCrossCheckTest;
00174 Vertex* edgeCrossA;
00175 Vertex* edgeCrossB;
00176
00177 Mode mToolMode;
00178 };
00179
00180 class TriangulatorV2 : public MeshGenerator
00181 {
00182 public:
00183 TriangulatorV2();
00184
00185 void release();
00186
00187 uint32_t build(const BooleanResultEdge* edges, uint32_t inEdgeCount, const Vertex* inVertices, Vertex* outWeldedVrts, uint32_t& vcount, uint32_t* outTriangles, PerTriangleAdditionalData* adata, uint32_t maxTcount, const Mesh* ma, const Mesh* mb);
00188
00189 struct LinkedListElement
00190 {
00191 uint32_t point;
00192 uint32_t nextPoint;
00193 uint32_t prevPoint;
00194 };
00195
00196 Vertex* weldedVertices;
00197 uint32_t weldedCount;
00198 uint32_t* triangleIndices;
00199 uint32_t triangleCount;
00200
00201 private:
00202
00203 void triangulatePolygonWithEarClipping(ProjectionDirections dir);
00204
00205 LinkedListElement facetList[1024];
00206 uint32_t facetListSize;
00207 uint32_t pointIndicesList[1024];
00208 uint32_t pointCount;
00209
00210 physx::PxVec2 projectedPointList[1024];
00211 uint32_t projectedPointCount;
00212
00213 uint32_t visitedFlagValue[1024];
00214 uint32_t currentFlagValue;
00215
00216
00217
00218 Edge* weldedEdges;
00219
00220
00221 const BooleanResultEdge* mInpEdges;
00222 uint32_t mInpEdgeCount;
00223 uint32_t maxTriangleCount;
00224
00225 const Mesh* meshA;
00226 const Mesh* meshB;
00227
00228 VertexWelding wldg;
00229 };
00230
00231 }
00232 }
00233