void init(void) { GLfloat matDiff[4] = { 0.65F, 0.05F, 0.20F, 0.60F }; GLfloat matSpec[4] = { 0.50F, 0.50F, 0.50F, 1.00F }; GLfloat matShine = 20.00F; GLint indexes[3]; GLfloat light0Pos[4] = { 0.70F, 0.70F, 1.25F, 0.00F }; glClearColor(colors[2].diff[0], colors[2].diff[1], colors[2].diff[2], 1.0F); glClearIndex((GLfloat) colors[2].indexes[1]); setProjection(); glTranslatef(0.0F, 0.0F, -2.0F); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiff); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpec); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, matShine); indexes[0] = 0; indexes[1] = colors[0].indexes[1] - colors[0].indexes[0]; indexes[2] = colors[0].indexes[2] - colors[0].indexes[0]; glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, indexes); glLightfv(GL_LIGHT0, GL_POSITION, light0Pos); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); setCheckTexture(); glEnable(GL_TEXTURE_2D); glEnable(GL_CULL_FACE); }
void redraw(void) { glClearColor(0.1, 0.1, 0.1, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_QUADS); glColor3f(0.9, 0.0, 1.0); glVertex3f(-2.0, -2.0, -1.0); glColor3f(0.9, 0.0, 1.0); glVertex3f(2.0, -2.0, -1.0); glColor3f(0.0, 0.1, 0.1); glVertex3f(2.0, 2.0, -1.0); glColor3f(0.0, 0.1, 0.1); glVertex3f(-2.0, 2.0, -1.0); glEnd(); glEnable(GL_DEPTH_TEST); if (useLighting) { glEnable(GL_LIGHTING); glPushMatrix(); glRotatef(lightRotY, 0, 1, 0); glRotatef(lightRotX, 1, 0, 0); setLight(); glPopMatrix(); } else { glColor3f(0.2, 0.2, 0.2); } if (useTexture || useSpecularTexture) { glEnable(GL_TEXTURE_2D); } if (useTexture) { setCheckTexture(); } else { setNullTexture(); } if (useSpecularTexture) { /* pass one */ glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ZERO); setMaterial(MAT_NO_SPECULAR); } else { setMaterial(MAT_ALL); } glPushMatrix(); glRotatef(objectRotY, 0, 1, 0); glRotatef(objectRotX, 1, 0, 0); if (useHighRes) { switch (drawObj) { case 0: drawSphere(64, 64, 0.8); break; case 1: drawCylinder(32, 64, 1.0, 0.4); break; case 2: drawTorus(64, 64, 0.6, 0.2); break; default: break; } } else { switch (drawObj) { case 0: drawSphere(16, 32, 0.8); break; case 1: drawCylinder(6, 16, 1.0, 0.4); break; case 2: drawTorus(32, 16, 0.6, 0.2); break; default: break; } } glPopMatrix(); if (useSpecularTexture) { /* pass two */ if (!useLighting) { glColor3f(1.0, 1.0, 1.0); } glBlendFunc(GL_ONE, GL_ONE); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); setMaterial(MAT_SPECULAR_TEXTURE_ONLY); glPushMatrix(); glRotatef(objectRotY, 0, 1, 0); glRotatef(objectRotX, 1, 0, 0); if (useHighRes) { switch (drawObj) { case 0: drawSphere(64, 64, 0.8); break; case 1: drawCylinder(32, 64, 1.0, 0.4); break; case 2: drawTorus(64, 64, 0.6, 0.2); break; default: break; } } else { switch (drawObj) { case 0: drawSphere(16, 32, 0.8); break; case 1: drawCylinder(6, 16, 1.0, 0.4); break; case 2: drawTorus(32, 16, 0.6, 0.2); break; default: break; } } glPopMatrix(); } glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); }