diff options
-rw-r--r-- | src/glu/mesa/tess.c | 139 | ||||
-rw-r--r-- | src/glu/mesa/tess.h | 44 |
2 files changed, 96 insertions, 87 deletions
diff --git a/src/glu/mesa/tess.c b/src/glu/mesa/tess.c index 48b7a6c4c6d..7c77395689a 100644 --- a/src/glu/mesa/tess.c +++ b/src/glu/mesa/tess.c @@ -1,4 +1,4 @@ -/* $Id: tess.c,v 1.18 1999/10/14 07:44:41 gareth Exp $ */ +/* $Id: tess.c,v 1.19 1999/11/04 04:07:57 gareth Exp $ */ /* * Mesa 3-D graphics library @@ -51,11 +51,15 @@ static void init_callbacks( tess_callbacks_t *callbacks ); static void tess_cleanup( GLUtesselator *tobj ); static void inspect_current_contour( GLUtesselator *tobj ); -static void delete_current_contour( GLUtesselator *tobj ); +void delete_contour( tess_contour_t **contour ); static void delete_all_contours( GLUtesselator *tobj ); #define TESS_CHECK_ERRORS(t) if ( (t)->error != GLU_NO_ERROR ) goto cleanup +#ifdef DEBUG +GLint tess_dbg_level; +#endif + /***************************************************************************** * @@ -71,7 +75,15 @@ GLUtesselator* GLAPIENTRY gluNewTess( void ) { GLUtesselator *tobj; - DEBUGP( 15, ( "-> gluNewTess()\n" ) ); +#ifdef DEBUG + if ( getenv( "GLU_TESS_DBG_LEVEL" ) ) { + tess_dbg_level = atoi( getenv( "GLU_TESS_DBG_LEVEL" ) ); + } else { + tess_dbg_level = DBG_LEVEL_BASE; + } +#endif + + MSG( 15, "-> gluNewTess()\n" ); tobj = malloc( sizeof(GLUtesselator) ); if ( tobj == NULL ) { @@ -107,7 +119,7 @@ GLUtesselator* GLAPIENTRY gluNewTess( void ) tobj->error = GLU_NO_ERROR; - DEBUGP( 15, ( "<- gluNewTess() tobj:%p\n", tobj ) ); + MSG( 15, "<- gluNewTess() tobj:%p\n", tobj ); return tobj; } @@ -117,12 +129,11 @@ GLUtesselator* GLAPIENTRY gluNewTess( void ) *****************************************************************************/ void GLAPIENTRY gluDeleteTess( GLUtesselator *tobj ) { - DEBUGP( 15, ( "-> gluDeleteTess( tobj:%p )\n", tobj ) ); + MSG( 15, "-> gluDeleteTess( tobj:%p )\n", tobj ); - if ( tobj->error == GLU_NO_ERROR && ( tobj->contour_count > 0 ) ) + if ( ( tobj->error == GLU_NO_ERROR ) && ( tobj->contour_count > 0 ) ) { /* gluEndPolygon was not called. */ - DEBUGP( 0, ( "*** error 3 ***\n" ) ); tess_error_callback( tobj, GLU_TESS_ERROR3 ); } @@ -130,7 +141,7 @@ void GLAPIENTRY gluDeleteTess( GLUtesselator *tobj ) tess_cleanup( tobj ); free( tobj ); - DEBUGP( 15, ( "<- gluDeleteTess()\n" ) ); + MSG( 15, "<- gluDeleteTess()\n" ); } @@ -139,16 +150,14 @@ void GLAPIENTRY gluDeleteTess( GLUtesselator *tobj ) *****************************************************************************/ void GLAPIENTRY gluTessBeginPolygon( GLUtesselator *tobj, void *polygon_data ) { - DEBUGP( 15, ( "-> gluTessBeginPolygon( tobj:%p data:%p )\n", tobj, polygon_data ) ); + MSG( 15, "-> gluTessBeginPolygon( tobj:%p data:%p )\n", tobj, polygon_data ); tobj->error = GLU_NO_ERROR; if ( tobj->current_contour != NULL ) { /* gluEndPolygon was not called. */ - DEBUGP( 0, ( "*** error 3 ***\n" ) ); tess_error_callback( tobj, GLU_TESS_ERROR3 ); - tess_cleanup( tobj ); } @@ -157,7 +166,7 @@ void GLAPIENTRY gluTessBeginPolygon( GLUtesselator *tobj, void *polygon_data ) tobj->edge_flag = GL_FALSE; tobj->label = 0; - DEBUGP( 15, ( "<- gluTessBeginPolygon( tobj:%p data:%p )\n", tobj, polygon_data ) ); + MSG( 15, "<- gluTessBeginPolygon( tobj:%p data:%p )\n", tobj, polygon_data ); } @@ -166,13 +175,12 @@ void GLAPIENTRY gluTessBeginPolygon( GLUtesselator *tobj, void *polygon_data ) *****************************************************************************/ void GLAPIENTRY gluTessBeginContour( GLUtesselator *tobj ) { - DEBUGP( 15, ( " -> gluTessBeginContour( tobj:%p )\n", tobj ) ); + MSG( 15, " -> gluTessBeginContour( tobj:%p )\n", tobj ); TESS_CHECK_ERRORS( tobj ); if ( tobj->current_contour != NULL ) { /* gluTessEndContour was not called. */ - DEBUGP( 0, ( "*** error 4 ***\n" ) ); tess_error_callback( tobj, GLU_TESS_ERROR4 ); return; } @@ -205,7 +213,7 @@ void GLAPIENTRY gluTessBeginContour( GLUtesselator *tobj ) tobj->current_contour->cross_vertices = hashtable_init( HT_DEFAULT_SIZE ); cleanup: - DEBUGP( 15, ( " <- gluTessBeginContour( tobj:%p )\n", tobj ) ); + MSG( 15, " <- gluTessBeginContour( tobj:%p )\n", tobj ); return; } @@ -219,13 +227,12 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3], tess_contour_t *current = tobj->current_contour; tess_vertex_t *last_vertex; - DEBUGP( 15, ( " -> gluTessVertex( tobj:%p coords:(%.2f,%.2f,%.2f) )\n", tobj, coords[0], coords[1], coords[2] ) ); + MSG( 15, " -> gluTessVertex( tobj:%p coords:(%.2f,%.2f,%.2f) )\n", tobj, coords[0], coords[1], coords[2] ); TESS_CHECK_ERRORS( tobj ); if ( current == NULL ) { /* gluTessBeginContour was not called. */ - DEBUGP( 0, ( "*** error 2 ***\n" ) ); tess_error_callback( tobj, GLU_TESS_ERROR2 ); return; } @@ -292,7 +299,7 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3], } cleanup: - DEBUGP( 15, ( " <- gluTessVertex( tobj:%p )\n", tobj ) ); + MSG( 15, " <- gluTessVertex( tobj:%p )\n", tobj ); return; } @@ -302,13 +309,12 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3], *****************************************************************************/ void GLAPIENTRY gluTessEndContour( GLUtesselator *tobj ) { - DEBUGP( 15, ( " -> gluTessEndContour( tobj:%p )\n", tobj ) ); + MSG( 15, " -> gluTessEndContour( tobj:%p )\n", tobj ); TESS_CHECK_ERRORS( tobj ); if ( tobj->current_contour == NULL ) { /* gluTessBeginContour was not called. */ - DEBUGP( 0, ( "*** error 2 ***\n" ) ); tess_error_callback( tobj, GLU_TESS_ERROR2 ); return; } @@ -316,11 +322,11 @@ void GLAPIENTRY gluTessEndContour( GLUtesselator *tobj ) if ( tobj->current_contour->vertex_count > 0 ) { inspect_current_contour( tobj ); } else { - delete_current_contour( tobj ); + delete_contour( &tobj->current_contour ); } cleanup: - DEBUGP( 15, ( " <- gluTessEndContour( tobj:%p )\n", tobj ) ); + MSG( 15, " <- gluTessEndContour( tobj:%p )\n", tobj ); return; } @@ -330,13 +336,12 @@ void GLAPIENTRY gluTessEndContour( GLUtesselator *tobj ) *****************************************************************************/ void GLAPIENTRY gluTessEndPolygon( GLUtesselator *tobj ) { - DEBUGP( 15, ( "-> gluTessEndPolygon( tobj:%p )\n", tobj ) ); + MSG( 15, "-> gluTessEndPolygon( tobj:%p )\n", tobj ); TESS_CHECK_ERRORS( tobj ); if ( tobj->current_contour != NULL ) { /* gluTessBeginPolygon was not called. */ - DEBUGP( 0, ( "*** error 1 ***\n" ) ); tess_error_callback( tobj, GLU_TESS_ERROR1 ); return; } @@ -375,7 +380,7 @@ void GLAPIENTRY gluTessEndPolygon( GLUtesselator *tobj ) cleanup: delete_all_contours( tobj ); - DEBUGP( 15, ( "<- gluTessEndPolygon( tobj:%p )\n", tobj ) ); + MSG( 15, "<- gluTessEndPolygon( tobj:%p )\n", tobj ); } @@ -441,7 +446,7 @@ void GLAPIENTRY gluTessCallback( GLUtesselator *tobj, GLenum which, break; default: - DEBUGP( 0, ( " gluTessCallback( tobj:%p which:%d ) invalid enum\n", tobj, which ) ); + MSG( 1, " gluTessCallback( tobj:%p which:%d ) invalid enum\n", tobj, which ); tobj->error = GLU_INVALID_ENUM; break; } @@ -463,7 +468,7 @@ void GLAPIENTRY gluTessProperty( GLUtesselator *tobj, GLenum which, break; case GLU_TESS_TOLERANCE: - DEBUGP( 15, ( " gluTessProperty( tobj:%p ) tolerance: %0.9f\n", tobj, value ) ); + MSG( 15, " gluTessProperty( tobj:%p ) tolerance: %0.9f\n", tobj, value ); tobj->tolerance = value; break; @@ -472,7 +477,7 @@ void GLAPIENTRY gluTessProperty( GLUtesselator *tobj, GLenum which, break; default: - DEBUGP( 0, ( " gluTessProperty( tobj:%p which:%d ) invalid enum\n", tobj, which ) ); + MSG( 1, " gluTessProperty( tobj:%p which:%d ) invalid enum\n", tobj, which ); tobj->error = GLU_INVALID_ENUM; break; } @@ -502,7 +507,7 @@ void GLAPIENTRY gluGetTessProperty( GLUtesselator *tobj, GLenum which, break; default: - DEBUGP( 0, ( " gluGetTessProperty( tobj:%p which:%d ) invalid enum\n", tobj, which ) ); + MSG( 1, " gluGetTessProperty( tobj:%p which:%d ) invalid enum\n", tobj, which ); tobj->error = GLU_INVALID_ENUM; break; } @@ -517,7 +522,7 @@ void GLAPIENTRY gluGetTessProperty( GLUtesselator *tobj, GLenum which, void GLAPIENTRY gluTessNormal( GLUtesselator *tobj, GLdouble x, GLdouble y, GLdouble z ) { - DEBUGP( 15, ( " gluTessNormal( tobj:%p n:(%.2f,%.2f,%.2f) )\n", tobj, x, y, z ) ); + MSG( 15, " gluTessNormal( tobj:%p n:(%.2f,%.2f,%.2f) )\n", tobj, x, y, z ); tobj->plane.normal[X] = x; tobj->plane.normal[Y] = y; @@ -615,16 +620,16 @@ static void init_callbacks( tess_callbacks_t *callbacks ) *****************************************************************************/ static void tess_cleanup( GLUtesselator *tobj ) { - DEBUGP( 15, ( " -> tess_cleanup( tobj:%p )\n", tobj ) ); + MSG( 15, " -> tess_cleanup( tobj:%p )\n", tobj ); if ( tobj->current_contour != NULL ) { - delete_current_contour( tobj ); + delete_contour( &tobj->current_contour ); } if ( tobj->contours != NULL ) { delete_all_contours( tobj ); } - DEBUGP( 15, ( " <- tess_cleanup( tobj:%p )\n", tobj ) ); + MSG( 15, " <- tess_cleanup( tobj:%p )\n", tobj ); } @@ -640,12 +645,12 @@ static void inspect_current_contour( GLUtesselator *tobj ) tess_contour_t *current = tobj->current_contour; GLdouble origin[3] = { 0.0, 0.0, 0.0 }; - DEBUGP( 15, ( " -> inspect_current_contour( tobj:%p )\n", tobj ) ); + MSG( 15, " -> inspect_current_contour( tobj:%p )\n", tobj ); if ( current->vertex_count < 3 ) { - DEBUGP( 15, ( " count %d < 3, deleting\n", current->vertex_count ) ); - delete_current_contour( tobj ); + MSG( 15, " count %d < 3, deleting\n", current->vertex_count ); + delete_contour( &tobj->current_contour ); return; } @@ -664,7 +669,7 @@ static void inspect_current_contour( GLUtesselator *tobj ) } else { - DEBUGP( 15, ( " normal: (%.2f,%.2f,%.2f)\n", tobj->plane.normal[X], tobj->plane.normal[Y], tobj->plane.normal[Z] ) ); + MSG( 15, " normal: (%.2f,%.2f,%.2f)\n", tobj->plane.normal[X], tobj->plane.normal[Y], tobj->plane.normal[Z] ); } project_current_contour( tobj ); @@ -673,7 +678,7 @@ static void inspect_current_contour( GLUtesselator *tobj ) return; } - DEBUGP( 15, ( " <- inspect_current_contour( tobj:%p )\n", tobj ) ); + MSG( 15, " <- inspect_current_contour( tobj:%p )\n", tobj ); } /***************************************************************************** @@ -685,7 +690,7 @@ static GLenum find_normal( GLUtesselator *tobj ) tess_vertex_t *va, *vb, *vc; GLdouble a[3], b[3], c[3]; - DEBUGP( 15, ( " -> find_normal( tobj:%p )\n", tobj ) ); + MSG( 15, " -> find_normal( tobj:%p )\n", tobj ); if ( contour == NULL ) { return GLU_ERROR; } @@ -699,7 +704,7 @@ static GLenum find_normal( GLUtesselator *tobj ) } if ( vb == va ) { - DEBUGP( 0, ( "*** error 7 ***\n" ) ); + /* FIXME: What error is this? */ tess_error_callback( tobj, GLU_TESS_ERROR7 ); } @@ -720,11 +725,11 @@ static GLenum find_normal( GLUtesselator *tobj ) contour->plane.dist = - DOT3( contour->plane.normal, va->coords ); - DEBUGP( 15, ( " <- find_normal( tobj:%p ) n: (%.2f,%.2f,%.2f)\n", tobj, contour->plane.normal[X], contour->plane.normal[Y], contour->plane.normal[Z] ) ); + MSG( 15, " <- find_normal( tobj:%p ) n: (%.2f,%.2f,%.2f)\n", tobj, contour->plane.normal[X], contour->plane.normal[Y], contour->plane.normal[Z] ); return GLU_NO_ERROR; } } - DEBUGP( 0, ( "*** error 7 ***\n" ) ); + /* FIXME: What error is this? */ tess_error_callback( tobj, GLU_TESS_ERROR7 ); return GLU_ERROR; @@ -745,7 +750,7 @@ static void project_current_contour( GLUtesselator *tobj ) GLdouble dot, rotx, roty; GLuint i; - DEBUGP( 15, ( " -> project_current_contour( tobj:%p )\n", tobj ) ); + MSG( 15, " -> project_current_contour( tobj:%p )\n", tobj ); if ( current == NULL ) { return; } @@ -807,7 +812,7 @@ static void project_current_contour( GLUtesselator *tobj ) current->area = -area; } - DEBUGP( 15, ( " <- project_current_contour( tobj:%p )\n", tobj ) ); + MSG( 15, " <- project_current_contour( tobj:%p )\n", tobj ); } /***************************************************************************** @@ -881,25 +886,28 @@ static GLenum save_current_contour( GLUtesselator *tobj ) } /***************************************************************************** - * delete_current_contour + * delete_contour + * + * Delete the given contour and set the pointer to NULL. *****************************************************************************/ -static void delete_current_contour( GLUtesselator *tobj ) +void delete_contour( tess_contour_t **contour ) { - tess_contour_t *current = tobj->current_contour; tess_vertex_t *vertex, *next; GLuint i; - if ( current == NULL ) { return; } + if ( *contour == NULL ) { return; } + + vertex = (*contour)->vertices; - for ( vertex = current->vertices, i = 0; i < current->vertex_count; i++) + for ( i = 0 ; i < (*contour)->vertex_count ; i++ ) { next = vertex->next; free( vertex ); vertex = next; } - free( current ); - tobj->current_contour = NULL; + free( *contour ); + *contour = NULL; } /***************************************************************************** @@ -907,11 +915,11 @@ static void delete_current_contour( GLUtesselator *tobj ) *****************************************************************************/ static void delete_all_contours( GLUtesselator *tobj ) { - tess_contour_t *current = tobj->current_contour, *next_contour; + tess_contour_t *current, *next_contour; GLuint i; - if ( current != NULL ) { - delete_current_contour( tobj ); + if ( tobj->current_contour != NULL ) { + delete_contour( &tobj->current_contour ); } for ( current = tobj->contours, i = 0 ; i < tobj->contour_count ; i++ ) @@ -941,22 +949,21 @@ static void delete_all_contours( GLUtesselator *tobj ) } - -#ifdef DEBUG - /***************************************************************************** - * Debugging output + * tess_msg *****************************************************************************/ -int tess_debug_level = 1; - -int vdebugstr( char *format_str, ... ) +INLINE void tess_msg( int level, char *format, ... ) { +#ifdef DEBUG va_list ap; - va_start( ap, format_str ); + va_start( ap, format ); - vfprintf( DEBUG_STREAM, format_str, ap ); - va_end( ap ); - return 0; -} + if ( level <= tess_dbg_level ) { + /*fprintf( DBG_STREAM, "%9.9s:%d:\t ", __FILE__, __LINE__ );*/ + vfprintf( DBG_STREAM, format, ap ); + fflush( DBG_STREAM ); + } + va_end( ap ); #endif +} diff --git a/src/glu/mesa/tess.h b/src/glu/mesa/tess.h index 9b221908a57..f28923e34f6 100644 --- a/src/glu/mesa/tess.h +++ b/src/glu/mesa/tess.h @@ -1,4 +1,4 @@ -/* $Id: tess.h,v 1.13 1999/10/13 19:12:47 gareth Exp $ */ +/* $Id: tess.h,v 1.14 1999/11/04 04:07:57 gareth Exp $ */ /* * Mesa 3-D graphics library @@ -39,6 +39,7 @@ #include "gluP.h" #include "tess_typedefs.h" +#include "tess_macros.h" #include "tess_hash.h" #include "tess_heap.h" #if 0 @@ -84,36 +85,37 @@ extern void tess_error_callback( GLUtesselator *, GLenum ); /***************************************************************************** - * Debugging output: (to be removed...) + * Debugging output: *****************************************************************************/ #ifdef DEBUG -extern int tess_debug_level; -int vdebugstr( char *format_str, ... ); +extern int tess_dbg_level; + +#define DBG_LEVEL_BASE 1 +#define DBG_LEVEL_VERBOSE 10 +#define DBG_LEVEL_ENTEREXIT 20 -#pragma message( "tess: using DEBUGP for debugging output" ) #ifdef _WIN32 -#define DEBUG_STREAM stdout +#define DBG_STREAM stdout #else -#define DEBUG_STREAM stderr +#define DBG_STREAM stderr #endif -#define DEBUGP( level, body ) \ - do { \ - if ( tess_debug_level >= level ) { \ - vdebugstr( "%11.11s:%-5d ", __FILE__, __LINE__, level ); \ - vdebugstr body; \ - fflush( DEBUG_STREAM ); \ - } \ - } while ( 0 ) -#define DEBUGIF( level ) do { if ( tess_debug_level >= level ) { -#define DEBUGENDIF } } while ( 0 ) +#ifdef __GNUC__ +#define MSG( level, format, args... ) \ + if ( level <= tess_dbg_level ) { \ + fprintf( DBG_STREAM, "%9.9s:%d:\t ", __FILE__, __LINE__ ); \ + fprintf( DBG_STREAM, format, ## args ); \ + fflush( DBG_STREAM ); \ + } #else +#define MSG tess_msg +#endif /* __GNUC__ */ -#define DEBUGP( level, body ) -#define DEBUGIF( level ) while(0) { -#define DEBUGENDIF } +#else +#define MSG tess_msg +#endif /* DEBUG */ -#endif +extern INLINE void tess_msg( int level, char *format, ... ); #ifdef __cplusplus } |