diff --git a/inc/core/ebo.hpp b/inc/core/ebo.hpp index 8656dbe..15ab3b2 100755 --- a/inc/core/ebo.hpp +++ b/inc/core/ebo.hpp @@ -1,24 +1,38 @@ #ifndef EBO_HPP #define EBO_HPP -#include +#include #include "glad/glad.h" + namespace core { +// An EBO (Element Buffer Object) is a contiguous block of GPU memory that +// stores indices for indexed drawing (used with glDrawElements). Unlike VBOs, +// the EBO binding is stored in the VAO when bound while a VAO is active. class EBO { private: - GLuint id; + GLuint id; // OpenGL handle for this buffer public: - EBO(); + // EBO constructor + // Uploads index data into GPU memory (VRAM) using GL_ELEMENT_ARRAY_BUFFER. + // The indices are used for indexed rendering with glDrawElements. + EBO(const GLuint *indices, std::size_t size); + + // EBO destructor + // Deletes the GPU buffer when the EBO object goes out of scope, freeing VRAM. ~EBO(); - void setData(const unsigned int* indices, size_t size); - + // Binds this EBO to the GL_ELEMENT_ARRAY_BUFFER target. + // If a VAO is bound, this binding is stored in the VAO. void bind(); - void unbind(); + + // Unbinds the current GL_ELEMENT_ARRAY_BUFFER by binding 0. + // This can be useful to avoid accidental modifications to the EBO. + static void unbind(); }; -}; // namespace core +} // namespace core + #endif // EBO_HPP \ No newline at end of file diff --git a/src/core/ebo.cpp b/src/core/ebo.cpp index 7503517..decf3ec 100755 --- a/src/core/ebo.cpp +++ b/src/core/ebo.cpp @@ -1,16 +1,34 @@ -#include "ebo.hpp" +#include "core/ebo.hpp" -EBO::EBO() : id(0) {} - -void EBO::setData(const unsigned int* indices, size_t size) +core::EBO::EBO(const GLuint* indices, std::size_t size) { - if (this->id == 0) glGenBuffers(1, &this->id); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->id); + // Generate a unique OpenGL buffer handle (ID) + glGenBuffers(1, &id); + + // Binding the EBO is mandatory before allocating GPU memory + // This makes OpenGL know which buffer we are uploading data to + bind(); + + // Allocate GPU memory and upload index data to the buffer glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, indices, GL_STATIC_DRAW); } -EBO::~EBO() { glDeleteBuffers(1, &this->id); } +core::EBO::~EBO() +{ + // Delete the OpenGL buffer handle and free GPU memory + glDeleteBuffers(1, &id); +} -void EBO::bind() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->id); } +void core::EBO::bind() +{ + // Bind this buffer to the GL_ELEMENT_ARRAY_BUFFER target + // OpenGL will use this buffer for indexed drawing (glDrawElements) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); +} -void EBO::unbind() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } \ No newline at end of file +void core::EBO::unbind() +{ + // Unbind any buffer from GL_ELEMENT_ARRAY_BUFFER + // This prevents accidental modification of the previously bound EBO + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +} \ No newline at end of file