#include <cassert>
using namespace std;

#include <gobj.h>
#include <mazedisp01.h>
#include <typedefs.h>


mazedisp01::mazedisp01
(
  doublec dx_, 
  uintc mazeorigin_,
  mazematrixD2<uint> const & mz_
)
  : mazeorigin(mazeorigin_), mz(mz_), mmap(mz,1,1), 
  dx(dx_), color(gobjglColor3f(0.0,0.0,1.0))
{
}

void mazedisp01::draw()
{
  assert(mz.valid());
  assert(mazeorigin!=0);
  assert(mazeorigin<mz.vi.size());

  mmap.relativeto(mazeorigin);
  mmap.eval();

  gobjpush(new gobjglDisable(GL_LIGHTING));
  gobjpush(new gobjglBegin(GL_LINES));
  gobjpush(new gobjglColor3f(color));

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

  gobjpush(new gobjglEnd()); 
}


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


