Added tessellation winding rule support. Misc bug fixes.
authorGareth Hughes <gareth@valinux.com>
Sun, 3 Oct 1999 00:56:07 +0000 (00:56 +0000)
committerGareth Hughes <gareth@valinux.com>
Sun, 3 Oct 1999 00:56:07 +0000 (00:56 +0000)
src/glu/mesa/tess.c
src/glu/mesa/tess.h

index 3619761930692c0c0c3e5478c42301cca8f4602a..9348f96f7acd10ea1e3ae077813626b55a30bafc 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: tess.c,v 1.9 1999/09/17 06:34:46 gareth Exp $ */
+/* $Id: tess.c,v 1.10 1999/10/03 00:56:07 gareth Exp $ */
 
 /*
  * Mesa 3-D graphics library
  * Version:  3.1
- * 
+ *
  * Copyright (C) 1999  Brian Paul   All Rights Reserved.
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
@@ -26,6 +26,9 @@
 
 /*
  * $Log: tess.c,v $
+ * Revision 1.10  1999/10/03 00:56:07  gareth
+ * Added tessellation winding rule support.  Misc bug fixes.
+ *
  * Revision 1.9  1999/09/17 06:34:46  gareth
  * Winding rule updates.
  *
@@ -124,6 +127,8 @@ GLUtesselator* GLAPIENTRY gluNewTess( void )
     tobj->grid = NULL;
 #endif
     tobj->cvc_lists = NULL;
+    tobj->user_data = NULL;
+    tobj->label = 0;
 
     tobj->error = GLU_NO_ERROR;
 
@@ -143,7 +148,7 @@ void GLAPIENTRY gluDeleteTess( GLUtesselator *tobj )
     {
        /* gluEndPolygon was not called. */
        DEBUGP( 0, ( "*** error 3 ***\n" ) );
-       tess_error_callback( tobj, GLU_TESS_ERROR3, NULL );
+       tess_error_callback( tobj, GLU_TESS_ERROR3 );
     }
 
     /* Delete all internal structures. */
@@ -167,11 +172,13 @@ void GLAPIENTRY gluTessBeginPolygon( GLUtesselator *tobj, void *polygon_data )
     {
        /* gluEndPolygon was not called. */
        DEBUGP( 0, ( "*** error 3 ***\n" ) );
-       tess_error_callback( tobj, GLU_TESS_ERROR3, NULL );
+       tess_error_callback( tobj, GLU_TESS_ERROR3 );
 
        tess_cleanup( tobj );
     }
 
+    tobj->user_data = polygon_data;
+
     DEBUGP( 3, ( "<- gluTessBeginPolygon( tobj:%p data:%p )\n", tobj, polygon_data ) );
 }
 
@@ -188,7 +195,7 @@ void GLAPIENTRY gluTessBeginContour( GLUtesselator *tobj )
     {
        /* gluTessEndContour was not called. */
        DEBUGP( 0, ( "*** error 4 ***\n" ) );
-       tess_error_callback( tobj, GLU_TESS_ERROR4, NULL );
+       tess_error_callback( tobj, GLU_TESS_ERROR4 );
        return;
     }
 
@@ -196,7 +203,7 @@ void GLAPIENTRY gluTessBeginContour( GLUtesselator *tobj )
           (tess_contour_t *) malloc( sizeof(tess_contour_t) ) ) == NULL )
     {
        DEBUGP( 0, ( "*** memory error ***\n" ) );
-       tess_error_callback( tobj, GLU_OUT_OF_MEMORY, NULL );
+       tess_error_callback( tobj, GLU_OUT_OF_MEMORY );
        return;
     }
 
@@ -241,7 +248,7 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3],
     {
        /* gluTessBeginContour was not called. */
        DEBUGP( 0, ( "*** error 2 ***\n" ) );
-       tess_error_callback( tobj, GLU_TESS_ERROR2, NULL );
+       tess_error_callback( tobj, GLU_TESS_ERROR2 );
        return;
     }
 
