This is isosurf.c in view mode; [Download] [Up]
/* isosurf.c */ /* * Mesa 2.0 version * * Display an isosurface of 3-D wind speed volume. Use arrow keys to * rotate, S toggles smooth shading, L toggles lighting * Brian Paul */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "gltk.h" GLboolean speed_test = GL_FALSE; GLboolean use_vertex_arrays = GL_FALSE; GLboolean doubleBuffer = GL_TRUE; GLboolean smooth = GL_TRUE; GLboolean lighting = GL_TRUE; #define MAXVERTS 10000 static GLfloat verts[MAXVERTS][3]; static GLfloat norms[MAXVERTS][3]; static GLint numverts; static GLfloat xrot; static GLfloat yrot; static void read_surface( char *filename ) { FILE *f; f = fopen(filename,"r"); if (!f) { printf("couldn't read %s\n", filename); exit(1); } numverts = 0; while (!feof(f) && numverts<MAXVERTS) { fscanf( f, "%f %f %f %f %f %f", &verts[numverts][0], &verts[numverts][1], &verts[numverts][2], &norms[numverts][0], &norms[numverts][1], &norms[numverts][2] ); numverts++; } numverts--; printf("%d vertices, %d triangles\n", numverts, numverts-2); fclose(f); } static void draw_surface( void ) { GLuint i; #ifdef GL_EXT_vertex_array if (use_vertex_arrays) { glDrawArraysEXT( GL_TRIANGLE_STRIP, 0, numverts ); } else { #endif glBegin( GL_TRIANGLE_STRIP ); for (i=0;i<numverts;i++) { glNormal3fv( norms[i] ); glVertex3fv( verts[i] ); } glEnd(); #ifdef GL_EXT_vertex_array } #endif } static void draw1(void) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glPushMatrix(); glRotatef( yrot, 0.0, 1.0, 0.0 ); glRotatef( xrot, 1.0, 0.0, 0.0 ); draw_surface(); glPopMatrix(); glFlush(); if (doubleBuffer) { tkSwapBuffers(); } } static void draw(void) { if (speed_test) { for (xrot=0.0;xrot<=360.0;xrot+=10.0) { draw1(); } tkQuit(); } else { draw1(); } } static void InitMaterials(void) { static float ambient[] = {0.1, 0.1, 0.1, 1.0}; static float diffuse[] = {0.5, 1.0, 1.0, 1.0}; static float position0[] = {0.0, 0.0, 20.0, 0.0}; static float position1[] = {0.0, 0.0, -20.0, 0.0}; static float front_mat_shininess[] = {60.0}; static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0}; static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0}; static float back_mat_shininess[] = {60.0}; static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0}; static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0}; static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0}; static float lmodel_twoside[] = {GL_FALSE}; glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); 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); glEnable(GL_LIGHTING); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_mat_shininess); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse); } static void Init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); InitMaterials(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum( -1.0, 1.0, -1.0, 1.0, 5, 25 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef( 0.0, 0.0, -6.0 ); #ifdef GL_EXT_vertex_array if (use_vertex_arrays) { glVertexPointerEXT( 3, GL_FLOAT, 0, numverts, verts ); glNormalPointerEXT( GL_FLOAT, 0, numverts, norms ); glEnable( GL_VERTEX_ARRAY_EXT ); glEnable( GL_NORMAL_ARRAY_EXT ); } #endif } static void Reshape(int width, int height) { glViewport(0, 0, (GLint)width, (GLint)height); } static GLenum Key(int key, GLenum mask) { switch (key) { case TK_ESCAPE: tkQuit(); case TK_LEFT: yrot -= 15.0; break; case TK_RIGHT: yrot += 15.0; break; case TK_UP: xrot += 15.0; break; case TK_DOWN: xrot -= 15.0; break; case TK_s: smooth = !smooth; if (smooth) { glShadeModel(GL_SMOOTH); } else { glShadeModel(GL_FLAT); } break; case TK_l: lighting = !lighting; if (lighting) { glEnable(GL_LIGHTING); } else { glDisable(GL_LIGHTING); } break; default: return GL_FALSE; } return GL_TRUE; } static GLenum Args(int argc, char **argv) { GLint i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-sb") == 0) { doubleBuffer = GL_FALSE; } else if (strcmp(argv[i], "-db") == 0) { doubleBuffer = GL_TRUE; } else if (strcmp(argv[i], "-speed") == 0) { speed_test = GL_TRUE; doubleBuffer = GL_TRUE; } else if (strcmp(argv[i], "-va") == 0) { use_vertex_arrays = GL_TRUE; } else { printf("%s (Bad option).\n", argv[i]); return GL_FALSE; } } return GL_TRUE; } void main(int argc, char **argv) { GLenum type; char *extensions; read_surface( "isosurf.dat" ); if (Args(argc, argv) == GL_FALSE) { tkQuit(); } tkInitPosition(0, 0, 400, 400); /* tkInitPosition(0, 0, 800, 800); */ type = TK_DEPTH; type |= TK_RGB; type |= TK_DIRECT; type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE; tkInitDisplayMode(type); if (tkInitWindow("Isosurface") == GL_FALSE) { tkQuit(); } /* Make sure server supports the vertex array extension */ extensions = (char *) glGetString( GL_EXTENSIONS ); if (!strstr( extensions, "GL_EXT_vertex_array" )) { use_vertex_arrays = GL_FALSE; } Init(); tkExposeFunc(Reshape); tkReshapeFunc(Reshape); tkKeyDownFunc(Key); tkDisplayFunc( draw ); tkExec(); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.