Newer
Older
Import / research / 3d-z-maps / mview-0.3.3 / mview / p_mesh.cpp
//
//    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);
}