tess.h revision 1cab2921ab279367f8206cdadc9259d12e603548
11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** License Applicability. Except to the extent portions of this file are 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** made subject to an alternative license as permitted in the SGI Free 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Software License B, Version 1.1 (the "License"), the contents of this 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** file are subject only to the provisions of the License. You may not use 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** this file except in compliance with the License. You may obtain a copy 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** http://oss.sgi.com/projects/FreeB 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Note that, as provided in the License, the Software is distributed on an 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Original Code. The Original Code is: OpenGL Sample Implementation, 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Copyright in any portions created by third parties is as indicated 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** elsewhere herein. All Rights Reserved. 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Additional Notice Provisions: The application programming interfaces 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** established by SGI in conjunction with the Original Code are The 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Window System(R) (Version 1.3), released October 19, 1998. This software 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** was created using the OpenGL(R) version 1.2.1 Sample Implementation 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** published by SGI, but has not been independently verified as being 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** compliant with the OpenGL(R) version 1.2.1 Specification. 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger*/ 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** Author: Eric Veach, July 1994. 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** $Date$ $Revision$ 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger** $Header: //depot/main/gfx/lib/glu/libtess/tess.h#6 $ 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger*/ 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef __tess_h_ 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define __tess_h_ 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include <sk_glu.h> 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include <setjmp.h> 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "mesh.h" 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "dict.h" 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "priorityq.h" 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* The begin/end calls must be properly nested. We keep track of 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * the current state to enforce the ordering. 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerenum TessState { T_DORMANT, T_IN_POLYGON, T_IN_CONTOUR }; 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* We cache vertex data for single-contour polygons so that we can 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * try a quick-and-dirty decomposition first. 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define TESS_MAX_CACHE 100 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergertypedef struct CachedVertex { 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLdouble coords[3]; 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void *data; 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} CachedVertex; 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstruct GLUtesselator { 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /*** state needed for collecting the input data ***/ 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger enum TessState state; /* what begin/end calls have we seen? */ 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLUhalfEdge *lastEdge; /* lastEdge->Org is the most recent vertex */ 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLUmesh *mesh; /* stores the input contours, and eventually 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger the tessellation itself */ 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callError)( GLenum errnum ); 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /*** state needed for projecting onto the sweep plane ***/ 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLdouble normal[3]; /* user-specified normal (if provided) */ 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLdouble sUnit[3]; /* unit vector in s-direction (debugging) */ 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLdouble tUnit[3]; /* unit vector in t-direction (debugging) */ 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /*** state needed for the line sweep ***/ 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLdouble relTolerance; /* tolerance for merging features */ 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLenum windingRule; /* rule for determining polygon interior */ 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLboolean fatalError; /* fatal error: needed combine callback */ 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Dict *dict; /* edge dictionary for sweep line */ 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger PriorityQ *pq; /* priority queue of vertex events */ 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLUvertex *event; /* current sweep event being processed */ 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callCombine)( GLdouble coords[3], void *data[4], 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLfloat weight[4], void **outData ); 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /*** state needed for rendering callbacks (see render.c) ***/ 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLboolean flagBoundary; /* mark boundary edges (use EdgeFlag) */ 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLboolean boundaryOnly; /* Extract contours, not triangles */ 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLUface *lonelyTriList; 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /* list of triangles which could not be rendered as strips or fans */ 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callBegin)( GLenum type ); 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callEdgeFlag)( GLboolean boundaryEdge ); 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callVertex)( void *data ); 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callEnd)( void ); 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callMesh)( GLUmesh *mesh ); 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /*** state needed to cache single-contour polygons for renderCache() */ 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLboolean emptyCache; /* empty cache on next vertex() call */ 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int cacheCount; /* number of cached vertices */ 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger CachedVertex cache[TESS_MAX_CACHE]; /* the vertex data */ 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /*** rendering callbacks that also pass polygon data ***/ 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callBeginData)( GLenum type, void *polygonData ); 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callEdgeFlagData)( GLboolean boundaryEdge, 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void *polygonData ); 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callVertexData)( void *data, void *polygonData ); 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callEndData)( void *polygonData ); 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callErrorData)( GLenum errnum, void *polygonData ); 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void (GLAPIENTRY *callCombineData)( GLdouble coords[3], void *data[4], 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLfloat weight[4], void **outData, 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void *polygonData ); 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger jmp_buf env; /* place to jump to when memAllocs fail */ 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void *polygonData; /* client data for current polygon */ 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GLAPIENTRY __gl_noBeginData( GLenum type, void *polygonData ); 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GLAPIENTRY __gl_noEdgeFlagData( GLboolean boundaryEdge, void *polygonData ); 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GLAPIENTRY __gl_noVertexData( void *data, void *polygonData ); 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GLAPIENTRY __gl_noEndData( void *polygonData ); 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GLAPIENTRY __gl_noErrorData( GLenum errnum, void *polygonData ); 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GLAPIENTRY __gl_noCombineData( GLdouble coords[3], void *data[4], 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GLfloat weight[4], void **outData, 1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void *polygonData ); 1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define CALL_BEGIN_OR_BEGIN_DATA(a) \ 1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (tess->callBeginData != &__gl_noBeginData) \ 1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (*tess->callBeginData)((a),tess->polygonData); \ 1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger else (*tess->callBegin)((a)); 1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define CALL_VERTEX_OR_VERTEX_DATA(a) \ 1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (tess->callVertexData != &__gl_noVertexData) \ 1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (*tess->callVertexData)((a),tess->polygonData); \ 1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger else (*tess->callVertex)((a)); 1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define CALL_EDGE_FLAG_OR_EDGE_FLAG_DATA(a) \ 1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (tess->callEdgeFlagData != &__gl_noEdgeFlagData) \ 1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (*tess->callEdgeFlagData)((a),tess->polygonData); \ 1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger else (*tess->callEdgeFlag)((a)); 1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define CALL_END_OR_END_DATA() \ 1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (tess->callEndData != &__gl_noEndData) \ 1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (*tess->callEndData)(tess->polygonData); \ 1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger else (*tess->callEnd)(); 1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define CALL_COMBINE_OR_COMBINE_DATA(a,b,c,d) \ 1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (tess->callCombineData != &__gl_noCombineData) \ 1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (*tess->callCombineData)((a),(b),(c),(d),tess->polygonData); \ 1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger else (*tess->callCombine)((a),(b),(c),(d)); 1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define CALL_ERROR_OR_ERROR_DATA(a) \ 1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (tess->callErrorData != &__gl_noErrorData) \ 1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger (*tess->callErrorData)((a),tess->polygonData); \ 1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger else (*tess->callError)((a)); 1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 173