#include <cstddef>
#include <glm/glm.hpp>
#include <glbase.hpp>
#include <gltraits.hpp>
template<
typename Value,
typename... Values
>
void vertex_setup(
GLTraits::Members<Value, Values...>,
std::size_t stride,
std::size_t offset = 0,
GLint location = 0
)
{
auto unaligned = offset % alignof(Value);
if (unaligned)
offset += alignof(Value) - unaligned;
GLTraits::Value<Value>::vertex_attrib_pointer(location, offset, stride);
vertex_setup(
GLTraits::Members<Values...>{},
stride,
offset + sizeof(Value),
location + GLTraits::Value<Value>::columns
);
}
void vertex_setup(GLTraits::Members<>, std::size_t, std::size_t, GLint)
{}
int main()
{
struct Vertex
{
glm::vec3 position;
glm::vec2 tex_coord;
glm::mat3 tbn;
glm::ivec4 bone_indices;
glm::vec4 bone_weights;
GLubyte flags;
GLdouble unaligned;
};
vertex_setup(GLTraits::members<Vertex>(), sizeof(Vertex));
}