tesswind.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:9k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1993-1997, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED 
  4.  * Permission to use, copy, modify, and distribute this software for 
  5.  * any purpose and without fee is hereby granted, provided that the above
  6.  * copyright notice appear in all copies and that both the copyright notice
  7.  * and this permission notice appear in supporting documentation, and that 
  8.  * the name of Silicon Graphics, Inc. not be used in advertising
  9.  * or publicity pertaining to distribution of the software without specific,
  10.  * written prior permission. 
  11.  *
  12.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  13.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  14.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  15.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  16.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  17.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  18.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  19.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  20.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  21.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  22.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  23.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  * 
  25.  * US Government Users Restricted Rights 
  26.  * Use, duplication, or disclosure by the Government is subject to
  27.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  28.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  29.  * clause at DFARS 252.227-7013 and/or in similar or successor
  30.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  31.  * Unpublished-- rights reserved under the copyright laws of the
  32.  * United States.  Contractor/manufacturer is Silicon Graphics,
  33.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  34.  *
  35.  * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
  36.  */
  37. /*
  38.  *  tesswind.c
  39.  *  This program demonstrates the winding rule polygon 
  40.  *  tessellation property.  Four tessellated objects are drawn, 
  41.  *  each with very different contours.  When the w key is pressed, 
  42.  *  the objects are drawn with a different winding rule.
  43.  */
  44. #include <GL/glut.h>
  45. #include <stdlib.h>
  46. #include <stdio.h>
  47. #ifdef GLU_VERSION_1_2
  48. /* Win32 calling conventions. */
  49. #ifndef CALLBACK
  50. #define CALLBACK
  51. #endif
  52. GLdouble currentWinding = GLU_TESS_WINDING_ODD;
  53. int currentShape = 0;
  54. GLUtesselator *tobj;
  55. GLuint list;
  56. /*  Make four display lists, 
  57.  *  each with a different tessellated object. 
  58.  */
  59. void makeNewLists (void) {
  60.    int i;
  61.    static GLdouble rects[12][3] = 
  62.       {50.0, 50.0, 0.0, 300.0, 50.0, 0.0, 
  63.        300.0, 300.0, 0.0, 50.0, 300.0, 0.0,
  64.        100.0, 100.0, 0.0, 250.0, 100.0, 0.0, 
  65.        250.0, 250.0, 0.0, 100.0, 250.0, 0.0,
  66.        150.0, 150.0, 0.0, 200.0, 150.0, 0.0, 
  67.        200.0, 200.0, 0.0, 150.0, 200.0, 0.0};
  68.    static GLdouble spiral[16][3] = 
  69.       {400.0, 250.0, 0.0, 400.0, 50.0, 0.0, 
  70.        50.0, 50.0, 0.0, 50.0, 400.0, 0.0, 
  71.        350.0, 400.0, 0.0, 350.0, 100.0, 0.0, 
  72.        100.0, 100.0, 0.0, 100.0, 350.0, 0.0, 
  73.        300.0, 350.0, 0.0, 300.0, 150.0, 0.0, 
  74.        150.0, 150.0, 0.0, 150.0, 300.0, 0.0, 
  75.        250.0, 300.0, 0.0, 250.0, 200.0, 0.0, 
  76.        200.0, 200.0, 0.0, 200.0, 250.0, 0.0};
  77.    static GLdouble quad1[4][3] = 
  78.       {50.0, 150.0, 0.0, 350.0, 150.0, 0.0, 
  79.       350.0, 200.0, 0.0, 50.0, 200.0, 0.0};
  80.    static GLdouble quad2[4][3] =
  81.       {100.0, 100.0, 0.0, 300.0, 100.0, 0.0, 
  82.        300.0, 350.0, 0.0, 100.0, 350.0, 0.0};
  83.    static GLdouble tri[3][3] =
  84.       {200.0, 50.0, 0.0, 250.0, 300.0, 0.0,
  85.        150.0, 300.0, 0.0};
  86.  
  87.    gluTessProperty(tobj, GLU_TESS_WINDING_RULE, 
  88.                    currentWinding);
  89.    glNewList(list, GL_COMPILE);
  90.       gluTessBeginPolygon(tobj, NULL);
  91.          gluTessBeginContour(tobj);
  92.          for (i = 0; i < 4; i++)
  93.             gluTessVertex(tobj, rects[i], rects[i]);
  94.          gluTessEndContour(tobj);
  95.          gluTessBeginContour(tobj);
  96.          for (i = 4; i < 8; i++)
  97.             gluTessVertex(tobj, rects[i], rects[i]);
  98.          gluTessEndContour(tobj);
  99.          gluTessBeginContour(tobj);
  100.          for (i = 8; i < 12; i++)
  101.             gluTessVertex(tobj, rects[i], rects[i]);
  102.          gluTessEndContour(tobj);
  103.       gluTessEndPolygon(tobj);
  104.    glEndList();
  105.    glNewList(list+1, GL_COMPILE);
  106.       gluTessBeginPolygon(tobj, NULL);
  107.          gluTessBeginContour(tobj);
  108.          for (i = 0; i < 4; i++)
  109.             gluTessVertex(tobj, rects[i], rects[i]);
  110.          gluTessEndContour(tobj);
  111.          gluTessBeginContour(tobj);
  112.          for (i = 7; i >= 4; i--)
  113.             gluTessVertex(tobj, rects[i], rects[i]);
  114.          gluTessEndContour(tobj);
  115.          gluTessBeginContour(tobj);
  116.          for (i = 11; i >= 8; i--)
  117.             gluTessVertex(tobj, rects[i], rects[i]);
  118.          gluTessEndContour(tobj);
  119.       gluTessEndPolygon(tobj);
  120.    glEndList();
  121.    glNewList(list+2, GL_COMPILE);
  122.       gluTessBeginPolygon(tobj, NULL);
  123.          gluTessBeginContour(tobj);
  124.          for (i = 0; i < 16; i++)
  125.             gluTessVertex(tobj, spiral[i], spiral[i]);
  126.          gluTessEndContour(tobj);
  127.       gluTessEndPolygon(tobj);
  128.    glEndList();
  129.    glNewList(list+3, GL_COMPILE);
  130.       gluTessBeginPolygon(tobj, NULL);
  131.          gluTessBeginContour(tobj);
  132.          for (i = 0; i < 4; i++)
  133.             gluTessVertex(tobj, quad1[i], quad1[i]);
  134.          gluTessEndContour(tobj);
  135.          gluTessBeginContour(tobj);
  136.          for (i = 0; i < 4; i++)
  137.             gluTessVertex(tobj, quad2[i], quad2[i]);
  138.          gluTessEndContour(tobj);
  139.          gluTessBeginContour(tobj);
  140.          for (i = 0; i < 3; i++)
  141.             gluTessVertex(tobj, tri[i], tri[i]);
  142.          gluTessEndContour(tobj);
  143.       gluTessEndPolygon(tobj);
  144.    glEndList();
  145. }
  146. void display (void) {
  147.    glClear(GL_COLOR_BUFFER_BIT);
  148.    glColor3f(1.0, 1.0, 1.0);
  149.    glPushMatrix(); 
  150.    glCallList(list);
  151.    glTranslatef(0.0, 500.0, 0.0);
  152.    glCallList(list+1);
  153.    glTranslatef(500.0, -500.0, 0.0);
  154.    glCallList(list+2);
  155.    glTranslatef(0.0, 500.0, 0.0);
  156.    glCallList(list+3);
  157.    glPopMatrix(); 
  158.    glFlush();
  159. }
  160. void CALLBACK beginCallback(GLenum which)
  161. {
  162.    glBegin(which);
  163. }
  164. void CALLBACK errorCallback(GLenum errorCode)
  165. {
  166.    const GLubyte *estring;
  167.    estring = gluErrorString(errorCode);
  168.    fprintf(stderr, "Tessellation Error: %sn", estring);
  169.    exit(0);
  170. }
  171. void CALLBACK endCallback(void)
  172. {
  173.    glEnd();
  174. }
  175. /*  combineCallback is used to create a new vertex when edges
  176.  *  intersect.  coordinate location is trivial to calculate,
  177.  *  but weight[4] may be used to average color, normal, or texture 
  178.  *  coordinate data.
  179.  */
  180. /* ARGSUSED */
  181. void CALLBACK combineCallback(GLdouble coords[3], GLdouble *data[4],
  182.                      GLfloat weight[4], GLdouble **dataOut )
  183. {
  184.    GLdouble *vertex;
  185.    vertex = (GLdouble *) malloc(3 * sizeof(GLdouble));
  186.    vertex[0] = coords[0];
  187.    vertex[1] = coords[1];
  188.    vertex[2] = coords[2];
  189.    *dataOut = vertex;
  190. }
  191. void init(void) 
  192. {
  193.    glClearColor(0.0, 0.0, 0.0, 0.0);
  194.    glShadeModel(GL_FLAT);    
  195.    tobj = gluNewTess();
  196.    gluTessCallback(tobj, GLU_TESS_VERTEX, 
  197.                    (GLvoid (CALLBACK*) ()) &glVertex3dv);
  198.    gluTessCallback(tobj, GLU_TESS_BEGIN, 
  199.                    (GLvoid (CALLBACK*) ()) &beginCallback);
  200.    gluTessCallback(tobj, GLU_TESS_END, 
  201.                    (GLvoid (CALLBACK*) ()) &endCallback);
  202.    gluTessCallback(tobj, GLU_TESS_ERROR, 
  203.                    (GLvoid (CALLBACK*) ()) &errorCallback);
  204.    gluTessCallback(tobj, GLU_TESS_COMBINE, 
  205.                    (GLvoid (CALLBACK*) ()) &combineCallback);
  206.    list = glGenLists(4);
  207.    makeNewLists();
  208. }
  209. void reshape(int w, int h)
  210. {
  211.    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
  212.    glMatrixMode(GL_PROJECTION);
  213.    glLoadIdentity();
  214.    if (w <= h)
  215.       gluOrtho2D(0.0, 1000.0, 0.0, 1000.0 * (GLdouble)h/(GLdouble)w);
  216.    else
  217.       gluOrtho2D(0.0, 1000.0 * (GLdouble)w/(GLdouble)h, 0.0, 1000.0);
  218.    glMatrixMode(GL_MODELVIEW);
  219.    glLoadIdentity();
  220. }
  221. /* ARGSUSED1 */
  222. void keyboard(unsigned char key, int x, int y)
  223. {
  224.    switch (key) {
  225.       case 'w':
  226.       case 'W':
  227.          if (currentWinding == GLU_TESS_WINDING_ODD)
  228.             currentWinding = GLU_TESS_WINDING_NONZERO;
  229.          else if (currentWinding == GLU_TESS_WINDING_NONZERO)
  230.             currentWinding = GLU_TESS_WINDING_POSITIVE;
  231.          else if (currentWinding == GLU_TESS_WINDING_POSITIVE)
  232.             currentWinding = GLU_TESS_WINDING_NEGATIVE;
  233.          else if (currentWinding == GLU_TESS_WINDING_NEGATIVE)
  234.             currentWinding = GLU_TESS_WINDING_ABS_GEQ_TWO;
  235.          else if (currentWinding == GLU_TESS_WINDING_ABS_GEQ_TWO)
  236.             currentWinding = GLU_TESS_WINDING_ODD;
  237.          makeNewLists();
  238.          glutPostRedisplay();
  239.          break;
  240.       case 27:
  241.          exit(0);
  242.          break;
  243.       default:
  244.          break;
  245.    }
  246. }
  247. int main(int argc, char** argv)
  248. {
  249.    glutInit(&argc, argv);
  250.    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  251.    glutInitWindowSize(500, 500);
  252.    glutCreateWindow(argv[0]);
  253.    init();
  254.    glutDisplayFunc(display);
  255.    glutReshapeFunc(reshape);
  256.    glutKeyboardFunc(keyboard);
  257.    glutMainLoop();
  258.    return 0;  
  259. }
  260. #else
  261. int main(int argc, char** argv)
  262. {
  263.     fprintf (stderr, "This program demonstrates the new tesselator API in GLU 1.2.n");
  264.     fprintf (stderr, "Your GLU library does not support this new interface, sorry.n");
  265.     return 0;
  266. }
  267. #endif