From 7b1268d4a4ddd381360d8d51b3d5cb5629e78fc2 Mon Sep 17 00:00:00 2001 From: Vitor Fernandes Date: Sat, 20 Jun 2020 15:46:40 +0100 Subject: [PATCH] Abstraction over layouts --- src/opengl/CMakeLists.txt | 1 + src/opengl/VertexArray.cpp | 36 ++++++++++++++++ src/opengl/VertexArray.h | 18 ++++++++ src/opengl/VertexBufferLayout.h | 73 +++++++++++++++++++++++++++++++++ src/opengl/gl1.cpp | 17 ++++---- 5 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 src/opengl/VertexArray.cpp create mode 100644 src/opengl/VertexArray.h create mode 100644 src/opengl/VertexBufferLayout.h diff --git a/src/opengl/CMakeLists.txt b/src/opengl/CMakeLists.txt index 0225057..0bc85a5 100644 --- a/src/opengl/CMakeLists.txt +++ b/src/opengl/CMakeLists.txt @@ -13,6 +13,7 @@ add_executable( Renderer.cpp VertexBuffer.cpp IndexBuffer.cpp + VertexArray.cpp glew.c ) diff --git a/src/opengl/VertexArray.cpp b/src/opengl/VertexArray.cpp new file mode 100644 index 0000000..b290398 --- /dev/null +++ b/src/opengl/VertexArray.cpp @@ -0,0 +1,36 @@ +#include "VertexArray.h" +#include "Renderer.h" + +VertexArray::VertexArray() +{ + GLCall(glGenVertexArrays(1,&m_RendererID)); +} + +VertexArray::~VertexArray() +{ + GLCall(glDeleteVertexArrays(1,&m_RendererID)); +} + +void VertexArray::AddBuffer(const VertexBuffer &vb, const VertexBufferLayout& layout) +{ + vb.Bind(); + const auto &elements = layout.GetElements(); + unsigned int offset=0; + for (unsigned int i = 0; i < elements.size(); i++) + { + const auto &element = elements[i]; + GLCall(glEnableVertexAttribArray(i)); + GLCall(glVertexAttribPointer(i, elements[i].count, element.type,element.normalized, layout.GetStride(), (const void*)offset)); + offset+=element.count * VertexBufferElement::GetSizeOfType(element.type); + } +} + +void VertexArray::Bind() const +{ + GLCall(glBindVertexArray(m_RendererID)); +} + +void VertexArray::Unbind() const +{ + GLCall(glBindVertexArray(0)); +} \ No newline at end of file diff --git a/src/opengl/VertexArray.h b/src/opengl/VertexArray.h new file mode 100644 index 0000000..59fa586 --- /dev/null +++ b/src/opengl/VertexArray.h @@ -0,0 +1,18 @@ +#pragma once + +#include "VertexBuffer.h" +#include "VertexBufferLayout.h" + +class VertexArray +{ +private: + unsigned int m_RendererID; + +public: + VertexArray(); + ~VertexArray(); + + void AddBuffer(const VertexBuffer &vb, const VertexBufferLayout &layout); + void Bind() const; + void Unbind() const; +}; \ No newline at end of file diff --git a/src/opengl/VertexBufferLayout.h b/src/opengl/VertexBufferLayout.h new file mode 100644 index 0000000..7c38c43 --- /dev/null +++ b/src/opengl/VertexBufferLayout.h @@ -0,0 +1,73 @@ +#pragma once + +#include +#include "glew.h" +#include "Renderer.h" + +struct VertexBufferElement +{ + unsigned int type; + unsigned int count; + unsigned char normalized; + static unsigned int GetSizeOfType(unsigned int type) + { + switch (type) + { + case GL_FLOAT: + return 4; + case GL_UNSIGNED_INT: + return 4; + case GL_UNSIGNED_BYTE: + return 1; + } + ASSERT(false); + return 0; + }; +}; + +class VertexBufferLayout +{ +private: + std::vector m_Elements; + unsigned int m_Stride; + +public: + VertexBufferLayout() : m_Stride(0) + { + } + + template + void Push(unsigned count); + template <> + void Push(unsigned int count) + { + VertexBufferElement vbe = {GL_FLOAT, count, GL_FALSE}; + m_Elements.push_back(vbe); + m_Stride += count * VertexBufferElement::GetSizeOfType(GL_FLOAT); + }; + + template <> + void Push(unsigned int count) + { + VertexBufferElement vbe = {GL_UNSIGNED_INT, count, GL_FALSE}; + m_Elements.push_back(vbe); + m_Stride += count * VertexBufferElement::GetSizeOfType(GL_UNSIGNED_INT); + } + + template <> + void Push(unsigned int count) + { + VertexBufferElement vbe = {GL_UNSIGNED_BYTE, count, GL_TRUE}; + m_Elements.push_back(vbe); + m_Stride += count * VertexBufferElement::GetSizeOfType(GL_UNSIGNED_BYTE); + } + + inline const std::vector GetElements() const & + { + return m_Elements; + } + inline unsigned int GetStride() const + { + return m_Stride; + } +}; \ No newline at end of file diff --git a/src/opengl/gl1.cpp b/src/opengl/gl1.cpp index 0cc7233..1b29b70 100644 --- a/src/opengl/gl1.cpp +++ b/src/opengl/gl1.cpp @@ -7,6 +7,7 @@ #include "Renderer.h" #include "VertexBuffer.h" #include "IndexBuffer.h" +#include "VertexArray.h" typedef unsigned int uint; @@ -141,11 +142,14 @@ int main(void) //Create buffer //Buffer id - VertexBuffer* vb = new VertexBuffer(positions, 4 * 2 * sizeof(float)); - GLCall(glEnableVertexAttribArray(0)); - GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0)); + VertexArray va ; + VertexBuffer vb(positions, 4 * 2 * sizeof(float)); + + VertexBufferLayout layout; + layout.Push(2); + va.AddBuffer(vb,layout); - IndexBuffer* ib = new IndexBuffer(indexes,6); + IndexBuffer ib(indexes,6); ShaderProgramSource source = ParseShader(SHADERS_PATH); uint shader = CreateShader(source.VertexSource, source.FragmentSource); @@ -183,8 +187,7 @@ int main(void) GLCall(glUniform4f(uniform_location, 0.2f, 0.3f, 0.8f, 1.0f)); - //GLCall(glBindVertexArray(vb)); - ib->Bind(); + ib.Bind(); GLCall(glDrawElements(GL_TRIANGLES, 6 * sizeof(uint), GL_UNSIGNED_INT, nullptr)); @@ -202,8 +205,6 @@ int main(void) glfwPollEvents(); } - delete ib; - delete vb; glfwTerminate(); return 0; } \ No newline at end of file