X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=progs%2Fdemos%2Fisosurf.c;h=e280d8f507c553d2d4201cf9176b6ef4d8325950;hb=56cfa4de9150514af46d040c3cdb24def301b3a1;hp=d5b0ceb500ac8cf6a6abf937238bce7feded9137;hpb=d1ff1f6798b003a820f5de9fad835ff352f31afe;p=mesa.git diff --git a/progs/demos/isosurf.c b/progs/demos/isosurf.c index d5b0ceb500a..e280d8f507c 100644 --- a/progs/demos/isosurf.c +++ b/progs/demos/isosurf.c @@ -1,7 +1,6 @@ -/* $Id: isosurf.c,v 1.7 2000/12/24 22:53:54 pesco 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 @@ -30,69 +29,79 @@ #include #include #include -#define GL_GLEXT_LEGACY +#ifdef _WIN32 +#include +#undef CLIP_MASK +#endif +#include #include "GL/glut.h" -#include "readtex.c" /* I know, this is a hack. KW: me too. */ +#include "readtex.h" #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 0x00000001 +#define UNLIT 0x00000002 +#define REFLECT 0x00000004 +#define POINT_FILTER 0x00000008 +#define LINEAR_FILTER 0x00000010 +#define GLVERTEX 0x00000020 +#define DRAW_ELTS 0x00000040 +#define DRAW_ARRAYS 0x00000080 +#define ARRAY_ELT 0x00000100 +#define LOCKED 0x00000200 +#define UNLOCKED 0x00000400 +#define IMMEDIATE 0x00000800 +#define DISPLAYLIST 0x00001000 +#define SHADE_SMOOTH 0x00002000 +#define SHADE_FLAT 0x00004000 +#define TRIANGLES 0x00008000 +#define STRIPS 0x00010000 +#define POINTS 0x00020000 +#define USER_CLIP 0x00040000 +#define NO_USER_CLIP 0x00080000 +#define MATERIALS 0x00100000 +#define NO_MATERIALS 0x00200000 +#define FOG 0x00400000 +#define NO_FOG 0x00800000 +#define QUIT 0x01000000 +#define GLINFO 0x02000000 +#define STIPPLE 0x04000000 +#define NO_STIPPLE 0x08000000 +#define POLYGON_FILL 0x10000000 +#define POLYGON_LINE 0x20000000 +#define POLYGON_POINT 0x40000000 + +#define LIGHT_MASK (LIT|UNLIT|REFLECT) +#define FILTER_MASK (POINT_FILTER|LINEAR_FILTER) +#define RENDER_STYLE_MASK (GLVERTEX|DRAW_ARRAYS|DRAW_ELTS|ARRAY_ELT) +#define DLIST_MASK (IMMEDIATE|DISPLAYLIST) +#define LOCK_MASK (LOCKED|UNLOCKED) +#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 POLYGON_MASK (POLYGON_FILL|POLYGON_LINE|POLYGON_POINT) #define MAXVERTS 10000 +static GLint maxverts = MAXVERTS; static float data[MAXVERTS][6]; static float compressed_data[MAXVERTS][6]; +static float expanded_data[MAXVERTS*3][6]; static GLuint indices[MAXVERTS]; static GLuint tri_indices[MAXVERTS*3]; +static GLuint strip_indices[MAXVERTS]; static GLfloat col[100][4]; static GLint numverts, num_tri_verts, numuniq; static GLfloat xrot; static GLfloat yrot; -static GLfloat dist = -6; +static GLfloat dist; static GLint state, allowed = ~0; static GLboolean doubleBuffer = GL_TRUE; -static GLdouble plane[4] = {1.0, 0.0, -1.0, 0.0}; -static GLuint surf1; +static GLdouble plane[4]; +static GLuint surf1, dlist_state; static GLboolean PrintInfo = GL_FALSE; @@ -110,9 +119,6 @@ static GLubyte halftone[] = { 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55}; -/* forward decl */ -int BuildList( int mode ); - static void read_surface( char *filename ) { @@ -125,7 +131,7 @@ static void read_surface( char *filename ) } numverts = 0; - while (!feof(f) && numverts 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 +260,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 +277,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 +299,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); @@ -282,6 +315,20 @@ static void compactify_arrays(void) free( ind ); } +static void expand_arrays(void) +{ + int i; + int parity = 0; + for (i = 2 ; i < numverts ; i++, parity ^= 1) { + int v0 = i-2+parity; + int v1 = i-1-parity; + int v2 = i; + memcpy( expanded_data[(i-2)*3+0], data[v0], sizeof(data[0]) ); + memcpy( expanded_data[(i-2)*3+1], data[v1], sizeof(data[0]) ); + memcpy( expanded_data[(i-2)*3+2], data[v2], sizeof(data[0]) ); + } +} + static float myrand( float max ) { return max*rand()/(RAND_MAX+1.0); @@ -292,12 +339,12 @@ static void make_tri_indices( void ) { unsigned int *v = tri_indices; unsigned int parity = 0; - unsigned int i, j; + int i, j; for (j=2;j Can't do strips here as ordering has been lost in + * compaction process... + */ + 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 + if (allowed & LOCKED) { + if (state & LOCKED) { + glLockArraysEXT( 0, numuniq ); + } else { + glUnlockArraysEXT(); + } + } +#endif } + else if ((state & PRIMITIVE_MASK) == TRIANGLES && + (state & RENDER_STYLE_MASK) == DRAW_ARRAYS) { + fprintf(stderr, "enabling big arrays\n"); + /* Only get here for TRIANGLES and drawarrays + */ + glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), (numverts-2) * 3, + expanded_data ); + glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), (numverts-2) * 3, + &expanded_data[0][3]); + #ifdef GL_EXT_compiled_vertex_array - if (allowed & COMPILED) { - if (m & COMPILED) { - glLockArraysEXT( 0, numuniq ); - } else { - glUnlockArraysEXT(); + if (allowed & LOCKED) { + if (state & LOCKED) { + glLockArraysEXT( 0, (numverts-2)*3 ); + } else { + glUnlockArraysEXT(); + } } +#endif } + else { + fprintf(stderr, "enabling normal arrays\n"); + glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numverts, data ); + glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numverts, &data[0][3]); +#ifdef GL_EXT_compiled_vertex_array + if (allowed & LOCKED) { + if (state & LOCKED) { + glLockArraysEXT( 0, numverts ); + } else { + glUnlockArraysEXT(); + } + } #endif + } + } #endif - if (m & (RENDER_STYLE_MASK|PRIMITIVE_MASK)) { - UPDATE(state, m, (RENDER_STYLE_MASK|PRIMITIVE_MASK)); + + if (m & DLIST_MASK) { + UPDATE(state, m, DLIST_MASK); } - + if (m & MATERIAL_MASK) { UPDATE(state, m, MATERIAL_MASK); } + print_flags("new flags", state); + glutPostRedisplay(); } @@ -673,20 +822,28 @@ static void Init(int argc, char *argv[]) { GLfloat fogColor[4] = {0.5,1.0,0.5,1.0}; + xrot = 0; + yrot = 0; + dist = -6; + plane[0] = 1.0; + plane[1] = 0.0; + plane[2] = -1.0; + plane[3] = 0.0; + glClearColor(0.0, 0.0, 1.0, 0.0); glEnable( GL_DEPTH_TEST ); glEnable( GL_VERTEX_ARRAY_EXT ); glEnable( GL_NORMAL_ARRAY_EXT ); - InitMaterials(); - glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum( -1.0, 1.0, -1.0, 1.0, 5, 25 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glClipPlane(GL_CLIP_PLANE0, plane); + glClipPlane(GL_CLIP_PLANE0, plane); + + InitMaterials(); set_matrix(); @@ -696,10 +853,6 @@ static void Init(int argc, char *argv[]) glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); - if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) { - printf("Error: couldn't load texture image\n"); - exit(1); - } /* Green fog is easy to see */ glFogi(GL_FOG_MODE,GL_EXP2); @@ -707,22 +860,31 @@ static void Init(int argc, char *argv[]) glFogf(GL_FOG_DENSITY,0.15); glHint(GL_FOG_HINT,GL_DONT_CARE); - - compactify_arrays(); - make_tri_indices(); - - surf1 = BuildList( GL_COMPILE ); + { + static int firsttime = 1; + if (firsttime) { + firsttime = 0; + compactify_arrays(); + expand_arrays(); + make_tri_indices(); + + if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) { + printf("Error: couldn't load texture image\n"); + exit(1); + } + } + } ModeMenu(SHADE_SMOOTH| LIT| - NO_TEXTURE| - NO_REFLECT| POINT_FILTER| - IMMEDIATE| NO_USER_CLIP| NO_MATERIALS| NO_FOG| NO_STIPPLE| + IMMEDIATE| + STRIPS| + UNLOCKED| GLVERTEX); if (PrintInfo) { @@ -759,7 +921,7 @@ static void Key( unsigned char key, int x, int y ) ModeMenu((state ^ STIPPLE_MASK) & STIPPLE_MASK); break; case 'l': - ModeMenu((state ^ LIGHT_MASK) & LIGHT_MASK); + ModeMenu((state ^ LIGHT_MASK) & (LIT|UNLIT)); break; case 'm': ModeMenu((state ^ MATERIAL_MASK) & MATERIAL_MASK); @@ -768,11 +930,10 @@ static void Key( unsigned char key, int x, int y ) ModeMenu((state ^ CLIP_MASK) & CLIP_MASK); break; case 'v': - if (allowed&COMPILED) - ModeMenu(COMPILED|DRAW_ARRAYS|TRIANGLES); + ModeMenu((LOCKED|IMMEDIATE|DRAW_ELTS|TRIANGLES) & allowed); break; case 'V': - ModeMenu(IMMEDIATE|GLVERTEX|STRIPS); + ModeMenu(UNLOCKED|IMMEDIATE|GLVERTEX|STRIPS); break; case 'b': Benchmark(5.0, 0); @@ -808,7 +969,9 @@ static void Key( unsigned char key, int x, int y ) set_matrix(); glutPostRedisplay(); break; - + case ' ': + Init(0,0); + break; } } @@ -854,6 +1017,15 @@ static GLint Args(int argc, char **argv) else if (strcmp(argv[i], "-info") == 0) { PrintInfo = GL_TRUE; } + else if (strcmp(argv[i], "-10") == 0) { + maxverts = 10; + } + else if (strcmp(argv[i], "-100") == 0) { + maxverts = 100; + } + else if (strcmp(argv[i], "-1000") == 0) { + maxverts = 1000; + } else { printf("%s (Bad option).\n", argv[i]); return QUIT; @@ -866,7 +1038,6 @@ static GLint Args(int argc, char **argv) int main(int argc, char **argv) { GLenum type; - char *extensions; GLuint arg_mode = Args(argc, argv); @@ -875,9 +1046,10 @@ int main(int argc, char **argv) read_surface( "isosurf.dat" ); + glutInit( &argc, argv); glutInitWindowPosition(0, 0); glutInitWindowSize(400, 400); - + type = GLUT_DEPTH; type |= GLUT_RGB; type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; @@ -887,73 +1059,66 @@ int main(int argc, char **argv) exit(0); } - /* Make sure server supports the vertex array extension */ - extensions = (char *) glGetString( GL_EXTENSIONS ); + glewInit(); - if (!strstr( extensions, "GL_EXT_vertex_array" )) + /* Make sure server supports the vertex array extension */ + if (!GLEW_EXT_vertex_array) { printf("Vertex arrays not supported by this renderer\n"); - allowed &= ~(COMPILED|DRAW_ARRAYS|ARRAY_ELT); + allowed &= ~(LOCKED|DRAW_ARRAYS|DRAW_ELTS|ARRAY_ELT); } - else if (!strstr( extensions, "GL_EXT_compiled_vertex_array" )) + else if (!GLEW_EXT_compiled_vertex_array) { printf("Compiled vertex arrays not supported by this renderer\n"); - allowed &= ~COMPILED; + allowed &= ~LOCKED; } Init(argc, argv); ModeMenu(arg_mode); - + glutCreateMenu(ModeMenu); - 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("GL info", GLINFO); + glutAddMenuEntry("", 0); + glutAddMenuEntry("Lit", LIT); + glutAddMenuEntry("Unlit", UNLIT); + glutAddMenuEntry("Reflect", REFLECT); + 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("Polygon Mode Fill", POLYGON_FILL); + glutAddMenuEntry("Polygon Mode Line", POLYGON_LINE); + glutAddMenuEntry("Polygon Mode Points", POLYGON_POINT); + 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)", - DISPLAYLIST|GLVERTEX|STRIPS); - glutAddMenuEntry("", 0); + glutAddMenuEntry("", 0); + glutAddMenuEntry("GL_TRIANGLES", TRIANGLES); + glutAddMenuEntry("GL_TRIANGLE_STRIPS", STRIPS); + glutAddMenuEntry("GL_POINTS", POINTS); + glutAddMenuEntry("", 0); + glutAddMenuEntry("Displaylist", DISPLAYLIST); + glutAddMenuEntry("Immediate", IMMEDIATE); + glutAddMenuEntry("", 0); + if (allowed & LOCKED) { + glutAddMenuEntry("Locked Arrays (CVA)", LOCKED); + glutAddMenuEntry("Unlocked Arrays", UNLOCKED); + glutAddMenuEntry("", 0); + } + glutAddMenuEntry("glVertex", GLVERTEX); if (allowed & DRAW_ARRAYS) { - glutAddMenuEntry("DrawArrays (STRIPS)", - IMMEDIATE|DRAW_ARRAYS|STRIPS); - glutAddMenuEntry("ArrayElement (STRIPS)", - IMMEDIATE|ARRAY_ELT|STRIPS); - glutAddMenuEntry("DrawElements (TRIANGLES)", - IMMEDIATE|DRAW_ARRAYS|TRIANGLES); - glutAddMenuEntry("ArrayElement (TRIANGLES)", - IMMEDIATE|ARRAY_ELT|TRIANGLES); - glutAddMenuEntry("", 0); - - } - if (allowed & COMPILED) { - glutAddMenuEntry("Compiled DrawElements (TRIANGLES)", - COMPILED|DRAW_ARRAYS|TRIANGLES); - 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("Quit", QUIT); + glutAddMenuEntry("glDrawElements", DRAW_ELTS); + glutAddMenuEntry("glDrawArrays", DRAW_ARRAYS); + glutAddMenuEntry("glArrayElement", ARRAY_ELT); + } + glutAddMenuEntry("", 0); + glutAddMenuEntry("Quit", QUIT); glutAttachMenu(GLUT_RIGHT_BUTTON); glutReshapeFunc(Reshape);