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 NVBLASTEXTAUTHORINGMESHNOISER_H
00030 #define NVBLASTEXTAUTHORINGMESHNOISER_H
00031 #include <vector>
00032 #include <map>
00033 #include "NvBlastExtAuthoringInternalCommon.h"
00034
00035 namespace Nv
00036 {
00037 namespace Blast
00038 {
00039 class SimplexNoise;
00040
00044 struct EdgeToTriangles
00045 {
00046 int32_t tr[2];
00047 int32_t c;
00048 EdgeToTriangles()
00049 {
00050 c = 0;
00051 }
00055 void add(int32_t t)
00056 {
00057 tr[c] = t;
00058 ++c;
00059 }
00063 void replace(int32_t from, int32_t to)
00064 {
00065 if (tr[0] == from)
00066 {
00067 tr[0] = to;
00068 }
00069 else
00070 {
00071 if (c == 2 && tr[1] == from)
00072 {
00073 tr[1] = to;
00074 }
00075 }
00076 }
00080 int32_t getNot(int32_t id)
00081 {
00082 if (tr[0] != id)
00083 {
00084 return tr[0];
00085 }
00086 if (c == 2 && tr[1] != id)
00087 {
00088 return tr[1];
00089 }
00090 return -1;
00091 }
00092
00093 };
00094
00099 class MeshNoiser
00100 {
00101 public:
00102 MeshNoiser()
00103 {
00104 reset();
00105 }
00106
00107 void reset();
00108
00112 enum EdgeFlag { INTERNAL_EDGE, EXTERNAL_BORDER_EDGE, INTERNAL_BORDER_EDGE, EXTERNAL_EDGE, NONE };
00113
00114
00118 void setMesh(const std::vector<Triangle>& mesh);
00119
00124 void tesselateInternalSurface(float maxLen);
00125
00133 void applyNoise(SimplexNoise& noise, float falloff, int32_t relaxIterations, float relaxFactor);
00134
00135 std::vector<Triangle> getMesh();
00136
00137 private:
00138 physx::PxVec3 mOffset;
00139 float mScale;
00140 bool isTesselated;
00144 std::vector<Vertex> mVertices;
00145 std::vector<TriangleIndexed> mTriangles;
00146 std::vector<Edge> mEdges;
00147 std::map<Vertex, int32_t, VrtComp> mVertMap;
00148 std::map<Edge, int32_t> mEdgeMap;
00149
00150
00154 std::vector<Triangle> mResultTriangles;
00155
00156
00157 int32_t addVerticeIfNotExist(const Vertex& p);
00158 int32_t addEdge(const Edge& e);
00159 int32_t findEdge(const Edge& e);
00160
00161
00162
00163 void collapseEdge(int32_t id);
00164 void divideEdge(int32_t id);
00165 void updateVertEdgeInfo();
00166 void updateEdgeTriangleInfo();
00167 void relax(int32_t iterations, float factor, std::vector<Vertex>& vertices);
00168 void recalcNoiseDirs();
00169
00170
00171 std::vector<bool> mRestrictionFlag;
00172 std::vector<EdgeFlag> mEdgeFlag;
00173 std::vector<EdgeToTriangles> mTrMeshEdToTr;
00174 std::vector<int32_t> mVertexValence;
00175 std::vector<std::vector<int32_t> > mVertexToTriangleMap;
00176
00177
00178
00179 std::vector<float> mVerticesDistances;
00180 std::vector<physx::PxVec3> mVerticesNormalsSmoothed;
00181 std::vector<uint32_t> mPositionMappedVrt;
00182 std::vector<std::vector<int32_t> > mGeometryGraph;
00183
00184 void prebuildEdgeFlagArray();
00185 void computePositionedMapping();
00186 void computeFalloffAndNormals();
00187
00188 void prebuildTesselatedTriangles();
00189 };
00190
00191 }
00192 }
00193 #endif // ! NVBLASTEXTAUTHORINGMESHNOISER_H