Ignore:
Timestamp:
Feb 14, 2011, 2:26:31 AM (11 years ago)
Author:
sam
Message:

Switch scene rendering method to vertex buffer objects.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/scene.cpp

    r313 r645  
    5656    float angle;
    5757
     58    GLuint *bufs;
     59    int nbufs;
     60
    5861    static Scene *scene;
    5962};
     
    7174    data->ntiles = 0;
    7275    data->angle = angle;
     76
     77    data->bufs = 0;
     78    data->nbufs = 0;
    7379}
    7480
    7581Scene::~Scene()
    7682{
     83    /* FIXME: this must be done while the GL context is still active.
     84     * Change the architecture to make sure of that. */
     85    glDeleteBuffers(data->nbufs, data->bufs);
    7786    delete data;
    7887}
     
    132141#endif
    133142    glTranslatef(-320.0f, -240.0f, 0.0f);
    134 
    135     for (int i = 0; i < data->ntiles; i++)
    136         Tiler::BlitTile(data->tiles[i].code, data->tiles[i].x,
    137                         data->tiles[i].y, data->tiles[i].z, data->tiles[i].o);
     143    // XXX: end of debug stuff
     144
     145    for (int buf = 0, i = 0, n; i < data->ntiles; i = n, buf += 2)
     146    {
     147        /* Generate new vertex / texture coord buffers if necessary */
     148        if (buf + 2 > data->nbufs)
     149        {
     150            data->bufs = (GLuint *)realloc(data->bufs, (buf + 2) * sizeof(GLuint));
     151            glGenBuffers(buf + 2 - data->nbufs, data->bufs + data->nbufs);
     152            data->nbufs = buf + 2;
     153        }
     154
     155        /* Count how many quads will be needed */
     156        for (n = i + 1; n < data->ntiles; n++)
     157            if (data->tiles[i].code >> 16 != data->tiles[n].code >> 16)
     158                break;
     159
     160        /* Create a vertex array object */
     161        float *vertex = (float *)malloc(6 * 3 * (n - i) * sizeof(float));
     162        float *texture = (float *)malloc(6 * 2 * (n - i) * sizeof(float));
     163
     164        for (int j = i; j < n; j++)
     165        {
     166            Tiler::BlitTile(data->tiles[j].code, data->tiles[j].x,
     167                            data->tiles[j].y, data->tiles[j].z, data->tiles[j].o,
     168                            vertex + 18 * (j - i), texture + 12 * (j - i));
     169        }
     170
     171        glEnableClientState(GL_VERTEX_ARRAY);
     172        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     173
     174        glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]);
     175        glBufferData(GL_ARRAY_BUFFER, 6 * 3 * (n - i) * sizeof(float),
     176                     vertex, GL_DYNAMIC_DRAW);
     177        glVertexPointer(3, GL_FLOAT, 0, NULL);
     178
     179        glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]);
     180        glBufferData(GL_ARRAY_BUFFER, 6 * 2 * (n - i) * sizeof(float),
     181                     texture, GL_DYNAMIC_DRAW);
     182        glTexCoordPointer(2, GL_FLOAT, 0, NULL);
     183
     184        Tiler::Bind(data->tiles[i].code);
     185        glDrawArrays(GL_TRIANGLES, 0, (n - i) * 6);
     186
     187        glDisableClientState(GL_VERTEX_ARRAY);
     188        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
     189
     190        free(vertex);
     191        free(texture);
     192    }
    138193
    139194    glPopMatrix();
    140     // XXX: end of debug stuff
    141195
    142196    free(data->tiles);
Note: See TracChangeset for help on using the changeset viewer.