feat: transparent buffer class with global binding control
This commit is contained in:
@ -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);
|
||||
@ -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
|
||||
Reference in New Issue
Block a user