home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / newopg.zip / TRI.C < prev    next >
Text File  |  1995-03-04  |  8KB  |  397 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.     tkClipBoard();
  199.     return GL_FALSE;
  200.     break;
  201.       default:
  202.     return GL_FALSE;
  203.     }
  204.     return GL_TRUE;
  205. }
  206.  
  207. static void BeginPrim(void)
  208. {
  209.  
  210.     switch (state) {
  211.       case SOLID:
  212.     glBegin(GL_POLYGON);
  213.     break;
  214.       case LINE:
  215.     glBegin(GL_LINE_LOOP);
  216.     break;
  217.       case POINT:
  218.     glBegin(GL_POINTS);
  219.     break;
  220.     }
  221. }
  222.  
  223. static void EndPrim(void)
  224. {
  225.  
  226.     glEnd();
  227. }
  228.  
  229. static void Draw(void)
  230. {
  231.     float scaleX, scaleY;
  232.  
  233.     glViewport(0, 0, windW, windH);
  234.  
  235.     glMatrixMode(GL_PROJECTION);
  236.     glLoadIdentity();
  237.     gluOrtho2D(-175., 175., -175., 175.);
  238.     glMatrixMode(GL_MODELVIEW);
  239.  
  240.     glScissor(0, 0, windW, windH);
  241.  
  242.     (culling) ? glEnable(GL_CULL_FACE) : glDisable(GL_CULL_FACE);
  243.     (winding) ? glFrontFace(GL_CCW) : glFrontFace(GL_CW);
  244.     (face) ? glCullFace(GL_FRONT) : glCullFace(GL_BACK);
  245.  
  246.     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  247.  
  248.     glClear(GL_COLOR_BUFFER_BIT);
  249.  
  250.     TK_SETCOLOR(windType, TK_GREEN);
  251.     glBegin(GL_LINE_LOOP);
  252.     glVertex3fv(boxA);
  253.     glVertex3fv(boxB);
  254.     glVertex3fv(boxC);
  255.     glVertex3fv(boxD);
  256.     glEnd();
  257.  
  258.     if (!hideBottomTriangle) {
  259.     glPushMatrix();
  260.  
  261.     glScalef(zoom, zoom, zoom);
  262.     glRotatef(zRotation, 0, 0, 1);
  263.  
  264.     TK_SETCOLOR(windType, TK_BLUE);
  265.     BeginPrim();
  266.         glVertex3fv(p0);
  267.         glVertex3fv(p1);
  268.         glVertex3fv(p2);
  269.     EndPrim();
  270.  
  271.     if (showVerticies) {
  272.         (rgb) ? glColor3fv(tkRGBMap[TK_RED]) : glIndexf(color1);
  273.         glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2);
  274.         (rgb) ? glColor3fv(tkRGBMap[TK_GREEN]) : glIndexf(color2);
  275.         glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2);
  276.         (rgb) ? glColor3fv(tkRGBMap[TK_BLUE]) : glIndexf(color3);
  277.         glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2);
  278.     }
  279.  
  280.     glPopMatrix();
  281.     }
  282.  
  283.     scaleX = (float)(windW - 20) / 2 / 175 * (175 - 100) + 10;
  284.     scaleY = (float)(windH - 20) / 2 / 175 * (175 - 100) + 10;
  285.  
  286.     glViewport(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY);
  287.  
  288.     glMatrixMode(GL_PROJECTION);
  289.     glLoadIdentity();
  290.     gluOrtho2D(-100., 100., -100., 100.);
  291.     glMatrixMode(GL_MODELVIEW);
  292.  
  293.     glScissor(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY);
  294.  
  295.     glPushMatrix();
  296.  
  297.     glScalef(zoom, zoom, zoom);
  298.     glRotatef(zRotation, 0,0,1);
  299.  
  300.     glPointSize(10);
  301.     glLineWidth(5);
  302.     glEnable(GL_POINT_SMOOTH);
  303.     glEnable(GL_LINE_STIPPLE);
  304.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  305.  
  306.     TK_SETCOLOR(windType, TK_RED);
  307.     BeginPrim();
  308.     (rgb) ? glColor3fv(tkRGBMap[TK_RED]) : glIndexf(color1);
  309.     glVertex3fv(p0);
  310.     (rgb) ? glColor3fv(tkRGBMap[TK_GREEN]) : glIndexf(color2);
  311.     glVertex3fv(p1);
  312.     (rgb) ? glColor3fv(tkRGBMap[TK_BLUE]) : glIndexf(color3);
  313.     glVertex3fv(p2);
  314.     EndPrim();
  315.  
  316.     glPointSize(1);
  317.     glLineWidth(1);
  318.     glDisable(GL_POINT_SMOOTH);
  319.     glDisable(GL_LINE_STIPPLE);
  320.     glBlendFunc(GL_ONE, GL_ZERO);
  321.  
  322.     if (outline) {
  323.     TK_SETCOLOR(windType, TK_WHITE);
  324.     glBegin(GL_LINE_LOOP);
  325.         glVertex3fv(p0);
  326.         glVertex3fv(p1);
  327.         glVertex3fv(p2);
  328.     glEnd();
  329.     }
  330.  
  331.     glPopMatrix();
  332.  
  333.     glFlush();
  334.  
  335.     if (doubleBuffer) {
  336.     tkSwapBuffers();
  337.     }
  338. }
  339.  
  340. static GLenum Args(int argc, char **argv)
  341. {
  342.     GLint i;
  343.  
  344.     rgb = GL_TRUE;
  345.     doubleBuffer = GL_FALSE;
  346.     directRender = GL_TRUE;
  347.  
  348.     for (i = 1; i < argc; i++) {
  349.     if (strcmp(argv[i], "-ci") == 0) {
  350.         rgb = GL_FALSE;
  351.     } else if (strcmp(argv[i], "-rgb") == 0) {
  352.         rgb = GL_TRUE;
  353.     } else if (strcmp(argv[i], "-sb") == 0) {
  354.         doubleBuffer = GL_FALSE;
  355.     } else if (strcmp(argv[i], "-db") == 0) {
  356.         doubleBuffer = GL_TRUE;
  357.     } else if (strcmp(argv[i], "-dr") == 0) {
  358.         directRender = GL_TRUE;
  359.     } else if (strcmp(argv[i], "-ir") == 0) {
  360.         directRender = GL_FALSE;
  361.     } else {
  362.         printf("%s (Bad option).\n", argv[i]);
  363.         return GL_FALSE;
  364.     }
  365.     }
  366.     return GL_TRUE;
  367. }
  368.  
  369. void main(int argc, char **argv)
  370. {
  371.  
  372.     if (Args(argc, argv) == GL_FALSE) {
  373.     tkQuit();
  374.     }
  375.  
  376.     windW = 100;
  377.     windH = 100;
  378.     tkInitPosition(0, 0, windW, windH);
  379.  
  380.     windType = (rgb) ? TK_RGB : TK_INDEX;
  381.     windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  382.     windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  383.     tkInitDisplayMode(windType);
  384.  
  385.     if (tkInitWindow("Triangle Test") == GL_FALSE) {
  386.     tkQuit();
  387.     }
  388.  
  389.     Init();
  390.  
  391.     tkExposeFunc(Reshape);
  392.     tkReshapeFunc(Reshape);
  393.     tkKeyDownFunc(Key);
  394.     tkDisplayFunc(Draw);
  395.     tkExec();
  396. }
  397.