3331
+ − 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 */