diff --git a/tests/OpenGL/CMakeLists.txt b/tests/OpenGL/CMakeLists.txt index 7f8624ba..ad87071b 100644 --- a/tests/OpenGL/CMakeLists.txt +++ b/tests/OpenGL/CMakeLists.txt @@ -26,6 +26,8 @@ add_executable( main.cpp OpenGLDevice.cpp OpenGLShader.cpp + OpenGLBuffer.cpp + OpenGLVertexArray.cpp ./package/src/glad.c ) diff --git a/tests/OpenGL/OpenGLBuffer.cpp b/tests/OpenGL/OpenGLBuffer.cpp new file mode 100644 index 00000000..56cffce3 --- /dev/null +++ b/tests/OpenGL/OpenGLBuffer.cpp @@ -0,0 +1,61 @@ +#define GLFW_INCLUDE_NONE +#include "OpenGLBuffer.h" +#include +#include + +namespace XCEngine { +namespace RHI { + +OpenGLBuffer::OpenGLBuffer() + : m_buffer(0) + , m_size(0) + , m_isIndexBuffer(false) { +} + +OpenGLBuffer::~OpenGLBuffer() { + Shutdown(); +} + +bool OpenGLBuffer::InitializeVertexBuffer(const void* data, size_t size) { + glGenBuffers(1, &m_buffer); + glBindBuffer(GL_ARRAY_BUFFER, m_buffer); + glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); + m_size = size; + m_isIndexBuffer = false; + return true; +} + +bool OpenGLBuffer::InitializeIndexBuffer(const void* data, size_t size) { + glGenBuffers(1, &m_buffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); + m_size = size; + m_isIndexBuffer = true; + return true; +} + +void OpenGLBuffer::Shutdown() { + if (m_buffer) { + glDeleteBuffers(1, &m_buffer); + m_buffer = 0; + } +} + +void OpenGLBuffer::Bind() const { + if (m_isIndexBuffer) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffer); + } else { + glBindBuffer(GL_ARRAY_BUFFER, m_buffer); + } +} + +void OpenGLBuffer::Unbind() const { + if (m_isIndexBuffer) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } else { + glBindBuffer(GL_ARRAY_BUFFER, 0); + } +} + +} // namespace RHI +} // namespace XCEngine diff --git a/tests/OpenGL/OpenGLBuffer.h b/tests/OpenGL/OpenGLBuffer.h new file mode 100644 index 00000000..05c768c5 --- /dev/null +++ b/tests/OpenGL/OpenGLBuffer.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +namespace XCEngine { +namespace RHI { + +class OpenGLBuffer { +public: + OpenGLBuffer(); + ~OpenGLBuffer(); + + bool InitializeVertexBuffer(const void* data, size_t size); + bool InitializeIndexBuffer(const void* data, size_t size); + void Shutdown(); + + void Bind() const; + void Unbind() const; + + unsigned int GetID() const { return m_buffer; } + size_t GetSize() const { return m_size; } + +private: + unsigned int m_buffer; + size_t m_size; + bool m_isIndexBuffer; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/tests/OpenGL/OpenGLVertexArray.cpp b/tests/OpenGL/OpenGLVertexArray.cpp new file mode 100644 index 00000000..01b01901 --- /dev/null +++ b/tests/OpenGL/OpenGLVertexArray.cpp @@ -0,0 +1,60 @@ +#define GLFW_INCLUDE_NONE +#include "OpenGLVertexArray.h" +#include +#include + +namespace XCEngine { +namespace RHI { + +OpenGLVertexArray::OpenGLVertexArray() + : m_vao(0) + , m_indexBuffer(0) + , m_indexCount(0) + , m_vertexBufferCount(0) { +} + +OpenGLVertexArray::~OpenGLVertexArray() { + Shutdown(); +} + +bool OpenGLVertexArray::Initialize() { + glGenVertexArrays(1, &m_vao); + return true; +} + +void OpenGLVertexArray::AddVertexBuffer(unsigned int buffer, const VertexAttribute& attribute) { + glBindVertexArray(m_vao); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glEnableVertexAttribArray(attribute.index); + glVertexAttribPointer(attribute.index, attribute.count, attribute.type, + attribute.normalized ? GL_TRUE : GL_FALSE, + attribute.stride, (void*)attribute.offset); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + m_vertexBufferCount++; +} + +void OpenGLVertexArray::SetIndexBuffer(unsigned int buffer, unsigned int type) { + glBindVertexArray(m_vao); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); + glBindVertexArray(0); + m_indexBuffer = buffer; +} + +void OpenGLVertexArray::Shutdown() { + if (m_vao) { + glDeleteVertexArrays(1, &m_vao); + m_vao = 0; + } +} + +void OpenGLVertexArray::Bind() const { + glBindVertexArray(m_vao); +} + +void OpenGLVertexArray::Unbind() const { + glBindVertexArray(0); +} + +} // namespace RHI +} // namespace XCEngine diff --git a/tests/OpenGL/OpenGLVertexArray.h b/tests/OpenGL/OpenGLVertexArray.h new file mode 100644 index 00000000..333a51e2 --- /dev/null +++ b/tests/OpenGL/OpenGLVertexArray.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +namespace XCEngine { +namespace RHI { + +struct VertexAttribute { + unsigned int index; + int count; + unsigned int type; + bool normalized; + size_t stride; + size_t offset; +}; + +class OpenGLVertexArray { +public: + OpenGLVertexArray(); + ~OpenGLVertexArray(); + + bool Initialize(); + void AddVertexBuffer(unsigned int buffer, const VertexAttribute& attribute); + void SetIndexBuffer(unsigned int buffer, unsigned int type); + void Shutdown(); + + void Bind() const; + void Unbind() const; + + unsigned int GetID() const { return m_vao; } + unsigned int GetIndexBuffer() const { return m_indexBuffer; } + unsigned int GetIndexCount() const { return m_indexCount; } + +private: + unsigned int m_vao; + unsigned int m_indexBuffer; + unsigned int m_indexCount; + int m_vertexBufferCount; +}; + +} // namespace RHI +} // namespace XCEngine