Commit d916d047 authored by Martin Mirbauer's avatar Martin Mirbauer
Browse files

added support for loading .off files: works but the simplification algorithm...

added support for loading .off files: works but the simplification algorithm seems to break "real-world" objects from ModelNet40 with non-uniform triangle density, e.g. in chair_0451 the overall chair shape disappears, keeping only the seat and its nearby parts connecting it to (now non-existent) legs, so that it looks more like a table; when "simplifying less" (targeting more faces/triangles than 1024, about 7000), the backrest is there but legs are partially missing
parent ba94ec26
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -34,15 +34,37 @@ void showHelp(const char * argv[]) {
#endif
} //showHelp()

void load(const char * fname) {
	int len = strlen(fname);
	if (len < 4) {
		printf("file name too short\n");
		return;
	}
	const char *ext = fname + (len - 4);
	printf("Extension: %s\n", ext);
	if (strcmp(ext, ".off") == 0) {
		printf("Loading off\n");
		Simplify::load_off(fname);
	} else if (strcmp(ext, ".obj") == 0) {
                printf("Loading obj\n");
		Simplify::load_obj(fname);
        } else {
                printf("Error: unknown file extension\n");
		return;
	}
}

int main(int argc, const char * argv[]) {
    printf("Mesh Simplification (C)2014 by Sven Forstmann in 2014, MIT License (%zu-bit)\n", sizeof(size_t)*8);
    if (argc < 3) {
        showHelp(argv);
        return EXIT_SUCCESS;
    }
	Simplify::load_obj(argv[1]);
	load(argv[1]);
	if ((Simplify::triangles.size() < 3) || (Simplify::vertices.size() < 3))
		return EXIT_FAILURE;
//	Simplify::write_obj(argv[2]);
//return 123;
	int target_count = min(Simplify::triangles.size(), 1024);
    if (argc > 3) {
    	target_count = atoi(argv[3]);
+97 −0
Original line number Diff line number Diff line
@@ -829,6 +829,102 @@ namespace Simplify
		return str;
	}

	void load_off (const char* filename) {
		vertices.clear();
		triangles.clear();
		//printf ( "Loading Objects %s ... \n",filename);
		FILE* fn;
		if(filename==NULL)		return ;
		if((char)filename[0]==0)	return ;
		if ((fn = fopen(filename, "rb")) == NULL)
		{
			printf ( "File %s not found!\n" ,filename );
			return;
		}
		char line[1000];
		memset ( line,0,1000 );
		int vertex_cnt = 0, triangle_cnt = 0, quad_cnt = 0;
		int material = -1;
		std::map<std::string, int> material_map;
		std::vector<vec3f> uvs;
		std::vector<std::vector<int> > uvMap;

		bool header_was_split = false;

		while(fgets( line, 1000, fn ) != NULL)
		{
			printf("Line: %s", line);
			char * trimmed_line = trimwhitespace(line);

			if (strcmp(trimmed_line, "OFF") == 0) {
				printf("split\n");
				header_was_split = true;
				continue;
			}

			if (header_was_split && sscanf(trimmed_line, "%d %d %d", &vertex_cnt, &triangle_cnt, &quad_cnt) == 3) {
				printf("split - cont'd counts\n");
				break;
			} else if (sscanf(trimmed_line, "OFF%d %d %d", &vertex_cnt, &triangle_cnt, &quad_cnt) == 3) {
				printf("no space\n");
				break;
			} else if (sscanf(trimmed_line, "OFF %d %d %d", &vertex_cnt, &triangle_cnt, &quad_cnt) == 3) {
				printf("space\n");
				break;
			} else {
				printf("Error: Unknown header\n");
				return;
			}
		}
		printf("OFF: %d vertices, %d triangles, %d quads\n", vertex_cnt, triangle_cnt, quad_cnt);

		if (quad_cnt > 0) {
			printf("non-zero quads!\n");
			return;
		}

		for (int vertex = 0; vertex < vertex_cnt; ++vertex) {
			Vertex v;
			if (fgets( line, 1000, fn ) == NULL) {
				printf("Error reading vertices\n");
			}
			if (sscanf(line, "%lf %lf %lf", &v.p.x, &v.p.y, &v.p.z) == 3) {
				vertices.push_back(v);
			} else {
				printf("Error: unexpected non-vertex data: %s\n", line);
				return;
			}
		}

		for (int tri = 0; tri < triangle_cnt; ++tri) {
			if (fgets( line, 1000, fn ) == NULL) {
				printf("Error reading triangles\n");
			}

			int sides;
			int integers[3];

			if ((sscanf(line, "%d %d %d %d", &sides, &integers[0], &integers[1], &integers[2]) == 4) && (sides == 3)) {
				Triangle t;
				t.v[0] = integers[0];
				t.v[1] = integers[1];
				t.v[2] = integers[2];
				t.attr = 0; // ?
				t.material = -1;

				triangles.push_back(t);
			} else {
				printf("Error: unexpected non-triangle data: %s\n", line);
				return;
			}
		}

		fclose(fn);

		printf("load_off: vertices = %lu, triangles = %lu\n", vertices.size(), triangles.size());
	} // load_obj()


	//Option : Load OBJ
	void load_obj(const char* filename, bool process_uv=false){
		vertices.clear();
@@ -972,6 +1068,7 @@ namespace Simplify
		//printf("load_obj: vertices = %lu, triangles = %lu, uvs = %lu\n", vertices.size(), triangles.size(), uvs.size() );
	} // load_obj()


	// Optional : Store as OBJ

	void write_obj(const char* filename)