From 337da2b3b77e87c6d2b6d68bc57ffad4b375835c Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 23 Oct 2025 22:42:41 +0200 Subject: [PATCH] feat: opengl buffer & nested uniform buffer class --- engine/CMakeLists.txt | 2 + engine/include/engine/opengl/buffers.h | 43 +++++++++++++++++++ engine/src/opengl/buffers.cpp | 58 ++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 engine/include/engine/opengl/buffers.h create mode 100644 engine/src/opengl/buffers.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 548a698..d01ad76 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -7,6 +7,8 @@ set(SOURCES src/input/input.cpp + src/opengl/buffers.cpp + src/scene/scene.cpp src/window/window.cpp diff --git a/engine/include/engine/opengl/buffers.h b/engine/include/engine/opengl/buffers.h new file mode 100644 index 0000000..c9df74a --- /dev/null +++ b/engine/include/engine/opengl/buffers.h @@ -0,0 +1,43 @@ +#ifndef OPENGL_BUFFERS_H_ +#define OPENGL_BUFFERS_H_ + +#include + +#include "engine/export.h" + +namespace Core { + +namespace OpenGL { + using BufferTarget = GLenum; + using BufferUsage = GLenum; + using BufferID = unsigned int; + + class ENGINE_API Buffer { + public: + Buffer(BufferTarget target, BufferUsage usage); + + void Data(void* data, size_t size); + void SubData(void *data, size_t size, size_t offset); + + void BindBuffer(unsigned int index); + void BindBufferRanged(unsigned int index, size_t offset, size_t size); + protected: + void Bind(); + void Unbind(); + private: + BufferID m_buffer; + BufferTarget m_target; + BufferUsage m_usage; + }; + + class ENGINE_API UniformBuffer : public Buffer { + public: + UniformBuffer(size_t size, unsigned int index); + public: + + }; +} // namespace OpenGL + +} // namespace Core + +#endif // OPENGL_BUFFERS_H_ diff --git a/engine/src/opengl/buffers.cpp b/engine/src/opengl/buffers.cpp new file mode 100644 index 0000000..d5da948 --- /dev/null +++ b/engine/src/opengl/buffers.cpp @@ -0,0 +1,58 @@ +#include "engine/opengl/buffers.h" + +namespace Core { + +namespace OpenGL { + + Buffer::Buffer(BufferTarget target, BufferUsage usage) + : m_target(target), m_usage(usage) + { + glGenBuffers(1, &m_buffer); + Bind(); + Data(nullptr, 0); + Unbind(); + } + + void Buffer::Bind() { + glBindBuffer(m_target, m_buffer); + } + + void Buffer::Unbind() { + 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::BindBuffer(unsigned int index) { + Bind(); + glBindBufferBase(m_target, index, m_buffer); + Unbind(); + } + + void Buffer::BindBufferRanged(unsigned int index, size_t offset, size_t size) { + Bind(); + glBindBufferRange(m_target, index, m_buffer, offset, size); + Unbind(); + } + + UniformBuffer::UniformBuffer(size_t size, unsigned int index) + : Buffer(GL_UNIFORM_BUFFER, GL_STATIC_DRAW) + { + Data(nullptr, size); + + BindBuffer(index); + } + +} // namespace OpenGL + +} // namespace Core \ No newline at end of file