#include <GL/glut.h>

#include <cubedraw3d.h>
#include <graphmisc.h>

//  Issue:
//  zpr rotation ok but translation is broken.
//  Possibly because glOrtho is not called.
//    when cubedraw2d calls.


void cubedraw3d::draw()
{
  doublec w = dx * 3.0;

  glPushMatrix();
  glTranslated(0.0,0.0,w);
  writeface(0);
  cursor const & cs(cb.cs);
  double y = dx/3.0;
  glTranslated((dx-y)*0.5+cs.j*dx,dx*0.4+cs.k*dx,0.01);
  glPushAttrib(GL_CURRENT_BIT);
  glPushAttrib(GL_LIGHTING);

  glDisable(GL_LIGHTING);

  {
    glBegin(GL_TRIANGLES);

    
    glColor3f(1.0,0.0,0.0);
    glNormal3d(0.0,0.0,1.0);     
    glVertex3d(0.0,0.0,0.0);

    glColor3f(1.0,0.0,0.0);
    glNormal3d(0.0,0.0,1.0);     
    glVertex3d(y,0.0,0.0);
  
    glColor3f(0.0,0.0,1.0);
    glNormal3d(0.0,0.0,1.0);     
    glVertex3d(y*0.5,y*0.866,0.0);

    glEnd();
  }

  glPopAttrib();
  glPopAttrib();
  
  glPopMatrix();

  glPushMatrix();
  glRotated(180.0,0.0,1.0,0.0);
  glTranslated(-w,0.0,0.0);
  writeface(2);
  glPopMatrix();

  glPushMatrix();
  glTranslated(w,0.0,w);
  glRotated(90.0,0.0,1.0,0.0);
  writeface(1);
  glPopMatrix();

  glPushMatrix();
  glRotated(-90.0,0.0,1.0,0.0);
  writeface(3);
  glPopMatrix();

  // Top
  glPushMatrix();
  glTranslated(0.0,w,w);
  glRotated(-90.0,1.0,0.0,0.0);
  writeface(5);
  glPopMatrix();

  glPushMatrix();
  glRotated(90.0,1.0,0.0,0.0);
  writeface(4);
  glPopMatrix();

  glerrordisplay();
}

cubedraw3d::cubedraw3d
(
  cube const & cb_, 
  doublec dx_
)
  : cubedraw(cb_), dx(dx_) {}

void cubedraw3d::writeface(uintc i)
{
  double x;
  double y = 3.0*dx;

  uint index = i*9;

  glBegin(GL_TRIANGLES);

  double e=dx*0.1;

  for (uint k=0; k<3; ++k)
  {
    x=0.0;
    for (uint w=0; w<3; ++w)
    {
      // Write the square
      // x,y point to top left of square.

      colorset(cb.xi[index]);

      glNormal3d(0.0,0.0,1.0);
      glVertex3d(x+e,y-e,0.0);
      glNormal3d(0.0,0.0,1.0);
      glVertex3d(x+e,y-dx+e,0.0);
      glNormal3d(0.0,0.0,1.0);
      glVertex3d(x+dx-e,y-e,0.0);

      glNormal3d(0.0,0.0,1.0);
      glVertex3d(x+dx-e,y-e,0.0);
      glNormal3d(0.0,0.0,1.0);
      glVertex3d(x+e,y-dx+e,0.0);
      glNormal3d(0.0,0.0,1.0);
      glVertex3d(x+dx-e,y-dx+e,0.0);

      x += dx;
      ++index;
    }
    y -= dx;
  }

  glEnd();
}




