#include <pointgrid3Ddraw.h>


pointgrid3Ddraw::pointgrid3Ddraw(pointgrid3D const & _pg)
  : gobjContainer(true), pg(_pg)
{
  displaypoints=true;

  quadric = new gobjQuadric();
  quadric->radius = 0.02;
  quadric->slices=20;
  quadric->loops=6;

  displayedges=true;

  update();
}

pointgrid3Ddraw::~pointgrid3Ddraw()
{
  delete quadric;
}

void pointgrid3Ddraw::update()
{
  nuke();

  push( new gobjglPushAttrib(GL_LIGHTING) );
  push( new gobjglPushAttrib(GL_CURRENT_BIT) );

  if (displaypoints==true)
  {
    push(new gobjglEnable(GL_LIGHTING) );
    
    push( new gobjglColor3ub(0,255,0) );
    uintc sz = pg.M*pg.N;
    for (uint i=0; i<sz; ++i)
      push( new gobjMySphereDraw(pg.pt[i],quadric) );
  }

  if (displayedges==true)
  {
    push(new gobjglDisable(GL_LIGHTING) );

    push( new gobjglColor3ub(255,0,0) );

    uintc M = pg.M;
    uintc N = pg.N;
    uint r,k;
    push( new gobjglBegin(GL_LINE) ); 

    for (r=0; r<M; ++r)
    {
      for (k=1; k<N; ++k)
      {
        // Draw line pij(k-1,i) to pij(k,i)
        push( new gobjglVertex3f(pg.pij(k-1,r )) );
        push( new gobjglVertex3f(pg.pij(k,r )) );
      }
    }

    for (k=0; k<N; ++k)
    {
      for (r=1; r<M; ++r)
      {
        push( new gobjglVertex3f(pg.pij(k,r-1 )) );
        push( new gobjglVertex3f(pg.pij(k,r )) );
      }
    }

    push( new gobjglEnd() );

    push( new gobjglPopAttrib() );
    push( new gobjglPopAttrib() );
  }
}



