
#include <vector>
using namespace std;

#include <pointsdisplay.h>
#include <functionalobjectoperators.h>
#include <gobj.h>
#include <graphmisc.h>
#include <random.h>
#include <snakesort.h>
#include <snakesorttest.h>
#include <zpr.h>

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

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

  gobj::global->draw();


  glerrordisplay();
  
  glutSwapBuffers();
}

void snakesorttest::test01(int argc, char** argv)
{
  int a1[]=
  {
    93,2,95,-2,5, 
    84,23,58,-10,50,
    100,120,-73 
  };

  snakesort::d1(&a1[0],13,5,less<int>());
  cout << print(a1,a1+13) << endl;
}


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

  uint N(125);
  vector< point2<double> > v;
  fillvec(v,N);

  snakesort::d2(&v[0],v.size(),less<double>());

  drawlinethroughpoints(v);

  typedef point3<double> pt3;

  vector<pt3> v2;
  for (uint i=0; i<N; ++i)
    v2.push_back( pt3(v[i].x,v[i].y,0.0) );
  drawpoints(v2);

  gobjpush( new myaxes(1.0) );
  

  gobj::global->displaylist(1);
  zpr zz;
  glutMainLoop();
}

void snakesorttest::drawlinethroughpoints
( 
  vector<pt2> const & v 
)
{
  gobjpush(new gobjglDisable(GL_LIGHTING));
  gobjpush( new gobjglColor3f(1.0,0.0,0.0) );
  gobjpush( new gobjglBegin(GL_LINE_STRIP) ); 

  for (uint i=0; i<v.size(); ++i)
    { gobjpush( new gobjglVertex2f(v[i]) ); }

  gobjpush( new gobjglEnd() );
}

void snakesorttest::drawlinethroughpoints
(
  vector<pt3> const & v
) 
{
  gobjpush(new gobjglDisable(GL_LIGHTING));
  gobjpush( new gobjglColor3f(1.0,0.0,0.0) );
  gobjpush( new gobjglBegin(GL_LINE_STRIP) ); 

  for (uint i=0; i<v.size(); ++i)
    { gobjpush( new gobjglVertex3f(v[i]) ); }

  gobjpush( new gobjglEnd() );
}

void snakesorttest::fillvec
( 
  vector<pt2> & v, 
  uintc n 
) 
{
  random11<> r; 
 
  for (uint i=0; i<n; ++i)
    v.push_back( pt2(r(),r()) );
}

void snakesorttest::fillvec
( 
  vector<pt3> & v, 
  uintc n 
) 
{
  random11<> r; 
 
  for (uint i=0; i<n; ++i)
    v.push_back( pt3(r(),r(),r()) );
}

void snakesorttest::drawpoints(vector<pt3> const & v)
{
  gobjpush( new gobjglPushAttrib(GL_CURRENT_BIT) );
  gobjpush( new gobjglPushAttrib(GL_LIGHTING_BIT) );
  gobjpush( new gobjglDisable(GL_LIGHTING) );
  gobjpush( new gobjglColor3f(1.0,1.0,0.0) );
    
  pointsdisplay3D<pt3> dp(v,true,false);

  gobjpush( new gobjglPopAttrib() );
  gobjpush( new gobjglPopAttrib() );
}





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

  uint N(100);
  vector< pt3 > v;
  fillvec(v,N);

  snakesort::d3(&v[0],N,less<double>());

  drawlinethroughpoints(v);
  drawpoints(v);

  gobjpush( new myaxes(1.0) );

  gobj::global->displaylist(1);
  zpr zz;
  glutMainLoop();
}