@@ -255,7 +262,7 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3],
               malloc( sizeof(tess_vertex_t) ) ) == NULL )
        {
            DEBUGP( 0, ( "*** memory error ***\n" ) );
-           tess_error_callback( tobj, GLU_OUT_OF_MEMORY, NULL );
+           tess_error_callback( tobj, GLU_OUT_OF_MEMORY );
            return;
        }
 
@@ -271,6 +278,7 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3],
 
        last_vertex->angle = 0.0;
        last_vertex->label = 0;
+       last_vertex->mark = 0;
 
        last_vertex->next = NULL;
        last_vertex->previous = NULL;
@@ -285,7 +293,7 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3],
               malloc( sizeof(tess_vertex_t) ) ) == NULL )
        {
            DEBUGP( 0, ( "*** memory error ***\n" ) );
-           tess_error_callback( tobj, GLU_OUT_OF_MEMORY, NULL );
+           tess_error_callback( tobj, GLU_OUT_OF_MEMORY );
            return;
        }
 
@@ -298,6 +306,7 @@ void GLAPIENTRY gluTessVertex( GLUtesselator *tobj, GLdouble coords[3],
 
        vertex->angle = 0.0;
        vertex->label = 0;
+       vertex->mark = 0;
 
        vertex->next = NULL;
        vertex->previous = last_vertex;
@@ -326,7 +335,7 @@ void GLAPIENTRY gluTessEndContour( GLUtesselator *tobj )
     {
        /* gluTessBeginContour was not called. */
        DEBUGP( 0, ( "*** error 2 ***\n" ) );
-       tess_error_callback( tobj, GLU_TESS_ERROR2, NULL );
+       tess_error_callback( tobj, GLU_TESS_ERROR2 );
        return;
     }
 
@@ -357,7 +366,7 @@ void GLAPIENTRY gluTessEndPolygon( GLUtesselator *tobj )
     {
        /* gluTessBeginPolygon was not called. */
        DEBUGP( 0, ( "*** error 1 ***\n" ) );
-       tess_error_callback( tobj, GLU_TESS_ERROR1, NULL );
+       tess_error_callback( tobj, GLU_TESS_ERROR1 );
        return;
     }
     TESS_CHECK_ERRORS( tobj );
@@ -590,12 +599,12 @@ void GLAPIENTRY gluEndPolygon( GLUtesselator *tobj )
  * tess_error_callback
  *
  * Internal error handler.  Call the user-registered error callback.
+ *
+ * 2nd arg changed from 'errno' to 'errnum' since MSVC defines errnum as
+ *  a macro (of all things) and thus breaks the build -tjump
  *****************************************************************************/
 
-/* 2nd arg changed from 'errno' to 'errnum' since MSVC defines errnum as */
-/* a macro (of all things) and thus breaks the build -tjump              */
-
-void tess_error_callback( GLUtesselator *tobj, GLenum errnum, void *data )
+void tess_error_callback( GLUtesselator *tobj, GLenum errnum )
 {
     if ( tobj->error == GLU_NO_ERROR )
     {
@@ -604,7 +613,7 @@ void tess_error_callback( GLUtesselator *tobj, GLenum errnum, void *data )
 
     if ( tobj->callbacks.errorData != NULL )
     {
-       ( tobj->callbacks.errorData )( errnum, data );
+       ( tobj->callbacks.errorData )( errnum, tobj->user_data );
     }
     else if ( tobj->callbacks.error != NULL )
     {
@@ -737,7 +746,7 @@ static GLenum find_normal( GLUtesselator *tobj )
 
     if ( vb == va ) {
        DEBUGP( 0, ( "*** error 7 ***\n" ) );
-       tess_error_callback( tobj, GLU_TESS_ERROR7, NULL );
+       tess_error_callback( tobj, GLU_TESS_ERROR7 );
     }
 
     SUB_3V( a, vb->coords, va->coords );
@@ -762,7 +771,7 @@ static GLenum find_normal( GLUtesselator *tobj )
        }
     }
     DEBUGP( 0, ( "*** error 7 ***\n" ) );
-    tess_error_callback( tobj, GLU_TESS_ERROR7, NULL );
+    tess_error_callback( tobj, GLU_TESS_ERROR7 );
 
     return GLU_ERROR;
 }
@@ -963,7 +972,9 @@ static void delete_all_contours( GLUtesselator *tobj )
            free( vertex );
            vertex = next_vertex;
        }
