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

void init(void) {
   GLfloat mat_diffuse[]      = { 1.0, 0.3, 0.3, 1.0 };
   GLfloat mat_specular[]     = { 1.0, 1.0, 1.0, 1.0 };  
   GLfloat mat_shininess[]    = { 50.0 }; 
   GLfloat light_position[]   = { 1.0, 1.0, 1.0, 0.0 };
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_SMOOTH);
   glMaterialfv (GL_FRONT,  GL_DIFFUSE,   mat_diffuse);
   glMaterialfv (GL_FRONT,  GL_SPECULAR,  mat_specular);
   glMaterialfv (GL_FRONT,  GL_SHININESS, mat_shininess); 
   glLightfv    (GL_LIGHT0, GL_POSITION,  light_position);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_DEPTH_TEST);
}

void reshape (int w, int h){
   GLfloat p = (GLfloat) w / (GLfloat) h;
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION); 
   glLoadIdentity();
   if (p > 1.0) glOrtho(-2*p,2*p,-1.5,1.5,-10.0,10.0);
           else glOrtho(-1.5,1.5,-2/p,2/p,-10.0,10.0);
   glMatrixMode(GL_MODELVIEW); 
   glLoadIdentity();
}

void display(void) {
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glLoadIdentity();
   glRotatef(-40.0, 0.0, 1.0, 0.0); 
   glRotatef( 20.0, 1.0, 0.0, 0.0);
   glutSolidTeapot(1.0);
   glFlush();
}

int main(int argc, char** argv) {
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
   glutInitWindowSize (800, 600); 
   glutInitWindowPosition (0,0);
   glutCreateWindow ("teapot");
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutMainLoop(); return 0;
}