CoriEngine
Loading...
Searching...
No Matches
GL_VertexArray.cpp
Go to the documentation of this file.
1#include "GL_VertexArray.hpp"
2#include <glad/gl.h>
3#include "GL_Buffers.hpp"
4
5namespace Cori {
6 namespace Graphics {
7 namespace Internal {
8 static constexpr GLenum ShaderDataTypeToGLDataType(ShaderDataType type) {
9 constexpr GLenum sizes[] = {
10 GL_NONE, // None
11 GL_FLOAT, // Float
12 GL_FLOAT, // Vec2
13 GL_FLOAT, // Vec3
14 GL_FLOAT, // Vec4
15 GL_FLOAT, // Mat3
16 GL_FLOAT, // Mat4
17 GL_INT, // Int
18 GL_INT, // Int2
19 GL_INT, // Int3
20 GL_INT, // Int4
21 GL_UNSIGNED_INT, // UInt
22 GL_UNSIGNED_INT, // UInt2
23 GL_UNSIGNED_INT, // UInt3
24 GL_UNSIGNED_INT, // UInt4
25 GL_BOOL, // Bool
26 };
27
28 static_assert(sizeof(sizes) / sizeof(GLenum) == static_cast<GLenum>(ShaderDataType::Bool) + 1, "ShaderDataTypeToGLDataType: Size array is out of sync with ShaderDataType enum");
29
30 if (CORI_CORE_CHECK(static_cast<GLenum>(type) < sizeof(sizes) / sizeof(GLenum), "ShaderDataTypeToGLDataType: Unknown shader data type '{}'", static_cast<int>(type))) { return 0; }
31
32 return sizes[static_cast<GLenum>(type)];
33 }
34
36 glGenVertexArrays(1, &m_ID);
37 }
38
40 glBindVertexArray(m_ID);
41 glDeleteVertexArrays(1, &m_ID);
42 }
43
46 glBindVertexArray(m_ID);
47 }
48
51 glBindVertexArray(0);
52 }
53
54 void OpenGLVertexArray::AddVertexBuffer(const std::shared_ptr<VertexBuffer>& vertexBuffer) {
56
57 if (CORI_CORE_CHECK(!vertexBuffer->GetLayout().GetElements().empty(), "VertexArray: (GL_RuntimeID: {}): Trying to add VBO that has no layout", m_ID)) { return; }
58
59 glBindVertexArray(m_ID);
60 vertexBuffer->Bind();
61 uint32_t index = 0;
62 const VBLayout& layout = vertexBuffer->GetLayout();
63 for (const auto& element : layout) {
64 if (element.m_Type == ShaderDataType::Mat3) {
65 for (size_t i = 0; i < element.GetComponentCount(); ++i) {
66 glEnableVertexAttribArray(index);
67 glVertexAttribPointer(index, static_cast<GLint>(element.GetComponentCount()), ShaderDataTypeToGLDataType(element.m_Type), element.m_Normalized ? GL_TRUE : GL_FALSE, static_cast<GLsizei>(layout.GetStride()), reinterpret_cast<const void*>(element.m_Offset + sizeof(float) * element.GetComponentCount() * i));
68
69 if (element.m_Divisor > 0) {
70 glVertexAttribDivisor(index, element.m_Divisor);
71 }
72
73 ++index;
74 }
75 }
76 else if (element.m_Type == ShaderDataType::Mat4) {
77 for (size_t i = 0; i < element.GetComponentCount(); i++) {
78 glEnableVertexAttribArray(index);
79 glVertexAttribPointer(index, static_cast<GLint>(element.GetComponentCount()), ShaderDataTypeToGLDataType(element.m_Type), element.m_Normalized ? GL_TRUE : GL_FALSE, static_cast<GLsizei>(layout.GetStride()), reinterpret_cast<const void*>(element.m_Offset + sizeof(float) * element.GetComponentCount() * i));
80
81 if (element.m_Divisor > 0) {
82 glVertexAttribDivisor(index, element.m_Divisor);
83 }
84
85 ++index;
86 }
87 }
88 else {
89 glEnableVertexAttribArray(index);
90 glVertexAttribPointer(index, static_cast<GLint>(element.GetComponentCount()), ShaderDataTypeToGLDataType(element.m_Type), element.m_Normalized ? GL_TRUE : GL_FALSE, static_cast<GLsizei>(layout.GetStride()), reinterpret_cast<const void*>(element.m_Offset));
91
92 if (element.m_Divisor > 0) {
93 glVertexAttribDivisor(index, element.m_Divisor);
94 }
95
96 ++index;
97 }
98 }
99
100 m_VertexBuffers.push_back(vertexBuffer);
101 CORI_CORE_DEBUG_TAGGED({ Logger::Tags::Graphics::Self, Logger::Tags::Graphics::OpenGL, Logger::Tags::Graphics::VertexArray }, "(GL_RuntimeID: {}): VertexBuffer with GL_RuntimeID: {} was added to successfully", m_ID ,std::static_pointer_cast<OpenGLVertexBuffer>(vertexBuffer)->m_ID);
102 }
103
104 void OpenGLVertexArray::AddIndexBuffer(const std::shared_ptr<IndexBuffer>& indexBuffer) {
106
107 if (CORI_CORE_CHECK(!m_VertexBuffers.empty(), "VertexArray: (GL_RuntimeID: {}): adding IBO to VAO before a valid VBO was added", m_ID)) { return; }
108
109 glBindVertexArray(m_ID);
110 indexBuffer->Bind();
111 m_IndexBuffer = indexBuffer;
112 CORI_CORE_TRACE_TAGGED({ Logger::Tags::Graphics::Self, Logger::Tags::Graphics::OpenGL, Logger::Tags::Graphics::VertexArray }, "(GL_RuntimeID: {}) : IndexBuffer with GL_RuntimeID : {} was added to successfully", m_ID ,reinterpret_pointer_cast<OpenGLIndexBuffer>(indexBuffer)->m_ID);
113 }
114 }
115 }
116}
#define CORI_CORE_DEBUG_TAGGED(...)
Definition Logger.hpp:1026
#define CORI_CORE_CHECK(x,...)
Definition Logger.hpp:1042
#define CORI_CORE_TRACE_TAGGED(...)
Definition Logger.hpp:1025
#define CORI_PROFILE_FUNCTION()
Definition Profiler.hpp:9
void AddIndexBuffer(const std::shared_ptr< IndexBuffer > &indexBuffer) override
void AddVertexBuffer(const std::shared_ptr< VertexBuffer > &vertexBuffer) override
uint32_t GetStride() const
Definition Buffers.hpp:174
static constexpr GLenum ShaderDataTypeToGLDataType(ShaderDataType type)
Almost everything connected to graphics is in this namespace.
Definition Window.hpp:7
Global engine namespace.
static constexpr char OpenGL[]
Definition Logger.hpp:49
static constexpr char VertexArray[]
Definition Logger.hpp:59
static constexpr char Self[]
Definition Logger.hpp:47