Skip to content

Instantly share code, notes, and snippets.

@mahulst
Created April 4, 2025 18:23
Show Gist options
  • Save mahulst/9115712b119273e14e041e81c0ff775b to your computer and use it in GitHub Desktop.
Save mahulst/9115712b119273e14e041e81c0ff775b to your computer and use it in GitHub Desktop.

Revisions

  1. mahulst created this gist Apr 4, 2025.
    82 changes: 82 additions & 0 deletions cgltf.odin
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,82 @@
    Vertex2 :: struct {
    pos: Vec3,
    color: Vec4,
    uv: Vec2,
    normal: Vec3,
    }
    data, result := cgltf.parse_file({}, "./assets/barrel.glb")
    b := cgltf.load_buffers({}, data, "./assets/barrel.glb")

    vertices: [dynamic]Vertex2 = make([dynamic]Vertex2)
    indices: [dynamic]u16 = make([dynamic]u16)


    for mesh in data.meshes {

    for prim in mesh.primitives {

    pos_accessor: ^cgltf.accessor
    norm_accessor: ^cgltf.accessor
    uv_accessor: ^cgltf.accessor

    for attr in prim.attributes {

    #partial switch attr.type {

    case cgltf.attribute_type.position:
    pos_accessor = attr.data
    case cgltf.attribute_type.normal:
    norm_accessor = attr.data
    case cgltf.attribute_type.texcoord:
    uv_accessor = attr.data
    }
    }

    if pos_accessor == nil {
    fmt.println("Primitive missing position attribute")
    continue
    }

    vertex_count := (pos_accessor.count)
    for mesh: uint = 0; mesh <= vertex_count; mesh += 1 {
    v: Vertex2 = {
    color = {1, 1, 1, 1},
    }
    ok := cgltf.accessor_read_float(
    pos_accessor,
    mesh,
    &v.pos[0],
    3,
    );assert(ok == true)

    if norm_accessor != nil {

    ok := cgltf.accessor_read_float(
    norm_accessor,
    mesh,
    &v.normal[0],
    3,
    );assert(ok == true)
    }

    if uv_accessor != nil {
    ok := cgltf.accessor_read_float(
    uv_accessor,
    mesh,
    &v.uv[0],
    2,
    );assert(ok == true)
    }
    append(&vertices, v)
    }

    if prim.indices != nil {
    for i: uint = 0; i < prim.indices.count; i += 1 {
    index := cgltf.accessor_read_index(prim.indices, i)
    append(&indices, u16(index))
    }
    }
    // Here you have the vertices and indices

    }
    }