Commit a8246ca9 authored by Tim Knip's avatar Tim Knip
Browse files

remove uv indices on triangle

parent 3e298276
Loading
Loading
Loading
Loading
+150 −128
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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);
@@ -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);
@@ -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);
		}
	}

@@ -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;
@@ -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);
@@ -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
@@ -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);
@@ -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)
		{
@@ -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);