1#include <zen/platform/OpenGL/ZEN_OpenGLVertexArray.h>
4static GLenum ShaderDataTypeToOpenGLBaseType(ShaderDataType type) {
6 case ShaderDataType::Float:
8 case ShaderDataType::Float2:
10 case ShaderDataType::Float3:
12 case ShaderDataType::Float4:
14 case ShaderDataType::Mat3:
16 case ShaderDataType::Mat4:
18 case ShaderDataType::Int:
20 case ShaderDataType::Int2:
22 case ShaderDataType::Int3:
24 case ShaderDataType::Int4:
26 case ShaderDataType::Bool:
33OpenGLVertexArray::OpenGLVertexArray() {
34 glCreateVertexArrays(1, &m_rendererID);
37OpenGLVertexArray::~OpenGLVertexArray() {
38 glDeleteVertexArrays(1, &m_rendererID);
41void OpenGLVertexArray::bind()
const { glBindVertexArray(m_rendererID); }
42void OpenGLVertexArray::unbind()
const { glBindVertexArray(0); }
43void OpenGLVertexArray::addVertexBuffer(
44 const std::shared_ptr<VertexBuffer> &vertexBuffer) {
45 glBindVertexArray(m_rendererID);
50 const auto &layout = vertexBuffer->getLayout();
51 for (
const auto &element : layout) {
52 glEnableVertexAttribArray(index);
53 glVertexAttribPointer(index, element.GetComponentCount(),
54 ShaderDataTypeToOpenGLBaseType(element.type),
55 element.isNormalized ? GL_TRUE : GL_FALSE,
56 layout.getStride(), (
const void *)element.offset);
57 ZEN_LOG_TRACE(
"index:{}, component count: {}, type:{}, normalized;{}, "
58 "stride:{}, offset:{}",
59 index, element.GetComponentCount(),
60 ShaderDataTypeToOpenGLBaseType(element.type),
61 element.isNormalized, layout.getStride(),
62 (
const void *)element.offset);
65 m_vertexBuffers.push_back(vertexBuffer);
67void OpenGLVertexArray::setIndexBuffer(
68 const std::shared_ptr<IndexBuffer> &indexBuffer) {
69 glBindVertexArray(m_rendererID);
71 m_indexBuffer = indexBuffer;