tri-cull.c revision 32001f49
1/*
2 * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and
5 * its documentation for any purpose is hereby granted without fee, provided
6 * that (i) the above copyright notices and this permission notice appear in
7 * all copies of the software and related documentation, and (ii) the name of
8 * Silicon Graphics may not be used in any advertising or
9 * publicity relating to the software without the specific, prior written
10 * permission of Silicon Graphics.
11 *
12 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
13 * ANY KIND,
14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 * OF THIS SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <string.h>
27#include <stdlib.h>
28#include "glut_wrap.h"
29
30static GLenum doubleBuffer;
31static GLint cullmode = 0;
32static GLenum front = GL_CCW; /* GL default */
33
34static void cull(void)
35{
36   cullmode = (cullmode + 1) % 4;
37   if (cullmode == 0) {
38      glCullFace(GL_FRONT);
39      glEnable(GL_CULL_FACE);
40      printf("cull GL_FRONT\n");
41   }
42   else if (cullmode == 1) {
43      glCullFace(GL_BACK);
44      glEnable(GL_CULL_FACE);
45      printf("cull GL_BACK\n");
46   }
47   else if (cullmode == 2) {
48      glCullFace(GL_FRONT_AND_BACK);
49      glEnable(GL_CULL_FACE);
50      printf("cull GL_FRONT_AND_BACK\n");
51   }
52   else {
53      glDisable(GL_CULL_FACE);
54      printf("cull none\n");
55   }
56}
57
58static void Init(void)
59{
60   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
61   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
62   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
63   fflush(stderr);
64   glClearColor(0.0, 0.0, 1.0, 1.0);
65   cull();
66}
67
68static void Reshape(int width, int height)
69{
70    glViewport(0, 0, (GLint)width, (GLint)height);
71
72    glMatrixMode(GL_PROJECTION);
73    glLoadIdentity();
74    glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
75    glMatrixMode(GL_MODELVIEW);
76}
77
78static void Key(unsigned char key, int x, int y)
79{
80   switch (key) {
81   case 27:
82      exit(1);
83   case 'c':
84      cull();
85      break;
86   case 'f':
87      front = ((front == GL_CCW) ? GL_CW : GL_CCW);
88      glFrontFace(front);
89      printf("front face = %s\n", front == GL_CCW ? "GL_CCW" : "GL_CW");
90      break;
91   default:
92      return;
93   }
94   glutPostRedisplay();
95}
96
97static void Draw(void)
98{
99   glClear(GL_COLOR_BUFFER_BIT);
100
101   glBegin(GL_TRIANGLES);
102   /* CCW / front-facing */
103   glColor3f(0,0,.7);
104   glVertex3f(-0.1, -0.9, -30.0);
105   glColor3f(.8,0,0);
106   glVertex3f(-0.1,  0.9, -30.0);
107   glColor3f(0,.9,0);
108   glVertex3f(-0.9,  0.0, -30.0);
109
110   /* CW / back-facing */
111   glColor3f(0,0,.7);
112   glVertex3f( 0.1, -0.9, -30.0);
113   glColor3f(.8,0,0);
114   glVertex3f( 0.1,  0.9, -30.0);
115   glColor3f(0,.9,0);
116   glVertex3f( 0.9,  0.0, -30.0);
117
118   glEnd();
119
120   glFlush();
121
122   if (doubleBuffer) {
123      glutSwapBuffers();
124   }
125}
126
127static GLenum Args(int argc, char **argv)
128{
129    GLint i;
130
131    doubleBuffer = GL_FALSE;
132
133    for (i = 1; i < argc; i++) {
134        if (strcmp(argv[i], "-sb") == 0) {
135	    doubleBuffer = GL_FALSE;
136	} else if (strcmp(argv[i], "-db") == 0) {
137	    doubleBuffer = GL_TRUE;
138	} else {
139	    fprintf(stderr, "%s (Bad option).\n", argv[i]);
140	    return GL_FALSE;
141	}
142    }
143    return GL_TRUE;
144}
145
146int main(int argc, char **argv)
147{
148    GLenum type;
149
150    glutInit(&argc, argv);
151
152    if (Args(argc, argv) == GL_FALSE) {
153	exit(1);
154    }
155
156    glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250);
157
158    type = GLUT_RGB | GLUT_ALPHA;
159    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
160    glutInitDisplayMode(type);
161
162    if (glutCreateWindow(*argv) == GL_FALSE) {
163	exit(1);
164    }
165
166    Init();
167
168    glutReshapeFunc(Reshape);
169    glutKeyboardFunc(Key);
170    glutDisplayFunc(Draw);
171    glutMainLoop();
172    return 0;
173}
174