/* Example 3.1.shading.c: OpenGL flat or smooth shading */ // by Jim X. Chen; March, 2001 #include #include #include #include #include #define ESC 27 #define SPACE 32 int Height=600, Width=600, cnt; static float vdata[3][3] = { {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0} }; void drawtriangle(float *v1, float *v2, float *v3) { glBegin(GL_TRIANGLES); glColor3f(1,0,0); glVertex3fv(v1); glColor3f(0,1,0); glVertex3fv(v2); glColor3f(0,0,1); glVertex3fv(v3); glEnd(); } drawColorCoord(float xlen, float ylen, float zlen) { // coordinate lines glBegin(GL_LINES); glColor3f(1,1,1); glVertex3f(0,0,0); glColor3f(0,0,1); glVertex3f(0,0,zlen); glColor3f(1,1,1); glVertex3f(0,0,0); glColor3f(0,1,0); glVertex3f(0,ylen, 0); glColor3f(1,1,1); glVertex3f(0,0,0); glColor3f(1,0,0); glVertex3f(xlen,0,0); glEnd(); // coordinate labels: X, Y, Z glPushMatrix(); glColor3f(1,0,0); glTranslatef(xlen,0.,0.); glScalef(xlen/Width,xlen/Width,1); glutStrokeCharacter(GLUT_STROKE_ROMAN, 'X'); glPopMatrix(); glPushMatrix(); glColor3f(0,1,0); glTranslatef(0., ylen,0.); glScalef(ylen/Width,ylen/Width,1); glutStrokeCharacter(GLUT_STROKE_ROMAN, 'Y'); glPopMatrix(); glPushMatrix(); glColor3f(0,0,1); glTranslatef(0., 0.,zlen); glScalef(zlen/Width,zlen/Width,1); glutStrokeCharacter(GLUT_STROKE_ROMAN, 'Z'); glPopMatrix(); } void display(void) { cnt++; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // alternate between flat and smooth if (cnt % 50 == 0) glShadeModel(GL_SMOOTH); if (cnt%100 == 0) glShadeModel(GL_FLAT); // alt. btween flat & smooth glPushMatrix(); glRotatef(cnt, 1,1,1); glScalef(Width/2, Width/2, Width/2); drawColorCoord(1., 1., 1.); drawtriangle(vdata[0], vdata[1], vdata[2]); glPopMatrix(); glutSwapBuffers(); } static void Reshape(int w, int h) { float zNear=w, zFar=3*w; glClearColor (0.0, 0.0, 0.0, 1.0); glEnable(GL_DEPTH_TEST); glViewport (0, 0, w, h); // hardware set to use projection transformation matrix stack glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho(-w, w, -h, h, -zNear, zFar); // hardware set to use model transformation matrix stack glMatrixMode (GL_MODELVIEW); glLoadIdentity (); } static void Key(unsigned char key, int x, int y) { switch (key) { case ESC: exit(0); case SPACE: glShadeModel(GL_FLAT); break; default: glShadeModel(GL_SMOOTH); } } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE); glutInitWindowSize(Width, Height); glutCreateWindow("Example: press SPACE & another key"); glutKeyboardFunc(Key); glutReshapeFunc(Reshape); glutDisplayFunc(display); glutIdleFunc(display); glutMainLoop(); }