//
//    File: x3d_mesh.cc
//
//    (C) 2006-2008 Toby Breckon
//
//    Licensed under the terms of the Lesser General Public License.
//

#include <string.h>
#include <time.h>

#include "timeval.h"

#include "x3d_mesh.h"

int X3DMesh::read(FILE *f, int (*update)(int pos),
		  void (*setTotal)(int size))
{
  return 1;
}

void X3DMesh::write(FILE *f, const char *comment)
{
  int n;
  list<Triangle*>::iterator it;
  list<Vertex*>::iterator iv;
  Vertex v;

  // get the time for the header (and remove newline)
	
  time_t timer;
  timer=time(NULL);
  char * timestring = ctime(&timer);
  timestring[strlen(timestring) - 1] = '\0';
  
	fprintf(f, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
	fprintf(f, "<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D 3.0//EN\" \"http://www.web3d.org/specifications/x3d-3.0.dtd\">\n");
	fprintf(f,"<X3D profile=\"Immersive\" version=\"3.0\">\n");
	fprintf(f,"   <head>\n");
	fprintf(f,"    <meta name=\"author\" content=\"*enter name of original author here*\"/>\n");
	fprintf(f,"    <meta name=\"translator\" content=\"*if manually translating VRML-to-X3D, enter name of person translating here*\"/>\n");
	fprintf(f,"    <meta name=\"translated\" content=\"%s\"/>\n", timestring);
	fprintf(f,"    <meta name=\"version\" content=\"*enter version here*\"/>\n");
	fprintf(f,"    <meta name=\"reference\" content=\"*enter reference citation or relative/online url here*\"/>\n");
	fprintf(f,"    <meta name=\"copyright\" content=\"*enter copyright information here*\"/>\n");
	fprintf(f,"    <meta name=\"keywords\" content=\"*enter keywords here*\"/>\n");
	fprintf(f,"    <meta name=\"url\" content=\"*enter online url address for this file here*\"/>\n");
	fprintf(f,"    <meta name=\"generator\" content=\"mview x3D exporter\"/>\n");
	fprintf(f,"  </head>\n");
	fprintf(f,"  <Scene>\n");
	fprintf(f,"  <Group >\n");
	fprintf(f,"      <Shape >\n");
	fprintf(f,"          <Appearance >\n");
	fprintf(f,"          </Appearance>\n");

  fprintf(f,"          <IndexedFaceSet  coordIndex=\" ");
	
	n=0;    // vertex numbers
  for (iv=vertices->begin(); iv != vertices->end(); iv++)
    {
			(*iv)->number=++n;
    }
	
	// triangle output
  for (it=triangles->begin(); it != triangles->end(); it++)
	{
    fprintf(f,"%d %d %d -1 ", ((*it)->vertices[0]->number) - 1,
	    ((*it)->vertices[1]->number) - 1, ((*it)->vertices[2]->number) - 1);
  }
	fprintf(f,"\">\n");
	
		fprintf(f,"<Coordinate  point=\"");
	
  n=0;    // vertex output
  for (iv=vertices->begin(); *iv != vertices->back(); iv++)
    {
      calcOriginalCoordinates(*iv, &v);
      fprintf(f,"%f %f %f, ", v.x(), v.y(), v.z());
			(*iv)->number=++n;
    }
  fprintf(f,"%f %f %f ", v.x(), v.y(), v.z());
  fprintf(f," \" />\n");
   
fprintf(f,"		</IndexedFaceSet>\n");
fprintf(f,"      </Shape>\n");
fprintf(f,"  </Group>\n");
fprintf(f,"  </Scene>\n");
fprintf(f,"\n");
fprintf(f,"</X3D>\n");

}
