#include <iostream>
using namespace std;


#include <commandline.h>
#include <graphmisc.h>
#include <maze002.h>
#include <mazedisp01.h>
#include <mazematrixD2.h>
#include <zpr.h>

string maze002::doc[] = 
{
  "",
  "Display an easy one path maze."
};

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

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

  gobj::global->draw();

  glerrordisplay();
  
  glutSwapBuffers();
}


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

  OpenGLinitialisation();

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

  xGraphics.set();

  // Construct the maze.

  mazematrixD2<uint> mz(3,3);

  uint k;
  k = mz.add();
  uint k2;
  k2 = mz.add();
  mz.link(k,1,1,3);

  mz.link(1,1,2);
  mz.link(2,1,3);
  mz.link(3,2,6);
  mz.link(6,3,5);
  mz.link(5,3,4);
  mz.link(4,2,7);
  mz.link(7,1,8);
  mz.link(8,1,9);
  mz.link(9,1,k2);

  assert(mz.valid());

  commandline cmd(argc,argv);

  double dx=0.2;
  cmd.mapvar(dx,"dx");

  mazedisp01 md(dx,1,mz);
  md.draw();
}


void maze002::eval()
{
  zpr zz;

  zz.update();
  glutMainLoop();
}


