#version 300 es

#define gl_FragColor _glesFragData[0]
#define gl_FragData _glesFragData
layout(location = 0) out mediump vec4 _glesFragData[4];

struct v2f {
    highp vec4 pos;
    highp vec2 uv;
};

uniform sampler2D _MainTex;
uniform sampler2D _Curve;
uniform highp float _RangeScale;

highp vec3 FromCIE( in highp vec3 Yxy ) {
    highp vec3 XYZ;
    XYZ.x = ((Yxy.x * Yxy.y) / Yxy.z);
    XYZ.y = Yxy.x;
    XYZ.z = ((Yxy.x * ((1.0 - Yxy.y) - Yxy.z)) / Yxy.z);
    highp mat3 XYZ2RGB = mat3(2.5651, -1.0217, 0.0753, -1.1665, 1.9777, -0.2543, -0.3986, 0.0439, 1.1892);
    return (XYZ2RGB * XYZ);
}
highp vec3 ToCIE( in highp vec3 FullScreenImage ) {
    highp mat3 RGB2XYZ = mat3(0.514136, 0.265068, 0.0241188, 0.323879, 0.670234, 0.122818, 0.160364, 0.0640916, 0.844427);
    highp vec3 XYZ = (RGB2XYZ * FullScreenImage.xyz);
    highp vec3 Yxy;
    Yxy.x = XYZ.y;
    highp float temp = dot( vec3( 1.0, 1.0, 1.0), XYZ.xyz);
    Yxy.yz = (XYZ.xy / temp);
    return Yxy;
}
highp vec4 fragCurve( in v2f i ) {
    highp vec4 color = texture( _MainTex, i.uv);
    highp vec3 cie = ToCIE( color.xyz);
    highp float newLum = texture( _Curve, vec2( (cie.x * _RangeScale), 0.5)).x;
    cie.x = newLum;
    color.xyz = FromCIE( cie);
    return color;
}
in highp vec2 xlv_TEXCOORD0;
void main() {
    highp vec4 xl_retval;
    v2f xlt_i;
    xlt_i.pos = vec4(0.0);
    xlt_i.uv = vec2(xlv_TEXCOORD0);
    xl_retval = fragCurve(xlt_i);
    gl_FragData[0] = vec4(xl_retval);
}
