light/modules/engine/src/platform/graphics/opengl/vertex_layout.cpp

107 lines
3.2 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <engine/platform/graphics/opengl/buffers.hpp>
#include <engine/platform/graphics/opengl/vertex_layout.hpp>
#include <glad/gl.h>
2021-05-29 15:40:15 +04:30
namespace Light {
2025-07-05 13:28:41 +03:30
glVertexLayout::glVertexLayout(
Ref<VertexBuffer> buffer,
const std::vector<std::pair<std::string, VertexElementType>> &elements
)
: m_array_id(NULL)
2022-03-07 21:57:00 +03:30
{
// check
lt_assert(
2025-07-05 13:28:41 +03:30
std::dynamic_pointer_cast<glVertexBuffer>(buffer),
"Failed to cast 'VertexBuffer' to 'glVertexBuffer'"
);
lt_assert(!elements.empty(), "'elements' is empty");
2022-03-07 21:57:00 +03:30
// local
std::vector<glVertexElementDesc> elementsDesc;
elementsDesc.reserve(elements.size());
unsigned int stride = 0u;
// extract elements desc
2025-07-05 13:28:41 +03:30
for (const auto &element : elements)
2021-05-29 15:40:15 +04:30
{
elementsDesc.push_back(get_element_desc(element.second, stride));
2022-03-07 21:57:00 +03:30
stride += elementsDesc.back().typeSize * elementsDesc.back().count;
2021-05-29 15:40:15 +04:30
}
2022-03-07 21:57:00 +03:30
// create vertex array
glCreateVertexArrays(1, &m_array_id);
2021-05-29 15:40:15 +04:30
2022-03-07 21:57:00 +03:30
// bind buffer and array
buffer->bind();
bind();
2021-05-29 15:40:15 +04:30
2022-03-07 21:57:00 +03:30
// enable vertex attributes
unsigned int index = 0u;
2025-07-05 13:28:41 +03:30
for (const auto &elementDesc : elementsDesc)
2021-05-29 15:40:15 +04:30
{
2025-07-05 13:28:41 +03:30
glVertexAttribPointer(
index,
elementDesc.count,
elementDesc.type,
GL_FALSE,
stride,
(const void *)elementDesc.offset
);
2022-03-07 21:57:00 +03:30
glEnableVertexAttribArray(index++);
2021-05-29 15:40:15 +04:30
}
2022-03-07 21:57:00 +03:30
}
glVertexLayout::~glVertexLayout()
{
glDeleteVertexArrays(1, &m_array_id);
2022-03-07 21:57:00 +03:30
}
void glVertexLayout::bind()
2022-03-07 21:57:00 +03:30
{
glBindVertexArray(m_array_id);
2022-03-07 21:57:00 +03:30
}
void glVertexLayout::un_bind()
2022-03-07 21:57:00 +03:30
{
glBindVertexArray(NULL);
}
glVertexElementDesc glVertexLayout::get_element_desc(VertexElementType type, unsigned int offset)
2022-03-07 21:57:00 +03:30
{
switch (type)
2021-05-29 15:40:15 +04:30
{
2022-03-07 21:57:00 +03:30
/* byte */
case Light::VertexElementType::Byte1: return { GL_BYTE, 1u, sizeof(GLbyte), offset };
case Light::VertexElementType::Byte2: return { GL_BYTE, 1u, sizeof(GLbyte), offset };
case Light::VertexElementType::Byte4: return { GL_BYTE, 1u, sizeof(GLbyte), offset };
/* ubyte */
case Light::VertexElementType::UByte1: return { GL_UNSIGNED_BYTE, 1u, sizeof(GLubyte), offset };
case Light::VertexElementType::UByte2: return { GL_UNSIGNED_BYTE, 2u, sizeof(GLubyte), offset };
case Light::VertexElementType::UByte4: return { GL_UNSIGNED_BYTE, 4u, sizeof(GLubyte), offset };
/* int */
case VertexElementType::Int1: return { GL_INT, 1u, sizeof(GLint), offset };
case VertexElementType::Int2: return { GL_INT, 2u, sizeof(GLint), offset };
case VertexElementType::Int3: return { GL_INT, 3u, sizeof(GLint), offset };
case VertexElementType::Int4: return { GL_INT, 4u, sizeof(GLint), offset };
/* uint */
case VertexElementType::UInt1: return { GL_UNSIGNED_INT, 1u, sizeof(GLuint), offset };
case VertexElementType::UInt2: return { GL_UNSIGNED_INT, 2u, sizeof(GLuint), offset };
case VertexElementType::UInt3: return { GL_UNSIGNED_INT, 3u, sizeof(GLuint), offset };
case VertexElementType::UInt4: return { GL_UNSIGNED_INT, 4u, sizeof(GLuint), offset };
/* float */
case VertexElementType::Float1: return { GL_FLOAT, 1u, sizeof(GLfloat), offset };
case VertexElementType::Float2: return { GL_FLOAT, 2u, sizeof(GLfloat), offset };
case VertexElementType::Float3: return { GL_FLOAT, 3u, sizeof(GLfloat), offset };
case VertexElementType::Float4: return { GL_FLOAT, 4u, sizeof(GLfloat), offset };
default: lt_assert(false, "Invalid 'VertexElementType'"); return {};
2021-05-29 15:40:15 +04:30
}
2022-03-07 21:57:00 +03:30
}
2021-05-29 15:40:15 +04:30
2022-03-07 21:57:00 +03:30
} // namespace Light