void vbo_draw(void) { if(vertex_buffer_count) { vbo_bind(); vbo_buffer_data(&vertex_buffer[0], VERTEX_SIZE * vertex_buffer_count); glDrawArrays(vertex_draw_mode,0,vertex_buffer_count); vertex_buffer_count = 0; vbo_unbind(); } }
void vbo_enable(void) { const void *vp = NULL; const void *vc = NULL; const void *tc0 = NULL; const void *tc1 = NULL; const void *fog = NULL; bool was_drawing = vbuf_drawing; if (vbuf_enabled) return; vbuf_drawing = true; if (vbuf_vbo) { glBindBuffer(GL_ARRAY_BUFFER, vbuf_vbo); if (vbuf_vbo_size < VERTEX_BUFFER_SIZE * sizeof(VBufVertex)) vbo_buffer_data(NULL, VERTEX_BUFFER_SIZE * sizeof(VBufVertex)); vp = (void*)offsetof(VBufVertex, x); vc = (void*)offsetof(VBufVertex, b); tc0 = (void*)offsetof(VBufVertex, coord[2]); tc1 = (void*)offsetof(VBufVertex, coord[0]); fog = (void*)offsetof(VBufVertex, fog); } else { vp = &vbuf_data->x; vc = &vbuf_data->b; tc0 = &vbuf_data->coord[2]; tc1 = &vbuf_data->coord[0]; fog = &vbuf_data->fog; } glEnableVertexAttribArray(POSITION_ATTR); glEnableVertexAttribArray(COLOUR_ATTR); glEnableVertexAttribArray(TEXCOORD_0_ATTR); glEnableVertexAttribArray(TEXCOORD_1_ATTR); glEnableVertexAttribArray(FOG_ATTR); glVertexAttribPointer(POSITION_ATTR, 4, GL_FLOAT, false, sizeof(VBufVertex), (void*)vp); glVertexAttribPointer(COLOUR_ATTR, 4, GL_UNSIGNED_BYTE, true, sizeof(VBufVertex), (void*)vc); glVertexAttribPointer(TEXCOORD_0_ATTR, 2, GL_FLOAT, false, sizeof(VBufVertex), (void*)tc0); glVertexAttribPointer(TEXCOORD_1_ATTR, 2, GL_FLOAT, false, sizeof(VBufVertex), (void*)tc1); glVertexAttribPointer(FOG_ATTR, 1, GL_FLOAT, false, sizeof(VBufVertex), (void*)fog); if (vbuf_vbo) glBindBuffer(GL_ARRAY_BUFFER, 0); vbuf_enabled = true; vbuf_drawing = was_drawing; }