diff options
-rw-r--r-- | progs/demos/isosurf.c | 323 |
1 files changed, 177 insertions, 146 deletions
diff --git a/progs/demos/isosurf.c b/progs/demos/isosurf.c index d5b0ceb500a..9c78a474904 100644 --- a/progs/demos/isosurf.c +++ b/progs/demos/isosurf.c @@ -1,7 +1,7 @@ -/* $Id: isosurf.c,v 1.7 2000/12/24 22:53:54 pesco Exp $ */ +/* $Id: isosurf.c,v 1.8 2001/01/06 20:38:03 gareth Exp $ */ /* - * Display an isosurface of 3-D wind speed volume. + * Display an isosurface of 3-D wind speed volume. * * Command line options: * -info print GL implementation information @@ -36,47 +36,48 @@ #include "readtex.c" /* I know, this is a hack. KW: me too. */ #define TEXTURE_FILE "../images/reflect.rgb" -#define LIT 0x1 -#define UNLIT 0x2 -#define TEXTURE 0x4 -#define NO_TEXTURE 0x8 -#define REFLECT 0x10 -#define NO_REFLECT 0x20 -#define POINT_FILTER 0x40 -#define LINEAR_FILTER 0x80 -#define GLVERTEX 0x100 -#define DRAW_ARRAYS 0x200 /* or draw_elts, if compiled */ -#define ARRAY_ELT 0x400 -#define COMPILED 0x800 -#define IMMEDIATE 0x1000 -#define SHADE_SMOOTH 0x2000 -#define SHADE_FLAT 0x4000 -#define TRIANGLES 0x8000 -#define STRIPS 0x10000 -#define USER_CLIP 0x20000 -#define NO_USER_CLIP 0x40000 -#define MATERIALS 0x80000 -#define NO_MATERIALS 0x100000 -#define FOG 0x200000 -#define NO_FOG 0x400000 -#define QUIT 0x800000 -#define DISPLAYLIST 0x1000000 -#define GLINFO 0x2000000 -#define STIPPLE 0x4000000 -#define NO_STIPPLE 0x8000000 - -#define LIGHT_MASK (LIT|UNLIT) -#define TEXTURE_MASK (TEXTURE|NO_TEXTURE) -#define REFLECT_MASK (REFLECT|NO_REFLECT) -#define FILTER_MASK (POINT_FILTER|LINEAR_FILTER) -#define RENDER_STYLE_MASK (GLVERTEX|DRAW_ARRAYS|ARRAY_ELT) -#define COMPILED_MASK (COMPILED|IMMEDIATE|DISPLAYLIST) -#define MATERIAL_MASK (MATERIALS|NO_MATERIALS) -#define PRIMITIVE_MASK (TRIANGLES|STRIPS) -#define CLIP_MASK (USER_CLIP|NO_USER_CLIP) -#define SHADE_MASK (SHADE_SMOOTH|SHADE_FLAT) -#define FOG_MASK (FOG|NO_FOG) -#define STIPPLE_MASK (STIPPLE|NO_STIPPLE) +#define LIT 0x1 +#define UNLIT 0x2 +#define TEXTURE 0x4 +#define NO_TEXTURE 0x8 +#define REFLECT 0x10 +#define NO_REFLECT 0x20 +#define POINT_FILTER 0x40 +#define LINEAR_FILTER 0x80 +#define GLVERTEX 0x100 +#define DRAW_ARRAYS 0x200 /* or draw_elts, if compiled */ +#define ARRAY_ELT 0x400 +#define COMPILED 0x800 +#define IMMEDIATE 0x1000 +#define SHADE_SMOOTH 0x2000 +#define SHADE_FLAT 0x4000 +#define TRIANGLES 0x8000 +#define STRIPS 0x10000 +#define POINTS 0x20000 +#define USER_CLIP 0x40000 +#define NO_USER_CLIP 0x80000 +#define MATERIALS 0x100000 +#define NO_MATERIALS 0x200000 +#define FOG 0x400000 +#define NO_FOG 0x800000 +#define QUIT 0x1000000 +#define DISPLAYLIST 0x2000000 +#define GLINFO 0x4000000 +#define STIPPLE 0x8000000 +#define NO_STIPPLE 0x10000000 + +#define LIGHT_MASK (LIT|UNLIT) +#define TEXTURE_MASK (TEXTURE|NO_TEXTURE) +#define REFLECT_MASK (REFLECT|NO_REFLECT) +#define FILTER_MASK (POINT_FILTER|LINEAR_FILTER) +#define RENDER_STYLE_MASK (GLVERTEX|DRAW_ARRAYS|ARRAY_ELT) +#define COMPILED_MASK (COMPILED|IMMEDIATE|DISPLAYLIST) +#define MATERIAL_MASK (MATERIALS|NO_MATERIALS) +#define PRIMITIVE_MASK (TRIANGLES|STRIPS|POINTS) +#define CLIP_MASK (USER_CLIP|NO_USER_CLIP) +#define SHADE_MASK (SHADE_SMOOTH|SHADE_FLAT) +#define FOG_MASK (FOG|NO_FOG) +#define STIPPLE_MASK (STIPPLE|NO_STIPPLE) #define MAXVERTS 10000 static float data[MAXVERTS][6]; @@ -180,7 +181,7 @@ int (*(compare[7]))( const void *a, const void *b ) = #define VEC_ELT(f, s, i) (float *)(((char *)f) + s * i) -static int sort_axis( int axis, +static int sort_axis( int axis, int vec_size, int vec_stride, struct data_idx *indices, @@ -192,27 +193,27 @@ static int sort_axis( int axis, { int i; - if (finish-start > 2) + if (finish-start > 2) { qsort( indices+start, finish-start, sizeof(*indices), compare[axis] ); - } - else if (indices[start].data[axis] > indices[start+1].data[axis]) + } + else if (indices[start].data[axis] > indices[start+1].data[axis]) { struct data_idx tmp = indices[start]; indices[start] = indices[start+1]; indices[start+1] = tmp; } - + if (axis == vec_size-1) { for (i = start ; i < finish ; ) { float max = indices[i].data[axis] + fudge; float *dest = VEC_ELT(out, vec_stride, uniq); int j; - + for (j = 0 ; j < vec_size ; j++) dest[j] = indices[i].data[j]; - for ( ; i < finish && max >= indices[i].data[axis]; i++) + for ( ; i < finish && max >= indices[i].data[axis]; i++) indices[i].uniq_idx = uniq; uniq++; @@ -227,7 +228,7 @@ static int sort_axis( int axis, int k; indices[i].uniq_idx = uniq; - + for (k = 0 ; k < vec_size ; k++) dest[k] = indices[i].data[k]; @@ -244,7 +245,7 @@ static int sort_axis( int axis, } -static void extract_indices1( const struct data_idx *in, unsigned int *out, +static void extract_indices1( const struct data_idx *in, unsigned int *out, int n ) { int i; @@ -266,13 +267,13 @@ static void compactify_arrays(void) ind[i].data = data[i]; } - numuniq = sort_axis(0, - sizeof(compressed_data[0])/sizeof(float), + numuniq = sort_axis(0, + sizeof(compressed_data[0])/sizeof(float), sizeof(compressed_data[0]), - ind, - 0, - numverts, - (float *)compressed_data, + ind, + 0, + numverts, + (float *)compressed_data, 0, 1e-6); @@ -297,7 +298,7 @@ static void make_tri_indices( void ) for (j=2;j<numverts;j++,parity^=1) { if (parity) { *v++ = indices[j-1]; - *v++ = indices[j-2]; + *v++ = indices[j-2]; *v++ = indices[j]; } else { *v++ = indices[j-2]; @@ -305,7 +306,7 @@ static void make_tri_indices( void ) *v++ = indices[j]; } } - + num_tri_verts = v - tri_indices; printf("num_tri_verts: %d\n", num_tri_verts); @@ -326,20 +327,8 @@ static void draw_surface( int with_state ) switch (with_state & (COMPILED_MASK|RENDER_STYLE_MASK|PRIMITIVE_MASK)) { #ifdef GL_EXT_vertex_array - case (COMPILED|DRAW_ARRAYS|STRIPS): - glDrawElements( GL_TRIANGLE_STRIP, numverts, GL_UNSIGNED_INT, indices ); - break; - - - case (COMPILED|ARRAY_ELT|STRIPS): - glBegin( GL_TRIANGLE_STRIP ); - for (i = 0 ; i < numverts ; i++) - glArrayElement( indices[i] ); - glEnd(); - break; - - case (COMPILED|DRAW_ARRAYS|TRIANGLES): case (IMMEDIATE|DRAW_ARRAYS|TRIANGLES): + case (COMPILED|DRAW_ARRAYS|TRIANGLES): if (with_state & MATERIALS) { for (j = i = 0 ; i < num_tri_verts ; i += 600, j++) { GLuint nr = MIN(num_tri_verts-i, 600); @@ -348,25 +337,9 @@ static void draw_surface( int with_state ) glDrawElements( GL_TRIANGLES, nr, GL_UNSIGNED_INT, tri_indices+i ); } } else { - glDrawElements( GL_TRIANGLES, num_tri_verts, GL_UNSIGNED_INT, + glDrawElements( GL_TRIANGLES, num_tri_verts, GL_UNSIGNED_INT, tri_indices ); } - - break; - - /* Uses the original arrays (including duplicate elements): - */ - case (IMMEDIATE|DRAW_ARRAYS|STRIPS): - glDrawArraysEXT( GL_TRIANGLE_STRIP, 0, numverts ); - break; - - /* Uses the original arrays (including duplicate elements): - */ - case (IMMEDIATE|ARRAY_ELT|STRIPS): - glBegin( GL_TRIANGLE_STRIP ); - for (i = 0 ; i < numverts ; i++) - glArrayElement( i ); - glEnd(); break; case (IMMEDIATE|ARRAY_ELT|TRIANGLES): @@ -386,11 +359,60 @@ static void draw_surface( int with_state ) glBegin( GL_TRIANGLES ); for (i = 0 ; i < num_tri_verts ; i++) glArrayElement( tri_indices[i] ); - + glEnd(); - } + } + break; + + + /* Uses the original arrays (including duplicate elements): + */ + case (IMMEDIATE|DRAW_ARRAYS|STRIPS): + glDrawArraysEXT( GL_TRIANGLE_STRIP, 0, numverts ); + break; + case (COMPILED|DRAW_ARRAYS|STRIPS): + glDrawElements( GL_TRIANGLE_STRIP, numverts, GL_UNSIGNED_INT, indices ); break; + /* Uses the original arrays (including duplicate elements): + */ + case (IMMEDIATE|ARRAY_ELT|STRIPS): + glBegin( GL_TRIANGLE_STRIP ); + for (i = 0 ; i < numverts ; i++) + glArrayElement( i ); + glEnd(); + break; + + case (COMPILED|ARRAY_ELT|STRIPS): + glBegin( GL_TRIANGLE_STRIP ); + for (i = 0 ; i < numverts ; i++) + glArrayElement( indices[i] ); + glEnd(); + break; + + case (DISPLAYLIST|GLVERTEX|STRIPS): + if (!surf1) + surf1 = BuildList( GL_COMPILE_AND_EXECUTE ); + else + glCallList(surf1); + break; + + + case (IMMEDIATE|DRAW_ARRAYS|POINTS): + glDrawArraysEXT( GL_POINTS, 0, numverts ); + break; + case (COMPILED|DRAW_ARRAYS|POINTS): + glDrawElements( GL_POINTS, numverts, GL_UNSIGNED_INT, indices ); + break; + case (IMMEDIATE|ARRAY_ELT|POINTS): + case (COMPILED|ARRAY_ELT|POINTS): + glBegin( GL_POINTS ); + for (i = 0 ; i < numverts ; i++) + glArrayElement( indices[i] ); + glEnd(); + break; +#endif + case (IMMEDIATE|GLVERTEX|TRIANGLES): if (with_state & MATERIALS) { for (j = i = 0 ; i < num_tri_verts ; i += 600, j++) { @@ -412,18 +434,18 @@ static void draw_surface( int with_state ) glVertex3fv( &compressed_data[tri_indices[i]][0] ); } glEnd(); - } + } break; - case (DISPLAYLIST|GLVERTEX|STRIPS): - if (!surf1) - surf1 = BuildList( GL_COMPILE_AND_EXECUTE ); - else - glCallList(surf1); + case (IMMEDIATE|GLVERTEX|POINTS): + glBegin( GL_POINTS ); + for ( i = 0 ; i < numverts ; i++ ) { + glNormal3fv( &data[i][3] ); + glVertex3fv( &data[i][0] ); + } + glEnd(); break; -#endif - /* Uses the original arrays (including duplicate elements): */ default: @@ -443,7 +465,7 @@ static void Display(void) glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); draw_surface( state ); glFlush(); - if (doubleBuffer) glutSwapBuffers(); + if (doubleBuffer) glutSwapBuffers(); } int BuildList( int mode ) @@ -515,12 +537,12 @@ static void InitMaterials(void) glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_POSITION, position0); glEnable(GL_LIGHT0); - + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT1, GL_POSITION, position1); glEnable(GL_LIGHT1); - + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); @@ -543,7 +565,7 @@ static void ModeMenu(int m) if (!m) return; - if (m==QUIT) + if (m==QUIT) exit(0); if (m==GLINFO) { @@ -579,7 +601,7 @@ static void ModeMenu(int m) if (CHANGED(state, m, TEXTURE_MASK)) { - if (m & TEXTURE) + if (m & TEXTURE) glEnable(GL_TEXTURE_2D); else glDisable(GL_TEXTURE_2D); @@ -604,12 +626,12 @@ static void ModeMenu(int m) } if (CHANGED(state, m, FOG_MASK)) { - if (m & FOG) + if (m & FOG) { glEnable(GL_FOG); printf("FOG enable\n"); - } - else + } + else { glDisable(GL_FOG); printf("FOG disable\n"); @@ -617,12 +639,12 @@ static void ModeMenu(int m) } if (CHANGED(state, m, STIPPLE_MASK)) { - if (m & STIPPLE) + if (m & STIPPLE) { glEnable(GL_POLYGON_STIPPLE); printf("STIPPLE enable\n"); - } - else + } + else { glDisable(GL_POLYGON_STIPPLE); printf("STIPPLE disable\n"); @@ -630,18 +652,18 @@ static void ModeMenu(int m) } #ifdef GL_EXT_vertex_array - if (CHANGED(state, m, (COMPILED_MASK|RENDER_STYLE_MASK|PRIMITIVE_MASK))) + if (CHANGED(state, m, (COMPILED_MASK|RENDER_STYLE_MASK|PRIMITIVE_MASK))) { if ((m & (COMPILED_MASK|PRIMITIVE_MASK)) == (IMMEDIATE|STRIPS)) { glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numverts, data ); glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numverts, &data[0][3]); } - else + else { - glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numuniq, + glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numuniq, compressed_data ); - glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numuniq, + glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numuniq, &compressed_data[0][3]); } #ifdef GL_EXT_compiled_vertex_array @@ -659,7 +681,7 @@ static void ModeMenu(int m) if (m & (RENDER_STYLE_MASK|PRIMITIVE_MASK)) { UPDATE(state, m, (RENDER_STYLE_MASK|PRIMITIVE_MASK)); } - + if (m & MATERIAL_MASK) { UPDATE(state, m, MATERIAL_MASK); } @@ -686,7 +708,7 @@ static void Init(int argc, char *argv[]) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glClipPlane(GL_CLIP_PLANE0, plane); + glClipPlane(GL_CLIP_PLANE0, plane); set_matrix(); @@ -877,7 +899,7 @@ int main(int argc, char **argv) glutInitWindowPosition(0, 0); glutInitWindowSize(400, 400); - + type = GLUT_DEPTH; type |= GLUT_RGB; type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; @@ -890,12 +912,12 @@ int main(int argc, char **argv) /* Make sure server supports the vertex array extension */ extensions = (char *) glGetString( GL_EXTENSIONS ); - if (!strstr( extensions, "GL_EXT_vertex_array" )) + if (!strstr( extensions, "GL_EXT_vertex_array" )) { printf("Vertex arrays not supported by this renderer\n"); allowed &= ~(COMPILED|DRAW_ARRAYS|ARRAY_ELT); } - else if (!strstr( extensions, "GL_EXT_compiled_vertex_array" )) + else if (!strstr( extensions, "GL_EXT_compiled_vertex_array" )) { printf("Compiled vertex arrays not supported by this renderer\n"); allowed &= ~COMPILED; @@ -903,55 +925,64 @@ int main(int argc, char **argv) Init(argc, argv); ModeMenu(arg_mode); - + glutCreateMenu(ModeMenu); - glutAddMenuEntry("GL info", GLINFO); - glutAddMenuEntry("", 0); + glutAddMenuEntry("GL info", GLINFO); + glutAddMenuEntry("", 0); glutAddMenuEntry("Lit", LIT|NO_TEXTURE|NO_REFLECT); glutAddMenuEntry("Unlit", UNLIT|NO_TEXTURE|NO_REFLECT); /* glutAddMenuEntry("Textured", TEXTURE); */ glutAddMenuEntry("Reflect", TEXTURE|REFLECT); - glutAddMenuEntry("", 0); + glutAddMenuEntry("", 0); glutAddMenuEntry("Smooth", SHADE_SMOOTH); glutAddMenuEntry("Flat", SHADE_FLAT); - glutAddMenuEntry("", 0); + glutAddMenuEntry("", 0); glutAddMenuEntry("Fog", FOG); glutAddMenuEntry("No Fog", NO_FOG); - glutAddMenuEntry("", 0); + glutAddMenuEntry("", 0); glutAddMenuEntry("Stipple", STIPPLE); glutAddMenuEntry("No Stipple", NO_STIPPLE); - glutAddMenuEntry("", 0); + glutAddMenuEntry("", 0); glutAddMenuEntry("Point Filtered", POINT_FILTER); glutAddMenuEntry("Linear Filtered", LINEAR_FILTER); - glutAddMenuEntry("", 0); - glutAddMenuEntry("glVertex (STRIPS)", IMMEDIATE|GLVERTEX|STRIPS); - glutAddMenuEntry("glVertex (TRIANGLES)", IMMEDIATE|GLVERTEX|TRIANGLES); - glutAddMenuEntry("", 0); - glutAddMenuEntry("glVertex display list (STRIPS)", + glutAddMenuEntry("", 0); + glutAddMenuEntry("glVertex (TRIANGLES)", IMMEDIATE|GLVERTEX|TRIANGLES); + glutAddMenuEntry("glVertex (STRIPS)", IMMEDIATE|GLVERTEX|STRIPS); + glutAddMenuEntry("glVertex (POINTS)", IMMEDIATE|GLVERTEX|POINTS); + glutAddMenuEntry("", 0); + glutAddMenuEntry("glVertex display list (STRIPS)", DISPLAYLIST|GLVERTEX|STRIPS); - glutAddMenuEntry("", 0); + glutAddMenuEntry("", 0); if (allowed & DRAW_ARRAYS) { + glutAddMenuEntry("DrawElements (TRIANGLES)", + IMMEDIATE|DRAW_ARRAYS|TRIANGLES); glutAddMenuEntry("DrawArrays (STRIPS)", IMMEDIATE|DRAW_ARRAYS|STRIPS); - glutAddMenuEntry("ArrayElement (STRIPS)", - IMMEDIATE|ARRAY_ELT|STRIPS); - glutAddMenuEntry("DrawElements (TRIANGLES)", - IMMEDIATE|DRAW_ARRAYS|TRIANGLES); - glutAddMenuEntry("ArrayElement (TRIANGLES)", + glutAddMenuEntry("DrawArrays (POINTS)", + IMMEDIATE|DRAW_ARRAYS|POINTS); + glutAddMenuEntry("ArrayElement (TRIANGLES)", IMMEDIATE|ARRAY_ELT|TRIANGLES); - glutAddMenuEntry("", 0); + glutAddMenuEntry("ArrayElement (STRIPS)", + IMMEDIATE|ARRAY_ELT|STRIPS); + glutAddMenuEntry("ArrayElement (POINTS)", + IMMEDIATE|ARRAY_ELT|POINTS); + glutAddMenuEntry("", 0); } if (allowed & COMPILED) { - glutAddMenuEntry("Compiled DrawElements (TRIANGLES)", + glutAddMenuEntry("Compiled DrawElements (TRIANGLES)", COMPILED|DRAW_ARRAYS|TRIANGLES); - glutAddMenuEntry("Compiled DrawElements (STRIPS)", + glutAddMenuEntry("Compiled DrawElements (STRIPS)", COMPILED|DRAW_ARRAYS|STRIPS); - glutAddMenuEntry("Compiled ArrayElement (TRIANGLES)", - COMPILED|ARRAY_ELT|TRIANGLES); - glutAddMenuEntry("Compiled ArrayElement (STRIPS)", - COMPILED|ARRAY_ELT|STRIPS); - glutAddMenuEntry("", 0); + glutAddMenuEntry("Compiled DrawElements (POINTS)", + COMPILED|DRAW_ARRAYS|POINTS); + glutAddMenuEntry("Compiled ArrayElement (TRIANGLES)", + COMPILED|ARRAY_ELT|TRIANGLES); + glutAddMenuEntry("Compiled ArrayElement (STRIPS)", + COMPILED|ARRAY_ELT|STRIPS); + glutAddMenuEntry("Compiled ArrayElement (POINTS)", + COMPILED|ARRAY_ELT|POINTS); + glutAddMenuEntry("", 0); } glutAddMenuEntry("Quit", QUIT); glutAttachMenu(GLUT_RIGHT_BUTTON); |