Zen 0.3.0
Loading...
Searching...
No Matches
ZEN_OpenGLVertexArray.cpp
1#include <zen/platform/OpenGL/ZEN_OpenGLVertexArray.h>
2
3namespace Zen {
4static GLenum ShaderDataTypeToOpenGLBaseType(ShaderDataType type) {
5 switch (type) {
6 case ShaderDataType::Float:
7 return GL_FLOAT;
8 case ShaderDataType::Float2:
9 return GL_FLOAT;
10 case ShaderDataType::Float3:
11 return GL_FLOAT;
12 case ShaderDataType::Float4:
13 return GL_FLOAT;
14 case ShaderDataType::Mat3:
15 return GL_FLOAT;
16 case ShaderDataType::Mat4:
17 return GL_FLOAT;
18 case ShaderDataType::Int:
19 return GL_INT;
20 case ShaderDataType::Int2:
21 return GL_INT;
22 case ShaderDataType::Int3:
23 return GL_INT;
24 case ShaderDataType::Int4:
25 return GL_INT;
26 case ShaderDataType::Bool:
27 return GL_BOOL;
28 }
29
30 return 0;
31}
32
33OpenGLVertexArray::OpenGLVertexArray() {
34 glCreateVertexArrays(1, &m_rendererID);
35}
36
37OpenGLVertexArray::~OpenGLVertexArray() {
38 glDeleteVertexArrays(1, &m_rendererID);
39}
40
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);
46 vertexBuffer->bind();
47
48 uint32_t index = 0;
49
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);
63 index++;
64 }
65 m_vertexBuffers.push_back(vertexBuffer);
66}
67void OpenGLVertexArray::setIndexBuffer(
68 const std::shared_ptr<IndexBuffer> &indexBuffer) {
69 glBindVertexArray(m_rendererID);
70 indexBuffer->bind();
71 m_indexBuffer = indexBuffer;
72}
73
74} // namespace Zen