From 20646758939562c0fbad4d52774efcfacf7e22fc Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 22 Dec 2021 14:10:34 +0000 Subject: RAII for glVertex and glBuffer --- gfx/models/mesh.cpp | 13 +++---------- gfx/models/mesh.h | 16 ++++------------ lib/glBuffers.cpp | 13 +++++++++++++ lib/glBuffers.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/glVertexArrays.cpp | 13 +++++++++++++ lib/glVertexArrays.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ ui/iconButton.cpp | 9 ++++----- ui/iconButton.h | 6 ++++-- 8 files changed, 137 insertions(+), 29 deletions(-) create mode 100644 lib/glBuffers.cpp create mode 100644 lib/glBuffers.h create mode 100644 lib/glVertexArrays.cpp create mode 100644 lib/glVertexArrays.h diff --git a/gfx/models/mesh.cpp b/gfx/models/mesh.cpp index 82eafbc..28cd021 100644 --- a/gfx/models/mesh.cpp +++ b/gfx/models/mesh.cpp @@ -1,17 +1,16 @@ #include "mesh.h" +#include "glBuffers.h" +#include "glVertexArrays.h" #include "vertex.hpp" #include #define offset_ptr(T, m) ((reinterpret_cast(1)) + offsetof(T, m) - 1) Mesh::Mesh(const std::span vertices, const std::span indices, GLenum m) : - m_vertexArrayObject {}, m_vertexArrayBuffers {}, m_numIndices {static_cast(indices.size())}, mode {m} + m_vertexArrayBuffers {}, m_numIndices {static_cast(indices.size())}, mode {m} { - glGenVertexArrays(1, &m_vertexArrayObject); glBindVertexArray(m_vertexArrayObject); - glGenBuffers(2, m_vertexArrayBuffers.data()); - glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[0]); glBufferData(GL_ARRAY_BUFFER, static_cast(sizeof(Vertex) * vertices.size()), vertices.data(), GL_STATIC_DRAW); @@ -32,12 +31,6 @@ Mesh::Mesh(const std::span vertices, const std::span -#include +#include +#include #include #include -#include class Vertex; -enum MeshBufferPositions { POSITION_VB, TEXCOORD_VB, NORMAL_VB, INDEX_VB }; - class Mesh { public: Mesh(const std::span vertices, const std::span indices, GLenum = GL_TRIANGLES); - virtual ~Mesh(); - - NO_COPY(Mesh); - NO_MOVE(Mesh); void Draw() const; private: - static constexpr unsigned int NUM_BUFFERS {4}; - - GLuint m_vertexArrayObject; - std::array m_vertexArrayBuffers; + glVertexArray m_vertexArrayObject; + glBuffers<2> m_vertexArrayBuffers; GLsizei m_numIndices; GLenum mode; }; diff --git a/lib/glBuffers.cpp b/lib/glBuffers.cpp new file mode 100644 index 0000000..cb5ab2a --- /dev/null +++ b/lib/glBuffers.cpp @@ -0,0 +1,13 @@ +#include "glBuffers.h" + +void +glBuffersBase::gen(GLsizei n, GLuint * ids) +{ + glGenBuffers(n, ids); +} + +void +glBuffersBase::del(GLsizei n, const GLuint * ids) +{ + glDeleteBuffers(n, ids); +} diff --git a/lib/glBuffers.h b/lib/glBuffers.h new file mode 100644 index 0000000..e91293c --- /dev/null +++ b/lib/glBuffers.h @@ -0,0 +1,48 @@ +#ifndef GLBUFFERS_H +#define GLBUFFERS_H + +#include +#include +#include +#include + +class glBuffersBase { +protected: + static void gen(GLsizei, GLuint *); + static void del(GLsizei, const GLuint *); +}; + +template class glBuffers : glBuffersBase { +public: + glBuffers() + { + gen(N, ids.data()); + } + + ~glBuffers() + { + del(N, ids.data()); + } + + NO_COPY(glBuffers); + NO_MOVE(glBuffers); + + // NOLINTNEXTLINE(hicpp-explicit-conversions) + operator GLuint() const + { + static_assert(N == 1, "Implicit cast only if N == 1"); + return ids.front(); + } + + auto + operator[](size_t n) const + { + return ids[n]; + } + +private: + std::array ids {}; +}; +using glBuffer = glBuffers<1>; + +#endif diff --git a/lib/glVertexArrays.cpp b/lib/glVertexArrays.cpp new file mode 100644 index 0000000..372b49b --- /dev/null +++ b/lib/glVertexArrays.cpp @@ -0,0 +1,13 @@ +#include "glVertexArrays.h" + +void +glVertexArraysBase::gen(GLsizei n, GLuint * ids) +{ + glGenVertexArrays(n, ids); +} + +void +glVertexArraysBase::del(GLsizei n, const GLuint * ids) +{ + glDeleteVertexArrays(n, ids); +} diff --git a/lib/glVertexArrays.h b/lib/glVertexArrays.h new file mode 100644 index 0000000..ab31751 --- /dev/null +++ b/lib/glVertexArrays.h @@ -0,0 +1,48 @@ +#ifndef GLVERTEXARRAYS_H +#define GLVERTEXARRAYS_H + +#include +#include +#include +#include + +class glVertexArraysBase { +protected: + static void gen(GLsizei, GLuint *); + static void del(GLsizei, const GLuint *); +}; + +template class glVertexArrays : glVertexArraysBase { +public: + glVertexArrays() + { + gen(N, ids.data()); + } + + ~glVertexArrays() + { + del(N, ids.data()); + } + + NO_COPY(glVertexArrays); + NO_MOVE(glVertexArrays); + + // NOLINTNEXTLINE(hicpp-explicit-conversions) + operator GLuint() const + { + static_assert(N == 1, "Implicit cast only if N == 1"); + return ids.front(); + } + + auto + operator[](size_t n) const + { + return ids[n]; + } + +private: + std::array ids {}; +}; +using glVertexArray = glVertexArrays<1>; + +#endif diff --git a/ui/iconButton.cpp b/ui/iconButton.cpp index c35303f..c97896f 100644 --- a/ui/iconButton.cpp +++ b/ui/iconButton.cpp @@ -1,6 +1,9 @@ #include "iconButton.h" +#include "glBuffers.h" +#include "glVertexArrays.h" #include "ui/icon.h" #include "ui/uiComponent.h" +#include #include #include #include @@ -9,14 +12,10 @@ #include IconButton::IconButton(const std::string & icon_, glm::vec2 position_, UIEvent click_) : - UIComponent {{position_, ICON_SIZE}}, icon {icon_}, click {std::move(click_)}, m_vertexArrayObject {}, - m_vertexArrayBuffer {} + UIComponent {{position_, ICON_SIZE}}, icon {icon_}, click {std::move(click_)} { - glGenVertexArrays(1, &m_vertexArrayObject); glBindVertexArray(m_vertexArrayObject); - glGenBuffers(1, &m_vertexArrayBuffer); - glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffer); glBufferData(GL_ARRAY_BUFFER, static_cast(sizeof(glm::vec4) * 4), nullptr, GL_DYNAMIC_DRAW); diff --git a/ui/iconButton.h b/ui/iconButton.h index ec3f357..76e3f1b 100644 --- a/ui/iconButton.h +++ b/ui/iconButton.h @@ -3,7 +3,8 @@ #include "icon.h" #include "uiComponent.h" -#include +#include +#include #include #include @@ -21,7 +22,8 @@ public: Icon icon; UIEvent click; - GLuint m_vertexArrayObject, m_vertexArrayBuffer; + glVertexArray m_vertexArrayObject; + glBuffer m_vertexArrayBuffer; }; #endif -- cgit v1.2.3