#version 130

#define F_TEXTURE       (1 << 0)
#define F_DISCARD_EN    (1 << 1)
#define F_SDF           (1 << 2)
#define F_SDF_AUX_EN    (1 << 3)

uniform int         iFlags;
uniform float       fSdfThreshold;
uniform float       fSdfAuxilliaryThreshold;
uniform vec4        v4SdfAuxilliaryColor;
uniform sampler2D   x2Texture;
uniform vec2        v2TextureOffset;

in      vec2        fv2Texture;
out     vec4        fv4Color;

vec4 v4Color()
{
    vec4 color = fv4Color;

    if ((iFlags & F_TEXTURE) != 0)
    {
        if ((iFlags & F_SDF) != 0)
        {
            float a = texture(x2Texture, fv2Texture + v2TextureOffset).a;

            if ((iFlags & F_SDF_AUX_EN) != 0)
            {
                color =
                    (a > fSdfThreshold)
                    ? color
                    : (a > fSdfAuxilliaryThreshold)
                        ? v4SdfAuxilliaryColor
                        : vec4(0, 0, 0, 0);
            }
            else if (a < fSdfThreshold)
            {
                color = vec4(0, 0, 0, 0);
            }
        }
        else
        {
            color *= texture(x2Texture, fv2Texture + v2TextureOffset);
        }
    }

    return color;
}

void main()
{
    vec4 color = v4Color();

    if ((iFlags & F_DISCARD_EN) != 0 && color.a <= 0)
    {
        discard;
    }

    fv4Color = color;
}
