| 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 | } |