//
// File: p_mesh.cc
//
// (C) 2000-2008 Helmut Cantzler
//
// Licensed under the terms of the Lesser General Public License.
//
#include "p_mesh.h"
int PMesh::read(FILE *f, int (*updateProgress)(int pos),
void (*setTotal)(int size))
{
list<Triangle*> *shapeTriangles;
list<Vertex*> *shapeVertices;
vector<Vertex*> vertexIndex;
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);
(*setTotal)(ftell(f));
fseek(f, 0, SEEK_SET);
shapeTriangles = new list<Triangle*>;
shapeVertices = new list<Vertex*>;
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);
printf("Here!\n");
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);
addVertex(v);
// save in a vector for the triangles and shape
vertexIndex.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 > verNr || p2 > verNr || p3 > verNr)
{
FILE_ERROR(f, "PMesh file format error: wrong vertex index");
return 2;
}
tri = new Triangle(vertexIndex[p1-1], vertexIndex[p2-1],
vertexIndex[p3-1]);
addTriangle(tri);
// save in a list for the shape
shapeTriangles->push_back(tri);
break;
case 'f': // Polygon with 3 vertices from wrongly detected OBJ files
printf("Here!\n");
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 > verNr || p2 > verNr || p3 > verNr)
{
FILE_ERROR(f, "PMesh/OBJ file format error: wrong vertex index");
return 2;
}
tri = new Triangle(vertexIndex[p1-1], vertexIndex[p2-1],
vertexIndex[p3-1]);
addTriangle(tri);
// save in a list for the shape
shapeTriangles->push_back(tri);
}
break;
default:
FILE_ERROR(f, "PMesh file format error");
return 4;
break;
}
if ((*updateProgress)(ftell(f)))
return 90;
}
// copy the vertices of this shape over
shapeVertices->insert(shapeVertices->begin(),
vertexIndex.begin(), vertexIndex.end());
shapes->push_back(new Shape(shapeTriangles, shapeVertices));
return 0;
}
void PMesh::write(FILE *f, const char *comment)
{
int n;
list<Triangle*>::iterator it;
list<Vertex*>::iterator iv;
Vertex v;
fprintf(f, "#PMesh\n");
fprintf(f, "# %s\n", comment);
n=0; // vertices
for (iv=vertices->begin(); iv != vertices->end(); iv++)
{
calcOriginalCoordinates(*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);
}