Lines Matching defs:tess
40 #include "tess.h"
94 GLUtesselator *tess;
103 tess = (GLUtesselator *)memAlloc( sizeof( GLUtesselator ));
104 if (tess == NULL) {
108 tess->state = T_DORMANT;
110 tess->normal[0] = 0;
111 tess->normal[1] = 0;
112 tess->normal[2] = 0;
114 tess->relTolerance = GLU_TESS_DEFAULT_TOLERANCE;
115 tess->windingRule = GLU_TESS_WINDING_ODD;
116 tess->flagBoundary = FALSE;
117 tess->boundaryOnly = FALSE;
119 tess->callBegin = &noBegin;
120 tess->callEdgeFlag = &noEdgeFlag;
121 tess->callVertex = &noVertex;
122 tess->callEnd = &noEnd;
124 tess->callError = &noError;
125 tess->callCombine = &noCombine;
126 tess->callMesh = &noMesh;
128 tess->callBeginData= &__gl_noBeginData;
129 tess->callEdgeFlagData= &__gl_noEdgeFlagData;
130 tess->callVertexData= &__gl_noVertexData;
131 tess->callEndData= &__gl_noEndData;
132 tess->callErrorData= &__gl_noErrorData;
133 tess->callCombineData= &__gl_noCombineData;
135 tess->polygonData= NULL;
137 return tess;
140 static void MakeDormant( GLUtesselator *tess )
144 if( tess->mesh != NULL ) {
145 __gl_meshDeleteMesh( tess->mesh );
147 tess->state = T_DORMANT;
148 tess->lastEdge = NULL;
149 tess->mesh = NULL;
152 #define RequireState( tess, s ) if( tess->state != s ) GotoState(tess,s)
154 static void GotoState( GLUtesselator *tess, enum TessState newState )
156 while( tess->state != newState ) {
160 if( tess->state < newState ) {
161 switch( tess->state ) {
164 gluTessBeginPolygon( tess, NULL );
168 gluTessBeginContour( tess );
174 switch( tess->state ) {
177 gluTessEndContour( tess );
181 /* gluTessEndPolygon( tess ) is too much work! */
182 MakeDormant( tess );
193 gluDeleteTess( GLUtesselator *tess )
195 RequireState( tess, T_DORMANT );
196 memFree( tess );
201 gluTessProperty( GLUtesselator *tess, GLenum which, GLdouble value )
208 tess->relTolerance = value;
221 tess->windingRule = windingRule;
228 tess->boundaryOnly = (value != 0);
240 gluGetTessProperty( GLUtesselator *tess, GLenum which, GLdouble *value )
245 assert(0.0 <= tess->relTolerance && tess->relTolerance <= 1.0);
246 *value= tess->relTolerance;
249 assert(tess->windingRule == GLU_TESS_WINDING_ODD ||
250 tess->windingRule == GLU_TESS_WINDING_NONZERO ||
251 tess->windingRule == GLU_TESS_WINDING_POSITIVE ||
252 tess->windingRule == GLU_TESS_WINDING_NEGATIVE ||
253 tess->windingRule == GLU_TESS_WINDING_ABS_GEQ_TWO);
254 *value= tess->windingRule;
257 assert(tess->boundaryOnly == TRUE || tess->boundaryOnly == FALSE);
258 *value= tess->boundaryOnly;
268 gluTessNormal( GLUtesselator *tess, GLdouble x, GLdouble y, GLdouble z )
270 tess->normal[0] = x;
271 tess->normal[1] = y;
272 tess->normal[2] = z;
276 gluTessCallback( GLUtesselator *tess, GLenum which, _GLUfuncptr fn)
280 tess->callBegin = (fn == NULL) ? &noBegin : (void (GLAPIENTRY *)(GLenum)) fn;
283 tess->callBeginData = (fn == NULL) ?
287 tess->callEdgeFlag = (fn == NULL) ? &noEdgeFlag :
292 tess->flagBoundary = (fn != NULL);
295 tess->callEdgeFlagData= (fn == NULL) ?
300 tess->flagBoundary = (fn != NULL);
303 tess->callVertex = (fn == NULL) ? &noVertex :
307 tess->callVertexData = (fn == NULL) ?
311 tess->callEnd = (fn == NULL) ? &noEnd : (void (GLAPIENTRY *)(void)) fn;
314 tess->callEndData = (fn == NULL) ? &__gl_noEndData :
318 tess->callError = (fn == NULL) ? &noError : (void (GLAPIENTRY *)(GLenum)) fn;
321 tess->callErrorData = (fn == NULL) ?
325 tess->callCombine = (fn == NULL) ? &noCombine :
329 tess->callCombineData = (fn == NULL) ? &__gl_noCombineData :
337 tess->callMesh = (fn == NULL) ? &noMesh : (void (GLAPIENTRY *)(GLUmesh *)) fn;
345 static int AddVertex( GLUtesselator *tess, GLdouble coords[3], void *data )
349 e = tess->lastEdge;
353 e = __gl_meshMakeEdge( tess->mesh );
378 tess->lastEdge = e;
384 static void CacheVertex( GLUtesselator *tess, GLdouble coords[3], void *data )
386 CachedVertex *v = &tess->cache[tess->cacheCount];
392 ++tess->cacheCount;
396 static int EmptyCache( GLUtesselator *tess )
398 CachedVertex *v = tess->cache;
401 tess->mesh = __gl_meshNewMesh();
402 if (tess->mesh == NULL) return 0;
404 for( vLast = v + tess->cacheCount; v < vLast; ++v ) {
405 if ( !AddVertex( tess, v->coords, v->data ) ) return 0;
407 tess->cacheCount = 0;
408 tess->emptyCache = FALSE;
415 gluTessVertex( GLUtesselator *tess, GLdouble coords[3], void *data )
420 RequireState( tess, T_IN_CONTOUR );
422 if( tess->emptyCache ) {
423 if ( !EmptyCache( tess ) ) {
427 tess->lastEdge = NULL;
445 if( tess->mesh == NULL ) {
446 if( tess->cacheCount < TESS_MAX_CACHE ) {
447 CacheVertex( tess, clamped, data );
450 if ( !EmptyCache( tess ) ) {
455 if ( !AddVertex( tess, clamped, data ) ) {
462 gluTessBeginPolygon( GLUtesselator *tess, void *data )
464 RequireState( tess, T_DORMANT );
466 tess->state = T_IN_POLYGON;
467 tess->cacheCount = 0;
468 tess->emptyCache = FALSE;
469 tess->mesh = NULL;
471 tess->polygonData= data;
476 gluTessBeginContour( GLUtesselator *tess )
478 RequireState( tess, T_IN_POLYGON );
480 tess->state = T_IN_CONTOUR;
481 tess->lastEdge = NULL;
482 if( tess->cacheCount > 0 ) {
487 tess->emptyCache = TRUE;
493 gluTessEndContour( GLUtesselator *tess )
495 RequireState( tess, T_IN_CONTOUR );
496 tess->state = T_IN_POLYGON;
500 gluTessEndPolygon( GLUtesselator *tess )
504 if (setjmp(tess->env) != 0) {
510 RequireState( tess, T_IN_POLYGON );
511 tess->state = T_DORMANT;
513 if( tess->mesh == NULL ) {
514 if( ! tess->flagBoundary && tess->callMesh == &noMesh ) {
521 if( __gl_renderCache( tess )) {
522 tess->polygonData= NULL;
526 if ( !EmptyCache( tess ) ) longjmp(tess->env,1); /* could've used a label*/
532 __gl_projectPolygon( tess );
534 /* __gl_computeInterior( tess ) computes the planar arrangement specified
537 * to the polygon, according to the rule given by tess->windingRule.
540 if ( !__gl_computeInterior( tess ) ) {
541 longjmp(tess->env,1); /* could've used a label */
544 mesh = tess->mesh;
545 if( ! tess->fatalError ) {
552 if( tess->boundaryOnly ) {
557 if (rc == 0) longjmp(tess->env,1); /* could've used a label */
561 if( tess->callBegin != &noBegin || tess->callEnd != &noEnd
562 || tess->callVertex != &noVertex || tess->callEdgeFlag != &noEdgeFlag
563 || tess->callBeginData != &__gl_noBeginData
564 || tess->callEndData != &__gl_noEndData
565 || tess->callVertexData != &__gl_noVertexData
566 || tess->callEdgeFlagData != &__gl_noEdgeFlagData )
568 if( tess->boundaryOnly ) {
569 __gl_renderBoundary( tess, mesh ); /* output boundary contours */
571 __gl_renderMesh( tess, mesh ); /* output strips and fans */
574 if( tess->callMesh != &noMesh ) {
583 (*tess->callMesh)( mesh ); /* user wants the mesh itself */
584 tess->mesh = NULL;
585 tess->polygonData= NULL;
590 tess->polygonData= NULL;
591 tess->mesh = NULL;
611 gluBeginPolygon( GLUtesselator *tess )
613 gluTessBeginPolygon( tess, NULL );
614 gluTessBeginContour( tess );
620 gluNextContour( GLUtesselator *tess, GLenum type )
622 gluTessEndContour( tess );
623 gluTessBeginContour( tess );
628 gluEndPolygon( GLUtesselator *tess )
630 gluTessEndContour( tess );
631 gluTessEndPolygon( tess );