module sbylib.graphics.glyph.glyphgeometry;

import sbylib.graphics.glyph.glyph;
import sbylib.graphics.geometry;
import sbylib.math;
import sbylib.wrapper.vulkan;

struct GlyphGeometry {

    struct Vertex {
        vec2 position;
        ivec2 uv;
    }

    Geometry!(Vertex, uint) geom;
    alias geom this;

    void add(const Glyph g, vec2 pos, vec2 size) {
        const indexOffset = cast(int)this.vertexList.length;

        alias lvec2 = Vector!(long,2);

        geom.add(Vertex(pos+vec2(     0, -size.y), cast(ivec2)(lvec2(g.x,g.y) + lvec2(        0, g.maxHeight))));
        geom.add(Vertex(pos+vec2(     0,       0), cast(ivec2)(lvec2(g.x,g.y) + lvec2(        0,           0))));
        geom.add(Vertex(pos+vec2(size.x, -size.y), cast(ivec2)(lvec2(g.x,g.y) + lvec2(g.advance, g.maxHeight))));
        geom.add(Vertex(pos+vec2(size.x,       0), cast(ivec2)(lvec2(g.x,g.y) + lvec2(g.advance,           0))));

        geom.select(indexOffset + 0);
        geom.select(indexOffset + 1);
        geom.select(indexOffset + 2);
        geom.select(indexOffset + 2);
        geom.select(indexOffset + 1);
        geom.select(indexOffset + 3);

        geom.primitive = PrimitiveTopology.TriangleList;
    }
}