Mercurial > sdl-ios-xcode
comparison Xcode/TemplatesForXcode/SDL OpenGL Application/atlantis/atlantis.c @ 2207:d63e9f5944ae
Unpacked project archives to get individual file history in subversion
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 21 Jul 2007 17:09:01 +0000 |
parents | |
children | 59a667370c57 |
comparison
equal
deleted
inserted
replaced
2206:ca7d2227d630 | 2207:d63e9f5944ae |
---|---|
1 | |
2 /* Copyright (c) Mark J. Kilgard, 1994. */ | |
3 | |
4 /** | |
5 * (c) Copyright 1993, 1994, Silicon Graphics, Inc. | |
6 * ALL RIGHTS RESERVED | |
7 * Permission to use, copy, modify, and distribute this software for | |
8 * any purpose and without fee is hereby granted, provided that the above | |
9 * copyright notice appear in all copies and that both the copyright notice | |
10 * and this permission notice appear in supporting documentation, and that | |
11 * the name of Silicon Graphics, Inc. not be used in advertising | |
12 * or publicity pertaining to distribution of the software without specific, | |
13 * written prior permission. | |
14 * | |
15 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" | |
16 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, | |
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR | |
18 * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON | |
19 * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, | |
20 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY | |
21 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, | |
22 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF | |
23 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN | |
24 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON | |
25 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE | |
26 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. | |
27 * | |
28 * US Government Users Restricted Rights | |
29 * Use, duplication, or disclosure by the Government is subject to | |
30 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph | |
31 * (c)(1)(ii) of the Rights in Technical Data and Computer Software | |
32 * clause at DFARS 252.227-7013 and/or in similar or successor | |
33 * clauses in the FAR or the DOD or NASA FAR Supplement. | |
34 * Unpublished-- rights reserved under the copyright laws of the | |
35 * United States. Contractor/manufacturer is Silicon Graphics, | |
36 * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. | |
37 * | |
38 * OpenGL(TM) is a trademark of Silicon Graphics, Inc. | |
39 */ | |
40 #include <stdio.h> | |
41 #include <stdlib.h> | |
42 #include <string.h> | |
43 #include <math.h> | |
44 #include <sys/time.h> | |
45 #include <GLUT/glut.h> | |
46 #include "atlantis.h" | |
47 | |
48 fishRec sharks[NUM_SHARKS]; | |
49 fishRec momWhale; | |
50 fishRec babyWhale; | |
51 fishRec dolph; | |
52 | |
53 GLboolean Timing = GL_TRUE; | |
54 | |
55 int w_win = 640; | |
56 int h_win = 480; | |
57 GLint count = 0; | |
58 GLenum StrMode = GL_VENDOR; | |
59 | |
60 GLboolean moving; | |
61 | |
62 static double mtime(void) | |
63 { | |
64 struct timeval tk_time; | |
65 struct timezone tz; | |
66 | |
67 gettimeofday(&tk_time, &tz); | |
68 | |
69 return 4294.967296 * tk_time.tv_sec + 0.000001 * tk_time.tv_usec; | |
70 } | |
71 | |
72 static double filter(double in, double *save) | |
73 { | |
74 static double k1 = 0.9; | |
75 static double k2 = 0.05; | |
76 | |
77 save[3] = in; | |
78 save[1] = save[0]*k1 + k2*(save[3] + save[2]); | |
79 | |
80 save[0]=save[1]; | |
81 save[2]=save[3]; | |
82 | |
83 return(save[1]); | |
84 } | |
85 | |
86 void DrawStr(const char *str) | |
87 { | |
88 GLint i = 0; | |
89 | |
90 if(!str) return; | |
91 | |
92 while(str[i]) | |
93 { | |
94 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, str[i]); | |
95 i++; | |
96 } | |
97 } | |
98 | |
99 void | |
100 InitFishs(void) | |
101 { | |
102 int i; | |
103 | |
104 for (i = 0; i < NUM_SHARKS; i++) { | |
105 sharks[i].x = 70000.0 + rand() % 6000; | |
106 sharks[i].y = rand() % 6000; | |
107 sharks[i].z = rand() % 6000; | |
108 sharks[i].psi = rand() % 360 - 180.0; | |
109 sharks[i].v = 1.0; | |
110 } | |
111 | |
112 dolph.x = 30000.0; | |
113 dolph.y = 0.0; | |
114 dolph.z = 6000.0; | |
115 dolph.psi = 90.0; | |
116 dolph.theta = 0.0; | |
117 dolph.v = 3.0; | |
118 | |
119 momWhale.x = 70000.0; | |
120 momWhale.y = 0.0; | |
121 momWhale.z = 0.0; | |
122 momWhale.psi = 90.0; | |
123 momWhale.theta = 0.0; | |
124 momWhale.v = 3.0; | |
125 | |
126 babyWhale.x = 60000.0; | |
127 babyWhale.y = -2000.0; | |
128 babyWhale.z = -2000.0; | |
129 babyWhale.psi = 90.0; | |
130 babyWhale.theta = 0.0; | |
131 babyWhale.v = 3.0; | |
132 } | |
133 | |
134 void | |
135 Atlantis_Init(void) | |
136 { | |
137 static float ambient[] = {0.2, 0.2, 0.2, 1.0}; | |
138 static float diffuse[] = {1.0, 1.0, 1.0, 1.0}; | |
139 static float position[] = {0.0, 1.0, 0.0, 0.0}; | |
140 static float mat_shininess[] = {90.0}; | |
141 static float mat_specular[] = {0.8, 0.8, 0.8, 1.0}; | |
142 static float mat_diffuse[] = {0.46, 0.66, 0.795, 1.0}; | |
143 static float mat_ambient[] = {0.3, 0.4, 0.5, 1.0}; | |
144 static float lmodel_ambient[] = {0.4, 0.4, 0.4, 1.0}; | |
145 static float lmodel_localviewer[] = {0.0}; | |
146 //GLfloat map1[4] = {0.0, 0.0, 0.0, 0.0}; | |
147 //GLfloat map2[4] = {0.0, 0.0, 0.0, 0.0}; | |
148 static float fog_color[] = {0.0, 0.5, 0.9, 1.0}; | |
149 | |
150 glFrontFace(GL_CCW); | |
151 | |
152 glDepthFunc(GL_LESS); | |
153 glEnable(GL_DEPTH_TEST); | |
154 | |
155 glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); | |
156 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); | |
157 glLightfv(GL_LIGHT0, GL_POSITION, position); | |
158 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); | |
159 glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_localviewer); | |
160 glEnable(GL_LIGHTING); | |
161 glEnable(GL_LIGHT0); | |
162 | |
163 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); | |
164 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); | |
165 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); | |
166 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); | |
167 | |
168 InitFishs(); | |
169 | |
170 glEnable(GL_FOG); | |
171 glFogi(GL_FOG_MODE, GL_EXP); | |
172 glFogf(GL_FOG_DENSITY, 0.0000025); | |
173 glFogfv(GL_FOG_COLOR, fog_color); | |
174 | |
175 glClearColor(0.0, 0.5, 0.9, 1.0); | |
176 } | |
177 | |
178 void | |
179 Atlantis_Reshape(int width, int height) | |
180 { | |
181 w_win = width; | |
182 h_win = height; | |
183 | |
184 glViewport(0, 0, width, height); | |
185 | |
186 glMatrixMode(GL_PROJECTION); | |
187 glLoadIdentity(); | |
188 gluPerspective(60.0, (GLfloat) width / (GLfloat) height, 20000.0, 300000.0); | |
189 glMatrixMode(GL_MODELVIEW); | |
190 } | |
191 | |
192 void | |
193 Atlantis_Animate(void) | |
194 { | |
195 int i; | |
196 | |
197 for (i = 0; i < NUM_SHARKS; i++) { | |
198 SharkPilot(&sharks[i]); | |
199 SharkMiss(i); | |
200 } | |
201 WhalePilot(&dolph); | |
202 dolph.phi++; | |
203 //glutPostRedisplay(); | |
204 WhalePilot(&momWhale); | |
205 momWhale.phi++; | |
206 WhalePilot(&babyWhale); | |
207 babyWhale.phi++; | |
208 } | |
209 | |
210 void | |
211 Atlantis_Key(unsigned char key, int x, int y) | |
212 { | |
213 switch (key) { | |
214 case 't': | |
215 Timing = !Timing; | |
216 break; | |
217 case ' ': | |
218 switch(StrMode) | |
219 { | |
220 case GL_EXTENSIONS: | |
221 StrMode = GL_VENDOR; | |
222 break; | |
223 case GL_VENDOR: | |
224 StrMode = GL_RENDERER; | |
225 break; | |
226 case GL_RENDERER: | |
227 StrMode = GL_VERSION; | |
228 break; | |
229 case GL_VERSION: | |
230 StrMode = GL_EXTENSIONS; | |
231 break; | |
232 } | |
233 break; | |
234 case 27: /* Esc will quit */ | |
235 exit(1); | |
236 break; | |
237 case 's': /* "s" start animation */ | |
238 moving = GL_TRUE; | |
239 //glutIdleFunc(Animate); | |
240 break; | |
241 case 'a': /* "a" stop animation */ | |
242 moving = GL_FALSE; | |
243 //glutIdleFunc(NULL); | |
244 break; | |
245 case '.': /* "." will advance frame */ | |
246 if (!moving) { | |
247 Atlantis_Animate(); | |
248 } | |
249 } | |
250 } | |
251 /* | |
252 void Display(void) | |
253 { | |
254 static float P123[3] = {-448.94, -203.14, 9499.60}; | |
255 static float P124[3] = {-442.64, -185.20, 9528.07}; | |
256 static float P125[3] = {-441.07, -148.05, 9528.07}; | |
257 static float P126[3] = {-443.43, -128.84, 9499.60}; | |
258 static float P127[3] = {-456.87, -146.78, 9466.67}; | |
259 static float P128[3] = {-453.68, -183.93, 9466.67}; | |
260 | |
261 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
262 | |
263 glPushMatrix(); | |
264 FishTransform(&dolph); | |
265 DrawDolphin(&dolph); | |
266 glPopMatrix(); | |
267 | |
268 glutSwapBuffers(); | |
269 } | |
270 */ | |
271 | |
272 void | |
273 Atlantis_Display(void) | |
274 { | |
275 int i; | |
276 static double th[4] = {0.0, 0.0, 0.0, 0.0}; | |
277 static double t1 = 0.0, t2 = 0.0, t; | |
278 char num_str[128]; | |
279 | |
280 t1 = t2; | |
281 | |
282 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
283 | |
284 for (i = 0; i < NUM_SHARKS; i++) { | |
285 glPushMatrix(); | |
286 FishTransform(&sharks[i]); | |
287 DrawShark(&sharks[i]); | |
288 glPopMatrix(); | |
289 } | |
290 | |
291 glPushMatrix(); | |
292 FishTransform(&dolph); | |
293 DrawDolphin(&dolph); | |
294 glPopMatrix(); | |
295 | |
296 glPushMatrix(); | |
297 FishTransform(&momWhale); | |
298 DrawWhale(&momWhale); | |
299 glPopMatrix(); | |
300 | |
301 glPushMatrix(); | |
302 FishTransform(&babyWhale); | |
303 glScalef(0.45, 0.45, 0.3); | |
304 DrawWhale(&babyWhale); | |
305 glPopMatrix(); | |
306 | |
307 if(Timing) | |
308 { | |
309 t2 = mtime(); | |
310 t = t2 - t1; | |
311 if(t > 0.0001) t = 1.0 / t; | |
312 | |
313 glDisable(GL_LIGHTING); | |
314 //glDisable(GL_DEPTH_TEST); | |
315 | |
316 glColor3f(1.0, 0.0, 0.0); | |
317 | |
318 glMatrixMode (GL_PROJECTION); | |
319 glPushMatrix(); | |
320 glLoadIdentity(); | |
321 glOrtho(0, w_win, 0, h_win, -10.0, 10.0); | |
322 | |
323 glRasterPos2f(5.0, 5.0); | |
324 | |
325 switch(StrMode) | |
326 { | |
327 case GL_VENDOR: | |
328 sprintf(num_str, "%0.2f Hz, %dx%d, VENDOR: ", filter(t, th), w_win, h_win); | |
329 DrawStr(num_str); | |
330 DrawStr(glGetString(GL_VENDOR)); | |
331 break; | |
332 case GL_RENDERER: | |
333 sprintf(num_str, "%0.2f Hz, %dx%d, RENDERER: ", filter(t, th), w_win, h_win); | |
334 DrawStr(num_str); | |
335 DrawStr(glGetString(GL_RENDERER)); | |
336 break; | |
337 case GL_VERSION: | |
338 sprintf(num_str, "%0.2f Hz, %dx%d, VERSION: ", filter(t, th), w_win, h_win); | |
339 DrawStr(num_str); | |
340 DrawStr(glGetString(GL_VERSION)); | |
341 break; | |
342 case GL_EXTENSIONS: | |
343 sprintf(num_str, "%0.2f Hz, %dx%d, EXTENSIONS: ", filter(t, th), w_win, h_win); | |
344 DrawStr(num_str); | |
345 DrawStr(glGetString(GL_EXTENSIONS)); | |
346 break; | |
347 } | |
348 | |
349 glPopMatrix(); | |
350 glMatrixMode(GL_MODELVIEW); | |
351 | |
352 glEnable(GL_LIGHTING); | |
353 //glEnable(GL_DEPTH_TEST); | |
354 } | |
355 | |
356 count++; | |
357 | |
358 glutSwapBuffers(); | |
359 } | |
360 | |
361 /* | |
362 void | |
363 Visible(int state) | |
364 { | |
365 if (state == GLUT_VISIBLE) { | |
366 if (moving) | |
367 glutIdleFunc(Animate); | |
368 } else { | |
369 if (moving) | |
370 glutIdleFunc(NULL); | |
371 } | |
372 } | |
373 | |
374 | |
375 void | |
376 timingSelect(int value) | |
377 { | |
378 switch(value) | |
379 { | |
380 case 1: | |
381 StrMode = GL_VENDOR; | |
382 break; | |
383 case 2: | |
384 StrMode = GL_RENDERER; | |
385 break; | |
386 case 3: | |
387 StrMode = GL_VERSION; | |
388 break; | |
389 case 4: | |
390 StrMode = GL_EXTENSIONS; | |
391 break; | |
392 } | |
393 } | |
394 | |
395 void | |
396 menuSelect(int value) | |
397 { | |
398 switch (value) { | |
399 case 1: | |
400 moving = GL_TRUE; | |
401 glutIdleFunc(Animate); | |
402 break; | |
403 case 2: | |
404 moving = GL_FALSE; | |
405 glutIdleFunc(NULL); | |
406 break; | |
407 case 4: | |
408 exit(0); | |
409 break; | |
410 } | |
411 } | |
412 | |
413 int | |
414 main(int argc, char **argv) | |
415 { | |
416 GLboolean fullscreen = GL_FALSE; | |
417 GLint time_menu; | |
418 | |
419 srand(0); | |
420 | |
421 glutInit(&argc, argv); | |
422 if (argc > 1 && !strcmp(argv[1], "-w")) | |
423 fullscreen = GL_FALSE; | |
424 | |
425 //glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); | |
426 glutInitDisplayString("rgba double depth=24"); | |
427 if (fullscreen) { | |
428 glutGameModeString("1024x768:32"); | |
429 glutEnterGameMode(); | |
430 } else { | |
431 glutInitWindowSize(320, 240); | |
432 glutCreateWindow("Atlantis Timing"); | |
433 } | |
434 Init(); | |
435 glutDisplayFunc(Display); | |
436 glutReshapeFunc(Reshape); | |
437 glutKeyboardFunc(Key); | |
438 moving = GL_TRUE; | |
439 glutIdleFunc(Animate); | |
440 glutVisibilityFunc(Visible); | |
441 | |
442 time_menu = glutCreateMenu(timingSelect); | |
443 glutAddMenuEntry("GL_VENDOR", 1); | |
444 glutAddMenuEntry("GL_RENDERER", 2); | |
445 glutAddMenuEntry("GL_VERSION", 3); | |
446 glutAddMenuEntry("GL_EXTENSIONS", 4); | |
447 | |
448 glutCreateMenu(menuSelect); | |
449 glutAddMenuEntry("Start motion", 1); | |
450 glutAddMenuEntry("Stop motion", 2); | |
451 glutAddSubMenu("Timing Mode", time_menu); | |
452 glutAddMenuEntry("Quit", 4); | |
453 | |
454 //glutAttachMenu(GLUT_RIGHT_BUTTON); | |
455 glutAttachMenu(GLUT_RIGHT_BUTTON); | |
456 glutMainLoop(); | |
457 return 0; // ANSI C requires main to return int. | |
458 } | |
459 */ |