Ejemplo n.º 1
0
void Tile::draw(const Mercator::Terrain & h, int x, int y)
{
    if (tex_id == -1) { return; }
    glBindTexture(GL_TEXTURE_2D, tex_id);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    float dw = m_pw / (2 * tileSize);
    float dh = m_ph / (2 * tileSize);
    int tile_size = tileSize + 1;
    GLfloat vertices[(tile_size * tile_size) * 3],
            texcoord[(tile_size * tile_size) * 3];
    int tindex = -1;
    int vindex = -1;
    for(int j = 0; j < tile_size; ++j) {
        for(int i = 0; i < tile_size; ++i) {
            texcoord[++tindex] = m_pw/2 + dw * (i - j);
            texcoord[++tindex] = dh * (i + j);
            vertices[++vindex] = i;
            vertices[++vindex] = j;
            vertices[++vindex] = h.get(x + i, y + j);
        }
    }
    GLuint indices[(int)tileSize * tile_size * 4];
    int iindex = -1;
    for (int i = 0; i < tile_size - 1; ++i) {
        for (int j = 0; j < tile_size; ++j) {
            indices[++iindex] = j * tile_size + i;
            indices[++iindex] = j * tile_size + i + 1;
        }
        if (++i >= tileSize) { break; }
        for (int j = tileSize; j >= 0; --j) {
            indices[++iindex] = j * tile_size + i + 1;
            indices[++iindex] = j * tile_size + i;
        }
    }
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT, 0, texcoord);
    glDrawElements(GL_TRIANGLE_STRIP, ++iindex, GL_UNSIGNED_INT, indices);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);
}