void SVIS_displayVectorData(SVIS_VECTORDATA *data)
{
int i;
// First we validate the data, then ensure that it's uploaded, then, finaly,
// display it.
if (data && data->vectorLoadComplete) {
if (!data->vboCreateComplete) {
glGenBuffers(1, &data->vbo);
glGenBuffers(1, &data->ibo);
glBindBuffer(GL_ARRAY_BUFFER, data->vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(SVN_VEC3) * data->maxVerticies,
data->verts, GL_DYNAMIC_DRAW);
data->vboCreateComplete = TRUE;
} else {
if (data->zoomLvl != G_mapZoom) {
//NOTE: data->indicies are propogated at this point, TODO: Repopulate based on zoom level.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data->ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * data->maxVerticies, // 1:1 ratio of verts to indicies is max case.
data->indicies, GL_DYNAMIC_DRAW);
data->zoomLvl = G_mapZoom;
}
// At this point, we do the actual drawing.
glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex points
glEnable(GL_POLYGON_SMOOTH); // Don't know if this is neccisary
glDepthFunc(GL_ALWAYS); // Don't let terrain be drawn on top
// NOTE: Don't set color or line width here. These should be done by
// the calling procedure.
glBindBuffer(GL_ARRAY_BUFFER, data->vbo);
glVertexPointer(3, GL_FLOAT, sizeof(SVN_VEC3), 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data->ibo);
for (i = 0; i < data->numElements; i++) {
SVIS_VECTOR_ELEMENT *ptr = &data->elements[i];
glDrawElements(GL_LINE_STRIP, ptr->indicyCount, GL_UNSIGNED_INT,
ptr->startIndicyIndex * sizeof(unsigned int));
//glDrawArrays(GL_LINE_STRIP, ptr->startIndicyIndex, ptr->indicyCount); // NOTE: replacing glDrawElements with this works.
}
glDepthFunc(GL_LESS); // Reset to default
glDisable(GL_POLYGON_SMOOTH); // See comment for Enable
glDisableClientState(GL_VERTEX_ARRAY); // Clean up the gl state.
}
}
}