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