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