
#include <commandline.h>
#include <graphmisc.h>
#include <point.h>
#include <regionD2linked.h>
#include <regionD2tess.h>
#include <regionD2tessdisplay.h>
#include <regionD2linkedtest.h>
#include <typedefs.h>

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


void regionD2linkedtest::test01()
{
  typedef point2<double> pt2;
  typedef regionD2linked< uint > region;

  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< region > vi(1);
  vi.push_back( region(1,2,3,4,0,0,2,0) );
  vi.push_back( region(3,5,4,0,0,1) );

  regionD2tess< vector<region> &, vector<pt2> &, uint > 
    tess(vi,pts);

  tess.print();

  assert(tess.verify());


}


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

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

  gobj::global->draw();


  glerrordisplay();
  
  glutSwapBuffers();
}



void regionD2linkedtest::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;
  typedef regionD2linked< uint > region;

  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< region > vi(1);
  vi.push_back( region(1,2,3,4,0,0,2,0) );
  vi.push_back( region(3,5,4,0,0,1) );

  typedef regionD2tess< vector<region> &, vector<pt2> &, uint > 
    tessregion; 
  tessregion tess(vi,pts);

  tess.printnumbered();
  assert(tess.verify());

  regionD2tessdisplaymesh<tessregion,uint> tessdisp(xGraphics,tess);

  tessdisp.draw();

  regionD2tessdisplaypoints<tessregion,uint> tesspoints(xGraphics,tess);
  tesspoints.draw();

  zpr zz;
  zz.update();
  glutMainLoop();
}



void regionD2linkedtest::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);


  typedef regionD2linked< uint > region;

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

  typedef regionD2tess< vector<region> &, vector<pt2> &, uint > 
    tessregion; 
  tessregion tess(vi,pts);

  tess.printnumbered();
  assert(tess.verify());

  regionD2tessdisplaymesh<tessregion,uint> tessdisp(xGraphics,tess);

  tessdisp.draw();

  regionD2tessdisplaypoints<tessregion,uint> tesspoints(xGraphics,tess);
  tesspoints.draw();

  zpr zz;
  glutMainLoop();
}



