From fe8d4b8e1394e7eab13c26fd63142179bfcafdb5 Mon Sep 17 00:00:00 2001 From: NaifBanana <30419422+NaifBanana@users.noreply.github.com> Date: Sat, 21 Mar 2026 22:14:31 -0500 Subject: [PATCH] Added VAO and some stuff --- engine/NBCore/Types.hpp | 6 +++- engine/NBGraphics/Buffers.hpp | 67 +++++++++++++++++++++++++++++------ 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/engine/NBCore/Types.hpp b/engine/NBCore/Types.hpp index d5409df..293bdb5 100644 --- a/engine/NBCore/Types.hpp +++ b/engine/NBCore/Types.hpp @@ -2,6 +2,8 @@ #ifndef _NB_CORE_TYPES #define _NB_CORE_TYPES +#include + namespace nb { template @@ -16,6 +18,8 @@ T swapEndian(const T& val) { } return ret; } - + +using ByteVector = std::vector; + } // namespace nb #endif // _NB_CORE_TYPES \ No newline at end of file diff --git a/engine/NBGraphics/Buffers.hpp b/engine/NBGraphics/Buffers.hpp index 1c57fe6..c02867a 100644 --- a/engine/NBGraphics/Buffers.hpp +++ b/engine/NBGraphics/Buffers.hpp @@ -10,6 +10,7 @@ #include #include "NBCore/Errors.hpp" +#include "NBCore/Types.hpp" namespace nb { @@ -101,6 +102,8 @@ public: template class OpenGLObject { public: + OpenGLObject(OpenGLObject&&) = default; + OpenGLObject& operator=(OpenGLObject&&) = default; ~OpenGLObject() { remove(); } virtual void bind() const = 0; @@ -110,27 +113,71 @@ public: protected: OpenGLObject() = default; - OpenGLObject(const OpenGLObject& rhs) = delete; - OpenGLObject& operator=(const OpenGLObject& rhs) = delete; + OpenGLObject(const OpenGLObject&) = delete; + OpenGLObject& operator=(const OpenGLObject&) = delete; virtual void remove() const = 0; GLuint _id; }; -template -class Buffer : OpenGLObject> { +class VAO : public virtual OpenGLObject { public: - using Base = OpenGLObject; + using Base = OpenGLObject; using Base::Base; - using BufferType::BufferType; - using BufferType::GLTarget; - - void bind() const { glBindBuffer(GLTarget, _id); } - void unbind() const { glBindBuffer(GLTarget, 0); } + + VAO() { glGenVertexArrays(1, &_id); } + + void bind() const { glBindVertexArray(_id); } + void unbind() const { glBindVertexArray(0); } + protected: using Base::_id; + const + + void remove() { glDeleteVertexArrays(1, &_id); } + +}; + +template +class Buffer : public virtual OpenGLObject> { +public: + using Base = OpenGLObject; + using Base::Base; + + Buffer(GLenum usage_ = GL_STATIC_DRAW) : usage(usage_) { glGenBuffers(1, &_id); } + + void bind() const { glBindBuffer(GLTarget, _id); } + void unbind() const { glBindBuffer(GLTarget, 0); } + void data(void* data_, size_t size) const { glBufferData(GLTarget, size, data_, usage); } + void data(nb::ByteVector& data_) const { glBufferData(GLTarget, data_.size(), data_.data(), usage); } + void invalidate() const { glInvalidateBufferData(_id); } + + + const GLenum GLTarget = BufferType::GLTarget; + GLenum usage; + +protected: + using Base::_id; + void remove() { glDeleteBuffers(1, &_id); } + +}; + +class VertexBuffer : public virtual Buffer { +public: + + static const GLenum GLTarget = GL_ARRAY_BUFFER; +protected: + +}; + +class ElementBuffer : public virtual Buffer { +public: + + static const GLenum GLTarget = GL_ELEMENT_ARRAY_BUFFER; + +protected: };