
#include <metal_stdlib>
using namespace metal;

struct Uniforms_MaskingCircleGlass {
    float scale;
    float x_offset;
    float y_offset;
    float invert_mix;
};

struct VertexOut_MaskingCircleGlass {
    float4 position [[ position ]];
    float2 uv;
};

float masking_circle_glass_mod(float a, float b) {
    return a - b * floor(a / b);
}

float masking_circle_glass_circle_sdf(float2 p, float r) {
    return length(p) - r;
}

float masking_circle_glass_circle_square_mask(float2 uv, float input_dist, float radius, float x_offset, float y_offset) {
    uv.x -= x_offset;
    uv.y -= y_offset;
    float dist = masking_circle_glass_circle_sdf(uv, radius);
    dist = smoothstep(0.0, 0.0001, dist);
    dist = mix(dist, input_dist, max(step(radius, uv.y), step(radius, uv.x)));
    return dist;
}

fragment float4 masking_circle_glass_frag(
VertexOut_MaskingCircleGlass in [[ stage_in ]],
constant Uniforms_MaskingCircleGlass &u [[ buffer(0) ]],
float4 color [[ color(0) ]]) {
    
    float scale = u.scale;
    float x_offset = u.x_offset;
    float y_offset = u.y_offset;
    float invert_mix = u.invert_mix;
    
    float2 uv = in.uv;
    
    uv -= 0.5;
    uv *= scale;
    uv.x -= (x_offset * scale);
    uv.y += (y_offset * scale);
    
    uv.x = abs(uv.x);
    uv.y = abs(uv.y);
    
    float radius = 0.5;
    float dist = 1.0;
    
    dist = masking_circle_glass_circle_square_mask(uv, dist, radius, 0.28, 0.0);
    dist = masking_circle_glass_circle_square_mask(uv, dist, radius, 0.0, 0.28);
    dist = masking_circle_glass_circle_square_mask(uv, dist, radius, 0.2, 0.0);
    dist = masking_circle_glass_circle_square_mask(uv, dist, radius, 0.0, 0.2);
    dist = masking_circle_glass_circle_square_mask(uv, dist, radius, 0.0, 0.0);
    
    float invertDist = 1.0 - dist;
    dist = mix(dist, invertDist, invert_mix);

    return float4(dist, dist, dist, 1.0);
}
