#include <commandline.h>
#include <gobj.h>
#include <graphmisc.h>
#include <tetrahedron.h>
#include <tetrahedrondisplay.h>
#include <tetrahedrontest.h>
#include <triangle.h>
#include <triangle3D.h>
#include <triangledisplay.h>
#include <zpr.h>


void tetrahedrontest::keyboard01(unsigned char key, int x, int y)
{
  switch (key)
  {
    case 27:
      exit(0);
      break;
  }
}

void tetrahedrontest::display01()
{ 
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  assert(gobj::global!=0);
  gobj::global->draw();

  glerrordisplay();
  
  glutSwapBuffers();
}


void tetrahedrontest::test01(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(display01);
  glutKeyboardFunc(keyboard01);

  zpr zz;

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);
 
  commandline cmd(argc,argv);

  double a0=0.0;
  double a1=0.0;
  double a2=0.0;
  double b0=1.3;
  double b1=0.0;
  double b2=0.0;

  double c0=0.5;
  double c1=0.0;
  double c2=1.0;

  double d0=1.0;
  double d1=2.0;
  double d2=0.0;

  cmd.mapvar(a0,"a0");
  cmd.mapvar(a1,"a1");
  cmd.mapvar(a2,"a2");
  cmd.mapvar(b0,"b0");
  cmd.mapvar(b1,"b1");
  cmd.mapvar(b2,"b2");
  cmd.mapvar(c0,"c0");
  cmd.mapvar(c1,"c1");
  cmd.mapvar(c2,"c2");
  cmd.mapvar(d0,"d0");
  cmd.mapvar(d1,"d1");
  cmd.mapvar(d2,"d2");

  typedef point3<double> pt3;

  pt3 a(a0,a1,a2);
  pt3 b(b0,b1,b2);
  pt3 c(c0,c1,c2);
  pt3 d(d0,d1,d2);

  //gX.push_back( new gobjglDisable(GL_LIGHTING) );

  tetrahedron<pt3,double> tet(a,b,c,d);

/*
  visualize_tetrahedron<double> v(gX,t);

  cmd.mapvar(v.mesh_on,"mesh_on");
  cmd.mapvar(v.midpoints_on,"midpoints_on");
  cmd.mapvar(v.midpoint_center_on,"midpoint_center_on");
  cmd.mapvar(v.altitude_to_point_on,"altitude_to_point_on");
  cmd.mapvar(v.altitude_on,"altitude_on");
  cmd.mapvar(v.innersphere_on,"innersphere_on");
*/

  gX.set();


  tetrahedrondisplay< tetrahedron<pt3,double> > td(gX,tet);
  cmd.mapvar(td.mesh,"mesh");
  cmd.mapvar(td.centroid,"centroid");
  cmd.mapvar(td.trianglecenterpoints,"trianglecenterpoints");
  cmd.mapvar(td.trianglecenters,"trianglecenters");
  td.draw();


/*
  tetrahedrondisplaymesh< tetrahedron<pt3,double> > td(gX,tet);
  td.draw();

  typedef triangledisplaypoints< triangle3D<pt3,double> > 
    tridisptype;
  typedef tetrahedron<pt3,double> tettype;

  tetrahedrontriangledisplay< tettype, tridisptype > tetd(gX,tet);
  tetrahedrontriangledisplaytdimacro(tetd, turnon() ); 

  tetd.draw();
*/
    

//  v.eval();

  //t.circumcenter();


  zz.update();
  glutMainLoop();
}


void tetrahedrontest::test02(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(display01);
  glutKeyboardFunc(keyboard01);

  zpr zz;

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);
 
  commandline cmd(argc,argv);

  double a0=0.0;
  double a1=0.0;
  double a2=0.0;
  double b0=1.3;
  double b1=0.0;
  double b2=0.0;

  double c0=0.5;
  double c1=0.0;
  double c2=1.0;

  double d0=1.0;
  double d1=2.0;
  double d2=0.0;

  cmd.mapvar(a0,"a0");
  cmd.mapvar(a1,"a1");
  cmd.mapvar(a2,"a2");
  cmd.mapvar(b0,"b0");
  cmd.mapvar(b1,"b1");
  cmd.mapvar(b2,"b2");
  cmd.mapvar(c0,"c0");
  cmd.mapvar(c1,"c1");
  cmd.mapvar(c2,"c2");
  cmd.mapvar(d0,"d0");
  cmd.mapvar(d1,"d1");
  cmd.mapvar(d2,"d2");

  typedef point3<double> pt3;

  pt3 a(a0,a1,a2);
  pt3 b(b0,b1,b2);
  pt3 c(c0,c1,c2);
  pt3 d(d0,d1,d2);

  //gX.push_back( new gobjglDisable(GL_LIGHTING) );

  tetrahedron<pt3,double> tet(a,b,c,d);

  gX.set();

  tetrahedrondisplay< tetrahedron<pt3,double> > td(gX,tet);
  cmd.mapvar(td.mesh,"mesh");
  cmd.mapvar(td.centroid,"centroid");
  cmd.mapvar(td.test,"test");
  cmd.mapvar(td.trianglecenterpoints,"trianglecenterpoints");
  cmd.mapvar(td.trianglecenters,"trianglecenters");
  td.draw();

  tetrahedron<pt3,double> tet2;

  uint n(1);
  cmd.mapvar(n,"n");

  //tet.applytoself(tet2, & triangle3D<pt3,double>::centroid );
  //tet.applytoself(tet2, & triangle3D<pt3,double>::centroid, n );
  //tet.applytoself(tet2, & triangle3D<pt3,double>::gergonnepoint, n );
  //tet.applytoself(tet2, & triangle3D<pt3,double>::circumcenter, n );
  //tet.applytoself(tet2, & triangle3D<pt3,double>::incenter, n );
  //tet.applytoself(tet2, & triangle3D<pt3,double>::orthocenter, n );
  tet.applytoself(tet2, & triangle3D<pt3,double>::napoleanpoint, n );
 

  tetrahedrondisplaymesh< tetrahedron<pt3,double> > td2(gX,tet2);
  td2.draw();

  

  zz.update();
  glutMainLoop();
}


