
#include <commandline.h>

#include <point.h>
#include <polytopeD2linked.h>
#include <polytopeD2linkedtest.h>
#include <polytopeD2tess.h>
#include <polytopeD2tessdisp01.h>

#include <graphmisc.h>
#include <random.h>
#include <zpr.h>

void polytopesD2linkedtest::test01()
{
  typedef point2<double> pt2;

  vector<pt2> pts;

  pts.push_back( pt2(0.0,0.0) );
  pts.push_back( pt2(1.0,0.0) );
  pts.push_back( pt2(1.0,1.0) );
  pts.push_back( pt2(0.0,1.0) );
  pts.push_back( pt2(0.5,1.3) );

  vector<polytopeD2linked> vi(1);
  vi.push_back( polytopeD2linked(0,1,2,3,0,0,2,0) );
  vi.push_back( polytopeD2linked(2,4,3,0,0,1) );

  for (uint i=1; i<vi.size(); ++i)
    cout << (string)vi[i] << endl;

  polytopeD2tess< vector<polytopeD2linked>, vector<pt2> > 
    tess(vi,pts);
  assert(tess.verify());



  //polytopeD2linkedverify< vector<polytopeD2linked> > ver(vi);
  //assert(ver.eval());
}

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

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  xGraphics.set();

  commandline cmd(argc,argv);

  typedef point2<double> pt2;

  vector<pt2> pts(1);

  pts.push_back( pt2(0.0,0.0) );
  pts.push_back( pt2(1.0,0.0) );
  pts.push_back( pt2(1.0,1.0) );
  pts.push_back( pt2(0.0,1.0) );
  pts.push_back( pt2(0.5,1.3) );

  vector<polytopeD2linked> vi(1);
  vi.push_back( polytopeD2linked(1,2,3,4,0,0,2,0) );
  vi.push_back( polytopeD2linked(3,5,4,0,0,1) );

  polytopeD2tess< vector<polytopeD2linked>, vector<pt2> > 
    tess(vi,pts);
  assert(tess.verify());

  tess.printvi();

  pts.push_back( (pts[3]+pts[4])*0.5 );
  tess.addpoint(2,4,6);

  tess.printvi();

  assert(tess.verify());

  polytopeD2tessdisp01
  < 
    vector<pt2>, 
    vector<polytopeD2linked> 
  > tessdisp(pts,vi);

  tessdisp.multicolored=true;
  tessdisp.labelpolytopes=true;
  tessdisp.labelpoints=true;

  gobjpush(new gobjglDisable(GL_LIGHTING));
    
  tessdisp.eval(*gobj::global);

//  glDisable(GL_DEPTH_TEST);
//  glEnable(GL_BLEND);
//  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  zpr zz;
  glutMainLoop();
}


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

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  xGraphics.set();

  commandline cmd(argc,argv);

  typedef point2<double> pt2;

  vector<pt2> pts(17);

  pts[0] =  pt2(0.0,0.0);
  pts[1] =  pt2(1.0,3.0);
  pts[2] =  pt2(2.0,3.0);
  pts[3] =  pt2(3.0,2.0);
  pts[4] =  pt2(3.0,1.0);
  pts[5] =  pt2(2.0,0.0);
  pts[6] =  pt2(1.0,0.0);
  pts[7] =  pt2(0.0,0.0);
  pts[8] =  pt2(0.0,1.0);
  pts[9] =  pt2(0.0,2.0);
  pts[10] = pt2(0.0,3.0);
  pts[11] = pt2(1.0,2.0);
  pts[12] = pt2(2.0,2.0);
  pts[13] = pt2(2.0,1.0);
  pts[14] = pt2(1.0,1.0);
  pts[15] = pt2(3.0,3.0);
  pts[16] = pt2(3.0,0.0);


  vector<polytopeD2linked> vi(1);
  vi.push_back( polytopeD2linked(1,10,9,11,0,0,2,0) );
  vi.push_back( polytopeD2linked(3,12,11,9,8,14,13,4,
                                 5,0,1,0,3,0,4,0) );
  vi.push_back( polytopeD2linked(14,8,7,6,2,0,0,0) );
  vi.push_back( polytopeD2linked(4,13,5,16,2,0,0,0) );
  vi.push_back( polytopeD2linked(3,15,2,12,0,0,0,2) );

  polytopeD2tessdisp01
  < 
    vector<pt2>, 
    vector<polytopeD2linked> 
  > tessdisp(pts,vi);

  tessdisp.multicolored=true;
  tessdisp.labelpolytopes=true;
  tessdisp.labelpoints=true;
    
  tessdisp.eval(*gobj::global);

  zpr zz;
  glutMainLoop();
}



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

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

  gobj::global->draw();


  glerrordisplay();
  
  glutSwapBuffers();
}



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

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);

  xGraphics.set();

  commandline cmd(argc,argv);

  typedef point2<double> pt2;

  vector<pt2> pts;

  pts.push_back( pt2(0.0,0.0) );
  pts.push_back( pt2(0.5,0.0) );
  pts.push_back( pt2(0.5,1.0) );

  vector<polytopeD2linked> vi(1);
  vi.push_back( polytopeD2linked(1,2,2,0) );
  vi.push_back( polytopeD2linked(2,1,1,0) );

  polytopeD2tessdisp01
  < 
    vector<pt2>, 
    vector<polytopeD2linked> 
  > tessdisp(pts,vi);

  tessdisp.multicolored=true;
  tessdisp.labelpolytopes=true;
  tessdisp.labelpoints=true;
    
  tessdisp.eval(*gobj::global);

  zpr zz;
  glutMainLoop();
}


