Merge branch '7.8'
[mesa.git] / progs / samples / depth.c
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 <GL/glut.h>
29
30
31 #define CI_OFFSET_1 16
32 #define CI_OFFSET_2 32
33
34
35 GLenum rgb, doubleBuffer;
36
37 GLenum antiAlias, stipple;
38 GLubyte stippleBits[32*4] = {
39 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
40 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
41 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
42 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
43 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
44 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
45 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
46 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
47 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
48 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
49 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
50 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
51 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
52 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
53 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
54 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
55 };
56
57
58 #include "tkmap.c"
59
60 static void Init(void)
61 {
62 GLint i;
63
64 glClearColor(0.0, 0.0, 0.0, 0.0);
65 glClearIndex(0.0);
66
67 if (!rgb) {
68 for (i = 0; i < 16; i++) {
69 glutSetColor(i+CI_OFFSET_1, 0.0, 0.0, i/15.0);
70 glutSetColor(i+CI_OFFSET_2, 0.0, i/15.0, 0.0);
71 }
72 }
73
74 glPolygonStipple(stippleBits);
75
76 antiAlias = GL_FALSE;
77 stipple = GL_FALSE;
78 }
79
80 static void Reshape(int width, int height)
81 {
82
83 glViewport(0, 0, (GLint)width, (GLint)height);
84
85 glMatrixMode(GL_PROJECTION);
86 glLoadIdentity();
87 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
88 glMatrixMode(GL_MODELVIEW);
89 }
90
91 static void Key(unsigned char key, int x, int y)
92 {
93
94 switch (key) {
95 case 27:
96 exit(1);
97 case '1':
98 antiAlias = !antiAlias;
99 break;
100 case '2':
101 stipple = !stipple;
102 break;
103 default:
104 return;
105 }
106
107 glutPostRedisplay();
108 }
109
110 static void Draw(void)
111 {
112 GLint ci1, ci2;
113
114 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
115
116 if (antiAlias) {
117 ci1 = CI_OFFSET_1;
118 ci2 = CI_OFFSET_2;
119 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
120 glEnable(GL_BLEND);
121 glEnable(GL_POLYGON_SMOOTH);
122 glDisable(GL_DEPTH_TEST);
123 } else {
124 ci1 = COLOR_BLUE;
125 ci2 = COLOR_GREEN;
126 glDisable(GL_BLEND);
127 glDisable(GL_POLYGON_SMOOTH);
128 glEnable(GL_DEPTH_TEST);
129 }
130
131 if (stipple) {
132 glEnable(GL_POLYGON_STIPPLE);
133 } else {
134 glDisable(GL_POLYGON_STIPPLE);
135 }
136
137 glBegin(GL_TRIANGLES);
138 (rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexi(ci1);
139 glVertex3f( 0.9, -0.9, -30.0);
140 glVertex3f( 0.9, 0.9, -30.0);
141 glVertex3f(-0.9, 0.0, -30.0);
142 (rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexi(ci2);
143 glVertex3f(-0.9, -0.9, -40.0);
144 glVertex3f(-0.9, 0.9, -40.0);
145 glVertex3f( 0.9, 0.0, -25.0);
146 glEnd();
147
148 glFlush();
149
150 if (doubleBuffer) {
151 glutSwapBuffers();
152 }
153 }
154
155 static GLenum Args(int argc, char **argv)
156 {
157 GLint i;
158
159 rgb = GL_TRUE;
160 doubleBuffer = GL_FALSE;
161
162 for (i = 1; i < argc; i++) {
163 if (strcmp(argv[i], "-ci") == 0) {
164 rgb = GL_FALSE;
165 } else if (strcmp(argv[i], "-rgb") == 0) {
166 rgb = GL_TRUE;
167 } else if (strcmp(argv[i], "-sb") == 0) {
168 doubleBuffer = GL_FALSE;
169 } else if (strcmp(argv[i], "-db") == 0) {
170 doubleBuffer = GL_TRUE;
171 } else {
172 printf("%s (Bad option).\n", argv[i]);
173 return GL_FALSE;
174 }
175 }
176 return GL_TRUE;
177 }
178
179 int main(int argc, char **argv)
180 {
181 GLenum type;
182
183 glutInit(&argc, argv);
184
185 if (Args(argc, argv) == GL_FALSE) {
186 exit(1);
187 }
188
189 glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
190
191 type = GLUT_DEPTH;
192 type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
193 type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
194 glutInitDisplayMode(type);
195
196 if (glutCreateWindow("Depth Test") == GL_FALSE) {
197 exit(1);
198 }
199
200 InitMap();
201
202 Init();
203
204 glutReshapeFunc(Reshape);
205 glutKeyboardFunc(Key);
206 glutDisplayFunc(Draw);
207 glutMainLoop();
208 return 0;
209 }