Ejemplo n.º 1
0
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;
    }
}