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

static GLdouble viewer[]= {2.0, 1.0, 2.0}; /* initial viewer location */

void displayRoom(void)
{

  // properties of light source GL_LIGHT0:
  GLfloat lightPosition[] = { 1.0f, 1.0f, 1.0f, 0.0f };
  glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);  
  // GLfloat ambient[] = { 0.4f, 0.4f, 0.4f, 1.0f };
  GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  GLfloat diffuse[] = { 0.3f, 0.3f, 0.3f, 1.0f };
  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  GLfloat specular[] = { 0.0f, 1.0f, 0.0f, 1.0f };
  glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

  // properties of light source GL_LIGHT1:
//  GLfloat lightPosition2[] = { 1.5f, 1.07f, 1.5f, 0.0 };
  GLfloat lightPosition2[] = { -3.0f, 3.0f, 3.0f, 0.0 };
  glLightfv(GL_LIGHT1, GL_POSITION, lightPosition2);  
  GLfloat lightDirection2[] = { 1.0f, -1.0f, -1.0f, 0.0f };
  glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, lightDirection2);  
  glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 75.0);  
  glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);  

  // GLfloat ambient2[] = { 0.4f, 0.4f, 0.4f, 1.0f };
  GLfloat ambient2[] = { 0.0f, 0.0f, 0.0f, 1.0f };
  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient2);
  GLfloat diffuse2[] = { 0.3f, 0.3f, 0.3f, 1.0f };
  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2);
  GLfloat specular2[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  glLightfv(GL_LIGHT1, GL_SPECULAR, specular2);

  // properties of surface material:
  GLfloat mat_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  GLfloat mat_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  GLfloat mat_shininess[] = { 50.0f };

  // the camera:
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  double winHt = 1.0; 
  glOrtho(-winHt*64/48.0, winHt*64/48.0, -winHt, winHt, 0.1, 100);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(viewer[0],viewer[1],viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );  
  glColor3d(0,0,0);

  //cube room
  GLfloat mat_ambient1[] = { 0.5f, 0.5f, 0.5f, 1.0f };
  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient1);
  glPushMatrix();
  glTranslated(1.5, 1.5, 1.5);
  glutSolidCube(3.0);
  glPopMatrix();

  //table surface
//  GLfloat mat_ambient2[] = { 0.1f, 0.07f, 0.03f, 1.0f };
  GLfloat mat_ambient2[] = { 0.0f, 0.0f, 0.0f, 1.0f };
  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient2);
  glPushMatrix();
  glTranslated(1.5, 1.0, 1.5);
  glRotated(90.0, 1.0, 0.0, 0.0);
  GLUquadricObj * qobj;
  qobj = gluNewQuadric();
  gluQuadricDrawStyle(qobj,GLU_FILL); 
  gluDisk(qobj, 0.0, .6, 20, 5);
  glPopMatrix();

  //table column
  GLfloat mat_ambient3[] = { 0.05f, 0.02f, 0.01f, 1.0f };
  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient3);
  glPushMatrix();
  glTranslated(1.5, 1.0, 1.5);
  glRotated(90.0, 1.0, 0.0, 0.0);
  GLUquadricObj * qobj2;
  qobj2 = gluNewQuadric();
  gluQuadricDrawStyle(qobj2,GLU_FILL); 
  gluCylinder(qobj2, 0.2, 0.2, 1.0, 12, 12);
  glPopMatrix();

  //egg
    GLfloat emit[] = { 1.0f, 0.0f, 0.0f, 0.0f };
    glMaterialfv(GL_FRONT, GL_EMISSION, emit);

  glShadeModel(GL_SMOOTH);
  GLfloat mat_ambient4[] = { 0.9f, 0.9f, 0.7f, 1.0f };
  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient4);
  glPushMatrix();
  glTranslated(1.5, 1.07, 1.5);
  GLUquadricObj * qobj3;
  qobj3 = gluNewQuadric();
  gluQuadricDrawStyle(qobj3,GLU_FILL); 
  gluSphere(qobj3, .1, 20, 20);
  glPopMatrix();
  glShadeModel(GL_FLAT);

  //put all the materials back the way they started:
  glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
  // and turn off the $(#&% egg:
  GLfloat no_emit[] = { 0.0f, 0.0f, 0.0f, 0.0f };
  glMaterialfv(GL_FRONT, GL_EMISSION, no_emit);

  glFlush();
}

void main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(640, 480);
  glutInitWindowPosition(100, 100);
  glutCreateWindow("Still life with egg");
  glutDisplayFunc(displayRoom);

  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_LIGHT1);
  glShadeModel(GL_FLAT);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_NORMALIZE);
  
  glClearColor(0.1f, 0.1f, 0.1f, 0.0f);
  glViewport(0, 0, 640, 480);
  glutMainLoop();
}



