00001
00027 #pragma once
00028
00029 #include <math.h>
00030 #include <assert.h>
00031 #include <map>
00032
00033
00034 #include "QEM_Edge.h"
00035 #include "QEM_Face.h"
00036
00037 typedef std::pair< int, int > VertexPair;
00038 typedef std::map < VertexPair, int> VertexPairEdgeMap;
00039
00040 namespace QEM {
00041
00042
00047 class ProgMesh
00048 {
00049 public:
00050
00051
00052
00053
00055 int getNumVertices() const { return vertices.size(); }
00056
00058 int getNumFacesTotal() const { return faces.size(); }
00059
00061 int getNumFacesVisible() const { return faces.getNumFacesVisible(); }
00062
00064 int getNumEdges() const { return edges.size(); }
00065
00066
00067
00068
00070 void addFace (int v1, int v2, int v3);
00071
00073 int addVertex (mfloat x, mfloat y, mfloat z);
00074
00076 int addVertexWithColor (mfloat x, mfloat y, mfloat z, const RgbByte &color);
00077
00078 void recalculateCosts();
00079
00081 void doCollapse(int finalPolygonCount);
00082
00084 void doOneCollapse();
00085
00088 void presize (int nTriangles, int nVertices);
00089
00091 void clear();
00092
00094 void draw() const;
00095
00096 private:
00097
00098 Vertex getOptimumPointForEdge (Edge &e);
00099 bool willDegenerate (EdgePtr e1, EdgePtr e2) const;
00100
00101
00102 int addOptimumPoint(Edge &deadEdge);
00103 EdgePtr consolidateEdges (EdgePtr e1, EdgePtr e2, int deadFaceIndex);
00104 EdgePtr addEdge (int faceIndex, int whichFace, int vFirst, int vSecond);
00105
00106 void reportProgress (char *str);
00107
00108
00109 FaceArray faces;
00110 EdgeList edges;
00111 VertexArray vertices;
00112
00113
00114 typedef std::map <int, RgbByte> ColorMap;
00115 ColorMap colorMap;
00116
00117 VertexPairEdgeMap vertexPairEdgeMap;
00118 };
00119
00120
00121
00122 }