// __multiversion__
// This signals the loading code to prepend either #version 100 or #version 300 es as apropriate.

#include "uniformWorldConstants.h"
#include "uniformShaderConstants.h"
#include "fragmentVersionSimple.h"
#include "uniformPerFrameConstants.h"

in highp vec3 pos;
in vec4 cloudColor;

vec3 jodieReinhardTonemap(vec3 c) {
    float l = dot(c, vec3(0.2126, 0.7152, 0.0722));
    vec3 tc = c / (c + 0.4);
    return mix(c / (l + 1.7), tc, tc);
}

vec4 skyColor(highp vec3 p, vec4 fc, vec4 cc){

float night = pow(max(min(1.0-fc.r*1.5,1.0),0.0),1.2);
float dusk = pow(max(min(1.0-fc.b*1.2,1.0),0.0),0.5);
float rain = smoothstep(0.55,0.1,FOG_CONTROL.r);
float rd = length(p.xz);

vec4 day_color = vec4(.05,.3,.8,1.0 );
vec4 night_color = vec4(0.16,0.2,0.4,0.0);
vec4 sun_color = cc*FOG_COLOR;
vec4 rain_color = FOG_COLOR*vec4(3.85,3.85,3.9,1.0);

vec4 colors = mix(mix(mix(day_color, sun_color, dusk), night_color, night),rain_color, rain);

//gradient
vec4 grad1 = mix(mix(mix(fc,fc,dusk),fc,night),fc,rain);
vec4 grad2 = mix(mix(mix(fc,fc,dusk),fc,night),fc,rain);
vec4 grad3 = mix(mix(mix(fc,fc,dusk),vec4(1.0),night),FOG_COLOR,rain);
vec4 grad4 = mix(mix(mix(fc*0.7,vec4(0.4,0.3,0.8,1.0),dusk),vec4(0.34,0.40,0.54,0.0),night),rain_color,rain);
vec4 grad5 = mix(mix(mix(fc*0.7,vec4(0.4,0.3,0.8,1.0),dusk),vec4(0.30,0.36,0.50,0.0),night),rain_color,rain);
vec4 grad6 = mix(mix(mix(colors*0.6,vec4(0.4,0.3,0.9,1.0),dusk),vec4(0.26,0.32,0.46,0.0),night),rain_color,rain);
vec4 grad7 = mix(mix(mix(colors*0.6,vec4(0.4,0.3,0.9,1.0),dusk),vec4(0.22,0.28,0.42,0.0),night),rain_color,rain);
vec4 grad8 = mix(mix(mix(colors*0.6,vec4(0.4,0.3,0.95,1.0),dusk),vec4(0.18,0.24,0.38,0.0),night),rain_color,rain);
vec4 grad9 = mix(mix(mix(colors*0.6,vec4(0.4,0.3,0.99,1.0),dusk),vec4(0.14,0.20,0.34,0.0),night),rain_color,rain);
vec4 grad10 = mix(mix(mix(colors*0.6,vec4(0.4,0.3,1.0,1.0),dusk),vec4(0.12,0.16,0.3,0.0),night),rain_color,rain);

vec4 sky_color= mix(colors,grad10,pow(clamp(rd*1.5,0.0,1.0),2.0));
sky_color = mix(sky_color, grad9, pow(clamp(rd*1.47,0.0,1.0),2.2));
sky_color = mix(sky_color, grad8, pow(clamp(rd*1.43,0.0,1.0),2.1));
sky_color = mix(sky_color, grad7, pow(clamp(rd*1.39,0.0,1.0),2.2));
sky_color = mix(sky_color, grad6, pow(clamp(rd*1.35,0.0,1.0),2.1));
sky_color = mix(sky_color, grad5, pow(clamp(rd*1.32,0.0,1.0),2.2));
sky_color = mix(sky_color, grad4, pow(clamp(rd*1.3,0.0,1.0),2.3));
sky_color.rgb = jodieReinhardTonemap(sky_color.rgb);
sky_color = mix(sky_color, grad3, pow(clamp(rd*1.2,0.0,1.0),3.2));
sky_color = mix(sky_color, grad2, pow(clamp(rd*1.1,0.0,1.0),2.0));
sky_color = mix(sky_color, grad1, pow(clamp(rd*1.0,0.0,1.0),2.0));

return sky_color;}

void main(){

vec4 result = skyColor(pos,FOG_COLOR, CURRENT_COLOR);

gl_FragColor = result;

}