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

double Angle;
GLfloat light_diffuse[] = { 1.0, 0.5, 0.0, 1.0};
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_SMOOTH);
   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
 
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_DEPTH_TEST);
}

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);

   glLoadIdentity ();             /* clear the matrix */
           /* viewing transformation  */
   gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   glScalef (1.0, 1.0, 1.0);      /* modeling transformation */ 
   glRotatef (Angle, 0.0, 1.0, 0.0);
   glutSolidSphere (2.0, 10, 10);
   glutSwapBuffers();
}

void RotateOnIdle(void)
{
  Angle += 0.1;
  glLoadIdentity();
  glRotatef (Angle, 0.0, 0.0, 1.0);
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  glutPostRedisplay();
 }


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

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

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(RotateOnIdle);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}



