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 
30 GLenum rgb, doubleBuffer;
31 
32 #include "tkmap.c"
33 
34 double plane[4] = {
35     1.0, 0.0, -1.0, 0.0
36 };
37 float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
38 float fogDensity = 0.02;
39 GLint cubeList = 1;
40 
41 float scp[18][3] = {
42     {
43 	1.000000, 0.000000, 0.000000
44     },
45     {
46 	1.000000, 0.000000, 5.000000
47     },
48     {
49 	0.707107, 0.707107, 0.000000
50     },
51     {
52 	0.707107, 0.707107, 5.000000
53     },
54     {
55 	0.000000, 1.000000, 0.000000
56     },
57     {
58 	0.000000, 1.000000, 5.000000
59     },
60     {
61 	-0.707107, 0.707107, 0.000000
62     },
63     {
64 	-0.707107, 0.707107, 5.000000
65     },
66     {
67 	-1.000000, 0.000000, 0.000000
68     },
69     {
70 	-1.000000, 0.000000, 5.000000
71     },
72     {
73 	-0.707107, -0.707107, 0.000000
74     },
75     {
76 	-0.707107, -0.707107, 5.000000
77     },
78     {
79 	0.000000, -1.000000, 0.000000
80     },
81     {
82 	0.000000, -1.000000, 5.000000
83     },
84     {
85 	0.707107, -0.707107, 0.000000
86     },
87     {
88 	0.707107, -0.707107, 5.000000
89     },
90     {
91 	1.000000, 0.000000, 0.000000
92     },
93     {
94 	1.000000, 0.000000, 5.000000
95     },
96 };
97 
98 
Build_lists(void)99 static void Build_lists(void)
100 {
101 
102     glNewList(cubeList, GL_COMPILE);
103 	glBegin(GL_TRIANGLE_STRIP);
104 	   glNormal3fv(scp[0]); glVertex3fv(scp[0]);
105 	   glNormal3fv(scp[0]); glVertex3fv(scp[1]);
106 	   glNormal3fv(scp[2]); glVertex3fv(scp[2]);
107 	   glNormal3fv(scp[2]); glVertex3fv(scp[3]);
108 	   glNormal3fv(scp[4]); glVertex3fv(scp[4]);
109 	   glNormal3fv(scp[4]); glVertex3fv(scp[5]);
110 	   glNormal3fv(scp[6]); glVertex3fv(scp[6]);
111 	   glNormal3fv(scp[6]); glVertex3fv(scp[7]);
112 	   glNormal3fv(scp[8]); glVertex3fv(scp[8]);
113 	   glNormal3fv(scp[8]); glVertex3fv(scp[9]);
114 	   glNormal3fv(scp[10]); glVertex3fv(scp[10]);
115 	   glNormal3fv(scp[10]); glVertex3fv(scp[11]);
116 	   glNormal3fv(scp[12]); glVertex3fv(scp[12]);
117 	   glNormal3fv(scp[12]); glVertex3fv(scp[13]);
118 	   glNormal3fv(scp[14]); glVertex3fv(scp[14]);
119 	   glNormal3fv(scp[14]); glVertex3fv(scp[15]);
120 	   glNormal3fv(scp[16]); glVertex3fv(scp[16]);
121 	   glNormal3fv(scp[16]); glVertex3fv(scp[17]);
122 	glEnd();
123     glEndList();
124 }
125 
Init(void)126 static void Init(void)
127 {
128     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
129     static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
130     static float position[] = {90.0, 90.0, 0.0, 0.0};
131     static float front_mat_shininess[] = {30.0};
132     static float front_mat_specular[] = {0.0, 0.0, 0.0, 1.0};
133     static float front_mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
134     static float back_mat_shininess[] = {50.0};
135     static float back_mat_specular[] = {0.0, 0.0, 1.0, 1.0};
136     static float back_mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
137     static float lmodel_ambient[] = {0.0, 0.0, 0.0, 1.0};
138     static float fog_color[] = {0.8, 0.8, 0.8, 1.0};
139 
140     glFrontFace(GL_CW);
141 
142     glEnable(GL_DEPTH_TEST);
143 
144     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
145     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
146     glLightfv(GL_LIGHT0, GL_POSITION, position);
147     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
148     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
149     glEnable(GL_LIGHTING);
150     glEnable(GL_LIGHT0);
151 
152     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
153     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
154     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
155     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
156     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
157     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
158 
159     glEnable(GL_FOG);
160     glFogi(GL_FOG_MODE, GL_EXP);
161     glFogf(GL_FOG_DENSITY, fogDensity);
162     if (rgb) {
163 	glFogfv(GL_FOG_COLOR, fog_color);
164 	glClearColor(0.8, 0.8, 0.8, 1.0);
165     } else {
166 	glFogi(GL_FOG_INDEX, 1<<5);
167 	SetFogRamp(5, 3);
168 	glClearIndex(128);
169     }
170 
171     Build_lists();
172 }
173 
Reshape(int width,int height)174 static void Reshape(int width, int height)
175 {
176 
177     glViewport(0, 0, (GLint)width, (GLint)height);
178 
179     glMatrixMode(GL_PROJECTION);
180     glLoadIdentity();
181     gluPerspective(45.0, 1.0, 1.0, 200.0);
182     glMatrixMode(GL_MODELVIEW);
183 }
184 
Key2(int key,int x,int y)185 static void Key2(int key, int x, int y)
186 {
187 
188     switch (key) {
189       case GLUT_KEY_UP:
190 	rotX -= 5;
191 	break;
192       case GLUT_KEY_DOWN:
193 	rotX += 5;
194 	break;
195       case GLUT_KEY_LEFT:
196 	rotY -= 5;
197 	break;
198       case GLUT_KEY_RIGHT:
199 	rotY += 5;
200 	break;
201       default:
202 	return;
203     }
204 
205     glutPostRedisplay();
206 }
207 
Key(unsigned char key,int x,int y)208 static void Key(unsigned char key, int x, int y)
209 {
210 
211     switch (key) {
212       case 27:
213 	exit(1);
214       case 'D':
215 	if (rgb) {
216 	    fogDensity *= 1.10;
217 	    glFogf(GL_FOG_DENSITY, fogDensity);
218 	}
219 	break;
220       case 'd':
221 	if (rgb) {
222 	    fogDensity /= 1.10;
223 	    glFogf(GL_FOG_DENSITY, fogDensity);
224 	}
225 	break;
226       default:
227 	return;
228     }
229 
230     glutPostRedisplay();
231 }
232 
Draw(void)233 static void Draw(void)
234 {
235 
236     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
237 
238     glPushMatrix();
239 
240     glTranslatef(0, 0, zTranslate);
241     glRotatef(rotY, 0,1,0);
242     glRotatef(rotX, 1,0,0);
243     glScalef(1.0, 1.0, 10.0);
244 
245     glCallList(cubeList);
246 
247     glPopMatrix();
248 
249     glFlush();
250 
251     if (doubleBuffer) {
252 	glutSwapBuffers();
253     }
254 }
255 
Args(int argc,char ** argv)256 static GLenum Args(int argc, char **argv)
257 {
258     GLint i;
259 
260     rgb = GL_TRUE;
261     doubleBuffer = GL_TRUE;
262 
263     for (i = 1; i < argc; i++) {
264 	if (strcmp(argv[i], "-ci") == 0) {
265 	    rgb = GL_FALSE;
266 	} else if (strcmp(argv[i], "-rgb") == 0) {
267 	    rgb = GL_TRUE;
268 	} else if (strcmp(argv[i], "-sb") == 0) {
269 	    doubleBuffer = GL_FALSE;
270 	} else if (strcmp(argv[i], "-db") == 0) {
271 	    doubleBuffer = GL_TRUE;
272 	} else {
273 	    printf("%s (Bad option).\n", argv[i]);
274 	    return GL_FALSE;
275 	}
276     }
277     return GL_TRUE;
278 }
279 
main(int argc,char ** argv)280 int main(int argc, char **argv)
281 {
282     GLenum type;
283 
284     glutInit(&argc, argv);
285 
286     if (Args(argc, argv) == GL_FALSE) {
287 	exit(1);
288     }
289 
290     glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
291 
292     type = GLUT_DEPTH;
293     type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
294     type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
295     glutInitDisplayMode(type);
296 
297     if (glutCreateWindow("Fog Test") == GL_FALSE) {
298 	exit(1);
299     }
300 
301     InitMap();
302 
303     Init();
304 
305     glutReshapeFunc(Reshape);
306     glutKeyboardFunc(Key);
307     glutSpecialFunc(Key2);
308     glutDisplayFunc(Draw);
309     glutMainLoop();
310 	return 0;
311 }
312