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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "tk.h"
  5.  
  6.  
  7. float tkRGBMap[8][3] = {
  8.     {
  9.     0, 0, 0
  10.     },
  11.     {
  12.     1, 0, 0
  13.     },
  14.     {
  15.     0, 1, 0
  16.     },
  17.     {
  18.     1, 1, 0
  19.     },
  20.     {
  21.     0, 0, 1
  22.     },
  23.     {
  24.     1, 0, 1
  25.     },
  26.     {
  27.     0, 1, 1
  28.     },
  29.     {
  30.     1, 1, 1
  31.     }
  32. };
  33.  
  34. #define    SOLID 1
  35. #define    LINE 2
  36. #define    POINT 3
  37.  
  38.  
  39. GLenum rgb, doubleBuffer, directRender, windType;
  40. GLint windW, windH;
  41.  
  42. GLenum dithering = GL_TRUE;
  43. GLenum showVerticies = GL_TRUE;
  44. GLenum hideBottomTriangle = GL_FALSE;
  45. GLenum outline = GL_TRUE;
  46. GLenum culling = GL_FALSE;
  47. GLenum winding = GL_FALSE;
  48. GLenum face = GL_FALSE;
  49. GLenum state = SOLID;
  50. GLenum aaMode = GL_FALSE;
  51. GLenum shade = GL_TRUE;
  52.  
  53. GLint color1, color2, color3;
  54.  
  55. float zRotation = 90.0;
  56. float zoom = 1.0;
  57.  
  58. float boxA[3] = {-100, -100, 0};
  59. float boxB[3] = { 100, -100, 0};
  60. float boxC[3] = { 100,  100, 0};
  61. float boxD[3] = {-100,  100, 0};
  62.  
  63. float p0[3] = {-125,-80, 0};
  64. float p1[3] = {-125, 80, 0};
  65. float p2[3] = { 172,  0, 0};
  66.  
  67.  
  68. static void Init(void)
  69. {
  70.     float r, g, b;
  71.     float percent1, percent2;
  72.     GLint i, j;
  73.  
  74.     glClearColor(0.0, 0.0, 0.0, 0.0);
  75.  
  76.     glLineStipple(1, 0xF0F0);
  77.  
  78.     glEnable(GL_SCISSOR_TEST);
  79.  
  80.     if (!rgb) {
  81.     for (j = 0; j <= 12; j++) {
  82.         if (j <= 6) {
  83.         percent1 = j / 6.0;
  84.         r = 1.0 - 0.8 * percent1;
  85.         g = 0.2 + 0.8 * percent1;
  86.         b = 0.2;
  87.         } else {
  88.         percent1 = (j - 6) / 6.0;
  89.         r = 0.2;
  90.         g = 1.0 - 0.8 * percent1;
  91.         b = 0.2 + 0.8 * percent1;
  92.         }
  93.         tkSetOneColor(j+18, r, g, b);
  94.         for (i = 0; i < 16; i++) {
  95.         percent2 = i / 15.0;
  96.         tkSetOneColor(j*16+i+32, r*percent2, g*percent2, b*percent2);
  97.         }
  98.     }
  99.     color1 = 18;
  100.     color2 = 24;
  101.     color3 = 30;
  102.     }
  103. }
  104.  
  105. static void Reshape(int width, int height)
  106. {
  107.  
  108.     windW = (GLint)width;
  109.     windH = (GLint)height;
  110. }
  111.  
  112. static GLenum Key(int key, GLenum mask)
  113. {
  114.  
  115.     switch (key) {
  116.       case TK_ESCAPE:
  117.     tkQuit();
  118.       case TK_LEFT:
  119.     zRotation += 0.5;
  120.     break;
  121.       case TK_RIGHT:
  122.     zRotation -= 0.5;
  123.     break;
  124.       case TK_Z:
  125.     zoom *= 0.75;
  126.     break;
  127.       case TK_z:
  128.     zoom /= 0.75;
  129.     if (zoom > 10) {
  130.         zoom = 10;
  131.     }
  132.     break;
  133.       case TK_1:
  134.     glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
  135.     break;
  136.       case TK_2:
  137.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  138.     break;
  139.       case TK_3:
  140.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  141.     break;
  142.       case TK_4:
  143.     state = POINT;
  144.     break;
  145.       case TK_5:
  146.     state = LINE;
  147.     break;
  148.       case TK_6:
  149.     state = SOLID;
  150.     break;
  151.       case TK_7:
  152.     culling = !culling;
  153.     break;
  154.       case TK_8:
  155.     winding = !winding;
  156.     break;
  157.       case TK_9:
  158.     face = !face;
  159.     break;
  160.       case TK_v:
  161.     showVerticies = !showVerticies;
  162.     break;
  163.       case TK_s:
  164.     shade = !shade;
  165.     (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
  166.     break;
  167.       case TK_h:
  168.     hideBottomTriangle = !hideBottomTriangle;
  169.     break;
  170.       case TK_o:
  171.     outline = !outline;
  172.     break;
  173.       case TK_m:
  174.     dithering = !dithering;
  175.     break;
  176.       case TK_0:
  177.     aaMode = !aaMode;
  178.     if (aaMode) {
  179.         glEnable(GL_POLYGON_SMOOTH);
  180.         glEnable(GL_BLEND);
  181.         glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  182.         if (!rgb) {
  183.         color1 = 32;
  184.         color2 = 128;
  185.         color3 = 224;
  186.         }
  187.     } else {
  188.         glDisable(GL_POLYGON_SMOOTH);
  189.         glDisable(GL_BLEND);
  190.         if (!rgb) {
  191.         color1 = 18;
  192.         color2 = 24;
  193.         color3 = 30;
  194.         }
  195.     }
  196.     break;
  197.       case TK_B:
  198. /*
  199.     tkClipBoard();
  200. */
  201.     return GL_FALSE;
  202.     break;
  203.       default:
  204.     return GL_FALSE;
  205.     }
  206.     return GL_TRUE;
  207. }
  208.  
  209. static void BeginPrim(void)
  210. {
  211.  
  212.     switch (state) {
  213.       case SOLID:
  214.     glBegin(GL_POLYGON);
  215.     break;
  216.       case LINE:
  217.     glBegin(GL_LINE_LOOP);
  218.     break;
  219.       case POINT:
  220.     glBegin(GL_POINTS);
  221.     break;
  222.     }
  223. }
  224.  
  225. static void EndPrim(void)
  226. {
  227.  
  228.     glEnd();
  229. }
  230.  
  231. static void Draw(void)
  232. {
  233.     float scaleX, scaleY;
  234.  
  235.     glViewport(0, 0, windW, windH);
  236.  
  237.     glMatrixMode(GL_PROJECTION);
  238.     glLoadIdentity();
  239.     gluOrtho2D(-175., 175., -175., 175.);
  240.     glMatrixMode(GL_MODELVIEW);
  241.  
  242.     glScissor(0, 0, windW, windH);
  243.  
  244.     (culling) ? glEnable(GL_CULL_FACE) : glDisable(GL_CULL_FACE);
  245.     (winding) ? glFrontFace(GL_CCW) : glFrontFace(GL_CW);
  246.     (face) ? glCullFace(GL_FRONT) : glCullFace(GL_BACK);
  247.  
  248.     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  249.  
  250.     glClear(GL_COLOR_BUFFER_BIT);
  251.  
  252.     TK_SETCOLOR(windType, TK_GREEN);
  253.     glBegin(GL_LINE_LOOP);
  254.     glVertex3fv(boxA);
  255.     glVertex3fv(boxB);
  256.     glVertex3fv(boxC);
  257.     glVertex3fv(boxD);
  258.     glEnd();
  259.  
  260.     if (!hideBottomTriangle) {
  261.     glPushMatrix();
  262.  
  263.     glScalef(zoom, zoom, zoom);
  264.     glRotatef(zRotation, 0, 0, 1);
  265.  
  266.     TK_SETCOLOR(windType, TK_BLUE);
  267.     BeginPrim();
  268.         glVertex3fv(p0);
  269.         glVertex3fv(p1);
  270.         glVertex3fv(p2);
  271.     EndPrim();
  272.  
  273.     if (showVerticies) {
  274.         (rgb) ? glColor3fv(tkRGBMap[TK_RED]) : glIndexf(color1);
  275.         glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2);
  276.         (rgb) ? glColor3fv(tkRGBMap[TK_GREEN]) : glIndexf(color2);
  277.         glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2);
  278.         (rgb) ? glColor3fv(tkRGBMap[TK_BLUE]) : glIndexf(color3);
  279.         glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2);
  280.     }
  281.  
  282.     glPopMatrix();
  283.     }
  284.  
  285.     scaleX = (float)(windW - 20) / 2 / 175 * (175 - 100) + 10;
  286.     scaleY = (float)(windH - 20) / 2 / 175 * (175 - 100) + 10;
  287.  
  288.     glViewport(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY);
  289.  
  290.     glMatrixMode(GL_PROJECTION);
  291.     glLoadIdentity();
  292.     gluOrtho2D(-100., 100., -100., 100.);
  293.     glMatrixMode(GL_MODELVIEW);
  294.  
  295.     glScissor(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY);
  296.  
  297.     glPushMatrix();
  298.  
  299.     glScalef(zoom, zoom, zoom);
  300.     glRotatef(zRotation, 0,0,1);
  301.  
  302.     glPointSize(10);
  303.     glLineWidth(5);
  304.     glEnable(GL_POINT_SMOOTH);
  305.     glEnable(GL_LINE_STIPPLE);
  306.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  307.  
  308.     TK_SETCOLOR(windType, TK_RED);
  309.     BeginPrim();
  310.     (rgb) ? glColor3fv(tkRGBMap[TK_RED]) : glIndexf(color1);
  311.     glVertex3fv(p0);
  312.     (rgb) ? glColor3fv(tkRGBMap[TK_GREEN]) : glIndexf(color2);
  313.     glVertex3fv(p1);
  314.     (rgb) ? glColor3fv(tkRGBMap[TK_BLUE]) : glIndexf(color3);
  315.     glVertex3fv(p2);
  316.     EndPrim();
  317.  
  318.     glPointSize(1);
  319.     glLineWidth(1);
  320.     glDisable(GL_POINT_SMOOTH);
  321.     glDisable(GL_LINE_STIPPLE);
  322.     glBlendFunc(GL_ONE, GL_ZERO);
  323.  
  324.     if (outline) {
  325.     TK_SETCOLOR(windType, TK_WHITE);
  326.     glBegin(GL_LINE_LOOP);
  327.         glVertex3fv(p0);
  328.         glVertex3fv(p1);
  329.         glVertex3fv(p2);
  330.     glEnd();
  331.     }
  332.  
  333.     glPopMatrix();
  334.  
  335.     glFlush();
  336.  
  337.     if (doubleBuffer) {
  338.     tkSwapBuffers();
  339.     }
  340. }
  341.  
  342. static GLenum Args(int argc, char **argv)
  343. {
  344.     GLint i;
  345.  
  346.     rgb = GL_TRUE;
  347.     doubleBuffer = GL_FALSE;
  348.     directRender = GL_TRUE;
  349.  
  350.     for (i = 1; i < argc; i++) {
  351.     if (strcmp(argv[i], "-ci") == 0) {
  352.         rgb = GL_FALSE;
  353.     } else if (strcmp(argv[i], "-rgb") == 0) {
  354.         rgb = GL_TRUE;
  355.     } else if (strcmp(argv[i], "-sb") == 0) {
  356.         doubleBuffer = GL_FALSE;
  357.     } else if (strcmp(argv[i], "-db") == 0) {
  358.         doubleBuffer = GL_TRUE;
  359.     } else if (strcmp(argv[i], "-dr") == 0) {
  360.         directRender = GL_TRUE;
  361.     } else if (strcmp(argv[i], "-ir") == 0) {
  362.         directRender = GL_FALSE;
  363.     } else {
  364.         printf("%s (Bad option).\n", argv[i]);
  365.         return GL_FALSE;
  366.     }
  367.     }
  368.     return GL_TRUE;
  369. }
  370.  
  371. void main(int argc, char **argv)
  372. {
  373.  
  374.     if (Args(argc, argv) == GL_FALSE) {
  375.     tkQuit();
  376.     }
  377.  
  378.     windW = 600;
  379.     windH = 300;
  380.     tkInitPosition(0, 0, windW, windH);
  381.  
  382.     windType = (rgb) ? TK_RGB : TK_INDEX;
  383.     windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  384.     windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  385.     tkInitDisplayMode(windType);
  386.  
  387.     if (tkInitWindow("Triangle Test") == GL_FALSE) {
  388.     tkQuit();
  389.     }
  390.  
  391.     Init();
  392.  
  393.     tkExposeFunc(Reshape);
  394.     tkReshapeFunc(Reshape);
  395.     tkKeyDownFunc(Key);
  396.     tkDisplayFunc(Draw);
  397.     tkExec();
  398. }
  399.