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

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