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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /**
  3.  * (c) Copyright 1993, 1994, 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. /*
  39.  * 1992 David G Yu -- Silicon Graphics Computer Systems
  40.  */
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #include <string.h>
  44. #include <math.h>
  45. #include <GL/glut.h>
  46. static int useRGB = 1;
  47. static int useLighting = 1;
  48. static int useFog = 0;
  49. static int useDB = 1;
  50. static int useLogo = 0;
  51. static int useQuads = 1;
  52. static int tick = -1;
  53. static int moving = 1;
  54. #define GREY 0
  55. #define RED 1
  56. #define GREEN 2
  57. #define BLUE 3
  58. #define CYAN 4
  59. #define MAGENTA 5
  60. #define YELLOW 6
  61. #define BLACK 7
  62. static float materialColor[8][4] =
  63. {
  64.   {0.8, 0.8, 0.8, 1.0},
  65.   {0.8, 0.0, 0.0, 1.0},
  66.   {0.0, 0.8, 0.0, 1.0},
  67.   {0.0, 0.0, 0.8, 1.0},
  68.   {0.0, 0.8, 0.8, 1.0},
  69.   {0.8, 0.0, 0.8, 1.0},
  70.   {0.8, 0.8, 0.0, 1.0},
  71.   {0.0, 0.0, 0.0, 0.6},
  72. };
  73. static float lightPos[4] =
  74. {2.0, 4.0, 2.0, 1.0};
  75. #if 0
  76. static float lightDir[4] =
  77. {-2.0, -4.0, -2.0, 1.0};
  78. #endif
  79. static float lightAmb[4] =
  80. {0.2, 0.2, 0.2, 1.0};
  81. static float lightDiff[4] =
  82. {0.8, 0.8, 0.8, 1.0};
  83. static float lightSpec[4] =
  84. {0.4, 0.4, 0.4, 1.0};
  85. static float groundPlane[4] =
  86. {0.0, 1.0, 0.0, 1.499};
  87. static float backPlane[4] =
  88. {0.0, 0.0, 1.0, 0.899};
  89. static float fogColor[4] =
  90. {0.0, 0.0, 0.0, 0.0};
  91. static float fogIndex[1] =
  92. {0.0};
  93. static unsigned char shadowPattern[128] =
  94. {
  95.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,  /* 50% Grey */
  96.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  97.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  98.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  99.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  100.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  101.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  102.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  103.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  104.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  105.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  106.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  107.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  108.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  109.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
  110.   0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55
  111. };
  112. static unsigned char sgiPattern[128] =
  113. {
  114.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  /* SGI Logo */
  115.   0xff, 0xbd, 0xff, 0x83, 0xff, 0x5a, 0xff, 0xef,
  116.   0xfe, 0xdb, 0x7f, 0xef, 0xfd, 0xdb, 0xbf, 0xef,
  117.   0xfb, 0xdb, 0xdf, 0xef, 0xf7, 0xdb, 0xef, 0xef,
  118.   0xfb, 0xdb, 0xdf, 0xef, 0xfd, 0xdb, 0xbf, 0x83,
  119.   0xce, 0xdb, 0x73, 0xff, 0xb7, 0x5a, 0xed, 0xff,
  120.   0xbb, 0xdb, 0xdd, 0xc7, 0xbd, 0xdb, 0xbd, 0xbb,
  121.   0xbe, 0xbd, 0x7d, 0xbb, 0xbf, 0x7e, 0xfd, 0xb3,
  122.   0xbe, 0xe7, 0x7d, 0xbf, 0xbd, 0xdb, 0xbd, 0xbf,
  123.   0xbb, 0xbd, 0xdd, 0xbb, 0xb7, 0x7e, 0xed, 0xc7,
  124.   0xce, 0xdb, 0x73, 0xff, 0xfd, 0xdb, 0xbf, 0xff,
  125.   0xfb, 0xdb, 0xdf, 0x87, 0xf7, 0xdb, 0xef, 0xfb,
  126.   0xf7, 0xdb, 0xef, 0xfb, 0xfb, 0xdb, 0xdf, 0xfb,
  127.   0xfd, 0xdb, 0xbf, 0xc7, 0xfe, 0xdb, 0x7f, 0xbf,
  128.   0xff, 0x5a, 0xff, 0xbf, 0xff, 0xbd, 0xff, 0xc3,
  129.   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
  130. };
  131. static float cube_vertexes[6][4][4] =
  132. {
  133.   {
  134.     {-1.0, -1.0, -1.0, 1.0},
  135.     {-1.0, -1.0, 1.0, 1.0},
  136.     {-1.0, 1.0, 1.0, 1.0},
  137.     {-1.0, 1.0, -1.0, 1.0}},
  138.   {
  139.     {1.0, 1.0, 1.0, 1.0},
  140.     {1.0, -1.0, 1.0, 1.0},
  141.     {1.0, -1.0, -1.0, 1.0},
  142.     {1.0, 1.0, -1.0, 1.0}},
  143.   {
  144.     {-1.0, -1.0, -1.0, 1.0},
  145.     {1.0, -1.0, -1.0, 1.0},
  146.     {1.0, -1.0, 1.0, 1.0},
  147.     {-1.0, -1.0, 1.0, 1.0}},
  148.   {
  149.     {1.0, 1.0, 1.0, 1.0},
  150.     {1.0, 1.0, -1.0, 1.0},
  151.     {-1.0, 1.0, -1.0, 1.0},
  152.     {-1.0, 1.0, 1.0, 1.0}},
  153.   {
  154.     {-1.0, -1.0, -1.0, 1.0},
  155.     {-1.0, 1.0, -1.0, 1.0},
  156.     {1.0, 1.0, -1.0, 1.0},
  157.     {1.0, -1.0, -1.0, 1.0}},
  158.   {
  159.     {1.0, 1.0, 1.0, 1.0},
  160.     {-1.0, 1.0, 1.0, 1.0},
  161.     {-1.0, -1.0, 1.0, 1.0},
  162.     {1.0, -1.0, 1.0, 1.0}}
  163. };
  164. static float cube_normals[6][4] =
  165. {
  166.   {-1.0, 0.0, 0.0, 0.0},
  167.   {1.0, 0.0, 0.0, 0.0},
  168.   {0.0, -1.0, 0.0, 0.0},
  169.   {0.0, 1.0, 0.0, 0.0},
  170.   {0.0, 0.0, -1.0, 0.0},
  171.   {0.0, 0.0, 1.0, 0.0}
  172. };
  173. static void
  174. usage(void)
  175. {
  176.   printf("n");
  177.   printf("usage: scube [options]n");
  178.   printf("n");
  179.   printf("    display a spinning cube and its shadown");
  180.   printf("n");
  181.   printf("  Options:n");
  182.   printf("    -geometry  window size and locationn");
  183.   printf("    -c         toggle color index moden");
  184.   printf("    -l         toggle lightingn");
  185.   printf("    -f         toggle fogn");
  186.   printf("    -db        toggle double bufferingn");
  187.   printf("    -logo      toggle sgi logo for the shadow patternn");
  188.   printf("    -quads     toggle use of GL_QUADS to draw the checkerboardn");
  189.   printf("n");
  190. #ifndef EXIT_FAILURE    /* should be defined by ANSI C
  191.                            <stdlib.h> */
  192. #define EXIT_FAILURE 1
  193. #endif
  194.   exit(EXIT_FAILURE);
  195. }
  196. void
  197. buildColormap(void)
  198. {
  199.   if (useRGB) {
  200.     return;
  201.   } else {
  202.     int mapSize = 1 << glutGet(GLUT_WINDOW_BUFFER_SIZE);
  203.     int rampSize = mapSize / 8;
  204.     int entry;
  205.     int i;
  206.     for (entry = 0; entry < mapSize; ++entry) {
  207.       int hue = entry / rampSize;
  208.       GLfloat val = (entry % rampSize) * (1.0 / (rampSize - 1));
  209.       GLfloat red, green, blue;
  210.       red = (hue == 0 || hue == 1 || hue == 5 || hue == 6) ? val : 0;
  211.       green = (hue == 0 || hue == 2 || hue == 4 || hue == 6) ? val : 0;
  212.       blue = (hue == 0 || hue == 3 || hue == 4 || hue == 5) ? val : 0;
  213.       glutSetColor(entry, red, green, blue);
  214.     }
  215.     for (i = 0; i < 8; ++i) {
  216.       materialColor[i][0] = i * rampSize + 0.2 * (rampSize - 1);
  217.       materialColor[i][1] = i * rampSize + 0.8 * (rampSize - 1);
  218.       materialColor[i][2] = i * rampSize + 1.0 * (rampSize - 1);
  219.       materialColor[i][3] = 0.0;
  220.     }
  221.     fogIndex[0] = -0.2 * (rampSize - 1);
  222.   }
  223. }
  224. static void
  225. setColor(int c)
  226. {
  227.   if (useLighting) {
  228.     if (useRGB) {
  229.       glMaterialfv(GL_FRONT_AND_BACK,
  230.         GL_AMBIENT_AND_DIFFUSE, &materialColor[c][0]);
  231.     } else {
  232.       glMaterialfv(GL_FRONT_AND_BACK,
  233.         GL_COLOR_INDEXES, &materialColor[c][0]);
  234.     }
  235.   } else {
  236.     if (useRGB) {
  237.       glColor4fv(&materialColor[c][0]);
  238.     } else {
  239.       glIndexf(materialColor[c][1]);
  240.     }
  241.   }
  242. }
  243. static void
  244. drawCube(int color)
  245. {
  246.   int i;
  247.   setColor(color);
  248.   for (i = 0; i < 6; ++i) {
  249.     glNormal3fv(&cube_normals[i][0]);
  250.     glBegin(GL_POLYGON);
  251.     glVertex4fv(&cube_vertexes[i][0][0]);
  252.     glVertex4fv(&cube_vertexes[i][1][0]);
  253.     glVertex4fv(&cube_vertexes[i][2][0]);
  254.     glVertex4fv(&cube_vertexes[i][3][0]);
  255.     glEnd();
  256.   }
  257. }
  258. static void
  259. drawCheck(int w, int h, int evenColor, int oddColor)
  260. {
  261.   static int initialized = 0;
  262.   static int usedLighting = 0;
  263.   static GLuint checklist = 0;
  264.   if (!initialized || (usedLighting != useLighting)) {
  265.     static float square_normal[4] =
  266.     {0.0, 0.0, 1.0, 0.0};
  267.     static float square[4][4];
  268.     int i, j;
  269.     if (!checklist) {
  270.       checklist = glGenLists(1);
  271.     }
  272.     glNewList(checklist, GL_COMPILE_AND_EXECUTE);
  273.     if (useQuads) {
  274.       glNormal3fv(square_normal);
  275.       glBegin(GL_QUADS);
  276.     }
  277.     for (j = 0; j < h; ++j) {
  278.       for (i = 0; i < w; ++i) {
  279.         square[0][0] = -1.0 + 2.0 / w * i;
  280.         square[0][1] = -1.0 + 2.0 / h * (j + 1);
  281.         square[0][2] = 0.0;
  282.         square[0][3] = 1.0;
  283.         square[1][0] = -1.0 + 2.0 / w * i;
  284.         square[1][1] = -1.0 + 2.0 / h * j;
  285.         square[1][2] = 0.0;
  286.         square[1][3] = 1.0;
  287.         square[2][0] = -1.0 + 2.0 / w * (i + 1);
  288.         square[2][1] = -1.0 + 2.0 / h * j;
  289.         square[2][2] = 0.0;
  290.         square[2][3] = 1.0;
  291.         square[3][0] = -1.0 + 2.0 / w * (i + 1);
  292.         square[3][1] = -1.0 + 2.0 / h * (j + 1);
  293.         square[3][2] = 0.0;
  294.         square[3][3] = 1.0;
  295.         if ((i & 1) ^ (j & 1)) {
  296.           setColor(oddColor);
  297.         } else {
  298.           setColor(evenColor);
  299.         }
  300.         if (!useQuads) {
  301.           glBegin(GL_POLYGON);
  302.         }
  303.         glVertex4fv(&square[0][0]);
  304.         glVertex4fv(&square[1][0]);
  305.         glVertex4fv(&square[2][0]);
  306.         glVertex4fv(&square[3][0]);
  307.         if (!useQuads) {
  308.           glEnd();
  309.         }
  310.       }
  311.     }
  312.     if (useQuads) {
  313.       glEnd();
  314.     }
  315.     glEndList();
  316.     initialized = 1;
  317.     usedLighting = useLighting;
  318.   } else {
  319.     glCallList(checklist);
  320.   }
  321. }
  322. static void
  323. myShadowMatrix(float ground[4], float light[4])
  324. {
  325.   float dot;
  326.   float shadowMat[4][4];
  327.   dot = ground[0] * light[0] +
  328.     ground[1] * light[1] +
  329.     ground[2] * light[2] +
  330.     ground[3] * light[3];
  331.   shadowMat[0][0] = dot - light[0] * ground[0];
  332.   shadowMat[1][0] = 0.0 - light[0] * ground[1];
  333.   shadowMat[2][0] = 0.0 - light[0] * ground[2];
  334.   shadowMat[3][0] = 0.0 - light[0] * ground[3];
  335.   shadowMat[0][1] = 0.0 - light[1] * ground[0];
  336.   shadowMat[1][1] = dot - light[1] * ground[1];
  337.   shadowMat[2][1] = 0.0 - light[1] * ground[2];
  338.   shadowMat[3][1] = 0.0 - light[1] * ground[3];
  339.   shadowMat[0][2] = 0.0 - light[2] * ground[0];
  340.   shadowMat[1][2] = 0.0 - light[2] * ground[1];
  341.   shadowMat[2][2] = dot - light[2] * ground[2];
  342.   shadowMat[3][2] = 0.0 - light[2] * ground[3];
  343.   shadowMat[0][3] = 0.0 - light[3] * ground[0];
  344.   shadowMat[1][3] = 0.0 - light[3] * ground[1];
  345.   shadowMat[2][3] = 0.0 - light[3] * ground[2];
  346.   shadowMat[3][3] = dot - light[3] * ground[3];
  347.   glMultMatrixf((const GLfloat *) shadowMat);
  348. }
  349. static char *windowNameRGBDB = "shadow cube (OpenGL RGB DB)";
  350. static char *windowNameRGB = "shadow cube (OpenGL RGB)";
  351. static char *windowNameIndexDB = "shadow cube (OpenGL Index DB)";
  352. static char *windowNameIndex = "shadow cube (OpenGL Index)";
  353. void
  354. idle(void)
  355. {
  356.   tick++;
  357.   if (tick >= 120) {
  358.     tick = 0;
  359.   }
  360.   glutPostRedisplay();
  361. }
  362. /* ARGSUSED1 */
  363. void
  364. keyboard(unsigned char ch, int x, int y)
  365. {
  366.   switch (ch) {
  367.   case 27:             /* escape */
  368.     exit(0);
  369.     break;
  370.   case 'L':
  371.   case 'l':
  372.     useLighting = !useLighting;
  373.     useLighting ? glEnable(GL_LIGHTING) :
  374.       glDisable(GL_LIGHTING);
  375.     glutPostRedisplay();
  376.     break;
  377.   case 'F':
  378.   case 'f':
  379.     useFog = !useFog;
  380.     useFog ? glEnable(GL_FOG) : glDisable(GL_FOG);
  381.     glutPostRedisplay();
  382.     break;
  383.   case '1':
  384.     glFogf(GL_FOG_MODE, GL_LINEAR);
  385.     glutPostRedisplay();
  386.     break;
  387.   case '2':
  388.     glFogf(GL_FOG_MODE, GL_EXP);
  389.     glutPostRedisplay();
  390.     break;
  391.   case '3':
  392.     glFogf(GL_FOG_MODE, GL_EXP2);
  393.     glutPostRedisplay();
  394.     break;
  395.   case ' ':
  396.     if (!moving) {
  397.       idle();
  398.       glutPostRedisplay();
  399.     }
  400.   }
  401. }
  402. void
  403. display(void)
  404. {
  405.   GLfloat cubeXform[4][4];
  406.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  407.   glPushMatrix();
  408.   glTranslatef(0.0, -1.5, 0.0);
  409.   glRotatef(-90.0, 1, 0, 0);
  410.   glScalef(2.0, 2.0, 2.0);
  411.   drawCheck(6, 6, BLUE, YELLOW);  /* draw ground */
  412.   glPopMatrix();
  413.   glPushMatrix();
  414.   glTranslatef(0.0, 0.0, -0.9);
  415.   glScalef(2.0, 2.0, 2.0);
  416.   drawCheck(6, 6, BLUE, YELLOW);  /* draw back */
  417.   glPopMatrix();
  418.   glPushMatrix();
  419.   glTranslatef(0.0, 0.2, 0.0);
  420.   glScalef(0.3, 0.3, 0.3);
  421.   glRotatef((360.0 / (30 * 1)) * tick, 1, 0, 0);
  422.   glRotatef((360.0 / (30 * 2)) * tick, 0, 1, 0);
  423.   glRotatef((360.0 / (30 * 4)) * tick, 0, 0, 1);
  424.   glScalef(1.0, 2.0, 1.0);
  425.   glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *) cubeXform);
  426.   drawCube(RED);        /* draw cube */
  427.   glPopMatrix();
  428.   glDepthMask(GL_FALSE);
  429.   if (useRGB) {
  430.     glEnable(GL_BLEND);
  431.   } else {
  432.     glEnable(GL_POLYGON_STIPPLE);
  433.   }
  434.   if (useFog) {
  435.     glDisable(GL_FOG);
  436.   }
  437.   glPushMatrix();
  438.   myShadowMatrix(groundPlane, lightPos);
  439.   glTranslatef(0.0, 0.0, 2.0);
  440.   glMultMatrixf((const GLfloat *) cubeXform);
  441.   drawCube(BLACK);      /* draw ground shadow */
  442.   glPopMatrix();
  443.   glPushMatrix();
  444.   myShadowMatrix(backPlane, lightPos);
  445.   glTranslatef(0.0, 0.0, 2.0);
  446.   glMultMatrixf((const GLfloat *) cubeXform);
  447.   drawCube(BLACK);      /* draw back shadow */
  448.   glPopMatrix();
  449.   glDepthMask(GL_TRUE);
  450.   if (useRGB) {
  451.     glDisable(GL_BLEND);
  452.   } else {
  453.     glDisable(GL_POLYGON_STIPPLE);
  454.   }
  455.   if (useFog) {
  456.     glEnable(GL_FOG);
  457.   }
  458.   if (useDB) {
  459.     glutSwapBuffers();
  460.   } else {
  461.     glFlush();
  462.   }
  463. }
  464. void
  465. fog_select(int fog)
  466. {
  467.   glFogf(GL_FOG_MODE, fog);
  468.   glutPostRedisplay();
  469. }
  470. void
  471. menu_select(int mode)
  472. {
  473.   switch (mode) {
  474.   case 1:
  475.     moving = 1;
  476.     glutIdleFunc(idle);
  477.     break;
  478.   case 2:
  479.     moving = 0;
  480.     glutIdleFunc(NULL);
  481.     break;
  482.   case 3:
  483.     useFog = !useFog;
  484.     useFog ? glEnable(GL_FOG) : glDisable(GL_FOG);
  485.     glutPostRedisplay();
  486.     break;
  487.   case 4:
  488.     useLighting = !useLighting;
  489.     useLighting ? glEnable(GL_LIGHTING) :
  490.       glDisable(GL_LIGHTING);
  491.     glutPostRedisplay();
  492.     break;
  493.   case 5:
  494.     exit(0);
  495.     break;
  496.   }
  497. }
  498. void
  499. visible(int state)
  500. {
  501.   if (state == GLUT_VISIBLE) {
  502.     if (moving)
  503.       glutIdleFunc(idle);
  504.   } else {
  505.     if (moving)
  506.       glutIdleFunc(NULL);
  507.   }
  508. }
  509. int
  510. main(int argc, char **argv)
  511. {
  512.   int width = 350, height = 350;
  513.   int i;
  514.   char *name;
  515.   int fog_menu;
  516.   glutInitWindowSize(width, height);
  517.   glutInit(&argc, argv);
  518.   /* process commmand line args */
  519.   for (i = 1; i < argc; ++i) {
  520.     if (!strcmp("-c", argv[i])) {
  521.       useRGB = !useRGB;
  522.     } else if (!strcmp("-l", argv[i])) {
  523.       useLighting = !useLighting;
  524.     } else if (!strcmp("-f", argv[i])) {
  525.       useFog = !useFog;
  526.     } else if (!strcmp("-db", argv[i])) {
  527.       useDB = !useDB;
  528.     } else if (!strcmp("-logo", argv[i])) {
  529.       useLogo = !useLogo;
  530.     } else if (!strcmp("-quads", argv[i])) {
  531.       useQuads = !useQuads;
  532.     } else {
  533.       usage();
  534.     }
  535.   }
  536.   /* choose visual */
  537.   if (useRGB) {
  538.     if (useDB) {
  539.       glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  540.       name = windowNameRGBDB;
  541.     } else {
  542.       glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  543.       name = windowNameRGB;
  544.     }
  545.   } else {
  546.     if (useDB) {
  547.       glutInitDisplayMode(GLUT_DOUBLE | GLUT_INDEX | GLUT_DEPTH);
  548.       name = windowNameIndexDB;
  549.     } else {
  550.       glutInitDisplayMode(GLUT_SINGLE | GLUT_INDEX | GLUT_DEPTH);
  551.       name = windowNameIndex;
  552.     }
  553.   }
  554.   glutCreateWindow(name);
  555.   buildColormap();
  556.   glutKeyboardFunc(keyboard);
  557.   glutDisplayFunc(display);
  558.   glutVisibilityFunc(visible);
  559.   fog_menu = glutCreateMenu(fog_select);
  560.   glutAddMenuEntry("Linear fog", GL_LINEAR);
  561.   glutAddMenuEntry("Exp fog", GL_EXP);
  562.   glutAddMenuEntry("Exp^2 fog", GL_EXP2);
  563.   glutCreateMenu(menu_select);
  564.   glutAddMenuEntry("Start motion", 1);
  565.   glutAddMenuEntry("Stop motion", 2);
  566.   glutAddMenuEntry("Toggle fog", 3);
  567.   glutAddMenuEntry("Toggle lighting", 4);
  568.   glutAddSubMenu("Fog type", fog_menu);
  569.   glutAddMenuEntry("Quit", 5);
  570.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  571.   /* setup context */
  572.   glMatrixMode(GL_PROJECTION);
  573.   glLoadIdentity();
  574.   glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 3.0);
  575.   glMatrixMode(GL_MODELVIEW);
  576.   glLoadIdentity();
  577.   glTranslatef(0.0, 0.0, -2.0);
  578.   glEnable(GL_DEPTH_TEST);
  579.   if (useLighting) {
  580.     glEnable(GL_LIGHTING);
  581.   }
  582.   glEnable(GL_LIGHT0);
  583.   glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  584.   glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
  585.   glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiff);
  586.   glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpec);
  587. #if 0
  588.   glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDir);
  589.   glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 80);
  590.   glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 25);
  591. #endif
  592.   glEnable(GL_NORMALIZE);
  593.   if (useFog) {
  594.     glEnable(GL_FOG);
  595.   }
  596.   glFogfv(GL_FOG_COLOR, fogColor);
  597.   glFogfv(GL_FOG_INDEX, fogIndex);
  598.   glFogf(GL_FOG_MODE, GL_EXP);
  599.   glFogf(GL_FOG_DENSITY, 0.5);
  600.   glFogf(GL_FOG_START, 1.0);
  601.   glFogf(GL_FOG_END, 3.0);
  602.   glEnable(GL_CULL_FACE);
  603.   glCullFace(GL_BACK);
  604.   glShadeModel(GL_SMOOTH);
  605.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  606.   if (useLogo) {
  607.     glPolygonStipple((const GLubyte *) sgiPattern);
  608.   } else {
  609.     glPolygonStipple((const GLubyte *) shadowPattern);
  610.   }
  611.   glClearColor(0.0, 0.0, 0.0, 1);
  612.   glClearIndex(0);
  613.   glClearDepth(1);
  614.   glutMainLoop();
  615.   return 0;             /* ANSI C requires main to return int. */
  616. }