#version 330 core

layout(location = 0) out vec4 fragColor;

in VS_OUT {
    vec2 texcoord;
    vec2 orthophoto_texcoord;
    vec3 vertex_normal;
    vec3 world_vector;
} fs_in;

uniform sampler2D color_tex;
uniform sampler2D orthophoto_tex;

uniform bool orthophotoAvailable;
uniform vec3 fg_SunDirectionWorld;
uniform vec4 fg_Viewport;

// math.glsl
float M_1_PI();
// color.glsl
vec3 eotf_inverse_sRGB(vec3 srgb);
// sun.glsl
vec3 get_sun_radiance_sea_level();
// aerial_perspective_envmap.glsl
vec4 get_aerial_perspective(vec3 pos);
vec3 mix_aerial_perspective(vec3 color, vec4 ap);

void main()
{
    vec3 texel = texture(color_tex, fs_in.texcoord).rgb;
    if (orthophotoAvailable) {
        vec4 sat_texel = texture(orthophoto_tex, fs_in.orthophoto_texcoord);
        if (sat_texel.a > 0.0) {
            texel.rgb = sat_texel.rgb;
        }
    }

    vec3 color = eotf_inverse_sRGB(texel);
    vec3 sun_radiance = get_sun_radiance_sea_level();

    vec3 N = normalize(fs_in.vertex_normal);
    float NdotL = max(dot(N, fg_SunDirectionWorld), 1e-4);

    // Assume a perfectly diffuse Lambertian surface
    color = M_1_PI() * color * sun_radiance * NdotL;

    vec4 ap = get_aerial_perspective(fs_in.world_vector);
    color = mix_aerial_perspective(color, ap);

    fragColor = vec4(color, 1.0);
}