home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / oglgold.zip / SAMPLES / TK / DEPTH.C < prev    next >
C/C++ Source or Header  |  1997-09-30  |  5KB  |  217 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "tk.h"
  5.  
  6. float tkRGBMap[8][3] = {
  7.     {
  8.     0, 0, 0
  9.     },
  10.     {
  11.     1, 0, 0
  12.     },
  13.     {
  14.     0, 1, 0
  15.     },
  16.     {
  17.     1, 1, 0
  18.     },
  19.     {
  20.     0, 0, 1
  21.     },
  22.     {
  23.     1, 0, 1
  24.     },
  25.     {
  26.     0, 1, 1
  27.     },
  28.     {
  29.     1, 1, 1
  30.     }
  31. };
  32.  
  33.  
  34. #define CI_OFFSET_1 16
  35. #define CI_OFFSET_2 32
  36.  
  37.  
  38. GLenum rgb, doubleBuffer, directRender;
  39.  
  40. GLenum antiAlias, stipple;
  41. GLubyte stippleBits[32*4] = {
  42.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  43.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  44.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  45.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  46.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  47.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  48.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  49.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  50.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  51.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  52.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  53.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  54.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  55.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  56.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  57.     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  58. };
  59.  
  60.  
  61. static void Init(void)
  62. {
  63.     GLint i;
  64.  
  65.     glClearColor(0.0, 0.0, 0.0, 0.0);
  66.     glClearIndex(0.0);
  67.  
  68.     if (!rgb) {
  69.     for (i = 0; i < 16; i++) {
  70.         tkSetOneColor(i+CI_OFFSET_1, 0.0, 0.0, i/15.0);
  71.         tkSetOneColor(i+CI_OFFSET_2, 0.0, i/15.0, 0.0);
  72.     }
  73.     }
  74.  
  75.     glPolygonStipple(stippleBits);
  76.  
  77.     antiAlias = GL_FALSE;
  78.     stipple = GL_FALSE;
  79. }
  80.  
  81. static void Reshape(int width, int height)
  82. {
  83.  
  84.     glViewport(0, 0, (GLint)width, (GLint)height);
  85.  
  86.     glMatrixMode(GL_PROJECTION);
  87.     glLoadIdentity();
  88.     glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
  89.     glMatrixMode(GL_MODELVIEW);
  90. }
  91.  
  92. static GLenum Key(int key, GLenum mask)
  93. {
  94.  
  95.     switch (key) {
  96.       case TK_B:
  97. /*
  98.     tkClipBoard();
  99. */
  100.     break;
  101.       case TK_ESCAPE:
  102.     tkQuit();
  103.       case TK_1:
  104.     antiAlias = !antiAlias;
  105.     break;
  106.       case TK_2:
  107.     stipple = !stipple;
  108.     break;
  109.       default:
  110.     return GL_FALSE;
  111.     }
  112.     return GL_TRUE;
  113. }
  114.  
  115. static void Draw(void)
  116. {
  117.     GLint ci1, ci2;
  118.  
  119.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  120.  
  121.     if (antiAlias) {
  122.     ci1 = CI_OFFSET_1;
  123.     ci2 = CI_OFFSET_2;
  124.     glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  125.     glEnable(GL_BLEND);
  126.     glEnable(GL_POLYGON_SMOOTH);
  127.     glDisable(GL_DEPTH_TEST);
  128.     } else {
  129.     ci1 = TK_BLUE;
  130.     ci2 = TK_GREEN;
  131.     glDisable(GL_BLEND);
  132.     glDisable(GL_POLYGON_SMOOTH);
  133.     glEnable(GL_DEPTH_TEST);
  134.     }
  135.  
  136.     if (stipple) {
  137.     glEnable(GL_POLYGON_STIPPLE);
  138.     } else {
  139.     glDisable(GL_POLYGON_STIPPLE);
  140.     }
  141.  
  142.     glBegin(GL_TRIANGLES);
  143.     (rgb) ? glColor3fv(tkRGBMap[TK_BLUE]) : glIndexi(ci1);
  144.     glVertex3f( 0.9, -0.9, -30.0);
  145.     glVertex3f( 0.9,  0.9, -30.0);
  146.     glVertex3f(-0.9,  0.0, -30.0);
  147.     (rgb) ? glColor3fv(tkRGBMap[TK_GREEN]) : glIndexi(ci2);
  148.     glVertex3f(-0.9, -0.9, -40.0);
  149.     glVertex3f(-0.9,  0.9, -40.0);
  150.     glVertex3f( 0.9,  0.0, -25.0);
  151.     glEnd();
  152.  
  153.     glFlush();
  154.  
  155.     if (doubleBuffer) {
  156.     tkSwapBuffers();
  157.     }
  158. }
  159.  
  160. static GLenum Args(int argc, char **argv)
  161. {
  162.     GLint i;
  163.  
  164.     rgb = GL_TRUE;
  165.     doubleBuffer = GL_FALSE;
  166.     directRender = GL_TRUE;
  167.  
  168.     for (i = 1; i < argc; i++) {
  169.     if (strcmp(argv[i], "-ci") == 0) {
  170.         rgb = GL_FALSE;
  171.     } else if (strcmp(argv[i], "-rgb") == 0) {
  172.         rgb = GL_TRUE;
  173.     } else if (strcmp(argv[i], "-sb") == 0) {
  174.         doubleBuffer = GL_FALSE;
  175.     } else if (strcmp(argv[i], "-db") == 0) {
  176.         doubleBuffer = GL_TRUE;
  177.     } else if (strcmp(argv[i], "-dr") == 0) {
  178.         directRender = GL_TRUE;
  179.     } else if (strcmp(argv[i], "-ir") == 0) {
  180.         directRender = GL_FALSE;
  181.     } else {
  182.         printf("%s (Bad option).\n", argv[i]);
  183.         return GL_FALSE;
  184.     }
  185.     }
  186.     return GL_TRUE;
  187. }
  188.  
  189. void main(int argc, char **argv)
  190. {
  191.     GLenum type;
  192.  
  193.     if (Args(argc, argv) == GL_FALSE) {
  194.     tkQuit();
  195.     }
  196.  
  197.     tkInitPosition(0, 0, 300, 300);
  198.  
  199.     type = TK_DEPTH;
  200.     type |= (rgb) ? TK_RGB : TK_INDEX;
  201.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  202.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  203.     tkInitDisplayMode(type);
  204.  
  205.     if (tkInitWindow("Depth Test") == GL_FALSE) {
  206.     tkQuit();
  207.     }
  208.  
  209.     Init();
  210.  
  211.     tkExposeFunc(Reshape);
  212.     tkReshapeFunc(Reshape);
  213.     tkKeyDownFunc(Key);
  214.     tkDisplayFunc(Draw);
  215.     tkExec();
  216. }
  217.