// main
void main(void) {
	vec2 uv = gl_FragCoord.xy / iResolution.xy;
    uv = uv * 2.0 - 1.0;
    uv.x *= iResolution.x / iResolution.y;    
    float time = iGlobalTime * 0.3;
        
    // ray
    vec3 ang = vec3(sin(time*3.0)*0.1,sin(time)*0.2+0.4,time);
    if(iMouse.z > 0.0) ang = vec3(0.0,clamp(2.0-iMouse.y*0.01,-0.3,PI),iMouse.x*0.01);
	mat4 rot = fromEuler(ang);
    
    vec3 ori = vec3(0.0,0.2,time*1.0);
    ori.y += abs(map_detailed(-ori));
    vec3 dir = normalize(vec3(uv.xy,-1.0));
    dir = rotate(normalize(dir),rot);
    
    // tracing
    vec3 p;
    float dens = hftracing(ori,dir,p);
    vec3 dist = p - ori;
    vec3 n = getNormal(p, dot(dist,dist)*EPSILON_NRM);
             
    // color
    vec3 color = sea_color(p,n,dir,dist);
    vec3 light = normalize(vec3(0.0,1.0,0.8));  
    color += vec3(diffuse(n,light,80.0) * SEA_WATER_COLOR) * 0.12; 
    color += vec3(specular(n,light,dir,60.0));  
    
    // post
    color = mix(sky_color(dir),color, clamp(1.0-length(dist)/100.0,0.0,1.0)); 
    color = pow(color,vec3(0.75));
	gl_FragColor = vec4(color,1.0);
}
	color physicalsky_color(const vector & ray_dir)
	{
		scalar haze_val = max(i_haze() + 2.0f, 2.0f);
		vector sun_dir_val(i_sun_direction());
		color sky_color(0.0f);
		int i_type = 0;
		switch ( i_type )
		{
		case 0:
			{
				sky_color = 0.0001f * get_haze_driven_sky_color(ray_dir, sun_dir_val, haze_val);
			}
			break;
		case 1:
			{
				sky_color = get_cie_standard_sky_color(ray_dir, sun_dir_val, color(i_zenith_luminance()), i_a(), i_b(), i_c(), i_d(), i_e());
			}
			break;
		default:
			{
				return color(0.0f);
			}
		}
		
		return i_multiplier() * sky_color * get_sun_intensity(ray_dir, sun_dir_val, haze_val, i_sun_disk_scale(), i_sun_disk_intensity(), 1.0f/*sun_glow_size()*/, i_sun_glow_intensity(), 5.0f/*sun_glow_falloff()*/);
	}
vec3 sea_color(in vec3 p, in vec3 n, in vec3 eye, in vec3 dist) {  
    float fresnel_o = 1.0 - max(dot(n,-eye),0.0);
    float fresnel = pow(fresnel_o,3.0) * 0.65;
        
    // reflection
    vec3 refl = sky_color(reflect(eye,n));
    
    // color
    vec3 ret = SEA_BASE;    
    ret = mix(ret,refl,fresnel);
    
    // wave peaks    
    float atten = max(1.0 - dot(dist,dist) * 0.001, 0.0);
    ret += SEA_WATER_COLOR * (p.y - SEA_HEIGHT) * 0.18 * atten;
    
    return ret;
}