void OGL4GeometryData::AttachIndexBuffer(GPUBufferPtr pBuffer, G_FORMAT format) { if(m_pIndexBuffer) { m_pIndexBuffer->Release(); } m_pIndexBuffer = pBuffer; switch(format) { case G_FORMAT_R32_UINT: m_indexType = GL_UNSIGNED_INT; m_indexElementBytes = 4; break; case G_FORMAT_R16_UINT: m_indexType = GL_UNSIGNED_SHORT; m_indexElementBytes = 2; break; default: assert(0); m_indexType = GL_UNSIGNED_SHORT; m_indexElementBytes = 2; break; } OGL4BufferPtr pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pOGLBuffer->GetBufferObject()); }
void OGL4GeometryData::CommitModify() { glBindVertexArray(m_vao); OGL4BufferPtr pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, pOGLBuffer->GetBufferObject()); pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pIndexBuffer); if(pOGLBuffer) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pOGLBuffer->GetBufferObject()); } glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); }
void OGL4GeometryData::SetVertexLayout(const VertexLayout& layout) { m_layout = layout; unsigned int stride = m_layout.VertexStride(); OGL4BufferPtr pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, pOGLBuffer->GetBufferObject()); unsigned int offset = 0; for(unsigned int i = 0; i < m_layout.AttrCount(); ++i) { glEnableVertexAttribArray(i); G_FORMAT type = m_layout.AttrType(i); unsigned int value_count = 0; GLenum gltype = GL_INVALID_ENUM; if(OGL4Convert::FormatToGLVertexAttr(type, value_count, gltype) == false) { assert(0); } switch(gltype) { case GL_INT: case GL_UNSIGNED_INT: glVertexAttribIPointer(i, value_count, gltype, stride, (GLvoid*)(m_vbOffset + offset)); break; default: glVertexAttribPointer(i, value_count, gltype, GL_FALSE, stride, (GLvoid*)(m_vbOffset + offset)); break; } offset += m_layout.TypeBytes(type); } }