Merged 3.2 updates, namely combine callback for intersecting
contours.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: tessdemo.c,v 1.3 1999/11/04 04:00:42 gareth Exp $ */
|
/* $Id: tessdemo.c,v 1.4 2000/01/23 21:25:39 gareth Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A demo of the GLU polygon tesselation functions written by Bogdan Sikorski.
|
* A demo of the GLU polygon tesselation functions written by Bogdan Sikorski.
|
||||||
@@ -14,6 +14,13 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: tessdemo.c,v $
|
* $Log: tessdemo.c,v $
|
||||||
|
* Revision 1.4 2000/01/23 21:25:39 gareth
|
||||||
|
* Merged 3.2 updates, namely combine callback for intersecting
|
||||||
|
* contours.
|
||||||
|
*
|
||||||
|
* Revision 1.3.2.1 1999/11/16 11:09:09 gareth
|
||||||
|
* Added combine callback. Converted vertices from ints to floats.
|
||||||
|
*
|
||||||
* Revision 1.3 1999/11/04 04:00:42 gareth
|
* Revision 1.3 1999/11/04 04:00:42 gareth
|
||||||
* Updated demo for new GLU 1.3 tessellation. Added optimized rendering
|
* Updated demo for new GLU 1.3 tessellation. Added optimized rendering
|
||||||
* by saving the output of the tessellation into display lists.
|
* by saving the output of the tessellation into display lists.
|
||||||
@@ -79,20 +86,20 @@ static GLfloat edge_color[3];
|
|||||||
|
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
GLint p[MAX_POINTS][2];
|
GLfloat p[MAX_POINTS][2];
|
||||||
GLuint point_cnt;
|
GLuint point_cnt;
|
||||||
} contours[MAX_CONTOURS];
|
} contours[MAX_CONTOURS];
|
||||||
|
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
GLsizei no;
|
GLsizei no;
|
||||||
GLint p[3][2];
|
GLfloat p[3][2];
|
||||||
GLclampf color[3][3];
|
GLclampf color[3][3];
|
||||||
} triangles[MAX_TRIANGLES];
|
} triangles[MAX_TRIANGLES];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void GLCALLBACK my_error( GLenum err )
|
void GLCALLBACK error_callback( GLenum err )
|
||||||
{
|
{
|
||||||
int len, i;
|
int len, i;
|
||||||
char const *str;
|
char const *str;
|
||||||
@@ -146,22 +153,22 @@ void GLCALLBACK end_callback()
|
|||||||
triangles[i].color[0][1],
|
triangles[i].color[0][1],
|
||||||
triangles[i].color[0][2] );
|
triangles[i].color[0][2] );
|
||||||
|
|
||||||
glVertex2i( triangles[i].p[0][0], triangles[i].p[0][1] );
|
glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
|
||||||
glVertex2i( triangles[i].p[1][0], triangles[i].p[1][1] );
|
glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
|
||||||
|
|
||||||
glColor3f( triangles[i].color[1][0],
|
glColor3f( triangles[i].color[1][0],
|
||||||
triangles[i].color[1][1],
|
triangles[i].color[1][1],
|
||||||
triangles[i].color[1][2] );
|
triangles[i].color[1][2] );
|
||||||
|
|
||||||
glVertex2i( triangles[i].p[1][0], triangles[i].p[1][1] );
|
glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
|
||||||
glVertex2i( triangles[i].p[2][0], triangles[i].p[2][1] );
|
glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
|
||||||
|
|
||||||
glColor3f( triangles[i].color[2][0],
|
glColor3f( triangles[i].color[2][0],
|
||||||
triangles[i].color[2][1],
|
triangles[i].color[2][1],
|
||||||
triangles[i].color[2][2] );
|
triangles[i].color[2][2] );
|
||||||
|
|
||||||
glVertex2i( triangles[i].p[2][0], triangles[i].p[2][1] );
|
glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
|
||||||
glVertex2i( triangles[i].p[0][0], triangles[i].p[0][1] );
|
glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnd();
|
glEnd();
|
||||||
@@ -170,9 +177,9 @@ void GLCALLBACK end_callback()
|
|||||||
void GLCALLBACK vertex_callback( void *data )
|
void GLCALLBACK vertex_callback( void *data )
|
||||||
{
|
{
|
||||||
GLsizei no;
|
GLsizei no;
|
||||||
GLint *p;
|
GLfloat *p;
|
||||||
|
|
||||||
p = (GLint *) data;
|
p = (GLfloat *) data;
|
||||||
no = triangles[triangle_cnt].no;
|
no = triangles[triangle_cnt].no;
|
||||||
|
|
||||||
triangles[triangle_cnt].p[no][0] = p[0];
|
triangles[triangle_cnt].p[no][0] = p[0];
|
||||||
@@ -190,6 +197,22 @@ void GLCALLBACK vertex_callback( void *data )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLCALLBACK combine_callback( GLdouble coords[3],
|
||||||
|
GLdouble *vertex_data[4],
|
||||||
|
GLfloat weight[4], void **data )
|
||||||
|
{
|
||||||
|
GLfloat *vertex;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
vertex = (GLfloat *) malloc( 2 * sizeof(GLfloat) );
|
||||||
|
|
||||||
|
vertex[0] = (GLfloat) coords[0];
|
||||||
|
vertex[1] = (GLfloat) coords[1];
|
||||||
|
|
||||||
|
*data = vertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void set_screen_wh( GLsizei w, GLsizei h )
|
void set_screen_wh( GLsizei w, GLsizei h )
|
||||||
{
|
{
|
||||||
width = w;
|
width = w;
|
||||||
@@ -208,10 +231,12 @@ void tesse( void )
|
|||||||
|
|
||||||
if ( tobj != NULL )
|
if ( tobj != NULL )
|
||||||
{
|
{
|
||||||
gluTessCallback( tobj, GLU_BEGIN, glBegin );
|
gluTessNormal( tobj, 0.0, 0.0, 1.0 );
|
||||||
gluTessCallback( tobj, GLU_VERTEX, glVertex2iv );
|
gluTessCallback( tobj, GLU_TESS_BEGIN, glBegin );
|
||||||
gluTessCallback( tobj, GLU_END, glEnd );
|
gluTessCallback( tobj, GLU_TESS_VERTEX, glVertex2fv );
|
||||||
gluTessCallback( tobj, GLU_ERROR, my_error );
|
gluTessCallback( tobj, GLU_TESS_END, glEnd );
|
||||||
|
gluTessCallback( tobj, GLU_TESS_ERROR, error_callback );
|
||||||
|
gluTessCallback( tobj, GLU_TESS_COMBINE, combine_callback );
|
||||||
|
|
||||||
glNewList( list_start, GL_COMPILE );
|
glNewList( list_start, GL_COMPILE );
|
||||||
gluBeginPolygon( tobj );
|
gluBeginPolygon( tobj );
|
||||||
@@ -233,10 +258,11 @@ void tesse( void )
|
|||||||
gluEndPolygon( tobj );
|
gluEndPolygon( tobj );
|
||||||
glEndList();
|
glEndList();
|
||||||
|
|
||||||
gluTessCallback( tobj, GLU_BEGIN, begin_callback );
|
#if 0
|
||||||
gluTessCallback( tobj, GLU_VERTEX, vertex_callback );
|
gluTessCallback( tobj, GLU_TESS_BEGIN, begin_callback );
|
||||||
gluTessCallback( tobj, GLU_END, end_callback );
|
gluTessCallback( tobj, GLU_TESS_VERTEX, vertex_callback );
|
||||||
gluTessCallback( tobj, GLU_EDGE_FLAG, edge_callback );
|
gluTessCallback( tobj, GLU_TESS_END, end_callback );
|
||||||
|
gluTessCallback( tobj, GLU_TESS_EDGE_FLAG, edge_callback );
|
||||||
|
|
||||||
glNewList( list_start + 1, GL_COMPILE );
|
glNewList( list_start + 1, GL_COMPILE );
|
||||||
gluBeginPolygon( tobj );
|
gluBeginPolygon( tobj );
|
||||||
@@ -257,6 +283,7 @@ void tesse( void )
|
|||||||
|
|
||||||
gluEndPolygon( tobj );
|
gluEndPolygon( tobj );
|
||||||
glEndList();
|
glEndList();
|
||||||
|
#endif
|
||||||
|
|
||||||
gluDeleteTess( tobj );
|
gluDeleteTess( tobj );
|
||||||
|
|
||||||
@@ -267,7 +294,7 @@ void tesse( void )
|
|||||||
|
|
||||||
void left_down( int x1, int y1 )
|
void left_down( int x1, int y1 )
|
||||||
{
|
{
|
||||||
GLint P[2];
|
GLfloat P[2];
|
||||||
GLuint point_cnt;
|
GLuint point_cnt;
|
||||||
|
|
||||||
/* translate GLUT into GL coordinates */
|
/* translate GLUT into GL coordinates */
|
||||||
@@ -284,13 +311,13 @@ void left_down( int x1, int y1 )
|
|||||||
|
|
||||||
if ( point_cnt )
|
if ( point_cnt )
|
||||||
{
|
{
|
||||||
glVertex2iv( contours[contour_cnt].p[point_cnt-1] );
|
glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
|
||||||
glVertex2iv( P );
|
glVertex2fv( P );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glVertex2iv( P );
|
glVertex2fv( P );
|
||||||
glVertex2iv( P );
|
glVertex2fv( P );
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnd();
|
glEnd();
|
||||||
@@ -311,8 +338,8 @@ void middle_down( int x1, int y1 )
|
|||||||
{
|
{
|
||||||
glBegin( GL_LINES );
|
glBegin( GL_LINES );
|
||||||
|
|
||||||
glVertex2iv( contours[contour_cnt].p[0] );
|
glVertex2fv( contours[contour_cnt].p[0] );
|
||||||
glVertex2iv( contours[contour_cnt].p[point_cnt-1] );
|
glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
|
||||||
|
|
||||||
contours[contour_cnt].p[point_cnt][0] = -1;
|
contours[contour_cnt].p[point_cnt][0] = -1;
|
||||||
|
|
||||||
@@ -383,24 +410,24 @@ void display( void )
|
|||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
glVertex2iv( contours[i].p[0] );
|
glVertex2fv( contours[i].p[0] );
|
||||||
glVertex2iv( contours[i].p[0] );
|
glVertex2fv( contours[i].p[0] );
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
glVertex2iv( contours[i].p[0] );
|
glVertex2fv( contours[i].p[0] );
|
||||||
glVertex2iv( contours[i].p[1] );
|
glVertex2fv( contours[i].p[1] );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
--point_cnt;
|
--point_cnt;
|
||||||
for ( j = 0 ; j < point_cnt ; j++ )
|
for ( j = 0 ; j < point_cnt ; j++ )
|
||||||
{
|
{
|
||||||
glVertex2iv( contours[i].p[j] );
|
glVertex2fv( contours[i].p[j] );
|
||||||
glVertex2iv( contours[i].p[j+1] );
|
glVertex2fv( contours[i].p[j+1] );
|
||||||
}
|
}
|
||||||
if ( contours[i].p[j+1][0] == -1 )
|
if ( contours[i].p[j+1][0] == -1 )
|
||||||
{
|
{
|
||||||
glVertex2iv( contours[i].p[0] );
|
glVertex2fv( contours[i].p[0] );
|
||||||
glVertex2iv( contours[i].p[j] );
|
glVertex2fv( contours[i].p[j] );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user