#include <iostream>
using namespace std;


#include <commandline.h>
#include <graphmisc.h>
#include <maze001.h>
#include <zpr.h>

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

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

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

  gobj::global->draw();


  glerrordisplay();
  
  glutSwapBuffers();
}

void maze001::celldraw
( 
  cellD2<uint> const & x,
  point2<double> const & p00
)
{
  point2<double> p10 = p00;
  p10.x += dx;
  point2<double> p01 = p00;
  p01.y += dx;
  point2<double> p11 = p00;
  p11.x += dx;
  p11.y += dx;

  if (x.ni[1]==0)
  {
    gobjpush(new gobjglVertex2d(p10));
    gobjpush(new gobjglVertex2d(p11));
  }

  if (x.ni[3]==0)
  {
    gobjpush(new gobjglVertex2d(p01));
    gobjpush(new gobjglVertex2d(p00));
  }

  
  if (x.ni[0]==0)
  {
    gobjpush(new gobjglVertex2d(p01));
    gobjpush(new gobjglVertex2d(p11));
  }
  
  if (x.ni[2]==0)
  {
    gobjpush(new gobjglVertex2d(p00));
    gobjpush(new gobjglVertex2d(p10));
  }



}

void maze001::constructgraphics()
{

  gobjpush(new gobjglDisable(GL_LIGHTING));
  gobjpush(new gobjglBegin(GL_LINES));
  gobjpush(new gobjglColor3f(0.0,0.0,1.0));

  uint id;
  point2<int> pos1;
  point2<double> pos2;
  for (mmap.reset(); !mmap; ++mmap)
  {
    id=mmap.currentIndex();
    pos1=mmap.currentPosition();
    pos2.x = dx*pos1.x+origin.x;
    pos2.y = dx*pos1.y+origin.y;
    celldraw(mz.vi[id],pos2);
  }

  gobjpush(new gobjglEnd()); 
}

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

  OpenGLinitialisation();

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

  xGraphics.set();

  commandline cmd(argc,argv);

  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());

  mmap.relativeto(1);
  mmap.eval();

  dx=0.2;
  origin = point2<double>(0.0,0.0);

  cmd.mapvar(dx,"dx");
  cmd.mapvar(origin.x,"originx");
  cmd.mapvar(origin.y,"originy");
  


/*
  gobjpush(new gobjglColor3ub(34,139,34));
  //gridsquare * gs = new gridsquare(1,0x0101,5,5,1.0,1.0);
  gridsquare * gs = new gridsquare(1,0xaaaa,5,5,1.0,1.0);
  
  gobjpush(gs);
*/

}


void maze001::eval()
{
  constructgraphics();

  zpr zz;

  zz.update();
  glutMainLoop();
}


