home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / newopg.zip / LOGO.C < prev    next >
Text File  |  1995-03-04  |  36KB  |  1,554 lines

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