home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 2000 April & May / AMIGA_2000_04.iso / patches / mesa3.1 / samples / logo.c < prev    next >
C/C++ Source or Header  |  2000-01-01  |  37KB  |  1,631 lines

  1. /* $Id: logo.c,v 1.1.1.1.2.1 1999/12/15 13:01:44 brianp Exp $ */
  2.  
  3. /*
  4.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the name of
  10.  * Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Silicon Graphics.
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  15.  * ANY KIND,
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  18.  *
  19.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  24.  * OF THIS SOFTWARE.
  25.  */
  26.  
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <stdlib.h>
  30. #include <GL/glut.h>
  31.  
  32.  
  33. #define PI 3.141592654
  34.  
  35. #define    BLACK 0
  36. #define    GRAY 128
  37. #define    WHITE 255
  38. #define BL 0x00
  39. #define WH 0xFF
  40. #define RD 0xA4,0x00,0x00,0xFF
  41. #define WT 0xFF,0xFF,0xFF,0xFF
  42.  
  43. #define    CHECKIMAGEWIDTH 8
  44. #define    CHECKIMAGEHEIGHT 8
  45. #define    BRICKIMAGEWIDTH 16
  46. #define    BRICKIMAGEHEIGHT 16
  47.  
  48.  
  49. GLenum rgb, doubleBuffer;
  50.  
  51. #include "tkmap.c"
  52.  
  53. float black[3] = {0.0, 0.0, 0.0};
  54. float white[3] = {1.0, 1.0, 1.0};
  55. float gray[3] = {0.5, 0.5, 0.5};
  56. float blue[3] = {0.0, 0.0, 1.0};
  57. GLint colorIndexes[3] = {0, 200, 255};
  58.  
  59. GLenum polyMode;
  60. GLboolean dithering;
  61. GLboolean shade;
  62. GLboolean doStipple;
  63. GLboolean noDraw = 0;
  64. GLboolean LineSmooth = GL_FALSE;
  65.  
  66. double plane[4] = {1.0, 0.0, -1.0, 0.0};
  67. float xRotation = 30.0, yRotation = 30.0;
  68. float zTranslation = -15.0;
  69.  
  70. GLint singleCylinder;
  71. GLint doubleCylinder;
  72. GLint elbow, logo;
  73.  
  74. GLubyte checkImage[3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT] = {
  75.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  76.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  77.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  78.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  79.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  80.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  81.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  82.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  83.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  84.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  85.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  86.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, 
  87. };
  88. GLubyte brickImage[4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT] = {
  89.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  90.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  91.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  92.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  93.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  94.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  95.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  96.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  97.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  98.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  99.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  100.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  101.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  102.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  103.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  104.     RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
  105. };
  106.  
  107. GLubyte *image = checkImage;
  108. GLint imageHeight = CHECKIMAGEHEIGHT;
  109. GLint imageWidth = CHECKIMAGEWIDTH;
  110.  
  111. static float decal[] = {
  112.     GL_DECAL,
  113. };
  114. static float modulate[] = {
  115.     GL_MODULATE,
  116. };
  117. static float repeat[] = {
  118.     GL_REPEAT,
  119. };
  120. static float nearest[] = {
  121.     GL_NEAREST,
  122. };
  123.  
  124. GLubyte stipple[4*32] = {
  125.     0x00, 0x00, 0x00, 0x00,
  126.     0x00, 0x00, 0x00, 0x00,
  127.     0x00, 0x00, 0x00, 0x00,
  128.     0x00, 0x00, 0x00, 0x00,
  129.     0x00, 0x00, 0x00, 0x00,
  130.     0x00, 0x00, 0x00, 0x00,
  131.     0x00, 0x00, 0x00, 0x00,
  132.     0x00, 0x00, 0x00, 0x00,
  133.  
  134.     0x00, 0x0F, 0xF0, 0x00,
  135.     0x00, 0x0F, 0xF0, 0x00,
  136.     0x00, 0x0F, 0xF0, 0x00,
  137.     0x00, 0x0F, 0xF0, 0x00,
  138.     0x00, 0x0F, 0xF0, 0x00,
  139.     0x00, 0x0F, 0xF0, 0x00,
  140.     0x00, 0x0F, 0xF0, 0x00,
  141.     0x00, 0x0F, 0xF0, 0x00,
  142.  
  143.     0x00, 0x0F, 0xF0, 0x00,
  144.     0x00, 0x0F, 0xF0, 0x00,
  145.     0x00, 0x0F, 0xF0, 0x00,
  146.     0x00, 0x0F, 0xF0, 0x00,
  147.     0x00, 0x0F, 0xF0, 0x00,
  148.     0x00, 0x0F, 0xF0, 0x00,
  149.     0x00, 0x0F, 0xF0, 0x00,
  150.     0x00, 0x0F, 0xF0, 0x00,
  151.  
  152.     0x00, 0x00, 0x00, 0x00,
  153.     0x00, 0x00, 0x00, 0x00,
  154.     0x00, 0x00, 0x00, 0x00,
  155.     0x00, 0x00, 0x00, 0x00,
  156.     0x00, 0x00, 0x00, 0x00,
  157.     0x00, 0x00, 0x00, 0x00,
  158.     0x00, 0x00, 0x00, 0x00,
  159.     0x00, 0x00, 0x00, 0x00,
  160. };
  161.  
  162. float tscp[18][2] = {
  163.     {
  164.     0.0, 0.0
  165.     },
  166.     {
  167.     1.0, 0.0
  168.     },
  169.     {
  170.     0.0, 0.125
  171.     },
  172.     {
  173.     1.0, 0.125
  174.     },
  175.     {
  176.     0.0, 0.250
  177.     },
  178.     {
  179.     1.0, 0.25
  180.     },
  181.     {
  182.     0.0, 0.375
  183.     },
  184.     {
  185.     1.0, 0.375
  186.     },
  187.     {
  188.     0.0, 0.50
  189.     },
  190.     {
  191.     1.0, 0.50
  192.     },
  193.     {
  194.     0.0, 0.625
  195.     },
  196.     {
  197.     1.0, 0.625
  198.     },
  199.     {
  200.     0.0, 0.75
  201.     },
  202.     {
  203.     1.0, 0.75
  204.     },
  205.     {
  206.     0.0, 0.875
  207.     },
  208.     {
  209.     1.0, 0.875
  210.     },
  211.     {
  212.     0.0, 1.0
  213.     },
  214.     {
  215.     1.0, 1.0
  216.     }
  217. };
  218. float scp[18][3] = {
  219.     {
  220.     1.000000, 0.000000, 0.000000
  221.     },
  222.     {
  223.     1.000000, 0.000000, 5.000000
  224.     },
  225.     {
  226.     0.707107, 0.707107, 0.000000
  227.     },
  228.     {
  229.     0.707107, 0.707107, 5.000000
  230.     },
  231.     {
  232.     0.000000, 1.000000, 0.000000
  233.     },
  234.     {
  235.     0.000000, 1.000000, 5.000000
  236.     },
  237.     {
  238.     -0.707107, 0.707107, 0.000000
  239.     },
  240.     {
  241.     -0.707107, 0.707107, 5.000000
  242.     },
  243.     {
  244.     -1.000000, 0.000000, 0.000000
  245.     },
  246.     {
  247.     -1.000000, 0.000000, 5.000000
  248.     },
  249.     {
  250.     -0.707107, -0.707107, 0.000000
  251.     },
  252.     {
  253.     -0.707107, -0.707107, 5.000000
  254.     },
  255.     {
  256.     0.000000, -1.000000, 0.000000
  257.     },
  258.     {
  259.     0.000000, -1.000000, 5.000000
  260.     },
  261.     {
  262.     0.707107, -0.707107, 0.000000
  263.     },
  264.     {
  265.     0.707107, -0.707107, 5.000000
  266.     },
  267.     {
  268.     1.000000, 0.000000, 0.000000
  269.     },
  270.     {
  271.     1.000000, 0.000000, 5.000000
  272.     }
  273. };
  274. float dcp[18][3] = {
  275.     {
  276.     1.000000, 0.000000, 0.000000
  277.     },
  278.     {
  279.     1.000000, 0.000000, 7.000000
  280.     },
  281.     {
  282.     0.707107, 0.707107, 0.000000
  283.     },
  284.     {
  285.     0.707107, 0.707107, 7.000000
  286.     },
  287.     {
  288.     0.000000, 1.000000, 0.000000
  289.     },
  290.     {
  291.     0.000000, 1.000000, 7.000000
  292.     },
  293.     {
  294.     -0.707107, 0.707107, 0.000000
  295.     },
  296.     {
  297.     -0.707107, 0.707107, 7.000000
  298.     },
  299.     {
  300.     -1.000000, 0.000000, 0.000000
  301.     },
  302.     {
  303.     -1.000000, 0.000000, 7.000000
  304.     },
  305.     {
  306.     -0.707107, -0.707107, 0.000000
  307.     },
  308.     {
  309.     -0.707107, -0.707107, 7.000000
  310.     },
  311.     {
  312.     0.000000, -1.000000, 0.000000
  313.     },
  314.     {
  315.     0.000000, -1.000000, 7.000000
  316.     },
  317.     {
  318.     0.707107, -0.707107, 0.000000
  319.     },
  320.     {
  321.     0.707107, -0.707107, 7.000000
  322.     },
  323.     {
  324.     1.000000, 0.000000, 0.000000
  325.     },
  326.     {
  327.     1.000000, 0.000000, 7.000000
  328.     }
  329. };
  330. float ep[7][9][3] = {
  331.     {
  332.     {
  333.         1.000000, 0.000000, 0.000000
  334.     },
  335.     {
  336.         0.707107, 0.707107, 0.000000
  337.     },
  338.     {
  339.         0.000000, 1.000000, 0.000000
  340.     },
  341.     {
  342.         -0.707107, 0.707107, 0.000000
  343.     },
  344.     {
  345.         -1.000000, 0.000000, 0.000000
  346.     },
  347.     {
  348.         -0.707107, -0.707107, 0.000000
  349.     },
  350.     {
  351.         0.000000, -1.000000, 0.000000
  352.     },
  353.     {
  354.         0.707107, -0.707107, 0.000000
  355.     },
  356.     {
  357.         1.000000, 0.000000, 0.000000
  358.     }
  359.     },
  360.     {
  361.     {
  362.         1.000000, 0.034074, 0.258819
  363.     },
  364.     {
  365.         0.707107, 0.717087, 0.075806
  366.     },
  367.     {
  368.         0.000000, 1.000000, 0.000000
  369.     },
  370.     {
  371.         -0.707107, 0.717087, 0.075806
  372.     },
  373.     {
  374.         -1.000000, 0.034074, 0.258819
  375.     },
  376.     {
  377.         -0.707107, -0.648939, 0.441832
  378.     },
  379.     {
  380.         0.000000, -0.931852, 0.517638
  381.     },
  382.     {
  383.         0.707107, -0.648939, 0.441832
  384.     },
  385.     {
  386.         1.000000, 0.034074, 0.258819
  387.     }
  388.     },
  389.     {
  390.     {
  391.         1.000000, 0.133975, 0.500000
  392.     },
  393.     {
  394.         0.707107, 0.746347, 0.146447
  395.     },
  396.     {
  397.         0.000000, 1.000000, 0.000000
  398.     },
  399.     {
  400.         -0.707107, 0.746347, 0.146447
  401.     },
  402.     {
  403.         -1.000000, 0.133975, 0.500000
  404.     },
  405.     {
  406.         -0.707107, -0.478398, 0.853553
  407.     },
  408.     {
  409.         0.000000, -0.732051, 1.000000
  410.     },
  411.     {
  412.         0.707107, -0.478398, 0.853553
  413.     },
  414.     {
  415.         1.000000, 0.133975, 0.500000
  416.     }
  417.     },
  418.     {
  419.     {
  420.         1.000000, 0.292893, 0.707107
  421.     },
  422.     {
  423.         0.707107, 0.792893, 0.207107
  424.     },
  425.     {
  426.         0.000000, 1.000000, 0.000000
  427.     },
  428.     {
  429.         -0.707107, 0.792893, 0.207107
  430.     },
  431.     {
  432.         -1.000000, 0.292893, 0.707107
  433.     },
  434.     {
  435.         -0.707107, -0.207107, 1.207107
  436.     },
  437.     {
  438.         0.000000, -0.414214, 1.414214
  439.     },
  440.     {
  441.         0.707107, -0.207107, 1.207107
  442.     },
  443.     {
  444.         1.000000, 0.292893, 0.707107
  445.     }
  446.     },
  447.     {
  448.     {
  449.         1.000000, 0.500000, 0.866025
  450.     },
  451.     {
  452.         0.707107, 0.853553, 0.253653
  453.     },
  454.     {
  455.         0.000000, 1.000000, 0.000000
  456.     },
  457.     {
  458.         -0.707107, 0.853553, 0.253653
  459.     },
  460.     {
  461.         -1.000000, 0.500000, 0.866025
  462.     },
  463.     {
  464.         -0.707107, 0.146447, 1.478398
  465.     },
  466.     {
  467.         0.000000, 0.000000, 1.732051
  468.     },
  469.     {
  470.         0.707107, 0.146447, 1.478398
  471.     },
  472.     {
  473.         1.000000, 0.500000, 0.866025
  474.     }
  475.     },
  476.     {
  477.     {
  478.         1.000000, 0.741181, 0.965926
  479.     },
  480.     {
  481.         0.707107, 0.924194, 0.282913
  482.     },
  483.     {
  484.         0.000000, 1.000000, 0.000000
  485.     },
  486.     {
  487.         -0.707107, 0.924194, 0.282913
  488.     },
  489.     {
  490.         -1.000000, 0.741181, 0.965926
  491.     },
  492.     {
  493.         -0.707107, 0.558168, 1.648939
  494.     },
  495.     {
  496.         0.000000, 0.482362, 1.931852
  497.     },
  498.     {
  499.         0.707107, 0.558168, 1.648939
  500.     },
  501.     {
  502.         1.000000, 0.741181, 0.965926
  503.     }
  504.     },
  505.     {
  506.     {
  507.         1.000000, 1.000000, 1.000000
  508.     },
  509.     {
  510.         0.707107, 1.000000, 0.292893
  511.     },
  512.     {
  513.         0.000000, 1.000000, 0.000000
  514.     },
  515.     {
  516.         -0.707107, 1.000000, 0.292893
  517.     },
  518.     {
  519.         -1.000000, 1.000000, 1.000000
  520.     },
  521.     {
  522.         -0.707107, 1.000000, 1.707107
  523.     },
  524.     {
  525.         0.000000, 1.000000, 2.000000
  526.     },
  527.     {
  528.         0.707107, 1.000000, 1.707107
  529.     },
  530.     {
  531.         1.000000, 1.000000, 1.000000
  532.     }
  533.     }
  534. };
  535. float en[7][9][3] = {
  536.     {
  537.     {
  538.         1.000000, 0.000000, 0.000000
  539.     },
  540.     {
  541.         0.707107, 0.707107, 0.000000
  542.     },
  543.     {
  544.         0.000000, 1.000000, 0.000000
  545.     },
  546.     {
  547.         -0.707107, 0.707107, 0.000000
  548.     },
  549.     {
  550.         -1.000000, 0.000000, 0.000000
  551.     },
  552.     {
  553.         -0.707107, -0.707107, 0.000000
  554.     },
  555.     {
  556.         0.000000, -1.000000, 0.000000
  557.     },
  558.     {
  559.         0.707107, -0.707107, 0.000000
  560.     },
  561.     {
  562.         1.000000, 0.000000, 0.000000
  563.     }
  564.     },
  565.     {
  566.     {
  567.         1.000000, 0.000000, 0.000000
  568.     },
  569.     {
  570.         0.707107, 0.683013, -0.183013
  571.     },
  572.     {
  573.         0.000000, 0.965926, -0.258819
  574.     },
  575.     {
  576.         -0.707107, 0.683013, -0.183013
  577.     },
  578.     {
  579.         -1.000000, 0.000000, 0.000000
  580.     },
  581.     {
  582.         -0.707107, -0.683013, 0.183013
  583.     },
  584.     {
  585.         0.000000, -0.965926, 0.258819
  586.     },
  587.     {
  588.         0.707107, -0.683013, 0.183013
  589.     },
  590.     {
  591.         1.000000, 0.000000, 0.000000
  592.     }
  593.     },
  594.     {
  595.     {
  596.         1.000000, 0.000000, 0.000000
  597.     },
  598.     {
  599.         0.707107, 0.612372, -0.353553
  600.     },
  601.     {
  602.         0.000000, 0.866025, -0.500000
  603.     },
  604.     {
  605.         -0.707107, 0.612372, -0.353553
  606.     },
  607.     {
  608.         -1.000000, 0.000000, 0.000000
  609.     },
  610.     {
  611.         -0.707107, -0.612372, 0.353553
  612.     },
  613.     {
  614.         0.000000, -0.866025, 0.500000
  615.     },
  616.     {
  617.         0.707107, -0.612372, 0.353553
  618.     },
  619.     {
  620.         1.000000, 0.000000, 0.000000
  621.     }
  622.     },
  623.     {
  624.     {
  625.         1.000000, 0.000000, 0.000000
  626.     },
  627.     {
  628.        /* These 3 lines added by BEP */
  629.         0.707107, 0.500000, -0.500000
  630.     },
  631.     {
  632.         0.000000, 0.707107, -0.707107
  633.     },
  634.     {
  635.         -0.707107, 0.500000, -0.500000
  636.     },
  637.     {
  638.         -1.000000, 0.000000, 0.000000
  639.     },
  640.     {
  641.         -0.707107, -0.500000, 0.500000
  642.     },
  643.     {
  644.         0.000000, -0.707107, 0.707107
  645.     },
  646.     {
  647.         0.707107, -0.500000, 0.500000
  648.     },
  649.     {
  650.         1.000000, 0.000000, 0.000000
  651.     }
  652.     },
  653.     {
  654.     {
  655.         1.000000, 0.000000, 0.000000
  656.     },
  657.     {
  658.         0.707107, 0.353553, -0.612372
  659.     },
  660.     {
  661.         0.000000, 0.500000, -0.866025
  662.     },
  663.     {
  664.         -0.707107, 0.353553, -0.612372
  665.     },
  666.     {
  667.         -1.000000, 0.000000, 0.000000
  668.     },
  669.     {
  670.         -0.707107, -0.353553, 0.612372
  671.     },
  672.     {
  673.         0.000000, -0.500000, 0.866025
  674.     },
  675.     {
  676.         0.707107, -0.353553, 0.612372
  677.     },
  678.     {
  679.         1.000000, 0.000000, 0.000000
  680.     }
  681.     },
  682.     {
  683.     {
  684.         1.000000, 0.000000, 0.000000
  685.     },
  686.     {
  687.         0.707107, 0.183013, -0.683013
  688.     },
  689.     {
  690.         0.000000, 0.258819, -0.965926
  691.     },
  692.     {
  693.         -0.707107, 0.183013, -0.683013
  694.     },
  695.     {
  696.         -1.000000, 0.000000, 0.000000
  697.     },
  698.     {
  699.         -0.707107, -0.183013, 0.683013
  700.     },
  701.     {
  702.         0.000000, -0.258819, 0.965926
  703.     },
  704.     {
  705.         0.707107, -0.183013, 0.683013
  706.     },
  707.     {
  708.         1.000000, 0.000000, 0.000000
  709.     }
  710.     },
  711.     {
  712.     {
  713.         1.000000, 0.000000, 0.000000
  714.     },
  715.     {
  716.         0.707107, 0.000000, -0.707107
  717.     },
  718.     {
  719.         0.000000, 0.000000, -1.000000
  720.     },
  721.     {
  722.         -0.707107, 0.000000, -0.707107
  723.     },
  724.     {
  725.         -1.000000, 0.000000, 0.000000
  726.     },
  727.     {
  728.         -0.707107, 0.000000, 0.707107
  729.     },
  730.     {
  731.         0.000000, 0.000000, 1.000000
  732.     },
  733.     {
  734.         0.707107, 0.000000, 0.707107
  735.     },
  736.     {
  737.         1.000000, 0.000000, 0.000000
  738.     }
  739.     }
  740. };
  741. float tep[7][9][2] = {
  742.     {
  743.     {
  744.         0,     0.0
  745.     },
  746.     {
  747.         0.125, 0.0
  748.     },
  749.     {
  750.         0.25,  0.0
  751.     },
  752.     {
  753.         0.375, 0.0
  754.     },
  755.     {
  756.         0.5,   0.0
  757.     },
  758.     {
  759.         0.625, 0.0
  760.     },
  761.     {
  762.         0.75,  0.0
  763.     },
  764.     {
  765.         0.875, 0.0
  766.     },
  767.     {
  768.         1.0,   0.0
  769.     }
  770.     },
  771.     {
  772.     {
  773.         0,     0.16667
  774.     },
  775.     {
  776.         0.125, 0.16667
  777.     },
  778.     {
  779.         0.25,  0.16667
  780.     },
  781.     {
  782.         0.375, 0.16667
  783.     },
  784.     {
  785.         0.5,   0.16667
  786.     },
  787.     {
  788.         0.625, 0.16667
  789.     },
  790.     {
  791.         0.75,  0.16667
  792.     },
  793.     {
  794.         0.875, 0.16667
  795.     },
  796.     {
  797.         1.0,   0.16667
  798.     }
  799.     },
  800.     {
  801.     {
  802.         0,     0.33333
  803.     },
  804.     {
  805.         0.125, 0.33333
  806.     },
  807.     {
  808.         0.25,  0.33333
  809.     },
  810.     {
  811.         0.375, 0.33333
  812.     },
  813.     {
  814.         0.5,   0.33333
  815.     },
  816.     {
  817.         0.625, 0.33333
  818.     },
  819.     {
  820.         0.75,  0.33333
  821.     },
  822.     {
  823.         0.875, 0.33333
  824.     },
  825.     {
  826.         1.0,   0.33333
  827.     }
  828.     },
  829.     {
  830.     {
  831.         0,     0.5
  832.     },
  833.     {
  834.         0.125, 0.5
  835.     },
  836.     {
  837.         0.25,  0.5
  838.     },
  839.     {
  840.         0.375, 0.5
  841.     },
  842.     {
  843.         0.5,   0.5
  844.     },
  845.     {
  846.         0.625, 0.5
  847.     },
  848.     {
  849.         0.75,  0.5
  850.     },
  851.     {
  852.         0.875, 0.5
  853.     },
  854.     {
  855.         1.0,   0.5
  856.     }
  857.     },
  858.     {
  859.     {
  860.         0,     0.6667
  861.     },
  862.     {
  863.         0.125, 0.6667
  864.     },
  865.     {
  866.         0.25,  0.6667
  867.     },
  868.     {
  869.         0.375, 0.6667
  870.     },
  871.     {
  872.         0.5,   0.6667
  873.     },
  874.     {
  875.         0.625, 0.6667
  876.     },
  877.     {
  878.         0.75,  0.6667
  879.     },
  880.     {
  881.         0.875, 0.6667
  882.     },
  883.     {
  884.         1.0,   0.6667
  885.     }
  886.     },
  887.     {
  888.     {
  889.         0,     0.83333
  890.     },
  891.     {
  892.         0.125, 0.83333
  893.     },
  894.     {
  895.         0.25,  0.83333
  896.     },
  897.     {
  898.         0.375, 0.83333
  899.     },
  900.     {
  901.         0.5,   0.83333
  902.     },
  903.     {
  904.         0.625, 0.83333
  905.     },
  906.     {
  907.         0.75,  0.83333
  908.     },
  909.     {
  910.         0.875, 0.83333
  911.     },
  912.     {
  913.         1.0,   0.83333
  914.     }
  915.     },
  916.     {
  917.     {
  918.         0,     1.0
  919.     },
  920.     {
  921.         0.125, 1.0
  922.     },
  923.     {
  924.         0.25,  1.0
  925.     },
  926.     {
  927.         0.375, 1.0
  928.     },
  929.     {
  930.         0.5,   1.0
  931.     },
  932.     {
  933.         0.625, 1.0
  934.     },
  935.     {
  936.         0.75,  1.0
  937.     },
  938.     {
  939.         0.875, 1.0
  940.     },
  941.     {
  942.         1.0,   1.0
  943.     }
  944.     }
  945. };
  946.  
  947.  
  948. static void SetUpAntiAliasedGrayScale(void)
  949. {
  950.     float color;
  951.     GLint i, j;
  952.  
  953.     for (i = 0; i < 16; i++) {
  954.     color = (2 * i + 1) / 32.0;
  955.     for (j = 0; j < 16; j++) {
  956.         glutSetColor(i*16+j, color*j/15.0, color*j/15.0, color*j/15.0);
  957.     }
  958.     }
  959. }
  960.  
  961. static void BendForward(void)
  962. {
  963.  
  964.     glTranslatef(0.0, 1.0, 0.0);
  965.     glRotatef(90.0, 1, 0, 0);
  966.     glTranslatef(0.0, -1.0, 0.0);
  967. }
  968.  
  969. static void BendLeft(void)
  970. {
  971.  
  972.     glRotatef(-90.0, 0, 0, 1);
  973.     glTranslatef(0.0, 1.0, 0.0);
  974.     glRotatef(90.0, 1, 0, 0);
  975.     glTranslatef(0.0, -1.0, 0.0);
  976. }
  977.  
  978. static void BendRight(void)
  979. {
  980.  
  981.     glRotatef(90.0, 0, 0, 1);
  982.     glTranslatef(0.0, 1.0, 0.0);
  983.     glRotatef(90.0, 1, 0, 0);
  984.     glTranslatef(0.0, -1.0, 0.0);
  985. }
  986.  
  987. static void BuildSingleCylinder(void)
  988. {
  989.  
  990.     glNewList(singleCylinder, GL_COMPILE);
  991.  
  992.     glBegin(GL_TRIANGLE_STRIP);
  993.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(scp[0]);
  994.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(scp[1]);
  995.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(scp[2]);
  996.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(scp[3]);
  997.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(scp[4]);
  998.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(scp[5]);
  999.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(scp[6]);
  1000.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(scp[7]);
  1001.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(scp[8]);
  1002.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(scp[9]);
  1003.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(scp[10]);
  1004.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(scp[11]);
  1005.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(scp[12]);
  1006.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(scp[13]);
  1007.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(scp[14]);
  1008.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(scp[15]);
  1009.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(scp[16]);
  1010.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(scp[17]);
  1011.     glEnd();
  1012.  
  1013.     glEndList();
  1014. }
  1015.  
  1016. static void BuildDoubleCylinder(void)
  1017. {
  1018.  
  1019.     glNewList(doubleCylinder, GL_COMPILE);
  1020.  
  1021.     glBegin(GL_TRIANGLE_STRIP);
  1022.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(dcp[0]);
  1023.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(dcp[1]);
  1024.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(dcp[2]);
  1025.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(dcp[3]);
  1026.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(dcp[4]);
  1027.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(dcp[5]);
  1028.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(dcp[6]);
  1029.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(dcp[7]);
  1030.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(dcp[8]);
  1031.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(dcp[9]);
  1032.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(dcp[10]);
  1033.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(dcp[11]);
  1034.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(dcp[12]);
  1035.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(dcp[13]);
  1036.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(dcp[14]);
  1037.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(dcp[15]);
  1038.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(dcp[16]);
  1039.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(dcp[17]);
  1040.     glEnd();
  1041.  
  1042.     glEndList();
  1043. }
  1044.  
  1045. static void BuildElbow(void)
  1046. {
  1047.  
  1048.     glNewList(elbow, GL_COMPILE);
  1049.  
  1050.     glBegin(GL_TRIANGLE_STRIP);
  1051.     glNormal3fv(en[0][0]); glTexCoord2fv(tep[0][0]); glVertex3fv(ep[0][0]);
  1052.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1053.     glNormal3fv(en[0][1]); glTexCoord2fv(tep[0][1]); glVertex3fv(ep[0][1]);
  1054.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1055.     glNormal3fv(en[0][2]); glTexCoord2fv(tep[0][2]); glVertex3fv(ep[0][2]);
  1056.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1057.     glNormal3fv(en[0][3]); glTexCoord2fv(tep[0][3]); glVertex3fv(ep[0][3]);
  1058.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1059.     glNormal3fv(en[0][4]); glTexCoord2fv(tep[0][4]); glVertex3fv(ep[0][4]);
  1060.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1061.     glNormal3fv(en[0][5]); glTexCoord2fv(tep[0][5]); glVertex3fv(ep[0][5]);
  1062.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1063.     glNormal3fv(en[0][6]); glTexCoord2fv(tep[0][6]); glVertex3fv(ep[0][6]);
  1064.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1065.     glNormal3fv(en[0][7]); glTexCoord2fv(tep[0][7]); glVertex3fv(ep[0][7]);
  1066.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1067.     glNormal3fv(en[0][8]); glTexCoord2fv(tep[0][8]); glVertex3fv(ep[0][8]);
  1068.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1069.     glEnd();
  1070.     glBegin(GL_TRIANGLE_STRIP);
  1071.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1072.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1073.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1074.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1075.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1076.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1077.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1078.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1079.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1080.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1081.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1082.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1083.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1084.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1085.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1086.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1087.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1088.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1089.     glEnd();
  1090.     glBegin(GL_TRIANGLE_STRIP);
  1091.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1092.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1093.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1094.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1095.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1096.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1097.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1098.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1099.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1100.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1101.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1102.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1103.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1104.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1105.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1106.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1107.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1108.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1109.     glEnd();
  1110.     glBegin(GL_TRIANGLE_STRIP);
  1111.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1112.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1113.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1114.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1115.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1116.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1117.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1118.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1119.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1120.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1121.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1122.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1123.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1124.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1125.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1126.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1127.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1128.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1129.     glEnd();
  1130.     glBegin(GL_TRIANGLE_STRIP);
  1131.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1132.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1133.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1134.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1135.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1136.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1137.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1138.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1139.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1140.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1141.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1142.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1143.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1144.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1145.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1146.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1147.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1148.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1149.     glEnd();
  1150.     glBegin(GL_TRIANGLE_STRIP);
  1151.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1152.     glNormal3fv(en[6][0]); glTexCoord2fv(tep[6][0]); glVertex3fv(ep[6][0]);
  1153.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1154.     glNormal3fv(en[6][1]); glTexCoord2fv(tep[6][1]); glVertex3fv(ep[6][1]);
  1155.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1156.     glNormal3fv(en[6][2]); glTexCoord2fv(tep[6][2]); glVertex3fv(ep[6][2]);
  1157.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1158.     glNormal3fv(en[6][3]); glTexCoord2fv(tep[6][3]); glVertex3fv(ep[6][3]);
  1159.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1160.     glNormal3fv(en[6][4]); glTexCoord2fv(tep[6][4]); glVertex3fv(ep[6][4]);
  1161.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1162.     glNormal3fv(en[6][5]); glTexCoord2fv(tep[6][5]); glVertex3fv(ep[6][5]);
  1163.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1164.     glNormal3fv(en[6][6]); glTexCoord2fv(tep[6][6]); glVertex3fv(ep[6][6]);
  1165.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1166.     glNormal3fv(en[6][7]); glTexCoord2fv(tep[6][7]); glVertex3fv(ep[6][7]);
  1167.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1168.     glNormal3fv(en[6][8]); glTexCoord2fv(tep[6][8]); glVertex3fv(ep[6][8]);
  1169.     glEnd();
  1170.  
  1171.     glEndList();
  1172. }
  1173.  
  1174. static void BuildLogo(void)
  1175. {
  1176.  
  1177.     glNewList(logo, GL_COMPILE);
  1178.  
  1179.     glTranslatef(5.5, -3.5, 4.5);
  1180.     glTranslatef(0.0, 0.0, -7.0);
  1181.     glCallList(doubleCylinder);
  1182.     BendForward();
  1183.     glCallList(elbow);
  1184.     glTranslatef(0.0, 0.0, -7.0);
  1185.     glCallList(doubleCylinder);
  1186.     BendForward();
  1187.     glCallList(elbow);
  1188.     glTranslatef(0.0, 0.0, -5.0);
  1189.     glCallList(singleCylinder);
  1190.     BendRight();
  1191.     glCallList(elbow);
  1192.     glTranslatef(0.0, 0.0, -7.0);
  1193.     glCallList(doubleCylinder);
  1194.     BendForward();
  1195.     glCallList(elbow);
  1196.     glTranslatef(0.0, 0.0, -7.0);
  1197.     glCallList(doubleCylinder);
  1198.     BendForward();
  1199.     glCallList(elbow);
  1200.     glTranslatef(0.0, 0.0, -5.0);
  1201.     glCallList(singleCylinder);
  1202.     BendLeft();
  1203.     glCallList(elbow);
  1204.     glTranslatef(0.0, 0.0, -7.0);
  1205.     glCallList(doubleCylinder);
  1206.     BendForward();
  1207.     glCallList(elbow);
  1208.     glTranslatef(0.0, 0.0, -7.0);
  1209.     glCallList(doubleCylinder);
  1210.     BendForward();
  1211.     glCallList(elbow);
  1212.     glTranslatef(0.0, 0.0, -5.0);
  1213.     glCallList(singleCylinder);
  1214.     BendRight();
  1215.     glCallList(elbow);
  1216.     glTranslatef(0.0, 0.0, -7.0);
  1217.     glCallList(doubleCylinder);
  1218.     BendForward();
  1219.     glCallList(elbow);
  1220.     glTranslatef(0.0, 0.0, -7.0);
  1221.     glCallList(doubleCylinder);
  1222.     BendForward();
  1223.     glCallList(elbow);
  1224.     glTranslatef(0.0, 0.0, -5.0);
  1225.     glCallList(singleCylinder);
  1226.     BendLeft();
  1227.     glCallList(elbow);
  1228.     glTranslatef(0.0, 0.0, -7.0);
  1229.     glCallList(doubleCylinder);
  1230.     BendForward();
  1231.     glCallList(elbow);
  1232.     glTranslatef(0.0, 0.0, -7.0);
  1233.     glCallList(doubleCylinder);
  1234.     BendForward();
  1235.     glCallList(elbow);
  1236.     glTranslatef(0.0, 0.0, -5.0);
  1237.     glCallList(singleCylinder);
  1238.     BendRight();
  1239.     glCallList(elbow);
  1240.     glTranslatef(0.0, 0.0, -7.0);
  1241.     glCallList(doubleCylinder);
  1242.     BendForward();
  1243.     glCallList(elbow);
  1244.     glTranslatef(0.0, 0.0, -7.0);
  1245.     glCallList(doubleCylinder);
  1246.     BendForward();
  1247.     glCallList(elbow);
  1248.     glTranslatef(0.0, 0.0, -5.0);
  1249.     glCallList(singleCylinder);
  1250.     BendLeft();
  1251.     glCallList(elbow);
  1252.  
  1253.     glEndList();
  1254. }
  1255.  
  1256. static void BuildLists(void)
  1257. {
  1258.  
  1259.     singleCylinder = glGenLists(1);
  1260.     doubleCylinder = glGenLists(1);
  1261.     elbow = glGenLists(1);
  1262.     logo = glGenLists(1);
  1263.  
  1264.     BuildSingleCylinder();
  1265.     BuildDoubleCylinder();
  1266.     BuildElbow();
  1267.     BuildLogo();
  1268. }
  1269.  
  1270. static void Init(void)
  1271. {
  1272.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  1273.     static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  1274.     static float position[] = {90.0, 90.0, 150.0, 0.0};
  1275.     static float front_mat_shininess[] = {30.0};
  1276.     static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  1277.     static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  1278.     static float back_mat_shininess[] = {50.0};
  1279.     static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  1280.     static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  1281.     static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  1282.     static float lmodel_twoside[] = {GL_TRUE};
  1283.  
  1284.     glClearColor(0.0, 0.0, 0.0, 0.0);
  1285.  
  1286.     glFrontFace(GL_CW);
  1287.  
  1288.     glEnable(GL_DEPTH_TEST);
  1289.  
  1290.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  1291.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  1292.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  1293.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  1294.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  1295.     glEnable(GL_LIGHTING);
  1296.     glEnable(GL_LIGHT0);
  1297.     
  1298.     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  1299.     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  1300.     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  1301.     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  1302.     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  1303.     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  1304.  
  1305.     glEnable(GL_CLIP_PLANE0);
  1306.  
  1307.     if (rgb) {
  1308.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1309.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1310.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1311.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1312.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1313.     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0,
  1314.              GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)checkImage);
  1315.     glEnable(GL_TEXTURE_2D);
  1316.  
  1317.     glCullFace(GL_BACK);
  1318.     glEnable(GL_CULL_FACE);
  1319.     } else {
  1320.     SetGreyRamp();
  1321.         /* commented out by BrianP because it's the wrong way to handle a 4-bit visual!
  1322.     if (doubleBuffer) {
  1323.         colorIndexes[1] = 10;
  1324.         colorIndexes[2] = 15;
  1325.     }
  1326.         */
  1327.     glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
  1328.     }
  1329.  
  1330.     BuildLists();
  1331.  
  1332.     dithering = GL_TRUE;
  1333.     shade = GL_TRUE;
  1334.     doStipple = GL_FALSE;
  1335.     polyMode = GL_BACK;
  1336. }
  1337.  
  1338. static void Reshape(int width, int height)
  1339. {
  1340.     glViewport(0, 0, (GLint)width, (GLint)height);
  1341.  
  1342.     glMatrixMode(GL_PROJECTION);
  1343.     glLoadIdentity();
  1344.     gluPerspective(90, 1.0, 1.0, 200.0);
  1345.     glMatrixMode(GL_MODELVIEW);
  1346. }
  1347.  
  1348. static void Key2(int key, int x, int y)
  1349. {
  1350.     (void) x;
  1351.     (void) y;
  1352.     switch (key) {
  1353.       case GLUT_KEY_LEFT:
  1354.     yRotation += 0.5;
  1355.     break;
  1356.       case GLUT_KEY_RIGHT:
  1357.     yRotation -= 0.5;
  1358.     break;
  1359.       case GLUT_KEY_UP:
  1360.     plane[3] += 2.0;
  1361.     break;
  1362.       case GLUT_KEY_DOWN:
  1363.     plane[3] -= 2.0;
  1364.     break;
  1365.       default:
  1366.     return;
  1367.     }
  1368.  
  1369.     glutPostRedisplay();
  1370. }
  1371.  
  1372. static void Key(unsigned char key, int x, int y)
  1373. {
  1374.     (void) x;
  1375.     (void) y;
  1376.     switch (key) {
  1377.       case 27:
  1378.     exit(1);
  1379.  
  1380.       case 'Z':
  1381.     zTranslation -= 1.0;
  1382.     break;
  1383.       case 'z':
  1384.     zTranslation += 1.0;
  1385.     break;
  1386.  
  1387.       case '1':
  1388.     glPolygonMode(polyMode, GL_POINT);
  1389.     break;
  1390.       case '2':
  1391.     glPolygonMode(polyMode, GL_LINE);
  1392.     break;
  1393.       case '3':
  1394.     glPolygonMode(polyMode, GL_FILL);
  1395.     break;
  1396.       case 'p':
  1397.     switch (polyMode) {
  1398.       case GL_BACK:
  1399.         polyMode = GL_FRONT;
  1400.         break;
  1401.       case GL_FRONT:
  1402.         polyMode = GL_FRONT_AND_BACK;
  1403.         break;
  1404.       case GL_FRONT_AND_BACK:
  1405.         polyMode = GL_BACK;
  1406.         break;
  1407.           default:
  1408.             break;
  1409.     }
  1410.     break;
  1411.  
  1412.       case '4':
  1413.     glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
  1414.     break;
  1415.       case '5':
  1416.     glEnable(GL_POLYGON_SMOOTH);
  1417.     if (rgb) {
  1418.         glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  1419.         glEnable(GL_BLEND);
  1420.         glDisable(GL_DEPTH_TEST);
  1421.     } else {
  1422.         SetUpAntiAliasedGrayScale();
  1423.     }
  1424.     break;
  1425.       case '6':
  1426.     glDisable(GL_POLYGON_SMOOTH);
  1427.     if (rgb) {
  1428.         glBlendFunc(GL_ONE, GL_ZERO);
  1429.         glDisable(GL_BLEND);
  1430.         glEnable(GL_DEPTH_TEST);
  1431.     } else {
  1432.         SetGreyRamp();
  1433.     }
  1434.     break;
  1435.  
  1436.       case '8':
  1437.     dithering = !dithering;
  1438.     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  1439.     break;
  1440.  
  1441.       case '9':
  1442.     doStipple = !doStipple;
  1443.     if (doStipple) {
  1444.         glPolygonStipple(stipple);
  1445.         glEnable(GL_POLYGON_STIPPLE);
  1446.     } else {
  1447.         glDisable(GL_POLYGON_STIPPLE);
  1448.     }
  1449.     break;
  1450.  
  1451.       case '0':
  1452.     shade = !shade;
  1453.     (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
  1454.     break;
  1455.  
  1456.       case 'q':
  1457.     glDisable(GL_CULL_FACE);
  1458.     break;
  1459.       case 'w':
  1460.     glEnable(GL_CULL_FACE);
  1461.     glCullFace(GL_FRONT);
  1462.     break;
  1463.       case 'e':
  1464.     glEnable(GL_CULL_FACE);
  1465.     glCullFace(GL_BACK);
  1466.     break;
  1467.  
  1468.       case 'r':
  1469.     glFrontFace(GL_CW);
  1470.     break;
  1471.       case 't': 
  1472.     glFrontFace(GL_CCW);
  1473.     break;
  1474.       case 'y':
  1475.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1476.     glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
  1477.     glPolygonStipple(stipple);
  1478.     break;
  1479.       case 'u':
  1480.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1481.     glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
  1482.     glPolygonStipple(stipple);
  1483.     break;
  1484.  
  1485.       case 'a':
  1486.     glEnable(GL_TEXTURE_2D);
  1487.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1488.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1489.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1490.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1491.     glTexImage2D(GL_TEXTURE_2D, 0, 4, BRICKIMAGEWIDTH,
  1492.              BRICKIMAGEHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  1493.              (GLvoid *)brickImage);
  1494.     break;
  1495.       case 's':
  1496.     glEnable(GL_TEXTURE_2D);
  1497.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1498.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1499.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1500.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1501.     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH,
  1502.              CHECKIMAGEHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE,
  1503.              (GLvoid *)checkImage);
  1504.     break;
  1505.       case 'd':
  1506.     glDisable(GL_TEXTURE_2D);
  1507.     break;
  1508.  
  1509.       case 'f':
  1510.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1511.     break;
  1512.       case 'g':
  1513.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
  1514.     break;
  1515.  
  1516.       case 'n':
  1517.         /* added by BrianP */
  1518.         noDraw = !noDraw;
  1519.         if (noDraw) {
  1520.            glDrawBuffer( GL_NONE );
  1521.         }
  1522.         else {
  1523.            if (doubleBuffer) {
  1524.               glDrawBuffer( GL_BACK );
  1525.            }
  1526.            else {
  1527.               glDrawBuffer( GL_FRONT );
  1528.            }
  1529.         }
  1530.         break;
  1531.  
  1532.       case 'l':
  1533.          /* Line Smooth - added by BrianP */
  1534.          LineSmooth = !LineSmooth;
  1535.          if (LineSmooth) {
  1536.             glEnable(GL_LINE_SMOOTH);
  1537.         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  1538.             glEnable(GL_BLEND);
  1539.          }
  1540.          else {
  1541.             glDisable(GL_LINE_SMOOTH);
  1542.         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  1543.             glDisable(GL_BLEND);
  1544.          }
  1545.          break;
  1546.       default:
  1547.     return;
  1548.     }
  1549.  
  1550.     glutPostRedisplay();
  1551. }
  1552.  
  1553. static void Draw(void)
  1554. {
  1555.  
  1556.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  1557.  
  1558.     glPushMatrix();
  1559.  
  1560.     glTranslatef(0, 0, zTranslation);
  1561.     glRotatef(30.0, 1, 0, 0);
  1562.     glRotatef(yRotation, 0, 1, 0);
  1563.     glClipPlane(GL_CLIP_PLANE0, plane);
  1564.     glCallList(logo);
  1565.  
  1566.     glPopMatrix();
  1567.  
  1568.     glFlush();
  1569.  
  1570.     if (doubleBuffer) {
  1571.     glutSwapBuffers();
  1572.     }
  1573. }
  1574.  
  1575. static GLenum Args(int argc, char **argv)
  1576. {
  1577.     GLint i;
  1578.  
  1579.     rgb = GL_TRUE;
  1580.     doubleBuffer = GL_FALSE;
  1581.  
  1582.     for (i = 1; i < argc; i++) {
  1583.     if (strcmp(argv[i], "-ci") == 0) {
  1584.         rgb = GL_FALSE;
  1585.     } else if (strcmp(argv[i], "-rgb") == 0) {
  1586.         rgb = GL_TRUE;
  1587.     } else if (strcmp(argv[i], "-sb") == 0) {
  1588.         doubleBuffer = GL_FALSE;
  1589.     } else if (strcmp(argv[i], "-db") == 0) {
  1590.         doubleBuffer = GL_TRUE;
  1591.     } else {
  1592.         printf("%s (Bad option).\n", argv[i]);
  1593.         return GL_FALSE;
  1594.     }
  1595.     }
  1596.     return GL_TRUE;
  1597. }
  1598.  
  1599. int main(int argc, char **argv)
  1600. {
  1601.     unsigned int type;
  1602.  
  1603.     glutInit(&argc, argv);
  1604.  
  1605.     if (Args(argc, argv) == GL_FALSE) {
  1606.     exit(1);
  1607.     }
  1608.  
  1609.     glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
  1610.  
  1611.     type = GLUT_DEPTH;
  1612.     type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
  1613.     type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  1614.     glutInitDisplayMode(type);
  1615.  
  1616.     if (glutCreateWindow("Logo Test") == GL_FALSE) {
  1617.     exit(1);
  1618.     }
  1619.  
  1620.     InitMap();
  1621.  
  1622.     Init();
  1623.  
  1624.     glutReshapeFunc(Reshape);
  1625.     glutKeyboardFunc(Key);
  1626.     glutSpecialFunc(Key2);
  1627.     glutDisplayFunc(Draw);
  1628.     glutMainLoop();
  1629.     return 0;
  1630. }
  1631.