/* Demo exhibiting the use of lighting on a stillframe scene */ #include #include #include #include "tw.h" #include //variables for bedside lamp location GLfloat xVal = 7; GLfloat yVal = 3; GLfloat zVal = 1; GLfloat light[4]={xVal,yVal,zVal,0}; /*bedside table lamp position*/ /* for texture mapping */ GLuint textureIDs[2]; //sets up lighting void lamp() { GLfloat ambient [] = {0.8,0.8,0.8,1}; GLfloat diffuse [] = {0.5,0.5,0.5,1}; GLfloat specular [] = {0.9,0.9,0.9,1}; glShadeModel(GL_SMOOTH); glLightfv(GL_LIGHT0, GL_POSITION, light); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); glEnable(GL_LIGHT0); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); glEnable(GL_LIGHTING); } void drawSides() { //ground glBindTexture(GL_TEXTURE_2D, textureIDs[0]); twTriple darkGray = {0.6, 0.6, 0.6}; twColor(darkGray,0.5, 128); glEnable(GL_TEXTURE_2D); glPushMatrix(); glScalef(20,20,20); twDrawUnitSquare(10,15); glPopMatrix(); glDisable(GL_TEXTURE_2D); twTriple blue = { 0.3, 0.3, 1.0 }; twColor(blue,0,0); // glBindTexture(GL_TEXTURE_2D, textureIDs[1]); //glEnable(GL_TEXTURE_2D); //left wall /* glPushMatrix(); glRotatef(270,0,0,1); glTranslatef(-30,0,0); glScalef(30,30,30); twDrawUnitSquare(10,10); glPopMatrix(); //right wall glPushMatrix(); glTranslatef(30,0,0); glRotatef(90,0,0,1); glScalef(30,30,30); twDrawUnitSquare(10,10); glPopMatrix(); //back wall glPushMatrix(); glTranslatef(0,30,0); glRotatef(90,1,0,0); glScalef(30,30,30); twDrawUnitSquare(10,10); glPopMatrix(); // glDisable(GL_TEXTURE_2D); //ceiling twTriple dark = {0.3, 0.3, 0.3}; twColor(dark, 0.4, 50); glPushMatrix(); glTranslatef(0,30,30); glRotatef(180,1,0,0); glScalef(30,30,30); twDrawUnitSquare(10,5); glPopMatrix();*/ } /* void drawBlock(int color) { glPushMatrix(); glutSolidCube(4); glPopMatrix(); } */ void display(void) { GLfloat m[16]; int i,j; for(i=0;i<16;i++) m[i]=0.0; m[0]=m[5]=m[10]=1.0; m[7]=-1.0/30;//light[1]; glClearColor(1.0,1.0,1.0,1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); twCamera(); //draw ceiling, ground, and walls drawSides(); lamp(); glPushMatrix(); glTranslatef(5,0,4); glRotatef(45,0,1,0); //draw original block glEnable(GL_LIGHTING); glPushMatrix(); glTranslatef(0,2.5,0); twTriple blockColor = {0.7, 0.2, 0.6}; twColor(blockColor, 1, 128); glutSolidCube(4); glPopMatrix(); glPushMatrix(); glTranslatef(0,30,0); // glTranslatef(light[0], light[1],light[2]); glMultMatrixf(m); // flattens out the cube glTranslatef(0,-30,0); //glTranslatef(-light[0], -light[1],-light[2]); glDisable(GL_LIGHTING); glEnable(GL_BLEND); //glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE); twTriple blockShadow = {0.2, 0.1, 0.2}; twColor(blockShadow, 0, 0); glutSolidCube(4); glPopMatrix(); glDisable(GL_BLEND); /* glDepthMask(GL_TRUE);*/ glPopMatrix(); glFlush(); glutSwapBuffers(); } /* Loads the textures */ void loadTextures() { glGenTextures(2,textureIDs); /*generate as many textures as you load! */ twLoadTexture(textureIDs[0], "checkerPattern.ppm"); /* for ground */ twLoadTexture(textureIDs[1], "grayFlowerWallpaper.ppm"); /* for walls */ } int main(int argc, char **argv) { /* need both double buffering and z buffer */ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(650, 650); twBoundingBox(5,15,5,9,0,12); glutCreateWindow("reflection"); glutDisplayFunc(display); loadTextures(); glEnable(GL_NORMALIZE); twMainInit(); glutMainLoop(); return 0; }