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 #include <3dsparse/MeshLOD.h>
00027 #include <3dsparse/MeshLODVector.h>
00028 #include <3dsparse/MeshLODTri.h>
00029
00030
00031
00032
00033
00034 namespace MeshLOD
00035 {
00036
00037
00038 void addVertices(std::vector<MeshLODVector *> &vertices,
00039 std::vector<Vertex *> &verts)
00040 {
00041 for(int i=0; i<(int) verts.size(); i++)
00042 {
00043 MeshLODVector *v = new MeshLODVector(verts[i]->position, i);
00044 vertices.push_back(v);
00045 }
00046 }
00047
00048 void addTriangles(std::vector<MeshLODVector *> &vertices,
00049 std::vector<MeshLODTri*> &triangles,
00050 std::vector<Face *> &tri)
00051 {
00052 for(int i=0; i<(int) tri.size(); i++)
00053 {
00054 MeshLODTri *t=new MeshLODTri(
00055 vertices[tri[i]->v[0]],
00056 vertices[tri[i]->v[1]],
00057 vertices[tri[i]->v[2]] );
00058 triangles.push_back(t);
00059 }
00060 }
00061
00062 MeshLODVector *minimumCostEdge(std::vector<MeshLODVector *> &vertices)
00063 {
00064
00065
00066
00067
00068
00069
00070 MeshLODVector *mn= vertices.front();
00071
00072 std::vector<MeshLODVector *>::iterator itor;
00073 for (itor = vertices.begin();
00074 itor != vertices.end();
00075 itor++)
00076 {
00077 if((*itor)->objdist < mn->objdist)
00078 {
00079 mn = *itor;
00080 }
00081 }
00082
00083 return mn;
00084 }
00085
00086 void computeAllEdgeCollapseCosts(std::vector<MeshLODVector *> &vertices)
00087 {
00088
00089
00090
00091 std::vector<MeshLODVector *>::iterator itor;
00092 for (itor = vertices.begin();
00093 itor != vertices.end();
00094 itor++)
00095 {
00096 (*itor)->computeEdgeCostAtVertex();
00097 }
00098 }
00099
00100 void removeVertex(std::vector<MeshLODVector *> &vertices, MeshLODVector *mn)
00101 {
00102 std::vector<MeshLODVector *>::iterator itor;
00103 for (itor = vertices.begin();
00104 itor != vertices.end();
00105 itor++)
00106 {
00107 if (*itor == mn)
00108 {
00109 vertices.erase(itor);
00110 return;
00111 }
00112 }
00113 }
00114
00115 void progressiveMesh(std::vector<Vertex *> &verts,
00116 std::vector<Face *> &tri,
00117 std::vector<int> &map)
00118 {
00119 std::vector<MeshLODVector *> vertices;
00120 std::vector<MeshLODTri*> triangles;
00121
00122 addVertices(vertices, verts);
00123 addTriangles(vertices, triangles, tri);
00124
00125
00126 computeAllEdgeCollapseCosts(vertices);
00127
00128
00129 map.resize(vertices.size(), 0);
00130 std::vector<int> permutation;
00131 permutation.resize(vertices.size(), 0);
00132 while(!vertices.empty())
00133 {
00134
00135 MeshLODVector *mn = minimumCostEdge(vertices);
00136
00137 permutation[mn->id] = ((int) vertices.size()) - 1;
00138
00139 map[vertices.size() - 1] = (mn->collapse)?mn->collapse->id:-1;
00140
00141 mn->collapseVertex();
00142
00143 removeVertex(vertices, mn);
00144 delete mn;
00145 }
00146 triangles.clear();
00147
00148
00149 unsigned int i;
00150 for(i=0;i<map.size();i++)
00151 {
00152 map[i] = (map[i]==-1)?0:permutation[map[i]];
00153 }
00154
00155
00156 std::vector<Vertex *> tmpVerts;
00157 for(i=0;i<verts.size();i++)
00158 {
00159 tmpVerts.push_back(verts[i]);
00160 }
00161 for(i=0; i<verts.size(); i++)
00162 {
00163 int j = permutation[i];
00164 verts[j] = tmpVerts[i];
00165 }
00166
00167
00168 for (i=0; i<tri.size(); i++)
00169 {
00170 for (int j=0; j<3; j++)
00171 {
00172 tri[i]->v[j] = permutation[tri[i]->v[j]];
00173 }
00174 }
00175 }
00176
00177
00178 }