#if defined(__APPLE__) && defined (__MACH__)
#   include <GLUT/glut.h>
#else
#   include <GL/glut.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

GLfloat aspect;
GLfloat deg = 0.0;
float time = 0.0;

void display()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  GLfloat ambient_col[] = {0.1, 0.0, 0.0, 1.0 };
  GLfloat diffuse_col[] = {0.5, 0.0, 0.0, 1.0 };

  // Setup projection matrix
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(50.0, aspect, 1.0, 10.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(4.0, 4.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  glRotatef(deg, 0.0, 1.0, 0.0);
  glMaterialfv(GL_FRONT, GL_AMBIENT, ambient_col);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse_col);
  glutSolidCube(2.0);
  glutSwapBuffers();
}

void reshape(GLsizei w, GLsizei h)
{
  if(h==0)
    h = 1;

  aspect = (float) w / (float) h;
  glViewport(0,0,w,h);
}

void idle()
{
  float new_time = glutGet(GLUT_ELAPSED_TIME);

  if(new_time - time >= 0.01) {
	GLKUTdeg += ((new_time - time) * 360.0/5.0)/1000.0;
    if(deg > 360.0)
      deg -= 360.0;
    time = new_time; 
    glutPostRedisplay();
  }
}

void init()
{
  GLfloat light_dir[] = { 1.0, -1.0, 0.0, 0.0 };
  GLfloat ambient[] = {0.1, 0.1, 0.1, 1.0 };

  glClearColor(0.0, 0.0, 1.0, 0.0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glShadeModel(GL_SMOOTH);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glLightfv(GL_LIGHT0, GL_POSITION, light_dir);
  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
}

void keyboard(unsigned char key, int x, int y)
{
  if(key == 'q' || key == 'Q' || key == 27)
    exit(0);
}

int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
  glutCreateWindow("Test 1");
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutIdleFunc(idle);
  glutKeyboardFunc(keyboard);
  init();
  glutMainLoop();
  return 0;
}

