home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / newopg.zip / SHAPE.C < prev    next >
Text File  |  1995-03-04  |  5KB  |  275 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 OPENGL_WIDTH 24
  35. #define OPENGL_HEIGHT 13
  36.  
  37.  
  38. GLenum rgb, doubleBuffer, directRender, windType;
  39. GLint objectIndex = 0;
  40. GLuint bases[20];
  41. float angleX = 0.0, angleY = 0.0, angleZ = 0.0;
  42. float scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0;
  43. float shiftX = 0.0, shiftY = 0.0, shiftZ = 0.0;
  44.  
  45.  
  46. static void Init(void)
  47. {
  48.  
  49.     bases[0] = glGenLists(1);
  50.     tkWireSphere(bases[0], 5.0);
  51.     bases[1] = glGenLists(1);
  52.     tkSolidSphere(bases[1], 5.0);
  53.     bases[2] = glGenLists(1);
  54.     tkWireCube(bases[2], 5.0);
  55.     bases[3] = glGenLists(1);
  56.     tkSolidCube(bases[3], 5.0);
  57.     bases[4] = glGenLists(1);
  58.     tkWireBox(bases[4], 4.0, 5.0, 6.0);
  59.     bases[5] = glGenLists(1);
  60.     tkSolidBox(bases[5], 4.0, 5.0, 6.0);
  61.     bases[6] = glGenLists(1);
  62.     tkWireTorus(bases[6], 5.0, 5.0);
  63.     bases[7] = glGenLists(1);
  64.     tkSolidTorus(bases[7], 5.0, 5.0);
  65.     bases[8] = glGenLists(1);
  66.     tkWireCylinder(bases[8], 5.0, 5.0);
  67.     bases[9] = glGenLists(1);
  68.     tkSolidCylinder(bases[9], 5.0, 5.0);
  69.     bases[10] = glGenLists(1);
  70.     tkWireCone(bases[10], 5.0, 5.0);
  71.     bases[11] = glGenLists(1);
  72.     tkSolidCone(bases[11], 5.0, 5.0);
  73.  
  74.     glClearColor(0.0, 0.0, 0.0, 0.0);
  75.     glClearIndex(0.0);
  76. }
  77.  
  78. static void Reshape(int width, int height)
  79. {
  80.  
  81.     glViewport(0, 0, (GLint)width, (GLint)height);
  82.  
  83.     glMatrixMode(GL_PROJECTION);
  84.     glLoadIdentity();
  85.     glOrtho(-400.0, 400.0, -200.0, 200.0, -400.0, 400.0);
  86.     glMatrixMode(GL_MODELVIEW);
  87. }
  88.  
  89. static GLenum Key(int key, GLenum mask)
  90. {
  91.  
  92.     switch (key) {
  93.       case TK_B:
  94.     tkClipBoard();
  95.     break;
  96.       case TK_ESCAPE:
  97.         tkQuit();
  98.  
  99.       case TK_SPACE:
  100.     objectIndex++;
  101.     if (objectIndex > 11) {
  102.         objectIndex = 0;
  103.     }
  104.     break;
  105.  
  106.       case TK_LEFT:
  107.     shiftX -= 20.0;
  108.     break;
  109.       case TK_RIGHT:
  110.     shiftX += 20.0;
  111.     break;
  112.       case TK_UP:
  113.     shiftY += 20.0;
  114.     break;
  115.       case TK_DOWN:
  116.     shiftY -= 20.0;
  117.     break;
  118.       case TK_n:
  119.     shiftZ += 20.0;
  120.     break;
  121.       case TK_m:
  122.     shiftZ -= 20.0;
  123.     break;
  124.  
  125.       case TK_q:
  126.     scaleX -= 0.1;
  127.     if (scaleX < 0.1) {
  128.         scaleX = 0.1;
  129.     }
  130.     break;
  131.       case TK_w:
  132.     scaleX += 0.1;
  133.     break;
  134.       case TK_a:
  135.     scaleY -= 0.1;
  136.     if (scaleY < 0.1) {
  137.         scaleY = 0.1;
  138.     }
  139.     break;
  140.       case TK_s:
  141.     scaleY += 0.1;
  142.     break;
  143.       case TK_z:
  144.     scaleZ -= 0.1;
  145.     if (scaleZ < 0.1) {
  146.         scaleZ = 0.1;
  147.     }
  148.     break;
  149.       case TK_x:
  150.     scaleZ += 1.1;
  151.     break;
  152.  
  153.       case TK_e:
  154.     angleX -= 5.0;
  155.     if (angleX < 0.0) {
  156.         angleX = 360.0 + angleX;
  157.     }
  158.     break;
  159.       case TK_r:
  160.     angleX += 5.0;
  161.     if (angleX > 360.0) {
  162.         angleX = angleX - 360.0;
  163.     }
  164.     break;
  165.       case TK_d:
  166.     angleY -= 5.0;
  167.     if (angleY < 0.0) {
  168.         angleY = 360.0 + angleY;
  169.     }
  170.     break;
  171.       case TK_f:
  172.     angleY += 5.0;
  173.     if (angleY > 360.0) {
  174.         angleY = angleY - 360.0;
  175.     }
  176.     break;
  177.       case TK_c:
  178.     angleZ -= 5.0;
  179.     if (angleZ < 0.0) {
  180.         angleZ = 360.0 + angleZ;
  181.     }
  182.     break;
  183.       case TK_v:
  184.     angleZ += 5.0;
  185.     if (angleZ > 360.0) {
  186.         angleZ = angleZ - 360.0;
  187.     }
  188.     break;
  189.       default:
  190.     return GL_FALSE;
  191.     }
  192.     return GL_TRUE;
  193. }
  194.  
  195. static void Draw(void)
  196. {
  197.  
  198.     glClear(GL_COLOR_BUFFER_BIT);
  199.  
  200.     TK_SETCOLOR(windType, TK_WHITE);
  201.  
  202.     glPushMatrix();
  203.  
  204.     glTranslatef(shiftX, shiftY, shiftZ);
  205.     glRotatef(angleX, 1.0, 0.0, 0.0);
  206.     glRotatef(angleY, 0.0, 1.0, 0.0);
  207.     glRotatef(angleZ, 0.0, 0.0, 1.0);
  208.     glScalef(scaleX, scaleY, scaleZ);
  209.  
  210.     glCallList(bases[objectIndex]);
  211.     glPopMatrix();
  212.  
  213.     glFlush();
  214.  
  215.     if (doubleBuffer) {
  216.     tkSwapBuffers();
  217.     }
  218. }
  219.  
  220. static GLenum Args(int argc, char **argv)
  221. {
  222.     GLint i;
  223.  
  224.     rgb = GL_TRUE;
  225.     doubleBuffer = GL_FALSE;
  226.     directRender = GL_TRUE;
  227.  
  228.     for (i = 1; i < argc; i++) {
  229.     if (strcmp(argv[i], "-ci") == 0) {
  230.         rgb = GL_FALSE;
  231.     } else if (strcmp(argv[i], "-rgb") == 0) {
  232.         rgb = GL_TRUE;
  233.     } else if (strcmp(argv[i], "-sb") == 0) {
  234.         doubleBuffer = GL_FALSE;
  235.     } else if (strcmp(argv[i], "-db") == 0) {
  236.         doubleBuffer = GL_TRUE;
  237.     } else if (strcmp(argv[i], "-dr") == 0) {
  238.         directRender = GL_TRUE;
  239.     } else if (strcmp(argv[i], "-ir") == 0) {
  240.         directRender = GL_FALSE;
  241.     } else {
  242.         printf("%s (Bad option).\n", argv[i]);
  243.         return GL_FALSE;
  244.     }
  245.     }
  246.     return GL_TRUE;
  247. }
  248.  
  249. void main(int argc, char **argv)
  250. {
  251.  
  252.     if (Args(argc, argv) == GL_FALSE) {
  253.     tkQuit();
  254.     }
  255.  
  256.     tkInitPosition(0, 0, 400, 400);
  257.  
  258.     windType = (rgb) ? TK_RGB : TK_INDEX;
  259.     windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  260.     windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  261.     tkInitDisplayMode(windType);
  262.  
  263.     if (tkInitWindow("Font Test") == GL_FALSE) {
  264.     tkQuit();
  265.     }
  266.  
  267.     Init();
  268.  
  269.     tkExposeFunc(Reshape);
  270.     tkReshapeFunc(Reshape);
  271.     tkKeyDownFunc(Key);
  272.     tkDisplayFunc(Draw);
  273.     tkExec();
  274. }
  275.