feat: transparent buffer class with global binding control

This commit is contained in:
2025-11-04 18:04:02 +01:00
parent 2d10e22a99
commit 8434ee8633

View File

@ -1,3 +1,4 @@
#include <iostream>
#include <cassert>
#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);
@ -87,9 +90,31 @@ 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