// [ref] https://www.inf.ufrgs.br/~oliveira/pubs_files/CVD_Simulation/CVD_Simulation.html

uniform int colorblind_mode; /// set:2 min:0 max:4 tip:"off, achromatopsia, protanomaly, deuteranomaly, tritanomaly"
uniform mat3 colorblind_matrices[5] = mat3[5](
    mat3(1.000,0.000,0.000,  0.000,1.000,0.000,  0.000,0.000,1.000), // 0 no colorblind
    mat3(0.299,0.587,0.114,  0.299,0.587,0.114,  0.299,0.587,0.114), // 1 achromatopsia (luma)
    mat3( // 2 protanomaly (no red cone)
         0.152286, 1.052583,-0.204868,
         0.114503, 0.786281, 0.099216,
        -0.003882,-0.048116, 1.051998
    ),
    mat3( // 3 deuteranomaly (no green cone)
         0.367322, 0.860646, -0.227968,
         0.280085, 0.672501,  0.047413,
        -0.011820, 0.042940,  0.968881
    ),
    mat3( // 4 tritanomaly (no blue cone)
         1.255528,-0.076749,-0.178779,
        -0.078411, 0.930809, 0.147602,
         0.004733, 0.691367, 0.303900
    )
);

void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
    vec2 uv = fragCoord.xy / iResolution.xy;

    vec4 src = texture(iChannel0, uv);
    fragColor = vec4( src.rgb * colorblind_matrices[colorblind_mode], src.a );
}