feat: instance + array buffer

This commit is contained in:
2025-10-24 13:06:40 +02:00
parent b5ea21ad43
commit e459fea503
7 changed files with 67 additions and 35 deletions

View File

@ -11,24 +11,19 @@ batch::batch() {
}
void batch::prepare(glm::mat4 *instances, unsigned int count) {
if (m_instance_vbo == 0) {
glGenBuffers(1, &m_instance_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
// Allocate *once*, no data yet — just reserve space
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * count, nullptr, GL_DYNAMIC_DRAW);
if (!m_instanceBuffer) {
m_instanceBuffer = std::make_unique<OpenGL::InstanceBuffer>(GL_DYNAMIC_DRAW);
m_instanceBuffer->Data(nullptr, sizeof(glm::mat4) * count);
m_instance_count = count;
} else if (count > m_instance_count) {
// Optional: reallocate only if you *really* have more instances than before
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * count, nullptr, GL_DYNAMIC_DRAW);
m_instanceBuffer->Data(nullptr, sizeof(glm::mat4) * count);
m_instance_count = count;
} else {
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
}
// Just update the data region — much cheaper
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(glm::mat4) * count, instances);
glBindBuffer(GL_ARRAY_BUFFER, 0);
m_instanceBuffer->SubData(instances, sizeof(glm::mat4) * count, 0);
}
}