#+feature dynamic-literals
package helpers

import "base:runtime"
import gl "vendor:OpenGL"

gl_types := map[typeid]u32 {
    i8  = gl.BYTE,
    u8  = gl.UNSIGNED_BYTE,
    i32 = gl.INT,
    u32 = gl.UNSIGNED_INT,
    f32 = gl.FLOAT,
}

setup_vertex_attributes :: proc(vao: u32, $T: typeid) {
    vertex_type_info := type_info_of(T).variant.(runtime.Type_Info_Named).base.variant.(runtime.Type_Info_Struct)

    for i in 0 ..< u32(vertex_type_info.field_count) {
        field_type := vertex_type_info.types[i]
        field_offset := u32(vertex_type_info.offsets[i])

        gl.EnableVertexArrayAttrib(vao, i)
        gl.VertexArrayAttribBinding(vao, i, 0)

        #partial switch v in field_type.variant {
        case runtime.Type_Info_Array:
            gl.VertexArrayAttribFormat(vao, i, i32(v.count), gl_types[v.elem.id], false, field_offset)
        case:
            gl.VertexArrayAttribFormat(vao, i, 1, gl_types[field_type.id], false, field_offset)
        }
    }
}