ideas.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:26k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1995. */
  2. /*
  3.  * (c) Copyright 1993, Silicon Graphics, Inc.
  4.  * ALL RIGHTS RESERVED 
  5.  * Permission to use, copy, modify, and distribute this software for 
  6.  * any purpose and without fee is hereby granted, provided that the above
  7.  * copyright notice appear in all copies and that both the copyright notice
  8.  * and this permission notice appear in supporting documentation, and that 
  9.  * the name of Silicon Graphics, Inc. not be used in advertising
  10.  * or publicity pertaining to distribution of the software without specific,
  11.  * written prior permission. 
  12.  *
  13.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  14.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  16.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  17.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  18.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  19.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  20.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  21.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  22.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  23.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  24.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  25.  * 
  26.  * US Government Users Restricted Rights 
  27.  * Use, duplication, or disclosure by the Government is subject to
  28.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  29.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  30.  * clause at DFARS 252.227-7013 and/or in similar or successor
  31.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  32.  * Unpublished-- rights reserved under the copyright laws of the
  33.  * United States.  Contractor/manufacturer is Silicon Graphics,
  34.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  35.  *
  36.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  37.  */
  38. #include <math.h>
  39. #ifdef _WIN32
  40. #include <windows.h>
  41. #include <winsock.h>
  42. #include <sys/timeb.h>
  43. #define gettimeofday(_x, _y)          
  44. {                                     
  45.   struct timeb _t;                    
  46.   ftime(&_t);                         
  47.   (_x)->tv_sec = _t.time;             
  48.   (_x)->tv_usec = _t.millitm * 1000;  
  49. }
  50. #else
  51. #include <sys/time.h>
  52. #endif
  53. /* Some <math.h> files do not define M_PI... */
  54. #ifndef M_PI
  55. #define M_PI 3.14159265358979323846
  56. #endif
  57. #include <stdio.h>
  58. #include <stdlib.h>
  59. #include "objects.h"
  60. #include <GL/glut.h>
  61. #define X 0
  62. #define Y 1
  63. #define Z 2
  64. #ifndef TRUE
  65. #define TRUE 1
  66. #endif
  67. #ifndef FALSE
  68. #define FALSE 0
  69. #endif
  70. #define DEG *M_PI/180.0
  71. #define RAD *180.0/M_PI
  72. float move_speed; /* Spline distance per second */
  73. int multisample = 0; /* Antialias polygons? */
  74. int doublebuffer = 1; /* Doublebuffer? */
  75. #define SPEED_SLOW 0.2 /* Spline distances per second */
  76. #define SPEED_MEDIUM 0.4
  77. #define SPEED_FAST 0.7
  78. #define SPEED_SUPER_FAST 1.0
  79. #define O_NOMS 7
  80. #define O_4MS 8
  81. #define O_8MS 9
  82. #define O_16MS 10
  83. static int RGBA_SB_attributes = GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE;
  84. static int RGBA_DB_attributes = GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE;
  85. float light1_ambient[] = { 0.0,0.0,0.0,1.0 };
  86. float light1_lcolor[] = { 1.0,1.0,1.0,1.0 };
  87. float light1_position[] = { 0.0,1.0,0.0,0.0 };
  88. float light2_ambient[] = { 0.0,0.0,0.0,1.0 };
  89. float light2_lcolor[] = { 0.3,0.3,0.5,1.0 };
  90. float light2_position[] = { -1.0,0.0,0.0,0.0 };
  91. float light3_ambient[] = { 0.2,0.2,0.2,1.0 };
  92. float light3_lcolor[] = { 0.2,0.2,0.2,1.0 };
  93. float light3_position[] = { 0.0,-1.0,0.0,0.0 };
  94. float lmodel_LVW[] = { 0.0 };
  95. float lmodel_ambient[] = { 0.3,0.3,0.3,1.0 };
  96. float lmodel_TWO[] = { GL_TRUE };
  97. float mat_logo_ambient[] = {0.1, 0.1, 0.1, 1.0};
  98. float mat_logo_diffuse[] = {0.5, 0.4, 0.7, 1.0};
  99. float mat_logo_specular[] = {1.0, 1.0, 1.0, 1.0};
  100. float mat_logo_shininess[] = {30.0};
  101. float mat_holder_base_ambient[] = {0.0, 0.0, 0.0, 1.0};
  102. float mat_holder_base_diffuse[] = {0.6, 0.6, 0.6, 1.0};
  103. float mat_holder_base_specular[] = {0.8, 0.8, 0.8, 1.0};
  104. float mat_holder_base_shininess[] = {30.0};
  105. float mat_holder_rings_ambient[] = { 0.0,0.0,0.0,1.0 };
  106. float mat_holder_rings_diffuse[] = { 0.9,0.8,0.0,1.0 };
  107. float mat_holder_rings_specular[] = { 1.0,1.0,1.0,1.0 };
  108. float mat_holder_rings_shininess[] = { 30.0 };
  109. float mat_hemisphere_ambient[] = {0.0, 0.0, 0.0,1.0 };
  110. float mat_hemisphere_diffuse[] = {1.0, 0.2, 0.2,1.0 };
  111. float mat_hemisphere_specular[] = {0.5, 0.5, 0.5,1.0 };
  112. float mat_hemisphere_shininess[] = {20.0};
  113. GLubyte stipple[32*32];
  114. typedef float vector[3];
  115. typedef float vector4[4];
  116. typedef vector parameter[4];
  117. /*
  118.  * Function definitions
  119.  */
  120. static void initialize(void);
  121. static void resize_window(int w, int h);
  122. static void build_table(void);
  123. static parameter *calc_spline_params(vector *ctl_pts, int n);
  124. static void calc_spline(vector v, parameter *params, float current_time);
  125. static void normalize(vector v);
  126. static float dot(vector v1, vector v2);
  127. void draw_table(void);
  128. void draw_logo_shadow(void);
  129. void draw_hemisphere(void);
  130. void draw_logo(void);
  131. void draw_under_table(void);
  132. void draw_i(void);
  133. void draw_d(void);
  134. void draw_e(void);
  135. void draw_a(void);
  136. void draw_s(void);
  137. void draw_n(void);
  138. void draw_m(void);
  139. void draw_o(void);
  140. void draw_t(void);
  141. int post_idle = 0;
  142. static void idle(void);
  143. static void do_post_idle(void);
  144. static void display(void);
  145. static void mouse(int b, int s, int x, int y);
  146. static void keyboard(unsigned char c, int x, int y);
  147. static void vis(int);
  148. static void init_materials(void) {
  149.   int x, y;
  150.   /* Stipple pattern */
  151.   for (y = 0; y < 32; y++)
  152.     for (x = 0; x < 4; x++) 
  153.       stipple[y * 4 + x] = (y % 2) ? 0xaa : 0x55;
  154.     glNewList(MAT_LOGO, GL_COMPILE); 
  155.     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_logo_ambient); 
  156.     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_logo_diffuse);
  157.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_logo_specular);
  158.     glMaterialfv(GL_FRONT, GL_SHININESS, mat_logo_shininess);
  159.     glEndList(); 
  160.     glNewList( MAT_HOLDER_BASE, GL_COMPILE);
  161.     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_holder_base_ambient); 
  162.     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_holder_base_diffuse);
  163.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_holder_base_specular);
  164.     glMaterialfv(GL_FRONT, GL_SHININESS, mat_holder_base_shininess);
  165.     glEndList();
  166.     glNewList(MAT_HOLDER_RINGS, GL_COMPILE); 
  167.     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_holder_rings_ambient); 
  168.     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_holder_rings_diffuse);
  169.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_holder_rings_specular);
  170.     glMaterialfv(GL_FRONT, GL_SHININESS, mat_holder_rings_shininess);
  171.     glEndList();
  172.     glNewList(MAT_HEMISPHERE, GL_COMPILE); 
  173.     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_hemisphere_ambient); 
  174.     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_hemisphere_diffuse);
  175.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_hemisphere_specular);
  176.     glMaterialfv(GL_FRONT, GL_SHININESS, mat_hemisphere_shininess);
  177.     glEndList();
  178. }
  179. void init_lights(void) {
  180.   static float ambient[] = { 0.1, 0.1, 0.1, 1.0 };
  181.   static float diffuse[] = { 0.5, 1.0, 1.0, 1.0 };
  182.   static float position[] = { 90.0, 90.0, 150.0, 0.0 };
  183.   
  184.   glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  185.   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  186.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  187.   glLightfv (GL_LIGHT1, GL_AMBIENT, light1_ambient);
  188.   glLightfv (GL_LIGHT1, GL_SPECULAR, light1_lcolor);
  189.   glLightfv (GL_LIGHT1, GL_DIFFUSE, light1_lcolor);
  190.   glLightfv (GL_LIGHT1, GL_POSITION, light1_position);
  191.     
  192.   glLightfv (GL_LIGHT2, GL_AMBIENT, light2_ambient);
  193.   glLightfv (GL_LIGHT2, GL_SPECULAR, light2_lcolor);
  194.   glLightfv (GL_LIGHT2, GL_DIFFUSE, light2_lcolor);
  195.   glLightfv (GL_LIGHT2, GL_POSITION, light2_position);
  196.   glLightfv (GL_LIGHT3, GL_AMBIENT, light3_ambient);
  197.   glLightfv (GL_LIGHT3, GL_SPECULAR, light3_lcolor);
  198.   glLightfv (GL_LIGHT3, GL_DIFFUSE, light3_lcolor);
  199.   glLightfv (GL_LIGHT3, GL_POSITION, light3_position);
  200.   
  201.   glLightModelfv (GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_LVW);
  202.   glLightModelfv (GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  203. }
  204. short dev, val;
  205. float current_time=0.0;
  206. float hold_time=0.0; /* Used when auto-running */
  207. float tmplight[] = {
  208.     GL_POSITION, 0.0, 0.0, 0.0, 0.0, 
  209. };
  210. GLfloat tv[4][4] = {
  211.   {1.0, 0.0, 0.0, 0.0},
  212.   {0.0, 1.0, 0.0, -1.0},
  213.   {0.0, 0.0, 1.0, 0.0},
  214.   {0.0, 0.0, 0.0, 0.0},
  215. };
  216. #define TABLERES 12
  217. float pcr, pcg, pcb, pca;
  218. vector table_points[TABLERES+1][TABLERES+1];
  219. GLubyte tablecolors[TABLERES+1][TABLERES+1];
  220. vector paper_points[4] = {
  221.     {-0.8, 0.0, 0.4},
  222.     {-0.2, 0.0, -1.4},
  223.     {1.0, 0.0, -1.0},
  224.     {0.4, 0.0, 0.8},
  225. };
  226. float dot(vector, vector);
  227. #define TIME 15
  228. #define START_TIME 0.6
  229. vector light_pos_ctl[] = {
  230.     {0.0, 1.8, 0.0},
  231.     {0.0, 1.8, 0.0},
  232.     {0.0, 1.6, 0.0},
  233.     {0.0, 1.6, 0.0},
  234.     {0.0, 1.6, 0.0},
  235.     {0.0, 1.6, 0.0},
  236.     {0.0, 1.4, 0.0},
  237.     {0.0, 1.3, 0.0},
  238.     {-0.2, 1.5, 2.0},
  239.     {0.8, 1.5, -0.4},
  240.     {-0.8, 1.5, -0.4},
  241.     {0.8, 2.0, 1.0},
  242.     {1.8, 5.0, -1.8},
  243.     {8.0, 10.0, -4.0},
  244.     {8.0, 10.0, -4.0},
  245.     {8.0, 10.0, -4.0},
  246. };
  247. vector logo_pos_ctl[] = {
  248.     {0.0, -0.5, 0.0},
  249.     {0.0, -0.5, 0.0},
  250.     {0.0, -0.5, 0.0},
  251.     {0.0, -0.5, 0.0},
  252.     {0.0, -0.5, 0.0},
  253.     {0.0, -0.5, 0.0},
  254.     {0.0, 0.0, 0.0},
  255.     {0.0, 0.6, 0.0},
  256.     {0.0, 0.75, 0.0},
  257.     {0.0, 0.8, 0.0},
  258.     {0.0, 0.8, 0.0},
  259.     {0.0, 0.5, 0.0},
  260.     {0.0, 0.5, 0.0},
  261.     {0.0, 0.5, 0.0},
  262.     {0.0, 0.5, 0.0},
  263.     {0.0, 0.5, 0.0},
  264. };
  265. vector logo_rot_ctl[] = {
  266.     {0.0, 0.0, -18.4},
  267.     {0.0, 0.0, -18.4},
  268.     {0.0, 0.0, -18.4},
  269.     {0.0, 0.0, -18.4},
  270.     {0.0, 0.0, -18.4},
  271.     {0.0, 0.0, -18.4},
  272.     {0.0, 0.0, -18.4},
  273.     {0.0, 0.0, -18.4},
  274. /*    {90.0, 0.0, -90.0},
  275.     {180.0, 180.0, 90.0}, */
  276.     {240.0, 360.0, 180.0},
  277.     {90.0, 180.0, 90.0},
  278.     {11.9, 0.0, -18.4},
  279.     {11.9, 0.0, -18.4},
  280.     {11.9, 0.0, -18.4},
  281.     {11.9, 0.0, -18.4},
  282.     {11.9, 0.0, -18.4},
  283. };
  284. vector view_from_ctl[] = {
  285.     {-1.0, 1.0, -4.0},
  286.     {-1.0, -3.0, -4.0}, /* 0 */
  287.     {-3.0, 1.0, -3.0}, /* 1 */
  288.     {-1.8, 2.0, 5.4}, /* 2 */
  289.     {-0.4, 2.0, 1.2}, /* 3 */
  290.     {-0.2, 1.5, 0.6}, /* 4 */
  291.     {-0.2, 1.2, 0.6}, /* 5 */
  292.     {-0.8, 1.0, 2.4}, /* 6 */
  293.     {-1.0, 2.0, 3.0}, /* 7 */
  294.     {0.0, 4.0, 3.6}, /* 8 */
  295.     {-0.8, 4.0, 1.2}, /* 9 */
  296.     {-0.2, 3.0, 0.6}, /* 10 */
  297.     {-0.1, 2.0, 0.3}, /* 11 */
  298.     {-0.1, 2.0, 0.3}, /* 12 */
  299.     {-0.1, 2.0, 0.3}, /* 13 */
  300.     {-0.1, 2.0, 0.3}, /* 13 */
  301. };
  302. vector view_to_ctl[] = {
  303.     {-1.0, 1.0, 0.0},
  304.     {-1.0, -3.0, 0.0},
  305.     {-1.0, 1.0, 0.0},
  306.     {0.1, 0.0, -0.3},
  307.     {0.1, 0.0, -0.3},
  308.     {0.1, 0.0, -0.3},
  309.     {0.0, 0.2, 0.0},
  310.     {0.0, 0.6, 0.0},
  311.     {0.0, 0.8, 0.0},
  312.     {0.0, 0.8, 0.0},
  313.     {0.0, 0.8, 0.0},
  314.     {0.0, 0.8, 0.0},
  315.     {0.0, 0.8, 0.0},
  316.     {0.0, 0.8, 0.0},
  317.     {0.0, 0.8, 0.0},
  318.     {0.0, 0.8, 0.0},
  319. };
  320. vector view_from, view_to, logo_pos, logo_rot;
  321. vector4 light_pos;
  322. parameter *view_from_spline, *view_to_spline,
  323.   *light_pos_spline, *logo_pos_spline,
  324.   *logo_rot_spline;
  325. double a3, a4;
  326. void ideas_usage(void)
  327. {
  328.   fprintf(stderr, "Usage: ideas [-a] [-m] [-d] -s{1-4}n");
  329.   fprintf(stderr, "Press ESC to quit, 1-4 to control speed, any other keyn");
  330.   fprintf(stderr, "to pause.n");
  331. }
  332.   int auto_run; /* If set, then automatically run forever */
  333.   float new_speed; /* Set new animation speed? */
  334.   int timejerk; /* Set to indicate time jerked! (menu pulled down) */
  335.   int paused = 0; /* Paused? */
  336.   int right = 0; /* Draw right eye? */
  337.   int resetclock; /* Reset the clock? */
  338.   float timeoffset; /* Used to compute timing */
  339.   struct timeval start;
  340. int main(int argc, char **argv)
  341. {
  342.   int i;
  343.   glutInit(&argc, argv);
  344.   auto_run = 0; /* Don't automatically run forever */
  345.   /* .4 spline distance per second by default */
  346.   move_speed = SPEED_MEDIUM;
  347.   new_speed = SPEED_MEDIUM;
  348.   timeoffset = START_TIME;
  349.   
  350.   for (i = 1; i < argc; i++) {
  351.     if (argv[i][0] != '-') {
  352.       break;
  353.     }
  354.     
  355.     switch(argv[i][1]) {
  356.     case 'a': /* Keep running forever */
  357.       auto_run = 1;
  358.       break;
  359.     case 'm': /* Multisample */
  360.       multisample = 1;
  361.       break;
  362.     case 'd': /* Single buffer */
  363.       doublebuffer = 0;
  364.       break;
  365.     case 's':
  366.       switch(argv[i][2]) {
  367.       case '1':
  368. move_speed = new_speed = SPEED_SLOW;
  369. break;
  370.       case '2':
  371. move_speed = new_speed = SPEED_MEDIUM;
  372. break;
  373.       case '3':
  374. move_speed = new_speed = SPEED_FAST;
  375. break;
  376.       case '4':
  377. move_speed = new_speed = SPEED_SUPER_FAST;
  378. break;
  379.       }
  380.       break;
  381.     default:
  382.       ideas_usage();
  383.       break;
  384.     }
  385.   }
  386.   
  387.   initialize();
  388.   
  389.   current_time = timeoffset;
  390.   resetclock = 1;
  391.   timejerk = 0;
  392.   glutMainLoop();
  393.   return 0;             /* ANSI C requires main to return int. */
  394. }
  395. static void idle(void) 
  396. {
  397.     if ((current_time) > (TIME*1.0)-3.0) {
  398.       if (auto_run) {
  399. hold_time += current_time - (TIME - 3.001);
  400. if (hold_time > 3.0) { /* 3 second hold */
  401.   hold_time = 0.0;
  402.   resetclock = 1;
  403. }
  404.       } else {
  405.         if(!resetclock) glutIdleFunc(NULL);
  406.       }
  407.       current_time = (TIME*1.0)-3.001;
  408.     } else {
  409.        post_idle = 1;
  410.     }
  411.     glutPostRedisplay();
  412. }
  413. /* ARGSUSED2 */
  414. static void
  415. mouse(int b, int s, int x, int y)
  416. {
  417.    if(b == GLUT_LEFT_BUTTON && s == GLUT_DOWN) {
  418.       resetclock = 1;
  419.       paused = 0;
  420.       glutIdleFunc(idle);
  421.    }
  422. }
  423. /* ARGSUSED1 */
  424. static void
  425. keyboard(unsigned char c, int x, int y)
  426. {
  427.    switch(c) {
  428.    case 27:
  429.       exit(0);
  430.       break;
  431.    case '1':
  432.       new_speed = SPEED_SLOW;
  433.       break;
  434.    case '2':
  435.       new_speed = SPEED_MEDIUM;
  436.       break;
  437.    case '3':
  438.       new_speed = SPEED_FAST;
  439.       break;
  440.    case '4':
  441.       new_speed = SPEED_SUPER_FAST;
  442.       break;
  443.    default:
  444.       if (paused) timejerk = 1;
  445.       paused = ~paused;
  446.       if(paused) {
  447.  glutIdleFunc(NULL);
  448.       } else {
  449.  glutIdleFunc(idle);
  450.       }
  451.    }
  452. }
  453. static void
  454. vis(int visible)
  455. {
  456.   if (visible == GLUT_VISIBLE) {
  457.       if(!paused) glutIdleFunc(idle);
  458.       do_post_idle();
  459.   } else {
  460.       if(!paused) glutIdleFunc(NULL);
  461.   }
  462. }
  463. static void display(void)
  464. {
  465.   float x, y, z, c;
  466.     calc_spline(view_from, view_from_spline, current_time);
  467.     calc_spline(view_to, view_to_spline, current_time);
  468.     calc_spline(light_pos, light_pos_spline, current_time);
  469.     light_pos[3] = 0.0;
  470.     calc_spline(logo_pos, logo_pos_spline, current_time);
  471.     calc_spline(logo_rot, logo_rot_spline, current_time);
  472.     
  473.     tmplight[1] = light_pos[X] - logo_pos[X];
  474.     tmplight[2] = light_pos[Y] - logo_pos[Y];
  475.     tmplight[3] = light_pos[Z] - logo_pos[Z];
  476.     
  477.     glNewList(LIGHT_TMP, GL_COMPILE); 
  478.     glMaterialf(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, * tmplight); 
  479.     glEndList();
  480.     
  481.     tv[0][0] = tv[1][1] = tv[2][2] = light_pos[Y];
  482.     
  483.     glColor3ub(0,  0,  0);
  484.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
  485.     
  486.     /*
  487.      * SHADOW
  488.      */
  489.     glMatrixMode(GL_MODELVIEW);
  490.     glLoadIdentity();
  491.     gluLookAt(view_from[X], view_from[Y], view_from[Z], 
  492.       view_to[X], view_to[Y], view_to[Z],
  493.       0.0, 1.0, 0.0);
  494.     
  495.     if (view_from[Y] > 0.0) draw_table();
  496.     glEnable(GL_CULL_FACE); 
  497.     glDisable(GL_DEPTH_TEST); 
  498.     if (logo_pos[Y] < 0.0) {
  499.       
  500.       if (logo_pos[Y]>-0.33) {
  501. /* We're emerging from the table */
  502. c = 1.0 - (logo_pos[Y]) / -0.33;
  503. pca /= 4.0;
  504. glColor3ub((GLubyte)(128.0*(1.0-c)*0.5 + 255.0*pca*c),
  505.    (GLubyte)(102.0*(1.0-c)*0.5 + 255.0*pca*c),
  506.    (GLubyte)(179.0*(1.0-c)*0.5 + 200.0*pca*c));
  507.       } else {
  508. /* Still under table */
  509. glColor3ub(128/2,  102/2,  179/2);
  510.       }
  511.       
  512.       glPushMatrix();
  513.       glScalef(0.04,  0.0,  0.04);
  514.       glRotatef(0.1 * (-900), 1.0, 0.0, 0.0);
  515.       glRotatef(0.1 * ((int)(10.0*logo_rot[Z])), 0.0, 0.0, 1.0);
  516.       glRotatef(0.1 * ((int)(10.0*logo_rot[Y])), 0.0, 1.0, 0.0);
  517.       glRotatef(0.1 * ((int)(10.0*logo_rot[X])), 1.0, 0.0, 0.0);
  518.       glRotatef(0.1 * (353), 1.0, 0.0, 0.0);
  519.       glRotatef(0.1 * (450), 0.0, 1.0, 0.0);
  520.       draw_logo_shadow();
  521.       glPopMatrix();
  522.     }
  523.     
  524.     if (logo_pos[Y] > 0.0) {
  525.       glPushMatrix();
  526.       if (logo_pos[Y]<0.33) {
  527. pca /= 4.0;
  528. c = 1.0 - (logo_pos[Y])/0.33;
  529. glColor3ub((GLubyte)(255.0*pca*c),
  530.    (GLubyte)(255.0*pca*c),
  531.    (GLubyte)(200.0*pca*c));
  532.       } else {
  533. glColor3ub(0, 0, 0);
  534.       }
  535.       
  536.       glTranslatef(light_pos[X],  light_pos[Y],  light_pos[Z]);
  537.       glMultMatrixf(&tv[0][0]);
  538.       glTranslatef(-light_pos[X]+logo_pos[X],
  539.    -light_pos[Y]+logo_pos[Y],
  540.    -light_pos[Z]+logo_pos[Z]);
  541.       glScalef(0.04,  0.04,  0.04);
  542.       glRotatef (0.1 * (-900), 1.0, 0.0, 0.0);
  543.       glRotatef (0.1 * ((int)(10.0*logo_rot[Z])), 0.0, 0.0, 1.0);
  544.       glRotatef (0.1 * ((int)(10.0*logo_rot[Y])), 0.0, 1.0, 0.0);
  545.       glRotatef (0.1 * ((int)(10.0*logo_rot[X])), 1.0, 0.0, 0.0);
  546.       glRotatef (0.1 * (353), 1.0, 0.0, 0.0);
  547.       glRotatef (0.1 * (450), 0.0, 1.0, 0.0);
  548.       glEnable(GL_POLYGON_STIPPLE);
  549.       glPolygonStipple(stipple);
  550.       draw_logo_shadow();
  551.       glDisable(GL_POLYGON_STIPPLE);
  552.       glPopMatrix();
  553.     }
  554.     /*
  555.      * DONE SHADOW 
  556.      */
  557.     glEnable(GL_DEPTH_TEST);
  558.     glDisable(GL_CULL_FACE);
  559.     glEnable(GL_LIGHTING);
  560.     glMatrixMode(GL_PROJECTION);
  561.     glLoadIdentity();
  562.     gluPerspective(.1*(450),  5.0/4.0,  0.5,  20.0);
  563.     glMatrixMode(GL_MODELVIEW);
  564.     glLoadIdentity();
  565.     
  566.     gluLookAt(view_from[X],  view_from[Y],  view_from[Z],
  567.       view_to[X],  view_to[Y],  view_to[Z], 
  568.       0.0, 1.0, 0.0);
  569.     
  570.     glCallList( MAT_HOLDER_RINGS); 
  571.     
  572.     glPushMatrix();
  573.     glTranslatef(light_pos[X],  light_pos[Y],  light_pos[Z]);
  574.     glScalef(0.1,  0.1,  0.1);
  575.     
  576.     x = light_pos[X] - logo_pos[X];
  577.     y = light_pos[Y] - logo_pos[Y];
  578.     z = light_pos[Z] - logo_pos[Z];
  579.     
  580.     if (x!=0.0) {
  581.       a3 = -atan2(z, x)*10.0 RAD;
  582.     } else a3 = 0.0;
  583.     
  584.     a4 = -atan2(sqrt(x*x + z*z), y)*10.0 RAD;
  585.     
  586.     glRotatef (0.1 * ((int)a3), 0.0, 1.0, 0.0);
  587.     glRotatef (0.1 * ((int)a4), 0.0, 0.0, 1.0);
  588.     glRotatef (0.1 * (-900), 1.0, 0.0, 0.0);
  589.     
  590.     glEnable(GL_LIGHT2);
  591.     glEnable(GL_LIGHT3);
  592.     glCallList(MAT_HEMISPHERE);
  593.     glEnable(GL_NORMALIZE);
  594.     draw_hemisphere();
  595.     glDisable(GL_NORMALIZE);
  596.     glPopMatrix();
  597.     glDisable(GL_LIGHT2);
  598.     glDisable(GL_LIGHT3); 
  599.     glEnable(GL_LIGHT1);
  600.     glLightfv(GL_LIGHT1, GL_POSITION, light_pos);
  601.     
  602.     if (logo_pos[Y] > -0.33) {
  603.       glCallList(MAT_LOGO);
  604.     
  605.       glPushMatrix();
  606.       glTranslatef(logo_pos[X],  logo_pos[Y],  logo_pos[Z]);
  607.       glScalef(0.04,  0.04,  0.04);
  608.       glRotatef (0.1 * (-900), 1.0, 0.0, 0.0);
  609.       glRotatef (0.1 * ((int)(10.0*logo_rot[Z])), 0.0, 0.0, 1.0);
  610.       glRotatef (0.1 * ((int)(10.0*logo_rot[Y])), 0.0, 1.0, 0.0);
  611.       glRotatef (0.1 * ((int)(10.0*logo_rot[X])), 1.0, 0.0, 0.0);
  612.       glRotatef (0.1 * (353), 1.0, 0.0, 0.0);
  613.       glRotatef (0.1 * (450), 0.0, 1.0, 0.0);
  614.       glEnable(GL_LIGHTING);
  615.       draw_logo();
  616.       glPopMatrix();
  617.     }
  618.     
  619.     if (view_from[Y] < 0.0) draw_under_table();
  620.     
  621.     glutSwapBuffers();
  622.     if(post_idle) do_post_idle();
  623. }
  624. static void do_post_idle(void)
  625. {
  626.   struct timeval current;
  627.   float timediff;
  628.     /* Time jerked -- adjust clock appropriately */
  629.     if (timejerk) {
  630.       timejerk = 0;
  631.       timeoffset = current_time;
  632.       gettimeofday(&start, NULL);
  633.     }
  634.     
  635.     /* Reset our timer */
  636.     if (resetclock) {
  637.       resetclock = 0;
  638.       paused = 0;
  639.       timeoffset = START_TIME;
  640.       gettimeofday(&start, NULL);
  641.     }
  642.     
  643.     /* Compute new time */
  644.     gettimeofday(&current, NULL);
  645.     timediff = (current.tv_sec - start.tv_sec) + 
  646.       ((double) (current.tv_usec - start.tv_usec)) / 1000000.0;
  647.     if (!paused) {
  648.        current_time = timediff * move_speed + timeoffset;
  649.     }
  650.     
  651.     /* Adjust to new speed */
  652.     if (new_speed != move_speed) {
  653.       move_speed = new_speed;
  654.       timeoffset = current_time;
  655.       gettimeofday(&start, NULL);
  656.     }
  657.     post_idle = 0;
  658. }
  659. static void resize_window(int w, int h) 
  660. {
  661.   glMatrixMode(GL_PROJECTION);
  662.   glLoadIdentity();
  663.   gluPerspective (45.0, 5.0/4.0, 0.5, 20.0); 
  664.   glMatrixMode(GL_MODELVIEW);
  665.   glLoadIdentity();
  666.   glViewport(0, 0, w, h);
  667. }
  668. static void initialize(void)
  669. {
  670.     int attr;
  671.     attr = doublebuffer ? RGBA_DB_attributes : RGBA_SB_attributes;
  672.     glutInitDisplayMode(attr);
  673.     glutInitWindowSize(640, 480);
  674.     glutCreateWindow("Ideas");
  675.     if (multisample) glEnable(GL_POLYGON_SMOOTH); 
  676.     
  677.     init_lights();
  678.     init_materials();
  679.     build_table();
  680.     view_from_spline = calc_spline_params(view_from_ctl, TIME);
  681.     view_to_spline = calc_spline_params(view_to_ctl, TIME);
  682.     light_pos_spline = calc_spline_params(light_pos_ctl, TIME);
  683.     logo_pos_spline = calc_spline_params(logo_pos_ctl, TIME);
  684.     logo_rot_spline = calc_spline_params(logo_rot_ctl, TIME);
  685.     glutReshapeFunc(resize_window);
  686.     glutDisplayFunc(display);
  687.     glutMouseFunc(mouse);
  688.     glutKeyboardFunc(keyboard);
  689.     glutVisibilityFunc(vis);
  690.     glMatrixMode(GL_MODELVIEW);
  691. }
  692. static void build_table(void) 
  693. {
  694.     float i, j;
  695.     for (j=0.0; j<=TABLERES*1.0; j+=1.0) {
  696. for (i=0.0; i<=TABLERES*1.0; i+=1.0) {
  697.     table_points[(int)j][(int)i][Z] = (i-TABLERES*1.0/2.0)/2.0;
  698.     table_points[(int)j][(int)i][X] = (j-TABLERES*1.0/2.0)/2.0;
  699.     table_points[(int)j][(int)i][Y] = 0.0;
  700. }
  701.     }
  702. }
  703. void draw_table(void)
  704. {
  705.     float c;
  706.     int i, j;
  707.     int k, l;
  708.     float ov[3], lv[3];
  709.     glDisable(GL_DEPTH_TEST);
  710.     glDisable(GL_LIGHTING);
  711.     ov[X] = light_pos[X]-logo_pos[X];
  712.     ov[Y] = light_pos[Y]-logo_pos[Y];
  713.     ov[Z] = light_pos[Z]-logo_pos[Z];
  714.     normalize(ov);
  715.     for (j=0; j<=TABLERES; j++) {
  716.       for (i=0; i<=TABLERES; i++) {
  717. lv[X] = light_pos[X] - table_points[j][i][X];
  718. lv[Y] = light_pos[Y] - table_points[j][i][Y];
  719. lv[Z] = light_pos[Z] - table_points[j][i][Z];
  720. normalize(lv);
  721. if ((c = dot(lv, ov))<0.0) c = 0.0;
  722. c = c * c * c * lv[Y] * 255.0;
  723. /* fade */
  724. if ((current_time>TIME-5.0) && (current_time<TIME-3.0)) 
  725.   c *= 1.0 - (current_time-(TIME-5.0)) * 0.5;
  726. tablecolors[j][i] = (int)c;
  727.       }
  728.     }
  729.     
  730.     
  731.     for (l=0; l<TABLERES; l++) {
  732.       
  733.       glBegin(GL_TRIANGLE_STRIP);
  734.       for (k=0; k<=TABLERES; k++) {
  735. glColor3ub(tablecolors[l][k],
  736.    tablecolors[l][k],
  737.    tablecolors[l][k]);
  738. glVertex3fv(table_points[l][k]);
  739. glColor3ub(tablecolors[l+1][k],
  740.    tablecolors[l+1][k], 
  741.    tablecolors[l+1][k]);
  742. glVertex3fv(table_points[l+1][k]);
  743.       }
  744. glEnd();
  745.     }
  746.     if (logo_pos[Y]>-0.33 && logo_pos[Y]<0.33) {
  747. glEnable(GL_DEPTH_TEST);
  748.     }
  749.     pca = 0.0;
  750.     glBegin(GL_POLYGON);
  751.     for (i=0; i<4; i++) {
  752.       lv[X] = light_pos[X] - paper_points[i][X];
  753.       lv[Y] = light_pos[Y] - paper_points[i][Y];
  754.       lv[Z] = light_pos[Z] - paper_points[i][Z];
  755.       normalize(lv);
  756.       if ((c = dot(lv, ov))<0.0) c = 0.0;
  757.       c = c * c * c * lv[Y];
  758.       /* fade */
  759.       if ((current_time>TIME-5.0) && (current_time<TIME-3.0)) 
  760. c *= 1.0 - (current_time-(TIME-5.0)) * 0.5;
  761.       
  762.       pcr = c * 255; pcg = c * 255; pcb = c * 200;
  763.       pca += c;
  764.       glColor3ub((GLubyte)pcr,  (GLubyte)pcg,  (GLubyte)pcb);
  765.       glVertex3fv(paper_points[i]);
  766.     }
  767.     glEnd();
  768.     glPushMatrix();
  769.     glRotatef (0.1 * (-184), 0.0, 1.0, 0.0);
  770.     glTranslatef(-0.3, 0.0, -0.8);
  771.     glRotatef (0.1 * (-900), 1.0, 0.0, 0.0);
  772.     glScalef(0.015, 0.015, 0.015);
  773.     if (current_time>TIME*1.0-5.0) {
  774. c = (current_time-(TIME*1.0-5.0))/2.0;
  775. glColor3ub((GLubyte)(c*255.0),  (GLubyte)(c*255.0),  (GLubyte)(c*255.0));
  776.     } else glColor3ub(0,  0,  0);
  777.     glDisable(GL_DEPTH_TEST);
  778.     draw_i();
  779.     glTranslatef(3.0,  0.0,  0.0);
  780.     draw_d();
  781.     glTranslatef(6.0,  0.0,  0.0);
  782.     draw_e();
  783.     glTranslatef(5.0,  0.0,  0.0);
  784.     draw_a();
  785.     glTranslatef(6.0,  0.0,  0.0);
  786.     draw_s();
  787.     glTranslatef(10.0,  0.0,  0.0);
  788.     draw_i();
  789.     glTranslatef(3.0,  0.0,  0.0);
  790.     draw_n();
  791.     glTranslatef(-31.0,  -13.0,  0.0);
  792.     draw_m();
  793.     glTranslatef(10.0,  0.0,  0.0);
  794.     draw_o();
  795.     glTranslatef(5.0,  0.0,  0.0);
  796.     draw_t();
  797.     glTranslatef(4.0,  0.0,  0.0);
  798.     draw_i();
  799.     glTranslatef(3.5,  0.0,  0.0);
  800.     draw_o();
  801.     glTranslatef(5.0,  0.0,  0.0);
  802.     draw_n();
  803.     glPopMatrix();
  804. }
  805. void draw_under_table(void) 
  806. {
  807.     int k, l;
  808.     glDisable(GL_DEPTH_TEST);
  809.     glColor3ub(0,  0,  0);
  810.     for (l=0; l<TABLERES; l++) {
  811. glBegin(GL_TRIANGLE_STRIP);
  812. for (k=0; k<=TABLERES; k++) {
  813.     glVertex3fv(table_points[l][k]);
  814.     glVertex3fv(table_points[l+1][k]);
  815. }
  816. glEnd();
  817.     }
  818.     glEnable(GL_DEPTH_TEST); 
  819. }
  820. static void calc_spline(vector v, parameter *params, float current_time)
  821. {
  822.     float t;
  823.     int ti, i;
  824.     t = current_time - (float)((int)current_time);
  825.     ti = current_time;
  826.     /* XXX Hack so that time will not overflow the params array.
  827.        The size of the spline params array should not be built into
  828.        this routine this way. */
  829.     if (ti >= (TIME - 3)) {
  830.       ti = TIME - 4;
  831.     }
  832.     for (i=0; i<3; i++) {
  833. v[i] = params[ti][3][i] +
  834.        params[ti][2][i] * t +
  835.        params[ti][1][i] * t * t +
  836.        params[ti][0][i] * t * t * t;
  837.     }
  838. }
  839. static parameter *calc_spline_params(vector *ctl_pts, int n)
  840. {
  841.     int i, j;
  842.     parameter *params;
  843.     if (n<4) {
  844. fprintf(stderr,
  845.     "calc_spline_params: not enough control pointsn");
  846. return (NULL);
  847.     }
  848.     params = (parameter *)malloc(sizeof(parameter) * (n-3));
  849.     for (i=0; i<n-3; i++) {
  850. for (j=0; j<3; j++) {
  851.     params[i][3][j] = ctl_pts[i+1][j];
  852.     params[i][2][j] = ctl_pts[i+2][j] - ctl_pts[i][j];
  853.     params[i][1][j] =  2.0 * ctl_pts[i][j] +
  854.       -2.0 * ctl_pts[i+1][j] +
  855.        1.0 * ctl_pts[i+2][j] +
  856.       -1.0 * ctl_pts[i+3][j];
  857.     params[i][0][j] = -1.0 * ctl_pts[i][j] +
  858.        1.0 * ctl_pts[i+1][j] +
  859.       -1.0 * ctl_pts[i+2][j] +
  860.        1.0 * ctl_pts[i+3][j];
  861. }
  862.     }
  863.     return (params);
  864. }
  865. static void normalize(vector v)
  866. {
  867.     float r;
  868.     r = sqrt(v[X]*v[X] + v[Y]*v[Y] + v[Z]*v[Z]);
  869.     v[X] /= r;
  870.     v[Y] /= r;
  871.     v[Z] /= r;
  872. }
  873. static float dot(vector v1, vector v2)
  874. {
  875.     return v1[X]*v2[X]+v1[Y]*v2[Y]+v1[Z]*v2[Z];
  876. }