static unsigned int * CreateLists() { static unsigned int lists[256]={0}; void * fnt0 = getFont(true,false); void * fnt1 = getFont(true,true); static bool use_bit = XMLSupport::parse_bool(vs_config->getVariable ("graphics","high_quality_font","false")); static bool use_display_lists = XMLSupport::parse_bool (vs_config->getVariable ("graphics","text_display_lists","true")); if (use_display_lists) { for (unsigned int i=32;i<256;i++){ if ((i<128)||(i>=128+32)) { lists[i]= GFXCreateList(); if (use_bit) glutBitmapCharacter (i<128?fnt0:fnt1,i%128); else glutStrokeCharacter (GLUT_STROKE_ROMAN,i%128); if (!GFXEndList ()) { lists[i]=0; } } } } return lists; }
void GFXVertexList::RefreshDisplayList( ) { #ifndef NO_VBO_SUPPORT if (game_options.vbo && !vbo_data) { if (glGenBuffersARB_p == 0 || glBindBufferARB_p == 0 || glBufferDataARB_p == 0 || glMapBufferARB_p == 0 || glUnmapBufferARB_p == 0) { game_options.vbo = 0; } else { (*glGenBuffersARB_p)(1, (GLuint*) &vbo_data); if (changed&HAS_INDEX) (*glGenBuffersARB_p)(1, (GLuint*) &display_list); } } if (vbo_data) { GFXBindBuffer( vbo_data ); (*glBufferDataARB_p)(GL_ARRAY_BUFFER_ARB, numVertices *( (changed&HAS_COLOR) ? sizeof (GFXColorVertex) : sizeof (GFXVertex) ), data.vertices, (changed&CHANGE_MUTABLE) ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB); if (changed&HAS_INDEX) { GFXBindElementBuffer( display_list ); unsigned int tot = 0; for (int i = 0; i < numlists; ++i) tot += offsets[i]; unsigned int indexsize = (changed&INDEX_BYTE) ? sizeof (char) : ( (changed&INDEX_SHORT) ? sizeof (unsigned short) : sizeof (unsigned int) ); (*glBufferDataARB_p)(GL_ELEMENT_ARRAY_BUFFER_ARB, tot*indexsize, &index.b[0], (changed&CHANGE_MUTABLE) ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB); } return; } #endif if ( (!gl_options.display_lists) || ( display_list && !(changed&CHANGE_CHANGE) ) || (changed&CHANGE_MUTABLE) ) return; //don't used lists if they're mutable if (display_list) GFXDeleteList( display_list ); int offset = 0; display_list = GFXCreateList(); if (changed & HAS_COLOR) { EnableArrays(data.colors); } else { EnableArrays(data.vertices); } for (int i = 0; i < numlists; i++) { // Populate the display list with array data if (changed & HAS_INDEX) { switch (changed & (INDEX_BYTE|INDEX_INT|INDEX_SHORT)) { case INDEX_BYTE: glDrawElements( PolyLookup(mode[i]), offsets[i], GL_UNSIGNED_BYTE, index.b ); break; case INDEX_SHORT: glDrawElements( PolyLookup(mode[i]), offsets[i], GL_UNSIGNED_SHORT, index.s ); break; case INDEX_INT: glDrawElements( PolyLookup(mode[i]), offsets[i], GL_UNSIGNED_INT, index.i ); break; default: break; } } else { glDrawArrays( PolyLookup(mode[i]), offset, offsets[i] ); } offset += offsets[i]; } if ( !GFXEndList() ) { GFXDeleteList( display_list ); display_list = 0; } }