#include "XCEngine/RHI/OpenGL/OpenGLVertexArray.h" #include namespace XCEngine { namespace RHI { static unsigned int ToGLAttributeType(VertexAttributeType type) { switch (type) { case VertexAttributeType::Float: return GL_FLOAT; case VertexAttributeType::Int: return GL_INT; case VertexAttributeType::UnsignedInt: return GL_UNSIGNED_INT; case VertexAttributeType::Short: return GL_SHORT; case VertexAttributeType::UnsignedShort: return GL_UNSIGNED_SHORT; case VertexAttributeType::Byte: return GL_BYTE; case VertexAttributeType::UnsignedByte: return GL_UNSIGNED_BYTE; case VertexAttributeType::Double: return GL_DOUBLE; case VertexAttributeType::HalfFloat: return GL_HALF_FLOAT; case VertexAttributeType::Fixed: return GL_FIXED; case VertexAttributeType::Int2101010Rev: return GL_INT_2_10_10_10_REV; case VertexAttributeType::UnsignedInt2101010Rev: return GL_UNSIGNED_INT_2_10_10_10_REV; case VertexAttributeType::UnsignedInt10F11F11FRev: return GL_UNSIGNED_INT_10F_11F_11F_REV; default: return GL_FLOAT; } } 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, ToGLAttributeType(attribute.type), attribute.normalized == VertexAttributeNormalized::True ? 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