| /** |
| * Test flat shading and clipping. |
| * |
| * Brian Paul |
| * 30 August 2007 |
| */ |
| |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <math.h> |
| #include <GL/glut.h> |
| |
| static int Win; |
| static GLfloat Scale = 2.0, Zrot = 50; |
| static GLenum Mode = GL_LINE_LOOP; |
| static GLboolean Smooth = 0; |
| static GLenum PolygonMode = GL_FILL; |
| |
| |
| static void |
| Draw(void) |
| { |
| glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| |
| if (Smooth) |
| glShadeModel(GL_SMOOTH); |
| else |
| glShadeModel(GL_FLAT); |
| |
| glPushMatrix(); |
| glScalef(Scale, Scale, 1); |
| glRotatef(Zrot, 0, 0, 1); |
| |
| glPolygonMode(GL_FRONT_AND_BACK, PolygonMode); |
| |
| glBegin(Mode); |
| glColor3f(1, 0, 0); |
| glVertex2f(-1, -1); |
| glColor3f(0, 1, 0); |
| glVertex2f( 2, -1); |
| glColor3f(0, 0, 1); |
| glVertex2f( 0, 1); |
| glEnd(); |
| |
| glPushMatrix(); |
| glScalef(0.9, 0.9, 1); |
| glBegin(Mode); |
| glColor3f(1, 0, 0); |
| glVertex2f( 0, 1); |
| |
| glColor3f(0, 0, 1); |
| glVertex2f( 2, -1); |
| |
| glColor3f(0, 1, 0); |
| glVertex2f(-1, -1); |
| |
| glEnd(); |
| glPopMatrix(); |
| |
| glPopMatrix(); |
| |
| glutSwapBuffers(); |
| } |
| |
| |
| static void |
| Reshape(int width, int height) |
| { |
| glViewport(0, 0, width, height); |
| glMatrixMode(GL_PROJECTION); |
| glLoadIdentity(); |
| glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); |
| glMatrixMode(GL_MODELVIEW); |
| glLoadIdentity(); |
| glTranslatef(0.0, 0.0, -15.0); |
| } |
| |
| |
| static void |
| Key(unsigned char key, int x, int y) |
| { |
| (void) x; |
| (void) y; |
| switch (key) { |
| case 'p': |
| if (Mode == GL_TRIANGLES) |
| Mode = GL_LINE_LOOP; |
| else |
| Mode = GL_TRIANGLES; |
| break; |
| case 'f': |
| if (PolygonMode == GL_POINT) |
| PolygonMode = GL_LINE; |
| else if (PolygonMode == GL_LINE) |
| PolygonMode = GL_FILL; |
| else |
| PolygonMode = GL_POINT; |
| printf("PolygonMode = 0x%x\n", PolygonMode); |
| break; |
| case 'r': |
| Zrot -= 5.0; |
| break; |
| case 'R': |
| Zrot += 5.0; |
| break; |
| case 'z': |
| Scale *= 1.1; |
| break; |
| case 'Z': |
| Scale /= 1.1; |
| break; |
| case 's': |
| Smooth = !Smooth; |
| break; |
| case 27: |
| glutDestroyWindow(Win); |
| exit(0); |
| break; |
| } |
| glutPostRedisplay(); |
| } |
| |
| |
| static void |
| Init(void) |
| { |
| printf("Usage:\n"); |
| printf(" z/Z: change triangle size\n"); |
| printf(" r/R: rotate\n"); |
| printf(" p: toggle line/fill mode\n"); |
| printf(" s: toggle smooth/flat shading\n"); |
| printf(" f: switch polygon fill mode\n"); |
| } |
| |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| glutInit(&argc, argv); |
| glutInitWindowPosition(0, 0); |
| glutInitWindowSize(400, 400); |
| glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); |
| Win = glutCreateWindow(argv[0]); |
| glutReshapeFunc(Reshape); |
| glutKeyboardFunc(Key); |
| glutDisplayFunc(Draw); |
| Init(); |
| glutMainLoop(); |
| return 0; |
| } |