1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
if (vboVertexBuffer == 0) {
GLuint vbo;
glCheck(glGenBuffers(1, &vbo));
const_cast<VertexArray*>(this)->vboVertexBuffer = static_cast<unsigned int>(vbo);
glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer));
glCheck(glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_vertices.size() * sizeof(Vertex), &(m_vertices[0]), GL_DYNAMIC_DRAW));
glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
} else {
GLvoid *pos_vbo = nullptr;
glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer));
pos_vbo = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
if (pos_vbo != nullptr) {
memcpy(pos_vbo,&m_vertices[0], m_vertices.size() * sizeof(Vertex));
glCheck(glUnmapBuffer(GL_ARRAY_BUFFER));
pos_vbo = nullptr;
}
//glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
}
if (vboNormalBuffer == 0) {
const_cast<VertexArray*>(this)->computeNormals();
GLuint vbo;
glCheck(glGenBuffers(1, &vbo));
const_cast<VertexArray*>(this)->vboNormalBuffer = static_cast<unsigned int>(vbo);
glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer));
glCheck(glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_normals.size() * sizeof(Vector3f), &(m_normals[0]), GL_DYNAMIC_DRAW));
glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
} else {
const_cast<VertexArray*>(this)->computeNormals();
GLvoid *pos_vbo = nullptr;
glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboNormalBuffer));
pos_vbo = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
if (pos_vbo != nullptr) {
memcpy(pos_vbo,&m_normals[0], m_normals.size() * sizeof(Vector3f));
glCheck(glUnmapBuffer(GL_ARRAY_BUFFER));
pos_vbo = nullptr;
}
//glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
}
const_cast<VertexArray*>(this)->needToUpdateVBOBuffer = false; |
Partager