void Vao::initGL() {
if(vaoHandle == 0) {
glGenVertexArrays(1, &vaoHandle);
glGenBuffers(1, &vboHandle);
glGenBuffers(1, &iboHandle);
}
glBindVertexArray(vaoHandle);
bindVboGL();
bindIboGL();
glBindVertexArray(0);
}
void Vao::drawGL() {
if(vaoHandle == 0) initGL();
glBindVertexArray(vaoHandle);
for(std::vector<VaoEntry>::size_type i = 0; i < entries.size(); i++) {
if(!entries.at(i).isVisible()) continue;
checkShaderProgramGL(entries.at(i).getShaderId());
checkEntryUpdatesGL();
entries.at(i).getShaderProgram()->bindGL();
entries.at(i).getShaderProgram()->uploadUniformsGL(entries.at(i).getUniformKey());
// First call throws handled exception
glDrawElements(mode, entries.at(i).getCount(), GL_UNSIGNED_SHORT,
reinterpret_cast<GLvoid *>(entries.at(i).getOffset() * sizeof(GLshort)));
entries.at(i).getShaderProgram()->unbindGL();
}
glBindVertexArray(0);
}
void Vao::updateGL() {
int vertexSize = 0;
int indexSize = 0;
for(std::vector<VaoEntry>::size_type i = 0; i < entries.size(); i++) {
vertexSize += entries.at(i).getSize();
indexSize += entries.at(i).getCount();
}
GLfloat* vertexBuffer = new GLfloat[vertexSize];
GLushort* indexBuffer = new GLushort[indexSize];
vertexSize = 0;
indexSize = 0;
for(std::vector<VaoEntry>::size_type i = 0; i < entries.size(); i++) {
entries.at(i).collectVertexData(vertexBuffer, &vertexSize);
entries.at(i).collectIndexData(indexBuffer, &indexSize);
}
glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
glBufferData(GL_ARRAY_BUFFER, vertexSize * sizeof(GLfloat), vertexBuffer, usage);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(vaoHandle);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboHandle);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize * sizeof(GLushort), indexBuffer, usage);
glBindVertexArray(0);
delete[] vertexBuffer;
delete[] indexBuffer;
}