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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1998.  */
  2. /* This program is freely distributable without licensing fees
  3.    and is provided without guarantee or warrantee expressed or
  4.    implied. This program is -not- in the public domain. */
  5. /* fakeraytrace.c - two reflective objects, one has reflection of other's reflection */
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include <stdio.h>
  9. #include <GL/glut.h>
  10. #include <GL/glsmap.h>
  11. #if defined(GL_EXT_texture_object) && !defined(GL_VERSION_1_1)
  12. #define glBindTexture(A,B)     glBindTextureEXT(A,B)
  13. #endif
  14. typedef struct {
  15.         GLfloat *obj2draw;
  16.         int drawObj1;
  17.         GLuint texobj;
  18. } Object;
  19. enum { X, Y, Z };
  20. enum {
  21. TO_NONE = 0,
  22. TO_FRONT, TO_TOP, TO_BOTTOM, TO_LEFT, TO_RIGHT,
  23. TO_BACK,
  24. TO_SPHERE_MAP,
  25.         TO_FRONT2, TO_TOP2, TO_BOTTOM2, TO_LEFT2, TO_RIGHT2,
  26. TO_BACK2,
  27. TO_SPHERE_MAP2,
  28.         TO_FRONT3, TO_TOP3, TO_BOTTOM3, TO_LEFT3, TO_RIGHT3,
  29. TO_BACK3,
  30. TO_SPHERE_MAP3
  31. };
  32. static GLuint texobjs[6] = {
  33. TO_FRONT, TO_TOP, TO_BOTTOM,
  34. TO_LEFT, TO_RIGHT, TO_BACK
  35. };
  36. static GLuint texobjs2[6] = {
  37. TO_FRONT2, TO_TOP2, TO_BOTTOM2,
  38. TO_LEFT2, TO_RIGHT2, TO_BACK2
  39. };
  40. static GLuint texobjs3[6] = {
  41. TO_FRONT3, TO_TOP3, TO_BOTTOM3,
  42. TO_LEFT3, TO_RIGHT3, TO_BACK3
  43. };
  44. int moving = 0;
  45. int multibounce = 1;
  46. SphereMap *smap, *smap2, *smap3;
  47. int win;
  48. GLfloat up[3] = { 0, 1, 0 };
  49. GLfloat up2[3] = { 0, 0, 1 };
  50. GLfloat eye[3] = { 0, 0, -15 };
  51. GLfloat obj[3] = { 0, 4, 0 };
  52. GLfloat obj2[3] = { 0, -4, 0 };
  53. Object sphere[] = {
  54.         { obj, 0, TO_SPHERE_MAP },
  55.         { obj2, 1, TO_SPHERE_MAP2 },
  56.         { obj, 0, TO_SPHERE_MAP3 } };
  57. GLfloat timeCount;
  58. int W, H;
  59. int showSphereMap = 0;
  60. int object = 0;
  61. int texdim = 64;
  62. int doubleBuffer = 1;
  63. int dynamicSmap = 1;
  64. int cullBackFaces = 1;
  65. int doSphereMap = 1;
  66. int multipass = 0;
  67. int animation = 0;
  68. int sphereTess = 20;
  69. static char *pattern[] = {
  70.   "......xxxx......",
  71.   "......xxxx......",
  72.   "......xxxx......",
  73.   "......xxxx......",
  74.   "......xxxx......",
  75.   "......xxxx......",
  76.   "xxxxxxxxxxxxxxxx",
  77.   "xxxxxxxxxxxxxxxx",
  78.   "xxxxxxxxxxxxxxxx",
  79.   "xxxxxxxxxxxxxxxx",
  80.   "......xxxx......",
  81.   "......xxxx......",
  82.   "......xxxx......",
  83.   "......xxxx......",
  84.   "......xxxx......",
  85.   "......xxxx......",
  86. };
  87. static void
  88. makePatternTexture(void)
  89. {
  90.   GLubyte patternTexture[16][16][4];
  91.   GLubyte *loc;
  92.   int s, t;
  93.   /* Setup RGB image for the texture. */
  94.   loc = (GLubyte*) patternTexture;
  95.   for (t = 0; t < 16; t++) {
  96.     for (s = 0; s < 16; s++) {
  97.       if (pattern[t][s] == 'x') {
  98. /* Nice green. */
  99.         loc[0] = 0x1f;
  100.         loc[1] = 0x8f;
  101.         loc[2] = 0x1f;
  102.         loc[3] = 0x7f;  /* opaque */
  103.       } else {
  104. /* Light gray. */
  105.         loc[0] = 0x00;
  106.         loc[1] = 0x00;
  107.         loc[2] = 0x00;
  108.         loc[3] = 0x00;  /* transparent */
  109.       }
  110.       loc += 4;
  111.     }
  112.   }
  113.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  114.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  115.     GL_LINEAR_MIPMAP_LINEAR);
  116.   gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 16, 16,
  117.     GL_RGBA, GL_UNSIGNED_BYTE, patternTexture);
  118. }
  119. void
  120. reshape(int w, int h)
  121. {
  122. W = w;
  123. H = h;
  124. }
  125. void
  126. positionLights(int view, void *context)
  127. {
  128. static GLfloat light1Pos[4] = { -41.0, 41.0, -41.0, 1.0 };
  129. static GLfloat light2Pos[4] = { +41.0, 0.0, -41.0, 1.0 };
  130. static GLfloat light3Pos[4] = { -41.0, 0.0, +41.0, 1.0 };
  131. static GLfloat light4Pos[4] = { +41.0, 0.0, +41.0, 1.0 };
  132. glLightfv(GL_LIGHT0, GL_POSITION, light1Pos);
  133. glLightfv(GL_LIGHT1, GL_POSITION, light2Pos);
  134. glLightfv(GL_LIGHT2, GL_POSITION, light3Pos);
  135. glLightfv(GL_LIGHT3, GL_POSITION, light4Pos);
  136. }
  137. extern void drawObject(Object *it);
  138. void
  139. drawView(int view, void *context)
  140. {
  141.         Object *it = context;
  142.         /* right green small cube (+5,0,-8) */
  143. glPushMatrix();
  144.   glTranslatef(5.0, 0.0, -8.0);
  145.   glRotatef(-45, 1.0, 0.0, 1.0);
  146.   glColor3f(0.0, 1.0, 0.0);
  147.   glutSolidCube(2.0);
  148. glPopMatrix();
  149. /* left red cube (-5,0,-8) */
  150. glPushMatrix();
  151.   glTranslatef(-5.0, 0.0, -8.0);
  152.   glRotatef(45, 1.0, 0.0, 1.0);
  153.   glColor3f(1.0, 0.0, 0.0);
  154.   glutSolidCube(6.0);
  155. glPopMatrix();
  156. /* left blue cube (-7,0,0); */
  157. glPushMatrix();
  158.   glTranslatef(-7.0, 0.0, 0.0);
  159.   glColor3f(0.0, 0.0, 1.0);
  160.   glutSolidCube(5.0);
  161. glPopMatrix();
  162. /* right cyan big cube (+7,0,0) */
  163. glPushMatrix();
  164.   glTranslatef(7.0, 0.0, 0.0);
  165.   glRotatef(30, 1.0, 1.0, 0.0);
  166.   glColor3f(0.0, 1.0, 1.0);
  167.   glutSolidCube(5.0);
  168. glPopMatrix();
  169. /* distant yellow sphere (0,0,+10) */
  170. glPushMatrix();
  171.   glTranslatef(0.0, 0.0, 10.0);
  172.   glColor3f(1.0, 1.0, 0.0);
  173.   glutSolidSphere(7.0, 8, 8);
  174. glPopMatrix();
  175.         if (it && multibounce) {
  176.                 if (it->drawObj1) {
  177.                         glEnable(GL_TEXTURE_2D);
  178.                         drawObject(&sphere[2]);
  179.                         glDisable(GL_TEXTURE_2D);
  180.                 }
  181.         }
  182. }
  183. void
  184. drawObject(Object *it)
  185. {
  186.         static GLfloat xplane[4] = { 1, 0, 0, 0 };
  187.         static GLfloat zplane[4] = { 0, 1, 0, 0 };
  188.         GLfloat *obj2draw = it->obj2draw;
  189.         if (!cullBackFaces) {
  190.                 glEnable(GL_CULL_FACE);
  191.                 glCullFace(GL_FRONT);
  192.         }
  193. glPushMatrix();
  194.                 glTranslatef(obj2draw[X], obj2draw[Y], obj2draw[Z]);
  195.                 if (doSphereMap) {
  196.         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  197.         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  198.         glEnable(GL_TEXTURE_GEN_S);
  199.         glEnable(GL_TEXTURE_GEN_T);
  200.         glEnable(GL_TEXTURE_2D);
  201.         glBindTexture(GL_TEXTURE_2D, it->texobj);
  202.         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
  203. GL_REPLACE);
  204.                 } else {
  205.                         glTexGenfv(GL_S, GL_OBJECT_PLANE, xplane);
  206.                         glTexGenfv(GL_T, GL_OBJECT_PLANE, zplane);
  207.                         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  208.                         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  209.                         glEnable(GL_TEXTURE_GEN_S);
  210.         glEnable(GL_TEXTURE_GEN_T);
  211.         glEnable(GL_TEXTURE_2D);
  212.                         glBindTexture(GL_TEXTURE_2D, 100);
  213.                         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
  214. GL_REPLACE);
  215.                 }
  216. glColor3f(1.0, 1.0, 1.0);
  217. switch (object) {
  218. case 0:
  219.                         glutSolidSphere(3.5, 20, 20);
  220. break;
  221. case 1:
  222. glScalef(3.0, 3.0, 3.0);
  223. glRotatef(30.0, 1.0, 1.0, 0.0);
  224. glutSolidIcosahedron();
  225. break;
  226. case 2:
  227. glFrontFace(GL_CW);
  228. glutSolidTeapot(3.0);
  229. glFrontFace(GL_CCW);
  230. break;
  231. }
  232.         glDisable(GL_TEXTURE_GEN_S);
  233.         glDisable(GL_TEXTURE_GEN_T);
  234. glPopMatrix();
  235.         if (!cullBackFaces) {
  236.                 glCullFace(GL_BACK);
  237.         }
  238. }
  239. void
  240. vsub(const GLfloat *src1, const GLfloat *src2, GLfloat *dst)
  241. {
  242.     dst[0] = src1[0] - src2[0];
  243.     dst[1] = src1[1] - src2[1];
  244.     dst[2] = src1[2] - src2[2];
  245. }
  246. void
  247. vcopy(const GLfloat *v1, GLfloat *v2)
  248. {
  249.     register int i;
  250.     for (i = 0 ; i < 3 ; i++)
  251.         v2[i] = v1[i];
  252. }
  253. void
  254. vcross(const GLfloat *v1, const GLfloat *v2, GLfloat *cross)
  255. {
  256.     GLfloat temp[3];
  257.     temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]);
  258.     temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]);
  259.     temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]);
  260.     vcopy(temp, cross);
  261. }
  262. void
  263. display(void)
  264. {
  265.         GLfloat tmp1[3], tmp2[3];
  266. glDisable(GL_TEXTURE_2D);
  267. glEnable(GL_DEPTH_TEST);
  268.         glEnable(GL_CULL_FACE);
  269.         if (dynamicSmap) {
  270.                 if (multibounce) {
  271.                 glDisable(GL_TEXTURE_2D);
  272.         glEnable(GL_DEPTH_TEST);
  273.                 glEnable(GL_CULL_FACE);
  274.                 vsub(eye,obj,tmp1);
  275.                 vsub(obj2,obj,tmp2);
  276.                 vcross(tmp1,tmp2,up2);
  277.                 vcross(up2,tmp2,up2);
  278.                 smapSetUpVector(smap3, up2);
  279.         smapGenSphereMap(smap3);
  280.                 }
  281.         
  282.                 glDisable(GL_TEXTURE_2D);
  283.         glEnable(GL_DEPTH_TEST);
  284.                 glEnable(GL_CULL_FACE);
  285.         smapGenSphereMap(smap);
  286.                 glDisable(GL_TEXTURE_2D);
  287.         glEnable(GL_DEPTH_TEST);
  288.                 glEnable(GL_CULL_FACE);
  289.         smapGenSphereMap(smap2);
  290.         }
  291. /* smapGenSphereMap leaves scissor enabled, disable it. */
  292. glDisable(GL_SCISSOR_TEST);
  293. glViewport(0, 0, W, H);
  294. if (showSphereMap) {
  295. glClear(GL_COLOR_BUFFER_BIT);
  296. glMatrixMode(GL_PROJECTION);
  297. glLoadIdentity();
  298. gluOrtho2D(0, 1, 0, 1);
  299. glMatrixMode(GL_MODELVIEW);
  300. glLoadIdentity();
  301. glEnable(GL_TEXTURE_2D);
  302. glDisable(GL_DEPTH_TEST);
  303. glBindTexture(GL_TEXTURE_2D, showSphereMap);
  304. glBegin(GL_QUADS);
  305. glTexCoord2f(0,0);
  306. glVertex2f(0,0);
  307. glTexCoord2f(1,0);
  308. glVertex2f(1,0);
  309. glTexCoord2f(1,1);
  310. glVertex2f(1,1);
  311. glTexCoord2f(0,1);
  312. glVertex2f(0,1);
  313. glEnd();
  314. } else {
  315. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  316. glDisable(GL_TEXTURE_2D);
  317. glEnable(GL_DEPTH_TEST);
  318. glMatrixMode(GL_PROJECTION);
  319. glLoadIdentity();
  320. gluPerspective(60.0, (GLfloat) W / (GLfloat) H, 0.5, 40.0);
  321. glMatrixMode(GL_MODELVIEW);
  322. glLoadIdentity();
  323. gluLookAt(eye[0], eye[1], eye[2],  /* eye at eye */
  324.   0, 0, 0,  /* looking at object */
  325.   up[0], up[1], up[2]);
  326. positionLights(-1, NULL);
  327. drawView(-1, NULL);
  328.                 if (multipass) {
  329.                   doSphereMap = 1;
  330.                 }
  331. drawObject(&sphere[0]);
  332.                 if (multipass) {
  333.                   doSphereMap = 0;
  334.                   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  335.                   glDepthFunc(GL_EQUAL);
  336.                   glEnable(GL_BLEND);
  337.   drawObject(&sphere[0]);
  338.                   glDisable(GL_BLEND);
  339.                   glDepthFunc(GL_LESS);
  340.                 }
  341.                 if (multipass) {
  342.                   doSphereMap = 1;
  343.                 }
  344. drawObject(&sphere[1]);
  345. }
  346. if (doubleBuffer) {
  347. glutSwapBuffers();
  348. }
  349. }
  350. int angle = 0;
  351. int downx, downy;
  352. void
  353. motion(int x, int y)
  354. {
  355.         if (moving) {
  356. angle += (x - downx);
  357. angle = angle % 360;
  358. eye[0] = sin(angle * 3.14159/180.0) * -15;
  359. eye[2] = cos(angle * 3.14159/180.0) * -15;
  360. eye[1] = eye[1] + 0.1 * (y - downy);
  361. if (eye[1] > +25) eye[1] = +25;
  362. if (eye[1] < -25) eye[1] = -25;
  363. smapSetEyeVector(smap, eye);
  364. smapSetEyeVector(smap2, eye);
  365. glutPostRedisplay();
  366. downx = x;
  367. downy = y;
  368.         }
  369. }
  370. void
  371. mouse(int button, int state, int x, int y)
  372. {
  373. if (button == GLUT_LEFT_BUTTON) {
  374. if (state == GLUT_DOWN) {
  375.                         moving = 1;
  376. downx = x;
  377. downy = y;
  378.                 } else {
  379.                         moving = 0;
  380.                 }
  381. }
  382. }
  383. void
  384. idle(void)
  385. {
  386.    timeCount = timeCount + 0.1;
  387.    obj2[Y] = -5 + cos(timeCount) * 1.0;
  388.    smapSetObjectVector(smap, obj);
  389.    smapSetObjectVector(smap2, obj2);
  390.    smapSetObjectVector(smap3, obj);
  391.    glutPostRedisplay();
  392. }
  393. /* When not visible, stop animating.  Restart when visible again. */
  394. static void 
  395. visible(int vis)
  396. {
  397.   if (vis == GLUT_VISIBLE) {
  398.     if (animation)
  399.       glutIdleFunc(idle);
  400.   } else {
  401.     if (!animation)
  402.       glutIdleFunc(NULL);
  403.   }
  404. }
  405. void initGraphicsState(void);
  406. void initCallbacks(int ifFullscreen);
  407. void
  408. menu(int value)
  409. {
  410. switch (value) {
  411. case 0:
  412. showSphereMap = 0;
  413. break;
  414. case 1:
  415. showSphereMap = TO_SPHERE_MAP;
  416. break;
  417. case -1:
  418. showSphereMap = TO_SPHERE_MAP2;
  419. break;
  420. case -2:
  421. showSphereMap = TO_SPHERE_MAP3;
  422. break;
  423. case 4:
  424. object = (object + 1) % 3;
  425. break;
  426. case 5:
  427. smapSetSphereMapTexDim(smap, 64);
  428. smapSetViewTexDim(smap, 64);
  429. smapSetSphereMapTexDim(smap2, 64);
  430. smapSetViewTexDim(smap2, 64);
  431. smapSetSphereMapTexDim(smap3, 64);
  432. smapSetViewTexDim(smap3, 64);
  433. break;
  434. case 6:
  435. smapSetSphereMapTexDim(smap, 128);
  436. smapSetViewTexDim(smap, 128);
  437. smapSetSphereMapTexDim(smap2, 128);
  438. smapSetViewTexDim(smap2, 128);
  439. smapSetSphereMapTexDim(smap3, 128);
  440. smapSetViewTexDim(smap3, 128);
  441.         break;  
  442. case 7:
  443. smapSetSphereMapTexDim(smap, 256);
  444. smapSetViewTexDim(smap, 256);
  445. smapSetSphereMapTexDim(smap2, 256);
  446. smapSetViewTexDim(smap2, 256);
  447. smapSetSphereMapTexDim(smap3, 256);
  448. smapSetViewTexDim(smap3, 256);
  449. break;
  450. case 8:
  451. glDrawBuffer(GL_FRONT);
  452. glReadBuffer(GL_FRONT);
  453. doubleBuffer = 0;
  454. break;
  455. case 9:
  456. glDrawBuffer(GL_BACK);
  457. glReadBuffer(GL_BACK);
  458. doubleBuffer = 1;
  459. break;
  460.         case 10:
  461.                 dynamicSmap = 1;
  462.                 break;
  463.         case 11:
  464.                 dynamicSmap = 0;
  465.                 break;
  466.         case 12:
  467.                 cullBackFaces = 1;
  468.                 break;
  469.         case 13:
  470.                 cullBackFaces = 0;
  471.                 break;
  472.         case 14:
  473.                 doSphereMap = 1;
  474.                 multipass = 0;
  475.                 break;
  476.         case 15:
  477.                 doSphereMap = 0;
  478.                 multipass = 0;
  479.                 break;
  480.         case 16:
  481.                 multipass = 1;
  482.                 break;
  483.         case 17:
  484.                 animation = !animation;
  485.                 if (animation) {
  486.                         glutIdleFunc(idle);
  487.                 } else {
  488.                         glutIdleFunc(NULL);
  489.                 }
  490.                 break;
  491. case 666:
  492. exit(0);
  493. break;
  494. }
  495. glutPostRedisplay();
  496. }
  497. void
  498. keyboard(unsigned char c, int x, int y)
  499. {
  500.         switch (c) {
  501.         case 27:
  502.                 exit(0);
  503.                 break;
  504.         case '1':
  505.                 menu(5);
  506.                 break;
  507.         case '2':
  508.                 menu(6);
  509.                 break;
  510.         case '3':
  511.                 menu(7);
  512.                 break;
  513.         case 's':
  514.                 menu(4);
  515.                 break;
  516.         case 'f':
  517.                 glutGameModeString("400x300:16@60");
  518.                 glutEnterGameMode();
  519.                 initGraphicsState();
  520.                 initCallbacks(0);
  521.                 break;
  522.         case 'l':
  523.                 glutLeaveGameMode();
  524.                 glutSetWindow(win);
  525.                 break;
  526.         case 'a':
  527.                 sphereTess += 5;
  528.                 glutPostRedisplay();
  529.                 break;
  530.         case 'z':
  531.                 sphereTess -= 5;
  532.                 glutPostRedisplay();
  533.                 break;
  534.         case 'b':
  535.         case 'B':
  536.                 multibounce = !multibounce;
  537.                 printf("multibounce = %dn", multibounce);
  538.                 break;
  539.         case ' ':
  540.                 menu(17);
  541.                 break;
  542.         }
  543. }
  544. void
  545. initGraphicsState(void)
  546. {
  547.     GLfloat lightColor[4] = { 0.6, 0.6, 0.6, 1.0 };  /* white */
  548. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
  549. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
  550. glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor);
  551. glLightfv(GL_LIGHT2, GL_DIFFUSE, lightColor);
  552. glLightfv(GL_LIGHT3, GL_DIFFUSE, lightColor);
  553. glEnable(GL_LIGHTING);
  554. glEnable(GL_LIGHT0);
  555. glEnable(GL_LIGHT1);
  556. glEnable(GL_LIGHT2);
  557. glEnable(GL_LIGHT3);
  558. glEnable(GL_DEPTH_TEST);
  559. glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
  560. glEnable(GL_COLOR_MATERIAL);
  561. glEnable(GL_NORMALIZE);
  562.         glBindTexture(GL_TEXTURE_2D, 100);
  563.         makePatternTexture();
  564. }
  565. void
  566. initCallbacks(int ifFullscreen)
  567. {
  568.         glutReshapeFunc(reshape);
  569. glutDisplayFunc(display);
  570.         glutVisibilityFunc(visible);
  571. glutMouseFunc(mouse);
  572.         glutKeyboardFunc(keyboard);
  573. glutMotionFunc(motion);
  574.         if (ifFullscreen) {
  575.         glutCreateMenu(menu);
  576. glutAddMenuEntry("eye view", 0);
  577. glutAddMenuEntry("eye to obj 1 smap", 1);
  578. glutAddMenuEntry("eye to obj 2 smap", -1);
  579. glutAddMenuEntry("obj 1 to obj 2 smap", -2);
  580. glutAddMenuEntry("switch object", 4);
  581. glutAddMenuEntry("texdim = 64", 5);
  582. glutAddMenuEntry("texdim = 128", 6);
  583. glutAddMenuEntry("texdim = 256", 7);
  584. glutAddMenuEntry("single buffer", 8);
  585. glutAddMenuEntry("double buffer", 9);
  586.         glutAddMenuEntry("dynamic smap", 10);
  587.         glutAddMenuEntry("stop smap building", 11);
  588.         glutAddMenuEntry("cull back faces", 12);
  589.         glutAddMenuEntry("cull front faces", 13);
  590.         glutAddMenuEntry("sphere map", 14);
  591.         glutAddMenuEntry("texture", 15);
  592.         glutAddMenuEntry("multipass", 16);
  593.         glutAddMenuEntry("toggle animate", 17);
  594. glutAddMenuEntry("quit", 666);
  595. glutAttachMenu(GLUT_RIGHT_BUTTON);
  596.         }
  597. }
  598. int
  599. main(int argc, char **argv)
  600. {
  601. glutInit(&argc, argv);
  602. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  603. win = glutCreateWindow("fakeraytrace");
  604. initGraphicsState();
  605.         initCallbacks(1);
  606. smap = smapCreateSphereMap(NULL);
  607. smapSetSphereMapTexObj    (smap, TO_SPHERE_MAP);
  608. smapSetViewTexObjs        (smap, texobjs);
  609. smapSetEyeVector          (smap, eye);
  610. smapSetUpVector           (smap, up);
  611. smapSetObjectVector       (smap, obj);
  612. smapSetNearFar            (smap, 0.5, 40.0);
  613. smapSetPositionLightsFunc (smap, positionLights);
  614. smapSetDrawViewFunc       (smap, drawView);
  615. smapSetViewTexDim         (smap, 64);
  616. smapSetSphereMapTexDim    (smap, 64);
  617.         smapSetContextData(smap, &sphere[0]);
  618.         smap2 = smapCreateSphereMap(NULL);
  619. smapSetSphereMapTexObj    (smap2, TO_SPHERE_MAP2);
  620. smapSetViewTexObjs        (smap2, texobjs2);
  621. smapSetEyeVector          (smap2, eye);
  622. smapSetUpVector           (smap2, up);
  623. smapSetObjectVector       (smap2, obj2);
  624. smapSetNearFar            (smap2, 0.5, 40.0);
  625. smapSetPositionLightsFunc (smap2, positionLights);
  626. smapSetDrawViewFunc       (smap2, drawView);
  627. smapSetViewTexDim         (smap2, 64);
  628. smapSetSphereMapTexDim    (smap2, 64);
  629.         smapSetContextData(smap2, &sphere[1]);
  630.         smap3 = smapCreateSphereMap(NULL);
  631. smapSetSphereMapTexObj    (smap3, TO_SPHERE_MAP3);
  632. smapSetViewTexObjs        (smap3, texobjs3);
  633. smapSetEyeVector          (smap3, obj2);
  634. smapSetUpVector           (smap3, up2);
  635. smapSetObjectVector       (smap3, obj);
  636. smapSetNearFar            (smap3, 0.1, 40.0);
  637. smapSetPositionLightsFunc (smap3, positionLights);
  638. smapSetDrawViewFunc       (smap3, drawView);
  639. smapSetViewTexDim         (smap3, 64);
  640. smapSetSphereMapTexDim    (smap3, 64);
  641.         smapSetContextData(smap3, &sphere[2]);
  642. glutMainLoop();
  643. return 0;
  644. }