atagen

monolith

public
Star0
Watch0
b96f1a324a8807feaa85938ab4e8fef84273dee0
1
ssh://brewery@pls.lobotomise.me:33/atagen/monolith.git
crates/render-vk/shaders/clip.glslGlsl24 lines908 B
1
// Coverage of the fragment under the push constant clip, a rounded rect in
2
// framebuffer pixels with radii TL, TR, BR, BL. A ring keeps only the band
3
// that wide inside the edge, for borders.
4
float rounded_box(vec2 p, vec2 half_size, float r) {
5
    vec2 q = abs(p) - half_size + r;
6
    return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r;
7
}
8
9
float clip_alpha() {
10
    if (pc.clip.z <= 0.0) {
11
        return 1.0;
12
    }
13
    vec2 half_size = pc.clip.zw * 0.5;
14
    vec2 p = gl_FragCoord.xy - (pc.clip.xy + half_size);
15
    float r = p.x < 0.0 ? (p.y < 0.0 ? pc.radii.x : pc.radii.w)
16
                        : (p.y < 0.0 ? pc.radii.y : pc.radii.z);
17
    float a = clamp(0.5 - rounded_box(p, half_size, r), 0.0, 1.0);
18
    float ring = pc.ring.x;
19
    if (ring > 0.0) {
20
        float inner = rounded_box(p, half_size - ring, max(r - ring, 0.0));
21
        a *= clamp(0.5 + inner, 0.0, 1.0);
22
    }
23
    return a;
24
}