2021-05-29 15:40:15 +04:30
# include "ltpch.h"
# include "glVertexLayout.h"
# include "glBuffers.h"
# include <glad/glad.h>
namespace Light {
2021-07-26 11:43:37 +04:30
glVertexLayout : : glVertexLayout ( Ref < VertexBuffer > buffer , const std : : vector < std : : pair < std : : string , VertexElementType > > & elements )
2021-05-29 15:40:15 +04:30
{
2021-06-15 22:17:28 +04:30
// check
2021-07-01 19:25:46 +04:30
LT_ENGINE_ASSERT ( std : : dynamic_pointer_cast < glVertexBuffer > ( buffer ) , " glVertexLayout::glVertexLayout: failed to cast 'VertexBuffer' to 'glVertexBuffer' " ) ;
LT_ENGINE_ASSERT ( ! elements . empty ( ) , " glVertexLayout::glVertexLayout: 'elements' is empty " ) ;
2021-05-29 15:40:15 +04:30
2021-06-19 15:12:42 +04:30
// local
2021-05-30 16:45:54 +04:30
std : : vector < glVertexElementDesc > elementsDesc ;
2021-06-19 15:12:42 +04:30
elementsDesc . reserve ( elements . size ( ) ) ;
2021-05-29 15:40:15 +04:30
unsigned int stride = 0u ;
2021-06-19 15:12:42 +04:30
// extract elements desc
2021-05-29 15:40:15 +04:30
for ( const auto & element : elements )
{
2021-06-02 17:20:15 +04:30
elementsDesc . push_back ( GetElementDesc ( element . second , stride ) ) ;
2021-05-29 15:40:15 +04:30
stride + = elementsDesc . back ( ) . typeSize * elementsDesc . back ( ) . count ;
}
2021-06-19 15:12:42 +04:30
// create vertex array
2021-05-29 15:40:15 +04:30
glCreateVertexArrays ( 1 , & m_ArrayID ) ;
2021-06-19 15:12:42 +04:30
// bind buffer and array
2021-05-29 15:40:15 +04:30
buffer - > Bind ( ) ;
Bind ( ) ;
2021-06-19 15:12:42 +04:30
// enable vertex attributes
2021-05-29 15:40:15 +04:30
unsigned int index = 0u ;
for ( const auto & elementDesc : elementsDesc )
{
glVertexAttribPointer ( index , elementDesc . count , elementDesc . type , GL_FALSE , stride , ( const void * ) elementDesc . offset ) ;
glEnableVertexAttribArray ( index + + ) ;
}
}
glVertexLayout : : ~ glVertexLayout ( )
{
glDeleteVertexArrays ( 1 , & m_ArrayID ) ;
}
void glVertexLayout : : Bind ( )
{
glBindVertexArray ( m_ArrayID ) ;
}
void glVertexLayout : : UnBind ( )
{
glBindVertexArray ( NULL ) ;
}
glVertexElementDesc glVertexLayout : : GetElementDesc ( VertexElementType type , unsigned int offset )
{
switch ( type )
{
2021-07-01 19:25:46 +04:30
// #todo: add char
2021-06-19 15:12:42 +04:30
// int
2021-07-01 19:25:46 +04:30
case VertexElementType : : Int1 : return { GL_INT , 1u , sizeof ( int ) , offset } ;
case VertexElementType : : Int2 : return { GL_INT , 2u , sizeof ( int ) , offset } ;
case VertexElementType : : Int3 : return { GL_INT , 3u , sizeof ( int ) , offset } ;
case VertexElementType : : Int4 : return { GL_INT , 4u , sizeof ( int ) , offset } ;
2021-05-29 15:40:15 +04:30
2021-06-19 15:12:42 +04:30
// uint
2021-07-01 19:25:46 +04:30
case VertexElementType : : UInt1 : return { GL_UNSIGNED_INT , 1u , sizeof ( unsigned int ) , offset } ;
case VertexElementType : : UInt2 : return { GL_UNSIGNED_INT , 2u , sizeof ( unsigned int ) , offset } ;
case VertexElementType : : UInt3 : return { GL_UNSIGNED_INT , 3u , sizeof ( unsigned int ) , offset } ;
case VertexElementType : : UInt4 : return { GL_UNSIGNED_INT , 4u , sizeof ( unsigned int ) , offset } ;
2021-05-29 15:40:15 +04:30
2021-06-19 15:12:42 +04:30
// float
2021-07-01 19:25:46 +04:30
case VertexElementType : : Float1 : return { GL_FLOAT , 1u , sizeof ( float ) , offset } ;
case VertexElementType : : Float2 : return { GL_FLOAT , 2u , sizeof ( float ) , offset } ;
case VertexElementType : : Float3 : return { GL_FLOAT , 3u , sizeof ( float ) , offset } ;
case VertexElementType : : Float4 : return { GL_FLOAT , 4u , sizeof ( float ) , offset } ;
2021-05-29 15:40:15 +04:30
2021-06-19 15:12:42 +04:30
// double
2021-05-29 15:40:15 +04:30
case VertexElementType : : Double1 : return { GL_DOUBLE , 1 , sizeof ( float ) , offset } ;
case VertexElementType : : Double2 : return { GL_DOUBLE , 2 , sizeof ( float ) , offset } ;
case VertexElementType : : Double3 : return { GL_DOUBLE , 3 , sizeof ( float ) , offset } ;
case VertexElementType : : Double4 : return { GL_DOUBLE , 4 , sizeof ( float ) , offset } ;
2021-06-19 15:12:42 +04:30
2021-05-29 15:40:15 +04:30
default :
2021-07-01 19:25:46 +04:30
LT_ENGINE_ASSERT ( false , " glVertexLayout::GetElementDesc: invalid 'VertexElementType' " ) ;
2021-05-29 15:40:15 +04:30
return { } ;
}
}
}