#include #include #include #include #include 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(); }