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 48fishRec sharks[NUM_SHARKS]; 49fishRec momWhale; 50fishRec babyWhale; 51fishRec dolph; 52 53GLboolean Timing = GL_TRUE; 54 55int w_win = 640; 56int h_win = 480; 57GLint count = 0; 58GLenum StrMode = GL_VENDOR; 59 60GLboolean moving; 61 62static 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 72static 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 86void 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 99void 100InitFishs(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 134void 135Atlantis_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 178void 179Atlantis_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 192void 193Atlantis_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 210void 211Atlantis_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/* 252void 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 272void 273Atlantis_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/* 362void 363Visible(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 375void 376timingSelect(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 395void 396menuSelect(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 413int 414main(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; 439glutIdleFunc(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*/