static void Init(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); InitMaterials(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 ); 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 ModeMenu(int m) { m &= allowed; if (!m) return; if (m==QUIT) exit(0); if (m==GLINFO) { printf("GL_VERSION: %s\n", (char *) glGetString(GL_VERSION)); printf("GL_EXTENSIONS: %s\n", (char *) glGetString(GL_EXTENSIONS)); printf("GL_RENDERER: %s\n", (char *) glGetString(GL_RENDERER)); return; } if (CHANGED(state, m, FILTER_MASK)) { UPDATE(state, m, FILTER_MASK); if (m & LINEAR_FILTER) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } } if (CHANGED(state, m, LIGHT_MASK)) { UPDATE(state, m, LIGHT_MASK); if (m & LIT) { glEnable(GL_LIGHTING); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); } else if (m & UNLIT) { glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); } else if (m & REFLECT) { glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); } } if (CHANGED(state, m, SHADE_MASK)) { UPDATE(state, m, SHADE_MASK); if (m & SHADE_SMOOTH) glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); } if (CHANGED(state, m, CLIP_MASK)) { UPDATE(state, m, CLIP_MASK); if (m & USER_CLIP) { glEnable(GL_CLIP_PLANE0); } else { glDisable(GL_CLIP_PLANE0); } } if (CHANGED(state, m, FOG_MASK)) { UPDATE(state, m, FOG_MASK); if (m & FOG) { glEnable(GL_FOG); } else { glDisable(GL_FOG); } } if (CHANGED(state, m, STIPPLE_MASK)) { UPDATE(state, m, STIPPLE_MASK); if (m & STIPPLE) { glEnable(GL_POLYGON_STIPPLE); } else { glDisable(GL_POLYGON_STIPPLE); } } if (CHANGED(state, m, POLYGON_MASK)) { UPDATE(state, m, POLYGON_MASK); if (m & POLYGON_FILL) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } } #ifdef GL_EXT_vertex_array if (CHANGED(state, m, (LOCK_MASK|RENDER_STYLE_MASK|PRIMITIVE_MASK))) { if (m & (PRIMITIVE_MASK)) { UPDATE(state, m, (PRIMITIVE_MASK)); } if (m & (RENDER_STYLE_MASK)) { UPDATE(state, m, (RENDER_STYLE_MASK)); } if (m & LOCK_MASK) { UPDATE(state, m, (LOCK_MASK)); } print_flags("primitive", state & PRIMITIVE_MASK); print_flags("render style", state & RENDER_STYLE_MASK); if ((state & PRIMITIVE_MASK) != STRIPS && ((state & RENDER_STYLE_MASK) == DRAW_ELTS || (state & RENDER_STYLE_MASK) == ARRAY_ELT || (state & PRIMITIVE_MASK) == POINTS)) { fprintf(stderr, "enabling small arrays\n"); /* Rendering any primitive with draw-element/array-element * --> 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, &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 & 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 & DLIST_MASK) { UPDATE(state, m, DLIST_MASK); } if (m & MATERIAL_MASK) { UPDATE(state, m, MATERIAL_MASK); } print_flags("new flags", state); glutPostRedisplay(); }