#version 330 core

uniform float alpha;
uniform bool red;
uniform float max_distorsion_amount;

// math.glsl
float sqr(float x);
// color.glsl
float srgb_to_luminance(vec3 color);

vec3 desaturate(vec3 color, float saturation)
{
    float lum = srgb_to_luminance(color);
    return mix(vec3(lum), color, saturation);
}

float opacity(vec2 uv, float amount)
{
    float dist_factor = 1.0 + distance(uv, vec2(0.5)) * 0.3;
    return 1.0 - min(amount * dist_factor, 1.0);
}

/*
 * Distort texcoords according to the intensity of the blackout/redout effect.
 */
vec2 redout_distort(vec2 uv)
{
    // Early exit if there is no blackout/redout
    if (alpha < 1e-5) {
        return uv;
    }
    uv = uv - vec2(0.5);
    float uva = atan(uv.x, uv.y);
    float uvd = sqrt(dot(uv, uv));
    float k = mix(0.0, -max_distorsion_amount, alpha);
    uvd = uvd * (1.0 + k * sqr(uvd));
    return vec2(sin(uva), cos(uva)) * uvd + vec2(0.5);
}

/*
 * Apply the blackout/redout effect.
 */
vec3 redout_apply(vec3 color, vec2 uv)
{
    // Early exit if there is no blackout/redout
    if (alpha < 1e-5) {
        return color;
    }
    color *= opacity(uv, alpha);
    if (red) {
        color = mix(color, vec3(color.r, 0.0, 0.0), alpha);
    } else {
        color = desaturate(color, 1.0 - alpha);
    }
    return color;
}