comparison Xcode/TemplatesForXcodeSnowLeopard/SDL OpenGL Application/atlantis/atlantis.c @ 3331:d44a0a913aa2

Eric Wing to Sam Lots of fixes. Fixed missing power management building. Added template icons to the project templates. DocSet stuff Documentation fixes.. Fixed all the SDLtests. (Lots of tedious work.) It now depends on the static library target for convenience so I am not going to remove it from the SDL xcode project.
author Sam Lantinga <slouken@libsdl.org>
date Thu, 01 Oct 2009 15:30:26 +0000
parents
children
comparison
equal deleted inserted replaced
3330:e15bcb04c9b4 3331:d44a0a913aa2
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 */