
#include <cstdlib>
using namespace std;

#include <gobj.h>
#include <gobjtest.h>
#include <graphmisc.h>
#include <zpr.h>

string gobjtest::doc[] = 
{
  "",
  "Display a circle rotated about an axis.",
  "",
  "Serialize inverse code to opengl example."
};

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

  OpenGLinitialisation();

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

  xGraphics.set();

  gobjQuadric * gd = new gobjQuadric();
  gd->radius=.02;
  gobjpush(gd);

  gobjpush(new gobjglColor3ub(255,0,0));
  point3<double> origin(0.0,0.0,0.0);
  gobjpush( new gobjMySphereDraw(origin,gd) );

  gobjMyCircle * gc = new gobjMyCircle();
  gobjpush(new gobjglColor3ub(127,255,212));
  double radius = 1.5;
  gobjpush(new gobjMyCircleDraw(radius,origin,*gc));

  gobjpush(new myaxes(1.0));

  gobjpush(new gobjglColor3ub(55,250,0));
  point3<double> axis(1.0,0.0,0.0);
  gobjpush(new gobjMyCircleDraw(radius,origin,axis,*gc));
  
  zpr zz;
  zz.update();
  glutMainLoop();
}


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

  OpenGLinitialisation();

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

  xGraphics.set();

  gobjQuadric * gd = new gobjQuadric();
  gd->radius=.02;
  gobjpush(gd);

  gobjpush(new gobjglColor3ub(255,0,0));
  point3<double> origin(0.0,0.0,0.0);
  gobjpush( new gobjMySphereDraw(origin,gd) );

  gobjMyCircle * gc = new gobjMyCircle();
  gobjpush(new gobjglColor3ub(127,255,212));
  double radius = 1.5;
  gobjpush(new gobjMyCircleDraw(radius,origin,*gc));

  gobjpush(new myaxes(1.0));

  gobjpush(new gobjglColor3ub(55,250,0));
  point3<double> axis(1.0,0.0,0.0);
  gobjpush(new gobjMyCircleDraw(radius,origin,axis,*gc));
  
  zpr zz;
  zz.update();
  glutMainLoop();
}

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

  OpenGLinitialisation();

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

  xGraphics.set();

/*
glPushAttrib GL_CURRENT_BIT 
glPushAttrib GL_LIGHTING_BIT 
glDisable GL_LIGHTING 
glBegin GL_LINES 
glColor3f 1.0 0.0 0.0 
glVertex3f 0.0 0.0 0.0 
glVertex3f 1.0 0.0 0.0 
glColor3f 0.0 1.0 0.0 
glVertex3f 0.0 0.0 0.0 
glVertex3f 0.0 1.0 0.0 
glColor3f 0.0 0.0 1.0 
glVertex3f 0.0 0.0 0.0 
glVertex3f 0.0 0.0 1.0 
glEnd  
glPopAttrib  
glPopAttrib
*/

  gobjpush(new gobjglPushAttrib("GL_CURRENT_BIT"));
  gobjpush(new gobjglPushAttrib("GL_LIGHTING_BIT"));
  gobjpush(new gobjglDisable("GL_LIGHTING"));
  gobjpush(new gobjglBegin("GL_LINES"));
  gobjpush(new gobjglColor3f("1.0 0.0 0.0"));
  gobjpush(new gobjglVertex3f("0.0 0.0 0.0"));
  gobjpush(new gobjglVertex3f("1.0 0.0 0.0"));
  gobjpush(new gobjglColor3f("0.0 1.0 0.0"));
  gobjpush(new gobjglVertex3f("0.0 0.0 0.0"));
  gobjpush(new gobjglVertex3f("0.0 1.0 0.0"));
  gobjpush(new gobjglColor3f("0.0 0.0 1.0"));
  gobjpush(new gobjglVertex3f("0.0 0.0 0.0"));
  gobjpush(new gobjglVertex3f("0.0 0.0 1.0"));
  gobjpush(new gobjglEnd());
  gobjpush(new gobjglPopAttrib());
  gobjpush(new gobjglPopAttrib());


  glutPostRedisplay();
  
  zpr zz;
  zz.update();
  glutMainLoop();
}






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

  gobj::global->draw();

  glerrordisplay();
  
  glutSwapBuffers();
}

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


