feat: transparent buffer class with global binding control
This commit is contained in:
@ -1,3 +1,4 @@
|
|||||||
|
#include <iostream>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include "engine/opengl/buffers.h"
|
#include "engine/opengl/buffers.h"
|
||||||
|
|
||||||
@ -5,13 +6,12 @@ namespace Core {
|
|||||||
|
|
||||||
namespace OpenGL {
|
namespace OpenGL {
|
||||||
|
|
||||||
|
BufferID Buffer::m_bound = 0;
|
||||||
|
|
||||||
Buffer::Buffer(BufferTarget target, BufferUsage usage)
|
Buffer::Buffer(BufferTarget target, BufferUsage usage)
|
||||||
: m_target(target), m_usage(usage)
|
: m_target(target), m_usage(usage)
|
||||||
{
|
{
|
||||||
glGenBuffers(1, &m_buffer);
|
glGenBuffers(1, &m_buffer);
|
||||||
Bind();
|
|
||||||
Data(nullptr, 0);
|
|
||||||
Unbind();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer::Buffer(BufferTarget target)
|
Buffer::Buffer(BufferTarget target)
|
||||||
@ -21,36 +21,26 @@ namespace OpenGL {
|
|||||||
glDeleteBuffers(1, &m_buffer);
|
glDeleteBuffers(1, &m_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Buffer::Bind() const {
|
void Buffer::Data(const Buffer* buffer, const void *data, size_t size) {
|
||||||
glBindBuffer(m_target, m_buffer);
|
if (!IsBound(buffer)) Bind(buffer);
|
||||||
|
glBufferData(buffer->m_target, size, data, buffer->m_usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Buffer::Unbind() const {
|
void Buffer::SubData(const Buffer* buffer, const void *data, size_t size, size_t offset) {
|
||||||
glBindBuffer(m_target, 0);
|
if (!IsBound(buffer)) Bind(buffer);
|
||||||
}
|
glBufferSubData(buffer->m_target, offset, size, data);
|
||||||
|
|
||||||
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::BindBuffer(unsigned int index) const {
|
void Buffer::BindBuffer(unsigned int index) const {
|
||||||
Bind();
|
Buffer::Bind(this);
|
||||||
glBindBufferBase(m_target, index, m_buffer);
|
glBindBufferBase(m_target, index, m_buffer);
|
||||||
Unbind();
|
Buffer::Unbind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Buffer::BindBufferRanged(unsigned int index, size_t offset, size_t size) const {
|
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);
|
glBindBufferRange(m_target, index, m_buffer, offset, size);
|
||||||
Unbind();
|
Buffer::Unbind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int UniformBuffer::s_bufferNextId = 1;
|
unsigned int UniformBuffer::s_bufferNextId = 1;
|
||||||
@ -58,7 +48,9 @@ namespace OpenGL {
|
|||||||
UniformBuffer::UniformBuffer(size_t size, unsigned int index)
|
UniformBuffer::UniformBuffer(size_t size, unsigned int index)
|
||||||
: Buffer(GL_UNIFORM_BUFFER, GL_STATIC_DRAW), m_uniformBinding(s_bufferNextId++)
|
: 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);
|
BindBuffer(m_uniformBinding);
|
||||||
}
|
}
|
||||||
@ -75,10 +67,21 @@ namespace OpenGL {
|
|||||||
: ArrayBuffer(usage) {}
|
: ArrayBuffer(usage) {}
|
||||||
|
|
||||||
VertexArray::VertexArray() : m_id(0) {
|
VertexArray::VertexArray() : m_id(0) {
|
||||||
|
std::cout << "Vertex Array init" << std::endl;
|
||||||
glGenVertexArrays(1, &m_id);
|
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() {
|
void VertexArray::Bind() {
|
||||||
|
std::cout << "Binding VAO" << std::endl;
|
||||||
assert(m_id != 0 && "Vertex Array wasn't initialized.");
|
assert(m_id != 0 && "Vertex Array wasn't initialized.");
|
||||||
|
|
||||||
glBindVertexArray(m_id);
|
glBindVertexArray(m_id);
|
||||||
@ -87,9 +90,31 @@ namespace OpenGL {
|
|||||||
void VertexArray::Unbind() {
|
void VertexArray::Unbind() {
|
||||||
assert(m_id != 0 && "Vertex Array wasn't initialized.");
|
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);
|
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 OpenGL
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
Reference in New Issue
Block a user