// 2D-Sprite-Pass für das UI-Overlay: texturierte Quads in internen Pixeln
// (Ursprung oben-links), getintet. Zeichnet ins interne Target *nach* der
// Szene, ohne Tiefentest → liegt immer obenauf. Echtes Alpha-Blending
// (anders als der 1-Bit-Alphatest der Welt), damit Panels und Glyph-Ränder
// weich überblenden.

struct Uniforms {
    inv_res: vec2f,  // 1/Breite, 1/Höhe des internen Targets
    _pad:    vec2f,
};
@group(0) @binding(0) var<uniform> u: Uniforms;

@group(1) @binding(0) var tex: texture_2d<f32>;
@group(1) @binding(1) var smp: sampler;

struct VsOut {
    @builtin(position) pos:   vec4f,
    @location(0)       uv:    vec2f,
    @location(1)       color: vec4f,
};

@vertex
fn vs_main(
    @location(0) pos:   vec2f,
    @location(1) uv:    vec2f,
    @location(2) color: vec4f,
) -> VsOut {
    var o: VsOut;
    // Pixel (oben-links) → NDC (y nach oben).
    let ndc = vec2f(
        pos.x * u.inv_res.x * 2.0 - 1.0,
        1.0 - pos.y * u.inv_res.y * 2.0,
    );
    o.pos   = vec4f(ndc, 0.0, 1.0);
    o.uv    = uv;
    o.color = color;
    return o;
}

@fragment
fn fs_main(in: VsOut) -> @location(0) vec4f {
    // Textur × Tint. Für Solid-Fills zeigt die UV auf einen weißen Texel,
    // dann ist die Farbe rein der Tint.
    return textureSample(tex, smp, in.uv) * in.color;
}
