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

  1. #include <stdio.h>
  2. #include <string.h>
  3. //#include <unistd.h>
  4. #include <stdlib.h>
  5. #include "tk.h"
  6.  
  7.  
  8. float tkRGBMap[8][3] = {
  9.     {
  10.     0, 0, 0
  11.     },
  12.     {
  13.     1, 0, 0
  14.     },
  15.     {
  16.     0, 1, 0
  17.     },
  18.     {
  19.     1, 1, 0
  20.     },
  21.     {
  22.     0, 0, 1
  23.     },
  24.     {
  25.     1, 0, 1
  26.     },
  27.     {
  28.     0, 1, 1
  29.     },
  30.     {
  31.     1, 1, 1
  32.     }
  33. };
  34.  
  35. #define PIXEL_CENTER(x) ((long)(x) + 0.5)
  36.  
  37. #define GAP 10
  38. #define ROWS 3
  39. #define COLS 4
  40.  
  41. #define OPENGL_WIDTH 48
  42. #define OPENGL_HEIGHT 13
  43.  
  44.  
  45. GLenum rgb, doubleBuffer, directRender, windType;
  46. GLint windW, windH;
  47.  
  48. GLenum mode1, mode2;
  49. GLint boxW, boxH;
  50. GLubyte OpenGL_bits[] = {
  51.    0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 
  52.    0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
  53.    0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01, 
  54.    0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
  55.    0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01, 
  56.    0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
  57.    0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00, 
  58.    0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
  59.    0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00, 
  60.    0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
  61.    0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e, 
  62.    0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
  63.    0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 
  64. };
  65.  
  66.  
  67. static void Init(void)
  68. {
  69.  
  70.     mode1 = GL_TRUE;
  71.     mode2 = GL_TRUE;
  72. }
  73.  
  74. static void Reshape(int width, int height)
  75. {
  76.  
  77.     windW = (GLint)width;
  78.     windH = (GLint)height;
  79. }
  80.  
  81. static void RotateColorMask(void)
  82. {
  83.     static GLint rotation = 0;
  84.     
  85.     rotation = (rotation + 1) & 0x3;
  86.     switch (rotation) {
  87.       case 0:
  88.     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  89.     glIndexMask( 0xff );
  90.     break;
  91.       case 1:
  92.     glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
  93.     glIndexMask(0xFE);
  94.     break;
  95.       case 2:
  96.     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
  97.     glIndexMask(0xFD);
  98.     break;
  99.       case 3:
  100.     glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
  101.     glIndexMask(0xFB);
  102.     break;
  103.     }
  104. }
  105.  
  106. static GLenum Key(int key, GLenum mask)
  107. {
  108.  
  109.     switch (key) {
  110.       case TK_B:
  111.     tkClipBoard();
  112.     break;
  113.       case TK_ESCAPE:
  114.     tkQuit();
  115.       case TK_1:
  116.     mode1 = !mode1;
  117.     break;
  118.       case TK_2:
  119.     mode2 = !mode2;
  120.     break;
  121.       case TK_3:
  122.     RotateColorMask();
  123.     break;
  124.       default:
  125.     return GL_FALSE;
  126.     }
  127.     return GL_TRUE;
  128. }
  129.  
  130. static void Viewport(GLint row, GLint column)
  131. {
  132.     GLint x, y;
  133.  
  134.     boxW = (windW - (COLS + 1) * GAP) / COLS;
  135.     boxH = (windH - (ROWS + 1) * GAP) / ROWS;
  136.  
  137.     x = GAP + column * (boxW + GAP);
  138.     y = GAP + row * (boxH + GAP);
  139.  
  140.     glViewport(x, y, boxW, boxH);
  141.  
  142.     glMatrixMode(GL_PROJECTION);
  143.     glLoadIdentity();
  144.     glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);
  145.     glMatrixMode(GL_MODELVIEW);
  146.  
  147.     glEnable(GL_SCISSOR_TEST);
  148.     glScissor(x, y, boxW, boxH);
  149. }
  150.  
  151. static void Point(void)
  152. {
  153.     GLint i;
  154.  
  155.     glBegin(GL_POINTS);
  156.     TK_SETCOLOR(windType, TK_WHITE);
  157.     glVertex2i(0, 0);
  158.     for (i = 1; i < 8; i++) {
  159.         GLint j = i * 2;
  160.         TK_SETCOLOR(windType, TK_RED+i);
  161.         glVertex2i(-j, -j);
  162.         glVertex2i(-j, 0);
  163.         glVertex2i(-j, j);
  164.         glVertex2i(0, j);
  165.         glVertex2i(j, j);
  166.         glVertex2i(j, 0);
  167.         glVertex2i(j, -j);
  168.         glVertex2i(0, -j);
  169.     }
  170.     glEnd();
  171. }
  172.  
  173. static void Lines(void)
  174. {
  175.     GLint i;
  176.  
  177.     glPushMatrix();
  178.  
  179.     glTranslatef(-12, 0, 0);
  180.     for (i = 1; i < 8; i++) {
  181.     TK_SETCOLOR(windType, TK_RED+i);
  182.     glBegin(GL_LINES);
  183.         glVertex2i(-boxW/4, -boxH/4);
  184.         glVertex2i(boxW/4, boxH/4);
  185.     glEnd();
  186.     glTranslatef(4, 0, 0);
  187.     }
  188.  
  189.     glPopMatrix();
  190.  
  191.     glBegin(GL_LINES);
  192.     glVertex2i(0, 0);
  193.     glEnd();
  194. }
  195.  
  196. static void LineStrip(void)
  197. {
  198.  
  199.     glBegin(GL_LINE_STRIP);
  200.     TK_SETCOLOR(windType, TK_RED);
  201.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
  202.     TK_SETCOLOR(windType, TK_GREEN);
  203.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
  204.     TK_SETCOLOR(windType, TK_BLUE);
  205.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
  206.     TK_SETCOLOR(windType, TK_WHITE);
  207.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
  208.     glEnd();
  209.  
  210.     glBegin(GL_LINE_STRIP);
  211.     glVertex2i(0, 0);
  212.     glEnd();
  213. }
  214.  
  215. static void LineLoop(void)
  216. {
  217.  
  218.     glBegin(GL_LINE_LOOP);
  219.     TK_SETCOLOR(windType, TK_RED);
  220.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
  221.     TK_SETCOLOR(windType, TK_GREEN);
  222.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
  223.     TK_SETCOLOR(windType, TK_BLUE);
  224.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
  225.     TK_SETCOLOR(windType, TK_WHITE);
  226.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
  227.     glEnd();
  228.  
  229.     glEnable(GL_LOGIC_OP);
  230.     glLogicOp(GL_XOR);
  231.  
  232.     glEnable(GL_BLEND);
  233.     glBlendFunc(GL_ONE, GL_ONE);
  234.  
  235.     TK_SETCOLOR(windType, TK_MAGENTA);
  236.     glBegin(GL_LINE_LOOP);
  237.     glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8));
  238.     glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));
  239.     glEnd();
  240.     glBegin(GL_LINE_LOOP);
  241.     glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5));
  242.     glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));
  243.     glEnd();
  244.     glDisable(GL_LOGIC_OP);
  245.     glDisable(GL_BLEND);
  246.  
  247.     TK_SETCOLOR(windType, TK_GREEN);
  248.     glBegin(GL_POINTS);
  249.     glVertex2i(0, 0);
  250.     glEnd();
  251.  
  252.     glBegin(GL_LINE_LOOP);
  253.     glVertex2i(0, 0);
  254.     glEnd();
  255. }
  256.  
  257. static void Bitmap(void)
  258. {
  259.  
  260.     glBegin(GL_LINES);
  261.     TK_SETCOLOR(windType, TK_GREEN);
  262.     glVertex2i(-boxW/2, 0);
  263.     glVertex2i(boxW/2, 0);
  264.     glVertex2i(0, -boxH/2);
  265.     glVertex2i(0, boxH/2);
  266.     TK_SETCOLOR(windType, TK_RED);
  267.     glVertex2i(0, -3);
  268.     glVertex2i(0, -3+OPENGL_HEIGHT);
  269.     TK_SETCOLOR(windType, TK_BLUE);
  270.     glVertex2i(0, -3);
  271.     glVertex2i(OPENGL_WIDTH, -3);
  272.     glEnd();
  273.  
  274.     TK_SETCOLOR(windType, TK_GREEN);
  275.  
  276.     glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
  277.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  278.  
  279.     glRasterPos2i(0, 0);
  280.     glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits);
  281. }
  282.  
  283. static void Triangles(void)
  284. {
  285.  
  286.     glBegin(GL_TRIANGLES);
  287.     TK_SETCOLOR(windType, TK_GREEN);
  288.     glVertex2i(-boxW/4, -boxH/4);
  289.     TK_SETCOLOR(windType, TK_RED);
  290.     glVertex2i(-boxW/8, -boxH/16);
  291.     TK_SETCOLOR(windType, TK_BLUE);
  292.     glVertex2i(boxW/8, -boxH/16);
  293.  
  294.     TK_SETCOLOR(windType, TK_GREEN);
  295.     glVertex2i(-boxW/4, boxH/4);
  296.     TK_SETCOLOR(windType, TK_RED);
  297.     glVertex2i(-boxW/8, boxH/16);
  298.     TK_SETCOLOR(windType, TK_BLUE);
  299.     glVertex2i(boxW/8, boxH/16);
  300.     glEnd();
  301.  
  302.     glBegin(GL_TRIANGLES);
  303.     glVertex2i(0, 0);
  304.     glVertex2i(-100, 100);
  305.     glEnd();
  306. }
  307.  
  308. static void TriangleStrip(void)
  309. {
  310.  
  311.     glBegin(GL_TRIANGLE_STRIP);
  312.     TK_SETCOLOR(windType, TK_GREEN);
  313.     glVertex2i(-boxW/4, -boxH/4);
  314.     TK_SETCOLOR(windType, TK_RED);
  315.     glVertex2i(-boxW/4, boxH/4);
  316.     TK_SETCOLOR(windType, TK_BLUE);
  317.     glVertex2i(0, -boxH/4);
  318.     TK_SETCOLOR(windType, TK_WHITE);
  319.     glVertex2i(0, boxH/4);
  320.     TK_SETCOLOR(windType, TK_CYAN);
  321.     glVertex2i(boxW/4, -boxH/4);
  322.     TK_SETCOLOR(windType, TK_YELLOW);
  323.     glVertex2i(boxW/4, boxH/4);
  324.     glEnd();
  325.  
  326.     glBegin(GL_TRIANGLE_STRIP);
  327.     glVertex2i(0, 0);
  328.     glVertex2i(-100, 100);
  329.     glEnd();
  330. }
  331.  
  332. static void TriangleFan(void)
  333. {
  334.     GLint vx[8][2];
  335.     GLint x0, y0, x1, y1, x2, y2, x3, y3;
  336.     GLint i;
  337.  
  338.     y0 = -boxH/4;
  339.     y1 = y0 + boxH/2/3;
  340.     y2 = y1 + boxH/2/3;
  341.     y3 = boxH/4;
  342.     x0 = -boxW/4;
  343.     x1 = x0 + boxW/2/3;
  344.     x2 = x1 + boxW/2/3;
  345.     x3 = boxW/4;
  346.  
  347.     vx[0][0] = x0; vx[0][1] = y1;
  348.     vx[1][0] = x0; vx[1][1] = y2;
  349.     vx[2][0] = x1; vx[2][1] = y3;
  350.     vx[3][0] = x2; vx[3][1] = y3;
  351.     vx[4][0] = x3; vx[4][1] = y2;
  352.     vx[5][0] = x3; vx[5][1] = y1;
  353.     vx[6][0] = x2; vx[6][1] = y0;
  354.     vx[7][0] = x1; vx[7][1] = y0;
  355.  
  356.     glBegin(GL_TRIANGLE_FAN);
  357.     TK_SETCOLOR(windType, TK_WHITE);
  358.     glVertex2i(0, 0);
  359.     for (i = 0; i < 8; i++) {
  360.         TK_SETCOLOR(windType, TK_WHITE-i);
  361.         glVertex2iv(vx[i]);
  362.     }
  363.     glEnd();
  364.  
  365.     glBegin(GL_TRIANGLE_FAN);
  366.     glVertex2i(0, 0);
  367.     glVertex2i(-100, 100);
  368.     glEnd();
  369. }
  370.  
  371. static void Rect(void)
  372. {
  373.  
  374.     TK_SETCOLOR(windType, TK_GREEN);
  375.     glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
  376. }
  377.  
  378. static void Polygon(void)
  379. {
  380.     GLint vx[8][2];
  381.     GLint x0, y0, x1, y1, x2, y2, x3, y3;
  382.     GLint i;
  383.  
  384.     y0 = -boxH/4;
  385.     y1 = y0 + boxH/2/3;
  386.     y2 = y1 + boxH/2/3;
  387.     y3 = boxH/4;
  388.     x0 = -boxW/4;
  389.     x1 = x0 + boxW/2/3;
  390.     x2 = x1 + boxW/2/3;
  391.     x3 = boxW/4;
  392.  
  393.     vx[0][0] = x0; vx[0][1] = y1;
  394.     vx[1][0] = x0; vx[1][1] = y2;
  395.     vx[2][0] = x1; vx[2][1] = y3;
  396.     vx[3][0] = x2; vx[3][1] = y3;
  397.     vx[4][0] = x3; vx[4][1] = y2;
  398.     vx[5][0] = x3; vx[5][1] = y1;
  399.     vx[6][0] = x2; vx[6][1] = y0;
  400.     vx[7][0] = x1; vx[7][1] = y0;
  401.  
  402.     glBegin(GL_POLYGON);
  403.     for (i = 0; i < 8; i++) {
  404.         TK_SETCOLOR(windType, TK_WHITE-i);
  405.         glVertex2iv(vx[i]);
  406.     }
  407.     glEnd();
  408.  
  409.     glBegin(GL_POLYGON);
  410.     glVertex2i(0, 0);
  411.     glVertex2i(100, 100);
  412.     glEnd();
  413. }
  414.  
  415. static void Quads(void)
  416. {
  417.  
  418.     glBegin(GL_QUADS);
  419.     TK_SETCOLOR(windType, TK_GREEN);
  420.     glVertex2i(-boxW/4, -boxH/4);
  421.     TK_SETCOLOR(windType, TK_RED);
  422.     glVertex2i(-boxW/8, -boxH/16);
  423.     TK_SETCOLOR(windType, TK_BLUE);
  424.     glVertex2i(boxW/8, -boxH/16);
  425.     TK_SETCOLOR(windType, TK_WHITE);
  426.     glVertex2i(boxW/4, -boxH/4);
  427.  
  428.     TK_SETCOLOR(windType, TK_GREEN);
  429.     glVertex2i(-boxW/4, boxH/4);
  430.     TK_SETCOLOR(windType, TK_RED);
  431.     glVertex2i(-boxW/8, boxH/16);
  432.     TK_SETCOLOR(windType, TK_BLUE);
  433.     glVertex2i(boxW/8, boxH/16);
  434.     TK_SETCOLOR(windType, TK_WHITE);
  435.     glVertex2i(boxW/4, boxH/4);
  436.     glEnd();
  437.  
  438.     glBegin(GL_QUADS);
  439.     glVertex2i(0, 0);
  440.     glVertex2i(100, 100);
  441.     glVertex2i(-100, 100);
  442.     glEnd();
  443. }
  444.  
  445. static void QuadStrip(void)
  446. {
  447.  
  448.     glBegin(GL_QUAD_STRIP);
  449.     TK_SETCOLOR(windType, TK_GREEN);
  450.     glVertex2i(-boxW/4, -boxH/4);
  451.     TK_SETCOLOR(windType, TK_RED);
  452.     glVertex2i(-boxW/4, boxH/4);
  453.     TK_SETCOLOR(windType, TK_BLUE);
  454.     glVertex2i(0, -boxH/4);
  455.     TK_SETCOLOR(windType, TK_WHITE);
  456.     glVertex2i(0, boxH/4);
  457.     TK_SETCOLOR(windType, TK_CYAN);
  458.     glVertex2i(boxW/4, -boxH/4);
  459.     TK_SETCOLOR(windType, TK_YELLOW);
  460.     glVertex2i(boxW/4, boxH/4);
  461.     glEnd();
  462.  
  463.     glBegin(GL_QUAD_STRIP);
  464.     glVertex2i(0, 0);
  465.     glVertex2i(100, 100);
  466.     glVertex2i(-100, 100);
  467.     glEnd();
  468. }
  469.  
  470. static void Draw(void)
  471. {
  472.  
  473.     glViewport(0, 0, windW, windH);
  474.     glDisable(GL_SCISSOR_TEST);
  475.  
  476.     glPushAttrib(GL_COLOR_BUFFER_BIT);
  477.  
  478.     glColorMask(1, 1, 1, 1);
  479.     glIndexMask(~0);
  480.  
  481.     glClearColor(0.0, 0.0, 0.0, 0.0);
  482.     glClear(GL_COLOR_BUFFER_BIT);
  483.  
  484.     glPopAttrib();
  485.  
  486.     if (mode1) {
  487.     glShadeModel(GL_SMOOTH);
  488.     } else {
  489.     glShadeModel(GL_FLAT);
  490.     }
  491.  
  492.     if (mode2) {
  493.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  494.     } else {
  495.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  496.     }
  497.  
  498.     Viewport(0, 0); Point();
  499.     Viewport(0, 1); Lines();
  500.     Viewport(0, 2); LineStrip();
  501.     Viewport(0, 3); LineLoop();
  502.  
  503.     Viewport(1, 0); Bitmap();
  504.  
  505.     Viewport(1, 1); TriangleFan();
  506.     Viewport(1, 2); Triangles();
  507.     Viewport(1, 3); TriangleStrip();
  508.  
  509.     Viewport(2, 0); Rect();
  510.     Viewport(2, 1); Polygon();
  511.     Viewport(2, 2); Quads();
  512.     Viewport(2, 3); QuadStrip();
  513.  
  514.     glFlush();
  515.  
  516.     if (doubleBuffer) {
  517.     tkSwapBuffers();
  518.     }
  519. }
  520.  
  521. static GLenum Args(int argc, char **argv)
  522. {
  523.     GLint i;
  524.  
  525.     rgb = GL_TRUE;
  526.     doubleBuffer = GL_FALSE;
  527.     directRender = GL_TRUE;
  528.  
  529.     for (i = 1; i < argc; i++) {
  530.     if (strcmp(argv[i], "-ci") == 0) {
  531.         rgb = GL_FALSE;
  532.     } else if (strcmp(argv[i], "-rgb") == 0) {
  533.         rgb = GL_TRUE;
  534.     } else if (strcmp(argv[i], "-sb") == 0) {
  535.         doubleBuffer = GL_FALSE;
  536.     } else if (strcmp(argv[i], "-db") == 0) {
  537.         doubleBuffer = GL_TRUE;
  538.     } else if (strcmp(argv[i], "-dr") == 0) {
  539.         directRender = GL_TRUE;
  540.     } else if (strcmp(argv[i], "-ir") == 0) {
  541.         directRender = GL_FALSE;
  542.     } else {
  543.         printf("%s (Bad option).\n", argv[i]);
  544.         return GL_FALSE;
  545.     }
  546.     }
  547.     return GL_TRUE;
  548. }
  549.  
  550. void main(int argc, char **argv)
  551. {
  552.  
  553.     if (Args(argc, argv) == GL_FALSE) {
  554.     tkQuit();
  555.     }
  556.  
  557.     windW = 600;
  558.     windH = 300;
  559.     tkInitPosition(0, 0, windW, windH);
  560.  
  561.     windType = (rgb) ? TK_RGB : TK_INDEX;
  562.     windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  563.     windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  564.     tkInitDisplayMode(windType);
  565.  
  566.     if (tkInitWindow("Primitive Test") == GL_FALSE) {
  567.     tkQuit();
  568.     }
  569.  
  570.     Init();
  571.  
  572.     tkExposeFunc(Reshape);
  573.     tkReshapeFunc(Reshape);
  574.     tkKeyDownFunc(Key);
  575.     tkDisplayFunc(Draw);
  576.     tkExec();
  577. }
  578.