47 enum TessState { T_DORMANT, T_IN_POLYGON, T_IN_CONTOUR };
 
   52 #define TESS_MAX_CACHE  100 
   54 typedef struct CachedVertex {
 
   59 struct GLUtesselator {
 
   65   GLUhalfEdge  *lastEdge;  
 
   69   void      (GLAPIENTRY *callError)( GLenum errnum );
 
   79   GLdouble  relTolerance;  
 
   87   void      (GLAPIENTRY *callCombine)( GLdouble coords[3], 
void *data[4],
 
   88                  GLfloat weight[4], 
void **outData );
 
   92   GLboolean flagBoundary;  
 
   93   GLboolean boundaryOnly;  
 
   94   GLUface   *lonelyTriList;
 
   97   void      (GLAPIENTRY *callBegin)( GLenum type );
 
   98   void      (GLAPIENTRY *callEdgeFlag)( GLboolean boundaryEdge );
 
   99   void      (GLAPIENTRY *callVertex)( 
void *data );
 
  100   void      (GLAPIENTRY *callEnd)( void );
 
  101   void      (GLAPIENTRY *callMesh)( GLUmesh *mesh );
 
  106   GLboolean emptyCache;    
 
  108   CachedVertex cache[TESS_MAX_CACHE];  
 
  111   void      (GLAPIENTRY *callBeginData)( GLenum type, 
void *polygonData );
 
  112   void      (GLAPIENTRY *callEdgeFlagData)( GLboolean boundaryEdge,
 
  114   void      (GLAPIENTRY *callVertexData)( 
void *data, 
void *polygonData );
 
  115   void      (GLAPIENTRY *callEndData)( 
void *polygonData );
 
  116   void      (GLAPIENTRY *callErrorData)( GLenum errnum, 
void *polygonData );
 
  117   void      (GLAPIENTRY *callCombineData)( GLdouble coords[3], 
void *data[4],
 
  118                 GLfloat weight[4], 
void **outData,
 
  126 void GLAPIENTRY __gl_noBeginData( GLenum type, 
void *polygonData );
 
  127 void GLAPIENTRY __gl_noEdgeFlagData( GLboolean boundaryEdge, 
void *polygonData );
 
  128 void GLAPIENTRY __gl_noVertexData( 
void *data, 
void *polygonData );
 
  129 void GLAPIENTRY __gl_noEndData( 
void *polygonData );
 
  130 void GLAPIENTRY __gl_noErrorData( GLenum errnum, 
void *polygonData );
 
  131 void GLAPIENTRY __gl_noCombineData( GLdouble coords[3], 
void *data[4],
 
  132           GLfloat weight[4], 
void **outData,
 
  135 #define CALL_BEGIN_OR_BEGIN_DATA(a) \ 
  136    if (tess->callBeginData != &__gl_noBeginData) \ 
  137       (*tess->callBeginData)((a),tess->polygonData); \ 
  138    else (*tess->callBegin)((a)); 
  140 #define CALL_VERTEX_OR_VERTEX_DATA(a) \ 
  141    if (tess->callVertexData != &__gl_noVertexData) \ 
  142       (*tess->callVertexData)((a),tess->polygonData); \ 
  143    else (*tess->callVertex)((a)); 
  145 #define CALL_EDGE_FLAG_OR_EDGE_FLAG_DATA(a) \ 
  146    if (tess->callEdgeFlagData != &__gl_noEdgeFlagData) \ 
  147       (*tess->callEdgeFlagData)((a),tess->polygonData); \ 
  148    else (*tess->callEdgeFlag)((a)); 
  150 #define CALL_END_OR_END_DATA() \ 
  151    if (tess->callEndData != &__gl_noEndData) \ 
  152       (*tess->callEndData)(tess->polygonData); \ 
  153    else (*tess->callEnd)(); 
  155 #define CALL_COMBINE_OR_COMBINE_DATA(a,b,c,d) \ 
  156    if (tess->callCombineData != &__gl_noCombineData) \ 
  157       (*tess->callCombineData)((a),(b),(c),(d),tess->polygonData); \ 
  158    else (*tess->callCombine)((a),(b),(c),(d)); 
  160 #define CALL_ERROR_OR_ERROR_DATA(a) \ 
  161    if (tess->callErrorData != &__gl_noErrorData) \ 
  162       (*tess->callErrorData)((a),tess->polygonData); \ 
  163    else (*tess->callError)((a));