From 8434ee8633999cf466328a8d8df58dc35beed115 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 4 Nov 2025 18:04:02 +0100 Subject: [PATCH] feat: transparent buffer class with global binding control --- engine/src/opengl/buffers.cpp | 73 +++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/engine/src/opengl/buffers.cpp b/engine/src/opengl/buffers.cpp index 43dd455..69ca41a 100644 --- a/engine/src/opengl/buffers.cpp +++ b/engine/src/opengl/buffers.cpp @@ -1,3 +1,4 @@ +#include #include #include "engine/opengl/buffers.h" @@ -5,13 +6,12 @@ namespace Core { namespace OpenGL { + BufferID Buffer::m_bound = 0; + Buffer::Buffer(BufferTarget target, BufferUsage usage) : m_target(target), m_usage(usage) { glGenBuffers(1, &m_buffer); - Bind(); - Data(nullptr, 0); - Unbind(); } Buffer::Buffer(BufferTarget target) @@ -21,36 +21,26 @@ namespace OpenGL { glDeleteBuffers(1, &m_buffer); } - void Buffer::Bind() const { - glBindBuffer(m_target, m_buffer); + void Buffer::Data(const Buffer* buffer, const void *data, size_t size) { + if (!IsBound(buffer)) Bind(buffer); + glBufferData(buffer->m_target, size, data, buffer->m_usage); } - void Buffer::Unbind() const { - glBindBuffer(m_target, 0); - } - - void Buffer::Data(void *data, size_t size) { - Bind(); - glBufferData(m_target, size, data, m_usage); - Unbind(); - } - - void Buffer::SubData(void *data, size_t size, size_t offset) { - Bind(); - glBufferSubData(m_target, offset, size, data); - Unbind(); + void Buffer::SubData(const Buffer* buffer, const void *data, size_t size, size_t offset) { + if (!IsBound(buffer)) Bind(buffer); + glBufferSubData(buffer->m_target, offset, size, data); } void Buffer::BindBuffer(unsigned int index) const { - Bind(); + Buffer::Bind(this); glBindBufferBase(m_target, index, m_buffer); - Unbind(); + Buffer::Unbind(this); } void Buffer::BindBufferRanged(unsigned int index, size_t offset, size_t size) const { - Bind(); + Buffer::Bind(this); glBindBufferRange(m_target, index, m_buffer, offset, size); - Unbind(); + Buffer::Unbind(this); } unsigned int UniformBuffer::s_bufferNextId = 1; @@ -58,7 +48,9 @@ namespace OpenGL { UniformBuffer::UniformBuffer(size_t size, unsigned int index) : Buffer(GL_UNIFORM_BUFFER, GL_STATIC_DRAW), m_uniformBinding(s_bufferNextId++) { - Data(nullptr, size); + Buffer::Bind(this); + Data(this, nullptr, size); + Buffer::Unbind(this); BindBuffer(m_uniformBinding); } @@ -75,10 +67,21 @@ namespace OpenGL { : ArrayBuffer(usage) {} VertexArray::VertexArray() : m_id(0) { + std::cout << "Vertex Array init" << std::endl; glGenVertexArrays(1, &m_id); + std::cout << "m_id: " << m_id << std::endl; + } + + VertexArray::~VertexArray() { + // if (m_vbo) { + // delete m_vbo; + // } + + glDeleteVertexArrays(1, &m_id); } void VertexArray::Bind() { + std::cout << "Binding VAO" << std::endl; assert(m_id != 0 && "Vertex Array wasn't initialized."); glBindVertexArray(m_id); @@ -86,10 +89,32 @@ namespace OpenGL { void VertexArray::Unbind() { assert(m_id != 0 && "Vertex Array wasn't initialized."); + + // TODO: Add EBO as well + if (Buffer::IsBound(m_vbo)) { + Buffer::Unbind(m_vbo); + } glBindVertexArray(0); } + void VertexArray::SetupVertexBuffer(BufferUsage usage) { + if (m_vbo) { + delete m_vbo; + } + + m_vbo = new ArrayBuffer(usage); + Buffer::Bind(m_vbo); + Buffer::Data(m_vbo, nullptr, 0); + } + + void VertexArray::VertexBufferData(size_t size, const void* data) { + assert(m_vbo != nullptr && "Trying to upload vertex buffer data to nullptr"); + + Buffer::Bind(m_vbo); + Buffer::Data(m_vbo, data, size); + } + } // namespace OpenGL } // namespace Core \ No newline at end of file