#include <cassert>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;

#include <GL/glut.h>
#include <GL/gl.h>

#include <zpr.h>

#include <graphmisc.h>

#include <gobj.h>

#include <test07.h>



test07::test07
(
  int & argc, 
  char** & argv,
  uintc mode,
  uintc x,
  uintc y,
  string const & title
)
  : myglutgui(argc,argv,mode,x,y,title), xGraphics(true)
{
  globalSet();
}

void test07::display()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  xGraphics.draw();

//cout << "drawing" << endl;
//cout << SHOW(xGraphics.vg.size()) << endl;

  glerrordisplay();
  glutSwapBuffers();
}

void test07::keyboard(unsigned char key, int x, int y)
{
  switch (key)
  {
    case 27:
      exit(0);
      break;

    case 'i':
      cout << "Enter the inner radius:  ";
      cin >> gtorus->innerRadius;
      xGraphics.nuke();
      xGraphics.push( gcomp->displaylistcreatenew(1) );
      break;

    case 'r':
      cout << "Enter the number of rings:  ";
      cin >> gtorus->rings;
      xGraphics.nuke();
      xGraphics.push( gcomp->displaylistcreatenew(1) );
      break;


  }

  glutPostRedisplay();
}


/*
void test07::f1update(doublec r)
{
  gcomp->nuke();

  gobjglGenLists* gl = new gobjglGenLists();
  gcomp->push_back(gl);

  glColor3f(1.0,0.0,0.0);
  
}
*/

void test07::f1()
{
  gcomp = new gobjContainer(true);

  gtorus = new gobjglutWireTorus(0.2,0.4,6,3);
  gcomp->push(gtorus);


/*
  xGraphics.push_back(gcomp);

    */

  xGraphics.push( gcomp->displaylistcreatenew(1) );

}


void test07::eval()
{
  OpenGLinitialisation();
  
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);

  //zpr::init();

  xGraphics.set();

  f1();

  glutPostRedisplay();
}






