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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <GL/gl.h>
  5. #include <GL/glu.h>
  6. #include <math.h>
  7. #include "tk.h"
  8.  
  9.  
  10. #define INREAL float
  11.  
  12. #define S_NUMPOINTS 13
  13. #define S_ORDER     3   
  14. #define S_NUMKNOTS  (S_NUMPOINTS + S_ORDER)
  15. #define T_NUMPOINTS 3
  16. #define T_ORDER     3 
  17. #define T_NUMKNOTS  (T_NUMPOINTS + T_ORDER)
  18. #define SQRT_TWO    1.41421356237309504880
  19.  
  20.  
  21. typedef INREAL Point[4];
  22.  
  23.  
  24. GLenum doubleBuffer, directRender;
  25.  
  26. GLenum expectedError;
  27. GLint rotX = 40, rotY = 40;
  28. INREAL sknots[S_NUMKNOTS] = {
  29.     -1.0, -1.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0,
  30.     4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 9.0, 9.0
  31. };
  32. INREAL tknots[T_NUMKNOTS] = {
  33.     1.0, 1.0, 1.0, 2.0, 2.0, 2.0
  34. };
  35. Point ctlpoints[S_NUMPOINTS][T_NUMPOINTS] = {
  36.     {
  37.     {
  38.         4.0, 2.0, 2.0, 1.0
  39.     },
  40.     {
  41.         4.0, 1.6, 2.5, 1.0
  42.     },
  43.     {
  44.         4.0, 2.0, 3.0, 1.0
  45.     }
  46.     },
  47.     {
  48.     {
  49.         5.0, 4.0, 2.0, 1.0
  50.     },
  51.     {
  52.         5.0, 4.0, 2.5, 1.0
  53.     },
  54.     {
  55.         5.0, 4.0, 3.0, 1.0
  56.     }
  57.     },
  58.     {
  59.     {
  60.         6.0, 5.0, 2.0, 1.0
  61.     },
  62.     {
  63.         6.0, 5.0, 2.5, 1.0
  64.     },
  65.     {
  66.         6.0, 5.0, 3.0, 1.0
  67.     }
  68.     },
  69.     {
  70.     {
  71.         SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  72.     },
  73.     {
  74.         SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  75.     },
  76.     {
  77.         SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  78.     }  
  79.     },
  80.     {
  81.     {
  82.         5.2, 6.7, 2.0, 1.0
  83.     },
  84.     {
  85.         5.2, 6.7, 2.5, 1.0
  86.     },
  87.     {
  88.         5.2, 6.7, 3.0, 1.0
  89.     }
  90.     },
  91.     {
  92.     {
  93.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  94.     },
  95.     {
  96.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  97.     }, 
  98.     {
  99.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  100.     }  
  101.     }, 
  102.     {
  103.     {
  104.         4.0, 5.2, 2.0, 1.0
  105.     },
  106.     {
  107.         4.0, 4.6, 2.5, 1.0
  108.     },
  109.     {
  110.         4.0, 5.2, 3.0, 1.0
  111.     }  
  112.     },
  113.     {
  114.     {
  115.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  116.     },
  117.     {
  118.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  119.     },
  120.     {
  121.         SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  122.     }  
  123.     },
  124.     {
  125.     {
  126.         2.8, 6.7, 2.0, 1.0
  127.     },
  128.     {
  129.         2.8, 6.7, 2.5, 1.0
  130.     },
  131.     {
  132.         2.8, 6.7, 3.0, 1.0
  133.     }   
  134.     },
  135.     {
  136.     {
  137.         SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
  138.     },
  139.     {
  140.         SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
  141.     },
  142.     {
  143.         SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
  144.     }  
  145.     },
  146.     {
  147.     {
  148.         2.0, 5.0, 2.0, 1.0
  149.     },
  150.     {
  151.         2.0, 5.0, 2.5, 1.0
  152.     },
  153.     {
  154.         2.0, 5.0, 3.0, 1.0
  155.     } 
  156.     },
  157.     {
  158.     {
  159.         3.0, 4.0, 2.0, 1.0
  160.     },
  161.     {
  162.         3.0, 4.0, 2.5, 1.0
  163.     },
  164.     {
  165.         3.0, 4.0, 3.0, 1.0
  166.     } 
  167.     },
  168.     {
  169.     {
  170.         4.0, 2.0, 2.0, 1.0
  171.     },
  172.     {
  173.         4.0, 1.6, 2.5, 1.0
  174.     },
  175.     {
  176.         4.0, 2.0, 3.0, 1.0
  177.     }    
  178.     }
  179. };
  180. GLUnurbsObj *theNurbs;
  181.  
  182.  
  183. static void ErrorCallback(GLenum which)
  184. {
  185.  
  186.     if (which != expectedError) {
  187.     fprintf(stderr, "Unexpected error occured (%d):\n", which);
  188.     fprintf(stderr, "    %s\n", gluErrorString(which));
  189.     }
  190. }
  191.  
  192. static void Init(void)
  193. {
  194.  
  195.     theNurbs = gluNewNurbsRenderer();
  196.     gluNurbsCallback(theNurbs, GLU_ERROR, ErrorCallback);
  197.  
  198.     gluNurbsProperty(theNurbs, GLU_SAMPLING_TOLERANCE, 15.0);
  199.     gluNurbsProperty(theNurbs, GLU_DISPLAY_MODE, GLU_OUTLINE_PATCH);
  200.  
  201.     expectedError = GLU_INVALID_ENUM;
  202.     gluNurbsProperty(theNurbs, ~0, 15.0);
  203.     expectedError = GLU_NURBS_ERROR13;
  204.     gluEndSurface(theNurbs);
  205.     expectedError = 0;
  206.  
  207.     glColor3f(1.0, 1.0, 1.0);
  208. }
  209.  
  210. static void Reshape(int width, int height)
  211. {
  212.  
  213.     glViewport(0, 0, (GLint)width, (GLint)height);
  214.  
  215.     glMatrixMode(GL_PROJECTION);
  216.     glLoadIdentity();
  217.     glFrustum(-2.0, 2.0, -2.0, 2.0, 0.8, 10.0);
  218.     gluLookAt(7.0, 4.5, 4.0, 4.5, 4.5, 2.5, 6.0, -3.0, 2.0);
  219.     glMatrixMode(GL_MODELVIEW);
  220. }
  221.  
  222. static GLenum Key(int key, GLenum mask)
  223. {
  224.  
  225.     switch (key) {
  226.       case TK_B:
  227.     tkClipBoard();
  228.     break;
  229.       case TK_ESCAPE:
  230.     tkQuit();
  231.       case TK_DOWN:
  232.     rotX -= 5;
  233.     break;
  234.       case TK_UP:
  235.     rotX += 5;
  236.     break;
  237.       case TK_LEFT:
  238.     rotY -= 5;
  239.     break;
  240.       case TK_RIGHT:
  241.     rotY += 5;
  242.     break;
  243.       default:
  244.     return GL_FALSE;
  245.     }
  246.     return GL_TRUE;
  247. }
  248.  
  249. static void Draw(void)
  250. {
  251.  
  252.     glClear(GL_COLOR_BUFFER_BIT);
  253.  
  254.     glPushMatrix();
  255.  
  256.     glTranslatef(4.0, 4.5, 2.5);
  257.     glRotatef(rotY, 1, 0, 0);
  258.     glRotatef(rotX, 0, 1, 0);
  259.     glTranslatef(-4.0, -4.5, -2.5);
  260.  
  261.     gluBeginSurface(theNurbs);
  262.     gluNurbsSurface(theNurbs, S_NUMKNOTS, sknots, T_NUMKNOTS, tknots,
  263.             4*T_NUMPOINTS, 4, &ctlpoints[0][0][0], S_ORDER,
  264.             T_ORDER, GL_MAP2_VERTEX_4);
  265.     gluEndSurface(theNurbs);
  266.  
  267.     glPopMatrix();
  268.  
  269.     glFlush();
  270.  
  271.     if (doubleBuffer) {
  272.     tkSwapBuffers();
  273.     }
  274. }
  275.  
  276. static GLenum Args(int argc, char **argv)
  277. {
  278.     GLint i;
  279.  
  280.     doubleBuffer = GL_FALSE;
  281.     directRender = GL_TRUE;
  282.  
  283.     for (i = 1; i < argc; i++) {
  284.     if (strcmp(argv[i], "-sb") == 0) {
  285.         doubleBuffer = GL_FALSE;
  286.     } else if (strcmp(argv[i], "-db") == 0) {
  287.         doubleBuffer = GL_TRUE;
  288.     } else if (strcmp(argv[i], "-dr") == 0) {
  289.         directRender = GL_TRUE;
  290.     } else if (strcmp(argv[i], "-ir") == 0) {
  291.         directRender = GL_FALSE;
  292.     } else {
  293.         printf("%s (Bad option).\n", argv[i]);
  294.         return GL_FALSE;
  295.     }
  296.     }
  297.     return GL_TRUE;
  298. }
  299.  
  300. void main(int argc, char **argv)
  301. {
  302.     GLenum type;
  303.  
  304.     if (Args(argc, argv) == GL_FALSE) {
  305.     tkQuit();
  306.     }
  307.  
  308.     tkInitPosition(0, 0, 300, 300);
  309.  
  310.     type = TK_RGB;
  311.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  312.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  313.     tkInitDisplayMode(type);
  314.  
  315.     if (tkInitWindow("NURBS Test") == GL_FALSE) {
  316.     tkQuit();
  317.     }
  318.  
  319.     Init();
  320.  
  321.     tkExposeFunc(Reshape);
  322.     tkReshapeFunc(Reshape);
  323.     tkKeyDownFunc(Key);
  324.     tkDisplayFunc(Draw);
  325.     tkExec();
  326. }
  327.