Loading src.cmd/Simplify.h +150 −128 Original line number Diff line number Diff line Loading @@ -309,13 +309,17 @@ class SymetricMatrix { namespace Simplify { // Global Variables & Strctures struct Triangle { int v[3];double err[4];int deleted,dirty;vec3f n;int uvs[3];vec3f uv[3];int material=-1; }; enum Attributes { NONE, NORMAL = 2, TEXCOORD = 4, COLOR = 8 }; struct Triangle { int v[3];double err[4];int deleted,dirty,attr;vec3f n;vec3f uvs[3];int material; }; struct Vertex { vec3f p;int tstart,tcount;SymetricMatrix q;int border;}; struct Ref { int tid,tvertex; }; std::vector<Triangle> triangles; std::vector<Vertex> vertices; std::vector<vec3f> uvs; std::vector<Ref> refs; std::string mtllib; std::vector<std::string> materials; Loading Loading @@ -344,12 +348,6 @@ namespace Simplify loopi(0,triangles.size()) { triangles[i].deleted=0; if (uvs.size()) { triangles[i].uv[0] = uvs[triangles[i].uvs[0]]; triangles[i].uv[1] = uvs[triangles[i].uvs[1]]; triangles[i].uv[2] = uvs[triangles[i].uvs[2]]; } } // main iteration loop Loading Loading @@ -410,7 +408,7 @@ namespace Simplify if( flipped(p,i1,i0,v1,v0,deleted1) ) continue; if ( uvs.size() > 0 ) if ( (t.attr & TEXCOORD) == TEXCOORD ) { update_uvs(i0,v0,p,deleted0); update_uvs(i0,v1,p,deleted1); Loading Loading @@ -501,7 +499,7 @@ namespace Simplify if( flipped(p,i0,i1,v0,v1,deleted0) ) continue; if( flipped(p,i1,i0,v1,v0,deleted1) ) continue; if ( uvs.size() > 0 ) if ( (t.attr & TEXCOORD) == TEXCOORD ) { update_uvs(i0,v0,p,deleted0); update_uvs(i0,v1,p,deleted1); Loading Loading @@ -583,7 +581,7 @@ namespace Simplify vec3f p1=vertices[t.v[0]].p; vec3f p2=vertices[t.v[1]].p; vec3f p3=vertices[t.v[2]].p; t.uv[r.tvertex] = interpolate(p,p1,p2,p3,t.uv); t.uvs[r.tvertex] = interpolate(p,p1,p2,p3,t.uvs); } } Loading Loading @@ -849,6 +847,9 @@ namespace Simplify int vertex_cnt = 0; int material = -1; std::map<std::string, int> material_map; std::vector<vec3f> uvs; std::vector<std::vector<int>> uvMap; while(fgets( line, 1000, fn ) != NULL) { Vertex v; Loading Loading @@ -936,13 +937,18 @@ namespace Simplify t.v[0] = integers[0]-1-vertex_cnt; t.v[1] = integers[1]-1-vertex_cnt; t.v[2] = integers[2]-1-vertex_cnt; t.attr = 0; if ( has_uv ) { t.uvs[0]=integers[6]-1-vertex_cnt; t.uvs[1]=integers[7]-1-vertex_cnt; t.uvs[2]=integers[8]-1-vertex_cnt; std::vector<int> indices; indices.push_back(integers[6]-1-vertex_cnt); indices.push_back(integers[7]-1-vertex_cnt); indices.push_back(integers[8]-1-vertex_cnt); uvMap.push_back(indices); t.attr |= TEXCOORD; } t.material = material; //geo.triangles.push_back ( tri ); triangles.push_back(t); Loading @@ -951,9 +957,19 @@ namespace Simplify } } } if (uvs.size()) { loopi(0,triangles.size()) { loopj(0,3) triangles[i].uvs[j] = uvs[uvMap[i][j]]; } } fclose(fn); printf("load_obj: vertices = %lu, triangles = %lu, uvs = %lu\n", vertices.size(), triangles.size(), uvs.size() ); //printf("load_obj: vertices = %lu, triangles = %lu, uvs = %lu\n", vertices.size(), triangles.size(), uvs.size() ); } // load_obj() // Optional : Store as OBJ Loading @@ -962,6 +978,8 @@ namespace Simplify { FILE *file=fopen(filename, "w"); int cur_material = -1; bool has_uv = (triangles.size() && (triangles[0].attr & TEXCOORD) == TEXCOORD); if (!file) { printf("write_obj: can't write data file \"%s\".\n", filename); Loading @@ -976,13 +994,15 @@ namespace Simplify //fprintf(file, "v %lf %lf %lf\n", vertices[i].p.x,vertices[i].p.y,vertices[i].p.z); fprintf(file, "v %g %g %g\n", vertices[i].p.x,vertices[i].p.y,vertices[i].p.z); //more compact: remove trailing zeros } if (has_uv) { loopi(0,triangles.size()) if(!triangles[i].deleted) { fprintf(file, "vt %g %g\n", triangles[i].uv[0].x, triangles[i].uv[0].y); fprintf(file, "vt %g %g\n", triangles[i].uv[1].x, triangles[i].uv[1].y); fprintf(file, "vt %g %g\n", triangles[i].uv[2].x, triangles[i].uv[2].y); fprintf(file, "vt %g %g\n", triangles[i].uvs[0].x, triangles[i].uvs[0].y); fprintf(file, "vt %g %g\n", triangles[i].uvs[1].x, triangles[i].uvs[1].y); fprintf(file, "vt %g %g\n", triangles[i].uvs[2].x, triangles[i].uvs[2].y); } } int uv = 1; loopi(0,triangles.size()) if(!triangles[i].deleted) { Loading @@ -991,13 +1011,15 @@ namespace Simplify cur_material = triangles[i].material; fprintf(file, "usemtl %s\n", materials[triangles[i].material]); } if (uvs.size() > 0) if (has_uv) { fprintf(file, "f %d/%d %d/%d %d/%d\n", triangles[i].v[0]+1, uv, triangles[i].v[1]+1, uv+1, triangles[i].v[2]+1, uv+2); uv += 3; } else { fprintf(file, "f %d %d %d\n", triangles[i].v[0]+1, triangles[i].v[1]+1, triangles[i].v[2]+1); } //fprintf(file, "f %d// %d// %d//\n", triangles[i].v[0]+1, triangles[i].v[1]+1, triangles[i].v[2]+1); //more compact: remove trailing zeros } fclose(file); Loading Loading
src.cmd/Simplify.h +150 −128 Original line number Diff line number Diff line Loading @@ -309,13 +309,17 @@ class SymetricMatrix { namespace Simplify { // Global Variables & Strctures struct Triangle { int v[3];double err[4];int deleted,dirty;vec3f n;int uvs[3];vec3f uv[3];int material=-1; }; enum Attributes { NONE, NORMAL = 2, TEXCOORD = 4, COLOR = 8 }; struct Triangle { int v[3];double err[4];int deleted,dirty,attr;vec3f n;vec3f uvs[3];int material; }; struct Vertex { vec3f p;int tstart,tcount;SymetricMatrix q;int border;}; struct Ref { int tid,tvertex; }; std::vector<Triangle> triangles; std::vector<Vertex> vertices; std::vector<vec3f> uvs; std::vector<Ref> refs; std::string mtllib; std::vector<std::string> materials; Loading Loading @@ -344,12 +348,6 @@ namespace Simplify loopi(0,triangles.size()) { triangles[i].deleted=0; if (uvs.size()) { triangles[i].uv[0] = uvs[triangles[i].uvs[0]]; triangles[i].uv[1] = uvs[triangles[i].uvs[1]]; triangles[i].uv[2] = uvs[triangles[i].uvs[2]]; } } // main iteration loop Loading Loading @@ -410,7 +408,7 @@ namespace Simplify if( flipped(p,i1,i0,v1,v0,deleted1) ) continue; if ( uvs.size() > 0 ) if ( (t.attr & TEXCOORD) == TEXCOORD ) { update_uvs(i0,v0,p,deleted0); update_uvs(i0,v1,p,deleted1); Loading Loading @@ -501,7 +499,7 @@ namespace Simplify if( flipped(p,i0,i1,v0,v1,deleted0) ) continue; if( flipped(p,i1,i0,v1,v0,deleted1) ) continue; if ( uvs.size() > 0 ) if ( (t.attr & TEXCOORD) == TEXCOORD ) { update_uvs(i0,v0,p,deleted0); update_uvs(i0,v1,p,deleted1); Loading Loading @@ -583,7 +581,7 @@ namespace Simplify vec3f p1=vertices[t.v[0]].p; vec3f p2=vertices[t.v[1]].p; vec3f p3=vertices[t.v[2]].p; t.uv[r.tvertex] = interpolate(p,p1,p2,p3,t.uv); t.uvs[r.tvertex] = interpolate(p,p1,p2,p3,t.uvs); } } Loading Loading @@ -849,6 +847,9 @@ namespace Simplify int vertex_cnt = 0; int material = -1; std::map<std::string, int> material_map; std::vector<vec3f> uvs; std::vector<std::vector<int>> uvMap; while(fgets( line, 1000, fn ) != NULL) { Vertex v; Loading Loading @@ -936,13 +937,18 @@ namespace Simplify t.v[0] = integers[0]-1-vertex_cnt; t.v[1] = integers[1]-1-vertex_cnt; t.v[2] = integers[2]-1-vertex_cnt; t.attr = 0; if ( has_uv ) { t.uvs[0]=integers[6]-1-vertex_cnt; t.uvs[1]=integers[7]-1-vertex_cnt; t.uvs[2]=integers[8]-1-vertex_cnt; std::vector<int> indices; indices.push_back(integers[6]-1-vertex_cnt); indices.push_back(integers[7]-1-vertex_cnt); indices.push_back(integers[8]-1-vertex_cnt); uvMap.push_back(indices); t.attr |= TEXCOORD; } t.material = material; //geo.triangles.push_back ( tri ); triangles.push_back(t); Loading @@ -951,9 +957,19 @@ namespace Simplify } } } if (uvs.size()) { loopi(0,triangles.size()) { loopj(0,3) triangles[i].uvs[j] = uvs[uvMap[i][j]]; } } fclose(fn); printf("load_obj: vertices = %lu, triangles = %lu, uvs = %lu\n", vertices.size(), triangles.size(), uvs.size() ); //printf("load_obj: vertices = %lu, triangles = %lu, uvs = %lu\n", vertices.size(), triangles.size(), uvs.size() ); } // load_obj() // Optional : Store as OBJ Loading @@ -962,6 +978,8 @@ namespace Simplify { FILE *file=fopen(filename, "w"); int cur_material = -1; bool has_uv = (triangles.size() && (triangles[0].attr & TEXCOORD) == TEXCOORD); if (!file) { printf("write_obj: can't write data file \"%s\".\n", filename); Loading @@ -976,13 +994,15 @@ namespace Simplify //fprintf(file, "v %lf %lf %lf\n", vertices[i].p.x,vertices[i].p.y,vertices[i].p.z); fprintf(file, "v %g %g %g\n", vertices[i].p.x,vertices[i].p.y,vertices[i].p.z); //more compact: remove trailing zeros } if (has_uv) { loopi(0,triangles.size()) if(!triangles[i].deleted) { fprintf(file, "vt %g %g\n", triangles[i].uv[0].x, triangles[i].uv[0].y); fprintf(file, "vt %g %g\n", triangles[i].uv[1].x, triangles[i].uv[1].y); fprintf(file, "vt %g %g\n", triangles[i].uv[2].x, triangles[i].uv[2].y); fprintf(file, "vt %g %g\n", triangles[i].uvs[0].x, triangles[i].uvs[0].y); fprintf(file, "vt %g %g\n", triangles[i].uvs[1].x, triangles[i].uvs[1].y); fprintf(file, "vt %g %g\n", triangles[i].uvs[2].x, triangles[i].uvs[2].y); } } int uv = 1; loopi(0,triangles.size()) if(!triangles[i].deleted) { Loading @@ -991,13 +1011,15 @@ namespace Simplify cur_material = triangles[i].material; fprintf(file, "usemtl %s\n", materials[triangles[i].material]); } if (uvs.size() > 0) if (has_uv) { fprintf(file, "f %d/%d %d/%d %d/%d\n", triangles[i].v[0]+1, uv, triangles[i].v[1]+1, uv+1, triangles[i].v[2]+1, uv+2); uv += 3; } else { fprintf(file, "f %d %d %d\n", triangles[i].v[0]+1, triangles[i].v[1]+1, triangles[i].v[2]+1); } //fprintf(file, "f %d// %d// %d//\n", triangles[i].v[0]+1, triangles[i].v[1]+1, triangles[i].v[2]+1); //more compact: remove trailing zeros } fclose(file); Loading