// // File: p_mesh.cc // // (C) 2000-2006 Helmut Cantzler // // Licensed under the terms of the Lesser General Public License. // #include "p_mesh.h" int P_Mesh::read(FILE *f, int (*update_progress)(int pos), void (*set_total)(int size)) { list *shape_triangles; list *shape_vertices; vector vertex_index; Triangle *tri; Vertex *v; char type; int p1, p2, p3; float x, y, z; int tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; fseek(f, 0, SEEK_END); (*set_total)(ftell(f)); fseek(f, 0, SEEK_SET); shape_triangles = new list; shape_vertices = new list; while ((type=fgetc(f)) != EOF) { switch (type) { case '#': // Comment do // Reads till end of the line { type=fgetc(f); } while (type != EOF && type != '\n'); break; case 'v': case 'V': // Vertex type=fgetc(f); if (type == ' '){ if (fscanf(f," %f %f %f\n",&x,&y,&z) != 3) { FILE_ERROR(f, "PMesh file format error: v"); return 3; } v = new Vertex(x,y,z); add_vertex(v); // save in a vector for the triangles and shape vertex_index.push_back(v); } else { do // Reads till end of the line { type=fgetc(f); } while (type != EOF && type != '\n'); } break; case 'p': case 'P': // Polygon with 3 vertices if (fscanf(f," 3 %d %d %d\n",&p1,&p2,&p3) != 3) { FILE_ERROR(f, "PMesh file format error: p"); return 2; } if (p1 < 1 || p2 < 1 || p3 < 1 || p1 > ver_nr || p2 > ver_nr || p3 > ver_nr) { FILE_ERROR(f, "PMesh file format error: wrong vertex index"); return 2; } tri = new Triangle(vertex_index[p1-1], vertex_index[p2-1], vertex_index[p3-1]); add_triangle(tri); // save in a list for the shape shape_triangles->push_back(tri); break; case 'f': // Polygon with 3 vertices from wrongly detected OBJ files if ((fscanf(f," %d %d %d\n",&p1,&p2,&p3) == 3) || (fscanf(f," %d/%d %d/%d %d/%d\n",&p1, &tmp1, &p2, &tmp2, &p3, &tmp3) == 6) || (fscanf(f," %d/%d/%d %d/%d/%d %d/%d/%d\n", &p1, &tmp1, &tmp4, &p2, &tmp2, &tmp5, &p3, &tmp3, &tmp6) == 9)) { if (p1 < 1 || p2 < 1 || p3 < 1 || p1 > ver_nr || p2 > ver_nr || p3 > ver_nr) { FILE_ERROR(f, "PMesh/OBJ file format error: wrong vertex index"); return 2; } tri = new Triangle(vertex_index[p1-1], vertex_index[p2-1], vertex_index[p3-1]); add_triangle(tri); // save in a list for the shape shape_triangles->push_back(tri); } break; default: FILE_ERROR(f, "PMesh file format error"); return 4; break; } if ((*update_progress)(ftell(f))) return 90; } // copy the vertices of this shape over shape_vertices->insert(shape_vertices->begin(), vertex_index.begin(), vertex_index.end()); shapes->push_back(new Shape(shape_triangles, shape_vertices)); return 0; } void P_Mesh::write(FILE *f, const char *comment) { int n; list::iterator it; list::iterator iv; Vertex v; fprintf(f, "#PMesh\n"); fprintf(f, "# %s\n", comment); n=0; // vertices for (iv=vertices->begin(); iv != vertices->end(); iv++) { calc_original_coordinates(*iv, &v); fprintf(f,"v %f %f %f\n", v.x(), v.y(), v.z()); (*iv)->number=++n; } // triangles for (it=triangles->begin(); it != triangles->end(); it++) fprintf(f,"p 3 %d %d %d\n", (*it)->vertices[0]->number, (*it)->vertices[1]->number, (*it)->vertices[2]->number); }