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

static GLfloat lightColor[] = {0.8, 1.0, 0.8, 1.0}; 
static GLfloat matColor[] = {0.8, 1.0, 0.1, 1.0}, 
               whiteColor[] = {1.0, 1.0, 1.0, 1.0},
               shininess[] = { 50.0 },
               lightPosition[] = {1,1,1,0};

GLfloat alpha = 0;

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();
   gluLookAt (3.0, 2.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   glPushMatrix();
   glRotatef(alpha, 0.0, 1.0, 0.0);
   glColor3f(1.0, 0.0, 0.0);
   glutSolidSphere (1.0, 16, 16);

   glTranslatef(0.0,0.0,-2.0);
   glMaterialfv(GL_FRONT, GL_DIFFUSE,   matColor);
   glMaterialfv(GL_FRONT, GL_SPECULAR,  whiteColor);
   glMaterialfv(GL_FRONT, GL_SHININESS, shininess);
   glColor3f(0.0, 1.0, 0.0);
   glutSolidCube(1.0);

   glPopMatrix();
   glTranslatef(1,0,4);
   glRotatef(alpha, 0.0, 1.0, 0.0);
   glDisable(GL_LIGHTING);

   glBegin(GL_LINES);
     glColor3f(1,0,0);
     glVertex3f(0,0,0);
     glVertex3f(.5,0,0);
     glColor3f(0,1,0);
     glVertex3f(0,0,0);
     glVertex3f(0,.5,0);
     glColor3f(0,0,1);
     glVertex3f(0,0,0);
     glVertex3f(0,0,.5);
   glEnd();
   glEnable(GL_LIGHTING);

   glutSwapBuffers();
   glFlush ();
}


void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
   glMatrixMode (GL_MODELVIEW);
}


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

void idle()
{
   alpha +=1;
   if (alpha>=360) alpha =0;
   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]);
   glClearColor (0.0, 0.0, 0.1, 0.0);
   glShadeModel (GL_FLAT);

   glEnable(GL_DEPTH_TEST);

   glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
   glLightfv(GL_LIGHT0, GL_DIFFUSE,  lightColor);
   glLightfv(GL_LIGHT0, GL_SPECULAR,  lightColor);
   glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
//   glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1);
//   glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05);
   glEnable(GL_LIGHT0);
   glEnable(GL_LIGHTING);

   glutIdleFunc(idle);
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}
