
#include <commandline.h>
#include <graphmisc.h>
#include <spiralindex.h>
#include <spiralindextest.h>

#include <zpr.h>


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

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

  gobj::global->draw();


  glerrordisplay();
  
  glutSwapBuffers();
}

void spiralindextest::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 M = 6;
  uint N = 4;

  commandline cmd(argc,argv);
  cmd.mapvar(M,"M");
  cmd.mapvar(N,"N");
  bool anticlockwise(true);
  cmd.mapvar(anticlockwise,"anticlockwise");

  double dy = 1.0 / ((double)M-1.0);
  double dx = 1.0 / ((double)N-1.0);

  gobjQuadric * q2 = new gobjQuadric();
  q2->radius = 0.02;
  q2->slices=20;
  q2->loops=6;
  gobjpush(q2);

  gobjpush( new gobjglColor3ub(0,255,0) );
  for (uint r=0; r<M; ++r)
  {
    for (uint k=0; k<N; ++k)
      { gobjpush( new gobjMySphereDraw(pt3(dx*k,1.0-dy*r,0.0),q2) ); }
  }

  spiralindex<> si(M,N,anticlockwise);

  gobjpush( new gobjglColor3ub(255,0,0) );
  gobjpush( new gobjglBegin(GL_LINE_STRIP) );

  int row;
  int col;

  for (si.reset(); !si; ++si)
  {
    si.pos(row,col);
    gobjpush( new gobjglVertex3d( pt3(dx*col,1.0-dy*row,0.0) ) );
  }

  gobjpush( new gobjglEnd() );


  zpr zz;
  glutMainLoop();
}

void spiralindextest::test01(int argc, char** argv)
{
  uint M = 6;
  uint N = 4;

  commandline cmd(argc,argv);
  cmd.mapvar(M,"M");
  cmd.mapvar(N,"N");
  bool anticlockwise(true);
  cmd.mapvar(anticlockwise,"anticlockwise");

  spiralindex<> si(M,N,anticlockwise);

  int k2;

  int row;
  int col;

  for (si.reset(); !si; ++si)
  {
    si.pos(row,col);
    si.pos(k2);
    cout << "(" << row << ", " << col << ")   ";
    cout << SHOW(k2) << endl;
  }
}

void spiralindextest::test03(int argc, char** argv)
{
  uint M = 6;
  uint N = 4;
  uint Z = 3;

  commandline cmd(argc,argv);
  cmd.mapvar(M,"M");
  cmd.mapvar(N,"N");
  cmd.mapvar(Z,"Z");
  bool anticlockwise(true);
  cmd.mapvar(anticlockwise,"anticlockwise");

  spiralindex3D<> si(M,N,Z,anticlockwise);

  int k2;

  int row;
  int col;
  int z;

  int count = 0;
  for (si.reset(); !si; ++si)
  {
    si.pos(row,col,z);
    si.pos(k2);
    cout << "(" << row << ", " << col << ", " << z << ")   ";
    cout << SHOW(k2) << endl;

    if (++count == 100)
      break;
    
  }

}


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

  uint M = 6;
  uint N = 4;
  uint Z = 3;

  commandline cmd(argc,argv);
  cmd.mapvar(M,"M");
  cmd.mapvar(N,"N");
  cmd.mapvar(Z,"Z");
  bool anticlockwise(true);
  cmd.mapvar(anticlockwise,"anticlockwise");

  double dy = 1.0 / ((double)M-1.0);
  double dx = 1.0 / ((double)N-1.0);
  double dz = 1.0 / ((double)Z-1.0);

  gobjQuadric * q2 = new gobjQuadric();
  q2->radius = 0.02;
  q2->slices=20;
  q2->loops=6;
  gobjpush(q2);

  gobjpush( new gobjglColor3ub(0,255,0) );
  for (uint zi=0; zi<Z; ++zi)
  {
    for (uint r=0; r<M; ++r)
    {
      for (uint k=0; k<N; ++k)
        { gobjpush( new gobjMySphereDraw(pt3(dx*k,1.0-dy*r,dz*zi),q2) ); }
    }
  }

  spiralindex3D<> si(M,N,Z,anticlockwise);

  gobjpush( new gobjglColor3ub(255,0,0) );
  gobjpush( new gobjglBegin(GL_LINE_STRIP) );

  int row;
  int col;
  int z;

  for (si.reset(); !si; ++si)
  {
    si.pos(row,col,z);
    gobjpush( new gobjglVertex3d( pt3(dx*col,1.0-dy*row,dz*z) ) );
  }

  gobjpush( new gobjglEnd() );


  zpr zz;
  glutMainLoop();
}


