void MeshCommand::buildVAO() { // FIXME: Assumes that all the passes in the Material share the same Vertex Attribs GLProgramState* programState = (_material != nullptr) ? _material->_currentTechnique->_passes.at(0)->getGLProgramState() : _glProgramState; releaseVAO(); glGenVertexArrays(1, &_vao); GL::bindVAO(_vao); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); auto flags = programState->getVertexAttribsFlags(); for (int i = 0; flags > 0; i++) { int flag = 1 << i; if (flag & flags) glEnableVertexAttribArray(i); flags &= ~flag; } programState->applyAttributes(false); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); GL::bindVAO(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); }
void MeshCommand::preBatchDraw() { // Do nothing if using material since each pass needs to bind its own VAO if (!_material) { if (Configuration::getInstance()->supportsShareableVAO() && _vao == 0) buildVAO(); if (_vao) { GL::bindVAO(_vao); } else { glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); // FIXME: Assumes that all the passes in the Material share the same Vertex Attribs GLProgramState* programState = _material ? _material->_currentTechnique->_passes.at(0)->getGLProgramState() : _glProgramState; programState->applyAttributes(); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); } } }