Home | History | Annotate | Download | only in libtess

Lines Matching defs:tess

39 ** $Header: //depot/main/gfx/lib/glu/libtess/tess.c#7 $
47 #include "tess.h"
96 GLUtesselator *tess;
105 tess = (GLUtesselator *)memAlloc( sizeof( GLUtesselator ));
106 if (tess == NULL) {
110 tess->state = T_DORMANT;
112 tess->normal[0] = 0;
113 tess->normal[1] = 0;
114 tess->normal[2] = 0;
116 tess->relTolerance = GLU_TESS_DEFAULT_TOLERANCE;
117 tess->windingRule = GLU_TESS_WINDING_ODD;
118 tess->flagBoundary = FALSE;
119 tess->boundaryOnly = FALSE;
121 tess->callBegin = &noBegin;
122 tess->callEdgeFlag = &noEdgeFlag;
123 tess->callVertex = &noVertex;
124 tess->callEnd = &noEnd;
126 tess->callError = &noError;
127 tess->callCombine = &noCombine;
128 tess->callMesh = &noMesh;
130 tess->callBeginData= &__gl_noBeginData;
131 tess->callEdgeFlagData= &__gl_noEdgeFlagData;
132 tess->callVertexData= &__gl_noVertexData;
133 tess->callEndData= &__gl_noEndData;
134 tess->callErrorData= &__gl_noErrorData;
135 tess->callCombineData= &__gl_noCombineData;
137 tess->polygonData= NULL;
139 return tess;
142 static void MakeDormant( GLUtesselator *tess )
146 if( tess->mesh != NULL ) {
147 __gl_meshDeleteMesh( tess->mesh );
149 tess->state = T_DORMANT;
150 tess->lastEdge = NULL;
151 tess->mesh = NULL;
154 #define RequireState( tess, s ) if( tess->state != s ) GotoState(tess,s)
156 static void GotoState( GLUtesselator *tess, enum TessState newState )
158 while( tess->state != newState ) {
162 if( tess->state < newState ) {
163 switch( tess->state ) {
166 gluTessBeginPolygon( tess, NULL );
170 gluTessBeginContour( tess );
177 switch( tess->state ) {
180 gluTessEndContour( tess );
184 /* gluTessEndPolygon( tess ) is too much work! */
185 MakeDormant( tess );
197 gluDeleteTess( GLUtesselator *tess )
199 RequireState( tess, T_DORMANT );
200 memFree( tess );
205 gluTessProperty( GLUtesselator *tess, GLenum which, GLdouble value )
212 tess->relTolerance = value;
225 tess->windingRule = windingRule;
232 tess->boundaryOnly = (value != 0);
244 gluGetTessProperty( GLUtesselator *tess, GLenum which, GLdouble *value )
249 assert(0.0 <= tess->relTolerance && tess->relTolerance <= 1.0);
250 *value= tess->relTolerance;
253 assert(tess->windingRule == GLU_TESS_WINDING_ODD ||
254 tess->windingRule == GLU_TESS_WINDING_NONZERO ||
255 tess->windingRule == GLU_TESS_WINDING_POSITIVE ||
256 tess->windingRule == GLU_TESS_WINDING_NEGATIVE ||
257 tess->windingRule == GLU_TESS_WINDING_ABS_GEQ_TWO);
258 *value= tess->windingRule;
261 assert(tess->boundaryOnly == TRUE || tess->boundaryOnly == FALSE);
262 *value= tess->boundaryOnly;
272 gluTessNormal( GLUtesselator *tess, GLdouble x, GLdouble y, GLdouble z )
274 tess->normal[0] = x;
275 tess->normal[1] = y;
276 tess->normal[2] = z;
280 gluTessCallback( GLUtesselator *tess, GLenum which, void (GLAPIENTRY *fn)())
284 tess->callBegin = (fn == NULL) ? &noBegin : (void (GLAPIENTRY *)(GLenum)) fn;
287 tess->callBeginData = (fn == NULL) ?
291 tess->callEdgeFlag = (fn == NULL) ? &noEdgeFlag :
296 tess->flagBoundary = (fn != NULL);
299 tess->callEdgeFlagData= (fn == NULL) ?
304 tess->flagBoundary = (fn != NULL);
307 tess->callVertex = (fn == NULL) ? &noVertex :
311 tess->callVertexData = (fn == NULL) ?
315 tess->callEnd = (fn == NULL) ? &noEnd : (void (GLAPIENTRY *)(void)) fn;
318 tess->callEndData = (fn == NULL) ? &__gl_noEndData :
322 tess->callError = (fn == NULL) ? &noError : (void (GLAPIENTRY *)(GLenum)) fn;
325 tess->callErrorData = (fn == NULL) ?
329 tess->callCombine = (fn == NULL) ? &noCombine :
333 tess->callCombineData = (fn == NULL) ? &__gl_noCombineData :
341 tess->callMesh = (fn == NULL) ? &noMesh : (void (GLAPIENTRY *)(GLUmesh *)) fn;
349 static int AddVertex( GLUtesselator *tess, GLdouble coords[3], void *data )
353 e = tess->lastEdge;
357 e = __gl_meshMakeEdge( tess->mesh );
382 tess->lastEdge = e;
388 static void CacheVertex( GLUtesselator *tess, GLdouble coords[3], void *data )
390 CachedVertex *v = &tess->cache[tess->cacheCount];
396 ++tess->cacheCount;
400 static int EmptyCache( GLUtesselator *tess )
402 CachedVertex *v = tess->cache;
405 tess->mesh = __gl_meshNewMesh();
406 if (tess->mesh == NULL) return 0;
408 for( vLast = v + tess->cacheCount; v < vLast; ++v ) {
409 if ( !AddVertex( tess, v->coords, v->data ) ) return 0;
411 tess->cacheCount = 0;
412 tess->emptyCache = FALSE;
419 gluTessVertex( GLUtesselator *tess, GLdouble coords[3], void *data )
424 RequireState( tess, T_IN_CONTOUR );
426 if( tess->emptyCache ) {
427 if ( !EmptyCache( tess ) ) {
431 tess->lastEdge = NULL;
449 if( tess->mesh == NULL ) {
450 if( tess->cacheCount < TESS_MAX_CACHE ) {
451 CacheVertex( tess, clamped, data );
454 if ( !EmptyCache( tess ) ) {
459 if ( !AddVertex( tess, clamped, data ) ) {
466 gluTessBeginPolygon( GLUtesselator *tess, void *data )
468 RequireState( tess, T_DORMANT );
470 tess->state = T_IN_POLYGON;
471 tess->cacheCount = 0;
472 tess->emptyCache = FALSE;
473 tess->mesh = NULL;
475 tess->polygonData= data;
480 gluTessBeginContour( GLUtesselator *tess )
482 RequireState( tess, T_IN_POLYGON );
484 tess->state = T_IN_CONTOUR;
485 tess->lastEdge = NULL;
486 if( tess->cacheCount > 0 ) {
491 tess->emptyCache = TRUE;
497 gluTessEndContour( GLUtesselator *tess )
499 RequireState( tess, T_IN_CONTOUR );
500 tess->state = T_IN_POLYGON;
504 gluTessEndPolygon( GLUtesselator *tess )
508 if (setjmp(tess->env) != 0) {
514 RequireState( tess, T_IN_POLYGON );
515 tess->state = T_DORMANT;
517 if( tess->mesh == NULL ) {
518 if( ! tess->flagBoundary && tess->callMesh == &noMesh ) {
525 if( __gl_renderCache( tess )) {
526 tess->polygonData= NULL;
530 if ( !EmptyCache( tess ) ) longjmp(tess->env,1); /* could've used a label*/
536 __gl_projectPolygon( tess );
538 /* __gl_computeInterior( tess ) computes the planar arrangement specified
541 * to the polygon, according to the rule given by tess->windingRule.
544 if ( !__gl_computeInterior( tess ) ) {
545 longjmp(tess->env,1); /* could've used a label */
548 mesh = tess->mesh;
549 if( ! tess->fatalError ) {
556 if( tess->boundaryOnly ) {
561 if (rc == 0) longjmp(tess->env,1); /* could've used a label */
565 if( tess->callBegin != &noBegin || tess->callEnd != &noEnd
566 || tess->callVertex != &noVertex || tess
567 || tess->callBeginData != &__gl_noBeginData
568 || tess->callEndData != &__gl_noEndData
569 || tess->callVertexData != &__gl_noVertexData
570 || tess->callEdgeFlagData != &__gl_noEdgeFlagData )
572 if( tess->boundaryOnly ) {
573 __gl_renderBoundary( tess, mesh ); /* output boundary contours */
575 __gl_renderMesh( tess, mesh ); /* output strips and fans */
578 if( tess->callMesh != &noMesh ) {
587 (*tess->callMesh)( mesh ); /* user wants the mesh itself */
588 tess->mesh = NULL;
589 tess->polygonData= NULL;
594 tess->polygonData= NULL;
595 tess->mesh = NULL;
616 gluBeginPolygon( GLUtesselator *tess )
618 gluTessBeginPolygon( tess, NULL );
619 gluTessBeginContour( tess );
625 gluNextContour( GLUtesselator *tess, GLenum type )
627 gluTessEndContour( tess );
628 gluTessBeginContour( tess );
633 gluEndPolygon( GLUtesselator *tess )
635 gluTessEndContour( tess );
636 gluTessEndPolygon( tess );