pgon-mode.c revision 32001f49
1/**
2 * Test glPolygonMode.
3 * A tri-strip w/ two tris is drawn so that the first tri is front-facing
4 * but the second tri is back-facing.
5 * Set glPolygonMode differently for the front/back faces
6 *
7 */
8
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <math.h>
13#include "glut_wrap.h"
14
15static int Win;
16static GLfloat Zrot = 0;
17static GLboolean FrontFillBackUnfilled = GL_TRUE;
18static GLboolean Lines = GL_TRUE;
19
20
21static void
22Draw(void)
23{
24   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
25
26   if (FrontFillBackUnfilled) {
27      if (Lines) {
28         printf("FrontMode = FILL, BackMode = LINE\n");
29         glPolygonMode(GL_BACK, GL_LINE);
30      }
31      else {
32         printf("FrontMode = FILL, BackMode = POINT\n");
33         glPolygonMode(GL_BACK, GL_POINT);
34      }
35      glPolygonMode(GL_FRONT, GL_FILL);
36   }
37   else {
38      if (Lines) {
39         printf("FrontMode = LINE, BackMode = FILL\n");
40         glPolygonMode(GL_FRONT, GL_LINE);
41      }
42      else {
43         printf("FrontMode = POINT, BackMode = FILL\n");
44         glPolygonMode(GL_FRONT, GL_POINT);
45      }
46      glPolygonMode(GL_BACK, GL_FILL);
47   }
48
49   glPushMatrix();
50   glRotatef(Zrot, 0, 0, 1);
51
52   glBegin(GL_TRIANGLE_STRIP);
53   glVertex2f(-1, 0);
54   glVertex2f( 1, 0);
55   glVertex2f(0,  1);
56   glVertex2f(0, -1);
57   glEnd();
58
59   glPopMatrix();
60
61   glutSwapBuffers();
62}
63
64
65static void
66Reshape(int width, int height)
67{
68   glViewport(0, 0, width, height);
69   glMatrixMode(GL_PROJECTION);
70   glLoadIdentity();
71   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
72   glMatrixMode(GL_MODELVIEW);
73   glLoadIdentity();
74   glTranslatef(0.0, 0.0, -15.0);
75}
76
77
78static void
79Key(unsigned char key, int x, int y)
80{
81   const GLfloat step = 3.0;
82   (void) x;
83   (void) y;
84   switch (key) {
85   case 'p':
86      FrontFillBackUnfilled = !FrontFillBackUnfilled;
87      break;
88   case 'l':
89      Lines = !Lines;
90      break;
91   case 'z':
92      Zrot -= step;
93      break;
94   case 'Z':
95      Zrot += step;
96      break;
97   case 27:
98      glutDestroyWindow(Win);
99      exit(0);
100      break;
101   }
102   glutPostRedisplay();
103}
104
105
106static void
107Init(void)
108{
109   printf("GL_RENDERER = %s\n", (char*) glGetString(GL_RENDERER));
110
111   glLineWidth(3.0);
112   glPointSize(3.0);
113
114   glColor4f(1, 1, 1, 0.8);
115   glEnable(GL_BLEND);
116   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
117
118   printf("Press 'p' to toggle polygon mode\n");
119}
120
121
122int
123main(int argc, char *argv[])
124{
125   glutInit(&argc, argv);
126   glutInitWindowPosition(0, 0);
127   glutInitWindowSize(400, 400);
128   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
129   Win = glutCreateWindow(argv[0]);
130   glutReshapeFunc(Reshape);
131   glutKeyboardFunc(Key);
132   glutDisplayFunc(Draw);
133   Init();
134   glutMainLoop();
135   return 0;
136}
137