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

GIS编程

开发平台:

Visual C++

  1. #include <GL/glut.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. double floor(double o);
  6. #define ACC 48
  7. /* Some <math.h> files do not define M_PI... */
  8. #ifndef M_PI
  9. #define M_PI 3.14159265358979323846
  10. #endif
  11. #define FOG
  12. #define FOG_D 0.1
  13. #define DIST 30
  14. #define MESA_BUGGED
  15. int rr=0;
  16. int frame = 0;
  17. GLfloat difmat1[4] = { 1.0, 0.4, 0.4, 1.0 };
  18. GLfloat difamb1[4] = { 1.0, 0.4, 0.4, 1.0 };
  19. GLfloat difmat2[4] = { 0.6, 0.6, 0.6, 1.0 };
  20. GLfloat difamb2[4] = { 0.6, 0.6, 0.6, 1.0 };
  21. GLfloat difmat3[4] = { 1.0, 1.0, 1.0, 1.0 };
  22. GLfloat difamb3[4] = { 1.0, 1.0, 1.0, 1.0 };
  23. GLfloat difmat4[4] = { 0.5, 0.5, 1.0, 1.0 };
  24. GLfloat difamb4[4] = { 0.5, 0.5, 1.0, 1.0 };
  25. GLfloat difmat5[4] = { 1.0, 1.0, 0.5, 1.0 };
  26. GLfloat difamb5[4] = { 1.0, 1.0, 0.5, 1.0 };
  27. GLfloat matspec1[4] = { 1.0, 1.0, 1.0, 0.0 };
  28. GLfloat matspec2[4] = { 0.774, 0.774, 0.774, 1.0 };
  29. GLfloat matspec4[4] = { 0.5, 0.5, 1.0, 1.0 };
  30. GLfloat dif_zwart[4] = { 0.3, 0.3, 0.3, 1.0 };
  31. GLfloat amb_zwart[4] = { 0.4, 0.4, 0.4, 1.0 };
  32. GLfloat spc_zwart[4] = { 0.4, 0.4, 0.4, 1.0 };
  33. GLfloat dif_copper[4] = { 0.5, 0.3, 0.1, 1.0 };
  34. GLfloat amb_copper[4] = { 0.2, 0.1, 0.0, 1.0 };
  35. GLfloat spc_copper[4] = { 0.3, 0.1, 0.1, 1.0 };
  36. GLfloat fogcol[4] = { 1.0, 1.0, 1.0, 1.0 };
  37. GLfloat hishin[1] = { 100.0 };
  38. GLfloat loshin[1] = { 5.0 };
  39. GLfloat lightpos[4] = { 1.0, 1.0, 1.0, 0.0 };
  40. GLfloat lightamb[4] = { 0.2, 0.2, 0.2, 1.0 };
  41. GLfloat lightdif[4] = { 0.8, 0.8, 0.8, 1.0 };
  42. GLubyte texture[32][32][3];
  43. GLubyte sky[32][32][3];
  44. #if defined(_WIN32)
  45. #define drand48() (((float) rand())/((float) RAND_MAX))
  46. #endif
  47. int rnd(int i)
  48. {
  49.    return (int) ((double) drand48()*i);
  50. }
  51. void make_texture(void)
  52. {
  53.     int i,j;
  54.     GLubyte r, g, b;
  55.     for (i=0;i<32;i++)
  56.     {
  57. for (j=0;j<32;j++)
  58. {
  59.     r = 100 + rnd(156);
  60.     g = 100 + rnd(156);
  61.     b = (b+g)/2 - rnd(100);
  62.     texture[i][j][0] = r/2;
  63.     texture[i][j][1] = g/2;
  64.     texture[i][j][2] = b/2;
  65.     r = rnd(100);
  66.     b = rnd(100)+156;
  67.     sky[i][j][1] = sky[i][j][0] = r;
  68.     sky[i][j][2] = b;
  69. }
  70.     }
  71. }
  72. #define MAX 10000
  73. extern int tot;
  74. float plaatje = 0.0;
  75. float speed = 0;
  76. int angle = 0;
  77. float angle2 = 0;
  78. float angle3 = 0;
  79. GLfloat x[MAX], y[MAX], z[MAX];
  80. GLfloat dx[MAX], dy[MAX], dz[MAX];
  81. GLfloat al[MAX], rl[MAX], hd[MAX], pt[MAX];
  82. GLfloat strips[27][MAX][3], normal[27][MAX][3], bnormal[2][MAX][3];
  83. GLdouble cum_al = 0.0, view_al = 0.0;
  84. int opt[MAX];
  85. GLfloat r1[MAX], r2[MAX], r3[MAX];
  86. void copper_texture(void)
  87. {
  88.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, dif_copper);
  89.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, amb_copper);
  90.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spc_copper);
  91.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 13);
  92. }
  93. void groen_texture(void)
  94. {
  95.     glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat4);
  96.     glMaterialfv(GL_FRONT, GL_AMBIENT, difamb4);
  97.     glMaterialfv(GL_FRONT, GL_SPECULAR, matspec4);
  98.     glMaterialf(GL_FRONT, GL_SHININESS, 5.0);
  99. }
  100. void rood_texture(void)
  101. {
  102.     glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat1);
  103.     glMaterialfv(GL_FRONT, GL_AMBIENT, difamb1);
  104.     glMaterialfv(GL_FRONT, GL_SPECULAR, matspec1);
  105.     glMaterialf(GL_FRONT, GL_SHININESS, 0.1*128);
  106. }
  107. void metaal_texture(void)
  108. {
  109.     glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat2);
  110.     glMaterialfv(GL_FRONT, GL_AMBIENT, difamb2);
  111.     glMaterialfv(GL_FRONT, GL_SPECULAR, matspec2);
  112.     glMaterialf(GL_FRONT, GL_SHININESS, 0.6*128.0);
  113. }
  114. void wit_texture(void)
  115. {
  116.     glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat3);
  117.     glMaterialfv(GL_FRONT, GL_AMBIENT, difamb3);
  118.     glMaterialfv(GL_FRONT, GL_SPECULAR, matspec1);
  119.     glMaterialf(GL_FRONT, GL_SHININESS, 0.8*128.0);
  120. }
  121. void geel_texture(void)
  122. {
  123.     glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat5);
  124.     glMaterialfv(GL_FRONT, GL_AMBIENT, difamb5);
  125.     glMaterialfv(GL_FRONT, GL_SPECULAR, matspec1);
  126.     glMaterialf(GL_FRONT, GL_SHININESS, 0.8*128.0);
  127. }
  128. void zwart_texture(void)
  129. {
  130.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, dif_zwart);
  131.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, amb_zwart);
  132.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spc_zwart);
  133.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 90);
  134. }
  135. #define VERTEX(I,J) glNormal3fv(normal[I][J]); glVertex3fv(strips[I][J]);
  136. void do_display (void)
  137. {
  138.     int i,j,s,t, tmp;
  139.     cum_al = 0.0;
  140.     metaal_texture();
  141.     for (s=0;s<24;s += 2)
  142.     {
  143. t = s+2;
  144. if (!(t&7))
  145.     t=t-8;
  146. if (s == 16)
  147.     rood_texture();
  148. glBegin(GL_QUADS);
  149. for (i=0;i<tot;i=j)
  150. {
  151.     tmp = 0;
  152.     for (j=i+1;j<tot;j++)
  153. if ((tmp=tmp+tmp+opt[j]) > 4000 || (!(j%(3*DIST))))
  154.     break;
  155.     if (j>=tot)
  156. j = 0;
  157.     rr++;
  158.     VERTEX(s, j);
  159.     VERTEX(s, i);
  160.     VERTEX(t, i);
  161.     VERTEX(t, j);
  162.     if (!j)
  163. break;
  164. }
  165. glEnd();
  166.     }
  167.     printf("Split up to %d parts.n", rr);
  168.     rood_texture();
  169.     for (i=0;i<tot-2;i+=DIST)
  170.     {
  171. if (!(i%(DIST*5)))
  172.     continue;
  173. glBegin(GL_QUADS);
  174. glNormal3fv(bnormal[0][i]);
  175. glVertex3fv(strips[24][i]);
  176. glVertex3fv(strips[24][i+5]);
  177. glVertex3fv(strips[26][i+5]);
  178. glVertex3fv(strips[26][i]);
  179. glNormal3fv(bnormal[1][i]);
  180. glVertex3fv(strips[25][i]);
  181. glVertex3fv(strips[25][i+5]);
  182. glVertex3fv(strips[26][i+5]);
  183. glVertex3fv(strips[26][i]);
  184. glEnd();
  185.     }
  186.     wit_texture();
  187.     for (i=0;i<tot-2;i+=DIST)
  188.     {
  189. if (i%(DIST*5))
  190.     continue;
  191. glBegin(GL_QUADS);
  192. glNormal3fv(bnormal[0][i]);
  193. glVertex3fv(strips[24][i]);
  194. glVertex3fv(strips[24][i+5]);
  195. glVertex3fv(strips[26][i+5]);
  196. glVertex3fv(strips[26][i]);
  197. glNormal3fv(bnormal[1][i]);
  198. glVertex3fv(strips[25][i]);
  199. glVertex3fv(strips[25][i+5]);
  200. glVertex3fv(strips[26][i+5]);
  201. glVertex3fv(strips[26][i]);
  202. glEnd();
  203.     }
  204.     groen_texture();
  205.     glBegin(GL_QUADS);
  206.     for (i=0;i<tot;i+=90)
  207.     {
  208. if (dy[i]<0.2)
  209.     continue;
  210. glNormal3f(-1.0, 0.0, 0.0);
  211. glVertex3f(strips[22][i][0]-0.7,-4,strips[22][i][2]-0.7);
  212. glVertex3f(strips[22][i][0]-0.2,strips[16][i][1],strips[22][i][2]-0.2);
  213. glVertex3f(strips[22][i][0]-0.2,strips[16][i][1],strips[22][i][2]+0.2);
  214. glVertex3f(strips[22][i][0]-0.7,-4,strips[22][i][2]+0.7);
  215. glNormal3f(0.0, 0.0, 1.0);
  216. glVertex3f(strips[22][i][0]+0.7,-4,strips[22][i][2]+0.7);
  217. glVertex3f(strips[22][i][0]+0.2,strips[16][i][1],strips[22][i][2]+0.2);
  218. glVertex3f(strips[22][i][0]-0.2,strips[16][i][1],strips[22][i][2]+0.2);
  219. glVertex3f(strips[22][i][0]-0.7,-4,strips[22][i][2]+0.7);
  220. glNormal3f(0.0, 0.0, -1.0);
  221. glVertex3f(strips[22][i][0]+0.7,-4,strips[22][i][2]-0.7);
  222. glVertex3f(strips[22][i][0]+0.2,strips[16][i][1],strips[22][i][2]-0.2);
  223. glVertex3f(strips[22][i][0]-0.2,strips[16][i][1],strips[22][i][2]-0.2);
  224. glVertex3f(strips[22][i][0]-0.7,-4,strips[22][i][2]-0.7);
  225. glNormal3f(1.0, 0.0, 0.0);
  226. glVertex3f(strips[22][i][0]+0.7,-4,strips[22][i][2]-0.7);
  227. glVertex3f(strips[22][i][0]+0.2,strips[16][i][1],strips[22][i][2]-0.2);
  228. glVertex3f(strips[22][i][0]+0.2,strips[16][i][1],strips[22][i][2]+0.2);
  229. glVertex3f(strips[22][i][0]+0.7,-4,strips[22][i][2]+0.7);
  230.     }
  231.     glEnd();
  232. }
  233. void do_one_wheel(void)
  234. {
  235.     float a,p,q;
  236.     int i;
  237.     copper_texture();
  238.     glBegin(GL_QUAD_STRIP);
  239.     for (i=0;i<=ACC;i++)
  240.     {
  241. a = i*M_PI*2/ACC;
  242. p = cos(a);
  243. q = sin(a);
  244. glNormal3f(p, q, 0.4);
  245. glVertex3f(0.7*p, 0.7*q, 0.8);
  246. glNormal3f(0.0, 0.0, 1.0);
  247. glVertex3f(0.8*p, 0.8*q, 0.7);
  248.     }
  249.     glEnd();
  250.     glBegin(GL_QUAD_STRIP);
  251.     for (i=0;i<=ACC;i++)
  252.     {
  253. a = i*M_PI*2/ACC;
  254. p = cos(a);
  255. q = sin(a);
  256. glNormal3f(0.0, 0.0, 1.0);
  257. glVertex3f(0.7*p, 0.7*q, 0.8);
  258. glVertex3f(0.6*p, 0.6*q, 0.8);
  259.     }
  260.     glEnd();
  261.     glBegin(GL_QUAD_STRIP);
  262.     for (i=0;i<=ACC;i++)
  263.     {
  264. a = i*M_PI*2/ACC;
  265. p = cos(a);
  266. q = sin(a);
  267. glNormal3f(-p, -q, 0.0);
  268. glVertex3f(0.6*p, 0.6*q, 0.8);
  269. glVertex3f(0.6*p, 0.6*q, 0.7);
  270.     }
  271.     glEnd();
  272.     glBegin(GL_QUADS);
  273.     for (i=0;i<=12;i++)
  274.     {
  275. a = i*M_PI/6;
  276. p = cos(a);
  277. q = sin(a);
  278. glNormal3f(p, q, 0.0);
  279. glVertex3f(0.65*p + 0.08*q, 0.65*q + 0.08*p, 0.75);
  280. glVertex3f(0.65*p - 0.08*q, 0.65*q - 0.08*p, 0.75);
  281. glVertex3f(-0.08*q, -0.08*p, 0.95);
  282. glVertex3f(0.08*q, 0.08*p, 0.95);
  283. if (!i)
  284.     rood_texture();
  285.     }
  286.     zwart_texture();
  287.     glNormal3f(0.0, 1.0, 0.0);
  288.     glVertex3f(0.1, 0.0, 0.8);
  289.     glVertex3f(-0.1, 0.0, 0.8);
  290.     glVertex3f(-0.1, 0.0, -0.8);
  291.     glVertex3f(0.1, 0.0, -0.8);
  292.     glNormal3f(1.0, 0.0, 0.0);
  293.     glVertex3f(0.0, 0.1, 0.8);
  294.     glVertex3f(0.0, -0.1, 0.8);
  295.     glVertex3f(0.0, -0.1, -0.8);
  296.     glVertex3f(0.0, 0.1, -0.8);
  297.     glEnd();
  298. }
  299. void init_wheel(void)
  300. {
  301.     glNewList(2, GL_COMPILE);
  302.     do_one_wheel();
  303.     glRotatef(180.0, 0.0, 1.0, 0.0);
  304.     do_one_wheel();
  305.     glRotatef(180.0, 0.0, 1.0, 0.0);
  306.     glEndList();
  307. }
  308. void display_wheel(float w)
  309. {
  310.     int ww = w;
  311.     glPopMatrix();
  312.     glPushMatrix();
  313.     glTranslatef(x[ww], y[ww], z[ww]);
  314.     glRotatef(r3[ww]*180/M_PI, 0.0, 0.0, 1.0);
  315.     glRotatef(-r2[ww]*180/M_PI, 0.0, 1.0, 0.0);
  316.     glRotatef(r1[ww]*180/M_PI, 1.0, 0.0, 0.0);
  317.     glTranslatef(-0.15*(w-ww), 0.8, 0.0);
  318.     glRotatef(-w, 0.0, 0.0, 1.0);
  319.     glCallList(2);
  320.     glRotatef(w, 0.0, 0.0, 1.0);
  321.     glTranslatef(0.0, -0.8, 0.0);
  322.     zwart_texture();
  323.     glBegin(GL_QUADS);
  324.     glNormal3f(0.0, 1.0, 0.0);
  325.     glVertex3f(-0.3, 1.1, 0.3);
  326.     glVertex3f(1.0, 1.1, 0.3);
  327.     glVertex3f(1.0, 1.1, -0.3);
  328.     glVertex3f(0.3, 1.1, -0.3);
  329.     glEnd();
  330. }
  331. void display_cart(float w)
  332. {
  333.     display_wheel(w);
  334.     geel_texture();
  335.     glEnable(GL_AUTO_NORMAL);
  336.     glEnable(GL_NORMALIZE);
  337.     glBegin(GL_QUADS);
  338.     glNormal3f(0.0, 1.0, 0.0);
  339.     glVertex3f(0.5, 0.8, -0.70);
  340.     glVertex3f(0.5, 0.8, 0.70);
  341.     glVertex3f(-2.0, 0.8, 0.70);
  342.     glVertex3f(-2.0, 0.8, -0.70);
  343.     glNormal3f(1.0, 0.0, 0.0);
  344.     glVertex3f(-2.0, 0.8, -0.70);
  345.     glVertex3f(-2.0, 0.8, 0.70);
  346.     glVertex3f(-2.0, 2.3, 0.70);
  347.     glVertex3f(-2.0, 2.3, -0.70);
  348.     glNormal3f(0.71, 0.71, 0.0);
  349.     glVertex3f(-2.0, 2.3, -0.70);
  350.     glVertex3f(-2.0, 2.3, 0.70);
  351.     glVertex3f(-1.7, 2.0, 0.70);
  352.     glVertex3f(-1.7, 2.0, -0.70);
  353.     glNormal3f(0.12, 0.03, 0.0);
  354.     glVertex3f(-1.7, 2.0, -0.70);
  355.     glVertex3f(-1.7, 2.0, 0.70);
  356.     glVertex3f(-1.4, 0.8, 0.70);
  357.     glVertex3f(-1.4, 0.8, -0.70);
  358.     glNormal3f(0.0, 1.0, 0.0);
  359.     glVertex3f(-1.4, 0.8, -0.70);
  360.     glVertex3f(-1.4, 0.8, 0.70);
  361.     glVertex3f(0.0, 0.8, 0.70);
  362.     glVertex3f(0.0, 0.8, -0.70);
  363.     glNormal3f(1.0, 0.0, 0.0);
  364.     glVertex3f(0.0, 0.8, -0.70);
  365.     glVertex3f(0.0, 0.8, 0.70);
  366.     glVertex3f(0.0, 1.5, 0.70);
  367.     glVertex3f(0.0, 1.5, -0.70);
  368.     glNormal3f(0.5, 0.3, 0.0);
  369.     glVertex3f(0.0, 1.5, -0.70);
  370.     glVertex3f(0.0, 1.5, 0.70);
  371.     glVertex3f(-0.5, 1.8, 0.70);
  372.     glVertex3f(-0.5, 1.8, -0.70);
  373.     glNormal3f(1.0, 0.0, 0.0);
  374.     glVertex3f(-0.5, 1.8, -0.70);
  375.     glVertex3f(-0.5, 1.8, 0.70);
  376.     glVertex3f(-0.5, 0.8, 0.70);
  377.     glVertex3f(-0.5, 0.8, -0.70);
  378.     zwart_texture();
  379.     glNormal3f(0.0, 0.0, 1.0);
  380.     glVertex3f(-1.8, 0.8, 0.70);
  381.     glVertex3f(-1.8, 1.3, 0.70);
  382.     glVertex3f(0.0, 1.3, 0.70);
  383.     glVertex3f(0.0, 0.8, 0.70);
  384.     glVertex3f(-1.8, 0.8, -0.70);
  385.     glVertex3f(-1.8, 1.6, -0.70);
  386.     glVertex3f(0.0, 1.4, -0.70);
  387.     glVertex3f(0.0, 0.8, -0.70);
  388.     glVertex3f(-2.0, 0.8, 0.70);
  389.     glVertex3f(-2.0, 2.3, 0.70);
  390.     glVertex3f(-1.7, 2.0, 0.70);
  391.     glVertex3f(-1.4, 0.8, 0.70);
  392.     glVertex3f(-2.0, 0.8, -0.70);
  393.     glVertex3f(-2.0, 2.3, -0.70);
  394.     glVertex3f(-1.7, 2.0, -0.70);
  395.     glVertex3f(-1.4, 0.8, -0.70);
  396.     glVertex3f(0.0, 0.8, -0.70);
  397.     glVertex3f(0.0, 1.5, -0.70);
  398.     glVertex3f(-0.5, 1.8, -0.70);
  399.     glVertex3f(-0.5, 0.8, -0.70);
  400.     glVertex3f(0.0, 0.8, 0.70);
  401.     glVertex3f(0.0, 1.5, 0.70);
  402.     glVertex3f(-0.5, 1.8, 0.70);
  403.     glVertex3f(-0.5, 0.8, 0.70);
  404.     glEnd();
  405. }
  406. void display(void)
  407. {
  408.     int plaatje2, l;
  409.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  410.     glPushMatrix();
  411.     glCallList(1);
  412.     glPopMatrix();
  413.     glPushMatrix();
  414.     glEnable(GL_TEXTURE_2D);
  415.     glTexImage2D(GL_TEXTURE_2D, 0, 3, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE,
  416. &texture[0][0][0]);
  417.     glBegin(GL_QUADS);
  418.     glNormal3f(0.0, 1.0, 0.0);
  419.     glTexCoord2f(0.0, 0.0); glVertex3f(-120, -4.1, -120);
  420.     glTexCoord2f(0.0, 1.0); glVertex3f(-120, -4.1, 120);
  421.     glTexCoord2f(1.0, 1.0); glVertex3f(120, -4.1, 120);
  422.     glTexCoord2f(1.0, 0.0); glVertex3f(120, -4.1, -120);
  423.     glEnd();
  424.     glDisable(GL_TEXTURE_2D);
  425. /* The sky moves with us to give a perception of being infinitely far away */
  426.     groen_texture();
  427.     l = plaatje;
  428.     glBegin(GL_QUADS);
  429.     glNormal3f(0.0, 1.0, 0.0);
  430.     glTexCoord2f(0.0, 0.0);
  431.     glVertex3f(-400+x[l], 21+y[l], -400+z[l]);
  432.     glTexCoord2f(0.0, 1.0);
  433.     glVertex3f(-400+x[l], 21+y[l], 400+z[l]);
  434.     glTexCoord2f(1.0, 1.0);
  435.     glVertex3f(400+x[l], 21+y[l], 400+z[l]);
  436.     glTexCoord2f(1.0, 0.0);
  437.     glVertex3f(400+x[l], 21+y[l], -400+z[l]);
  438.     glEnd();
  439.     display_cart(plaatje);
  440.     plaatje2 = plaatje + 40;
  441.     if (plaatje2 >= tot)
  442. plaatje2 -= tot;
  443.     display_cart(plaatje2);
  444.     plaatje2 = plaatje + 20;
  445.     if (plaatje2 >= tot)
  446. plaatje2 -= tot;
  447.     display_cart(plaatje2);
  448.     plaatje2 = plaatje - 20;
  449.     if (plaatje2 < 0)
  450. plaatje2 += tot;
  451.     display_wheel(plaatje2);
  452.     glFlush();
  453.     glutSwapBuffers();
  454.     glPopMatrix();
  455. }
  456. void myinit (void) {
  457.     glShadeModel (GL_SMOOTH);
  458.     glFrontFace(GL_CCW);
  459.     glEnable(GL_DEPTH_TEST);
  460.     glClearColor(fogcol[0], fogcol[1], fogcol[2], fogcol[3]);
  461.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  462.     glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb);
  463.     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightdif);
  464.     glEnable(GL_LIGHTING);
  465.     glEnable(GL_LIGHT0);
  466.     glColor3f(1.0, 1.0, 1.0);
  467.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  468. #ifdef FOG
  469. /* fog */
  470.     glEnable(GL_FOG);
  471.     glFogi(GL_FOG_MODE, GL_LINEAR);
  472.     glFogfv(GL_FOG_COLOR, fogcol);
  473.     glFogf(GL_FOG_DENSITY, 0.01);
  474.     glFogf(GL_FOG_START, 0.01);
  475.     glFogf(GL_FOG_END, 55.0);
  476.     glHint(GL_FOG_HINT, GL_NICEST);
  477. #endif
  478.     make_texture();
  479.     init_wheel();
  480.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  481. /*
  482.     glTexImage2D(GL_TEXTURE_2D, 0, 3, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE,
  483. &texture[0][0][0]);
  484. */
  485.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  486.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  487.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  488.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  489.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  490. }
  491. /* ARGSUSED1 */
  492. void parsekey(unsigned char key, int x, int y)
  493. {
  494.     switch (key)
  495.     {
  496. case 27: exit(0);
  497. case 13: speed = 0; break;
  498.     }
  499. }
  500. /* ARGSUSED1 */
  501. void parsekey_special(int key, int x, int y)
  502. {
  503.     switch (key)
  504.     {
  505. case GLUT_KEY_UP: speed ++; break;
  506. case GLUT_KEY_DOWN: speed --; break;
  507. case GLUT_KEY_RIGHT: angle ++; break;
  508. case GLUT_KEY_LEFT: angle --; break;
  509.     }
  510. }
  511. void SetCamera(void)
  512. {
  513.     float plaatje2;
  514.     int l,l2;
  515.     l = plaatje;
  516.     plaatje2 = plaatje + 10;
  517.     if (plaatje2 >= tot)
  518. plaatje2 -= tot;
  519.     glMatrixMode(GL_PROJECTION);
  520.     glLoadIdentity();
  521.     glFrustum (-0.1, 0.1, -0.1, 0.1, 0.1, 550.0);
  522.     glMatrixMode(GL_MODELVIEW);
  523.     glLoadIdentity();
  524. #if 1
  525.     glTranslated(0.0, +0.4, 0.0);
  526.     glRotated(angle*5.0, 0.0, 1.0, 0.0);
  527.     glTranslatef(0.0, 0.0, -6.5-2*sin(angle2)-sin(angle3));
  528.     glRotatef(45 - 35*cos(angle3), 1.0, 0.0, 0.0);
  529.     glRotatef(-100*sin(angle3), 0.0, 1.0, 0.0);
  530. #else
  531.     glRotatef(100*sin(angle3), 0.0, 1.0, 0.0);
  532.     glRotatef(-45 + 35*cos(angle3), 1.0, 0.0, 0.0);
  533.     glTranslatef(0.0, 0.0, +6+2*sin(angle2)+sin(angle3));
  534.     glRotated(-angle*5.0, 0.0, 1.0, 0.0);
  535.     glTranslated(0.0, -0.4, 0.0);
  536. #endif
  537.     l2 = plaatje2;
  538.     glTranslatef(-0.15*(plaatje-l), 0.0, 0.0);
  539.     gluLookAt(x[l], y[l], z[l],
  540. x[l2], y[l2], z[l2],
  541. dx[l], dy[l], dz[l]);
  542. }
  543. void Animate(void)
  544. {
  545.     int l1;
  546.     l1 = plaatje;
  547.     speed += (y[l1] - y[l1+4])*2-0.005;
  548.     speed -= (fabs(rl[l1]-al[l1]) + fabs(pt[l1]) + fabs(hd[l1])) * speed/200;
  549.     if (frame > 450)
  550. speed -= 0.2208;
  551.     if (speed < 0)
  552. speed = 0;
  553.     if (frame < 10)
  554. speed = 0;
  555.     if (frame == 10)
  556. speed = 4.5;
  557.     if (frame > 155 && frame < 195)
  558. speed = 7.72;
  559.     plaatje += speed;
  560.     if (plaatje >= tot) {
  561. plaatje = tot - 1;
  562. glutIdleFunc(NULL);
  563. return;
  564.     }
  565.     if (plaatje < 0)
  566. plaatje += tot;
  567.     SetCamera();
  568.     angle2 = frame*4*M_PI/503;
  569.     angle3 = frame*6*M_PI/503;
  570.     glutPostRedisplay();
  571.     frame++;
  572. }
  573. void myReshape(int w, int h)
  574. {
  575.     SetCamera();
  576.     glViewport (0, 0, w, h);
  577. }
  578. int main(int argc, char *argv[])
  579. {
  580.     int sz;
  581.     extern void calculate_rc(void);
  582.     calculate_rc();
  583.     printf("tot = %dn", tot);
  584.     if (argc > 1)
  585. sz = atoi(argv[1]);
  586.     else
  587. sz = 200;
  588.     glutInitDisplayMode(GLUT_DEPTH | GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE);
  589.     glutInitWindowPosition(200, 0);
  590.     glutInitWindowSize(sz, sz);
  591.     glutCreateWindow("Roller coaster");
  592.     glNewList(1, GL_COMPILE);
  593.     do_display();
  594.     glEndList();
  595.     glutDisplayFunc(display);
  596.     glutKeyboardFunc(parsekey);
  597.     glutSpecialFunc(parsekey_special);
  598.     glutReshapeFunc(myReshape);
  599.     glutIdleFunc(Animate);
  600.     myinit();
  601.     glutSwapBuffers();
  602.     glutMainLoop();
  603.     return 0;             /* ANSI C requires main to return int. */
  604. }