summaryrefslogtreecommitdiff
path: root/thirdparty/thekla_atlas/nvmesh/MeshBuilder.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/thekla_atlas/nvmesh/MeshBuilder.h')
-rw-r--r--thirdparty/thekla_atlas/nvmesh/MeshBuilder.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/thirdparty/thekla_atlas/nvmesh/MeshBuilder.h b/thirdparty/thekla_atlas/nvmesh/MeshBuilder.h
new file mode 100644
index 0000000000..5b3af3fc1d
--- /dev/null
+++ b/thirdparty/thekla_atlas/nvmesh/MeshBuilder.h
@@ -0,0 +1,119 @@
+// This code is in the public domain -- castanyo@yahoo.es
+
+#pragma once
+#ifndef NV_MESH_MESHBUILDER_H
+#define NV_MESH_MESHBUILDER_H
+
+#include "nvmesh.h"
+#include "nvcore/Array.h"
+#include "nvmath/Vector.h"
+
+namespace nv
+{
+ class String;
+ class TriMesh;
+ class QuadTriMesh;
+ namespace HalfEdge { class Mesh; }
+
+
+ /// Mesh builder is a helper class for importers.
+ /// Ideally it should handle any vertex data, but for now it only accepts positions,
+ /// normals and texcoords.
+ class MeshBuilder
+ {
+ NV_FORBID_COPY(MeshBuilder);
+ NV_FORBID_HEAPALLOC();
+ public:
+ MeshBuilder();
+ ~MeshBuilder();
+
+ // Builder methods.
+ uint addPosition(const Vector3 & v);
+ uint addNormal(const Vector3 & v);
+ uint addTexCoord(const Vector2 & v, uint set = 0);
+ uint addColor(const Vector4 & v, uint set = 0);
+
+ void beginGroup(uint id);
+ void endGroup();
+
+ uint addMaterial(const char * name);
+ void beginMaterial(uint id);
+ void endMaterial();
+
+ void beginPolygon(uint id = 0);
+ uint addVertex(uint p, uint n = NIL, uint t0 = NIL, uint t1 = NIL, uint c0 = NIL, uint c1 = NIL, uint c2 = NIL);
+ uint addVertex(const Vector3 & p);
+ //uint addVertex(const Vector3 & p, const Vector3 & n, const Vector2 & t0 = Vector2(0), const Vector2 & t1 = Vector2(0), const Vector4 & c0 = Vector4(0), const Vector4 & c1 = Vector4(0));
+ bool endPolygon();
+
+ uint weldPositions();
+ uint weldNormals();
+ uint weldTexCoords(uint set = 0);
+ uint weldColors(uint set = 0);
+ void weldVertices();
+
+ void optimize(); // eliminate duplicate components and duplicate vertices.
+ void removeUnusedMaterials(Array<uint> & newMaterialId);
+ void sortFacesByGroup();
+ void sortFacesByMaterial();
+
+ void done();
+ void reset();
+
+ // Hints.
+ void hintTriangleCount(uint count);
+ void hintVertexCount(uint count);
+ void hintPositionCount(uint count);
+ void hintNormalCount(uint count);
+ void hintTexCoordCount(uint count, uint set = 0);
+ void hintColorCount(uint count, uint set = 0);
+
+ // Helpers.
+ void addTriangle(uint v0, uint v1, uint v2);
+ void addQuad(uint v0, uint v1, uint v2, uint v3);
+
+ // Get result.
+ TriMesh * buildTriMesh() const;
+ QuadTriMesh * buildQuadTriMesh() const;
+
+ enum Error {
+ Error_None,
+ Error_NonManifoldEdge,
+ Error_NonManifoldVertex,
+ };
+
+ HalfEdge::Mesh * buildHalfEdgeMesh(bool weldPositions, Error * error = NULL, Array<uint> * badFaces = NULL) const;
+
+ bool buildPositions(Array<Vector3> & positionArray);
+ bool buildNormals(Array<Vector3> & normalArray);
+ bool buildTexCoords(Array<Vector2> & texCoordArray, uint set = 0);
+ bool buildColors(Array<Vector4> & colorArray, uint set = 0);
+ void buildVertexToPositionMap(Array<int> & map);
+
+
+ // Expose attribute indices of the unified vertex array.
+ uint vertexCount() const;
+
+ uint positionCount() const;
+ uint normalCount() const;
+ uint texCoordCount(uint set = 0) const;
+ uint colorCount(uint set = 0) const;
+
+ uint materialCount() const;
+ const char * material(uint i) const;
+
+ uint positionIndex(uint vertex) const;
+ uint normalIndex(uint vertex) const;
+ uint texCoordIndex(uint vertex, uint set = 0) const;
+ uint colorIndex(uint vertex, uint set = 0) const;
+
+ private:
+
+ struct PrivateData;
+ PrivateData * d;
+
+ };
+
+} // nv namespace
+
+#endif // NV_MESH_MESHBUILDER_H