-       free( vertex );
+       if ( vertex ) {
+           free( vertex );
+       }
        next_contour = current->next;
 
        free( current );
@@ -981,11 +992,12 @@ static void delete_all_contours( GLUtesselator *tobj )
 
 
 
+#ifdef DEBUG
+
 /*****************************************************************************
  * Debugging output
  *****************************************************************************/
-#ifdef DEBUG
-int    tess_debug_level = 0;
+int    tess_debug_level = -1;
 
 int vdebugstr( char *format_str, ... )
 {
@@ -996,4 +1008,5 @@ int vdebugstr( char *format_str, ... )
     va_end( ap );
     return 0;
 }
+
 #endif
index c9fb9129d095d35f8c59990979dd0852a9111929..92b8a4131cef62eed1176fd4a9e0b74f97eecf80 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: tess.h,v 1.8 1999/09/17 06:31:02 gareth Exp $ */
+/* $Id: tess.h,v 1.9 1999/10/03 00:56:07 gareth Exp $ */
 
 /*
  * Mesa 3-D graphics library
  * Version:  3.1
- * 
+ *
  * Copyright (C) 1999  Brian Paul   All Rights Reserved.
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
@@ -26,6 +26,9 @@
 
 /*
  * $Log: tess.h,v $
+ * Revision 1.9  1999/10/03 00:56:07  gareth
+ * Added tessellation winding rule support.  Misc bug fixes.
+ *
  * Revision 1.8  1999/09/17 06:31:02  gareth
  * Winding rule updates.
  *
@@ -89,6 +92,8 @@ struct GLUtesselator
 #endif
     heap_t             *ears;
     hashtable_t                *cvc_lists;
+    void               *user_data;
+    GLuint             label;
     GLenum             error;
 };
 
@@ -96,7 +101,7 @@ struct GLUtesselator
 /*****************************************************************************
  * Tessellation error handler:
  *****************************************************************************/
-extern void tess_error_callback( GLUtesselator *, GLenum, void * );
+extern void tess_error_callback( GLUtesselator *, GLenum );
 
 
 /*****************************************************************************
@@ -107,7 +112,7 @@ extern      int     tess_debug_level;
 int vdebugstr( char *format_str, ... );
 
 #pragma message( "tess: using DEBUGP for debugging output" )
-#define DEBUGP(level, body)                                            \
+#define DEBUGP( level, body )                                          \
     do {                                                               \
        if ( tess_debug_level >= level ) {                              \
            vdebugstr( "%11.11s:%-5d ", __FILE__, __LINE__, level );    \
@@ -115,12 +120,15 @@ int vdebugstr( char *format_str, ... );
            fflush( stderr );                                           \
        }                                                               \
     } while ( 0 )
-#define DEBUGIF(level)          do { if ( tess_debug_level >= level ) {
-#define DEBUGENDIF              } } while ( 0 )
+#define DEBUGIF( level )       do { if ( tess_debug_level >= level ) {
+#define DEBUGENDIF             } } while ( 0 )
+
 #else
-#define DEBUGP(level, body)
-#define DEBUGIF(level)         while(0) {
+
+#define DEBUGP( level, body )
+#define DEBUGIF( level )       while(0) {
 #define DEBUGENDIF             }
+
 #endif
 
 #ifdef __cplusplus