#include "cs148.h"

// Start time and spin rate.
const double SPIN_RATE = 45.;
double startT;

/*  Initialize material property, light source, lighting model,
 *  and depth buffer.
 */
void init(void)  {
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_SMOOTH);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_DEPTH_TEST);
   startT = CS148::getTime();
}


void display(void) {
   GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };

   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glPushMatrix();
   glTranslated(0.0, 0.0, -5.0);
   
   glPushMatrix();
   double spin = (CS148::getTime() - startT) * SPIN_RATE;
   glRotated(spin, 1.0, 0.0, 0.0);
   glLightfv(GL_LIGHT0, GL_POSITION, position);
   
   glTranslated(0.0, 0.0, 1.5);
   glDisable(GL_LIGHTING);
   glColor3f(0.0, 1.0, 1.0);
   glutWireCube(0.1);
   glEnable(GL_LIGHTING);
   
   glPopMatrix();
   glutSolidTorus(0.275, 0.85, 8, 15);
   glPopMatrix();
   glutSwapBuffers();
}


void reshape (int w, int h) {
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(40.0, (GLfloat)w/ (GLfloat)h, 1.0, 20.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}


// Idle function
void myIdle(void) {
   glutPostRedisplay();
}


int main(int argc, char** argv) {
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutIdleFunc(myIdle);
   glutMainLoop();
   return 0;
}

