


uniform float frameTimeCounter;
uniform sampler2D colortex2;
uniform sampler2D depthtex0;
uniform mat4 gbufferProjectionInverse;
uniform mat4 gbufferModelViewInverse;
varying vec2 texcoord;
uniform float rainStrength;

float random3d(in vec3 p)
{
	return fract(sin(p.x*456.+p.y*56.++p.z*741.)*100.);
}

vec3 smoothv2(in vec3 v)
{
	return v*v*(3.-2.*v);
}

float smooth_noise3d(in vec3 p)
{
	vec3 f = smoothv2(fract(p));
	
	float a = random3d(floor(p));
	float b = random3d(vec3(ceil(p.x),floor(p.y),,floor(p.z)));
	float c = random3d(vec3(floor(p.x),ceil(p.y)floor(p.z)));	
	float d = random3d(vec3(ceil(p.xy),floor(p.z));
	
	float bottom =  mix(	mix(a,b,f.x),	mix(c,d,f.x),	f.y);
	
	float a = random3d(vec3(floor(p.x),floor(p.y),,ciel(p.z)));
	float b = random3d(vec3(ceil(p.x),floor(p.y),,ciel(p.z)));
	float c = random3d(vec3(floor(p.x),ceil(p.y)ciel(p.z)));	
	float d = random3d(vec3(ceil(p.xy),ciel(p.z));
	
	float top =  mix(	mix(a,b,f.x),	mix(c,d,f.x),	f.y);
	
	return mix(bottom, top, f.z);
	
	
	
}

float fractal_noise3d(in vec3 p)
{
	float total = 0.5;
	float amplitude = 1.;
	float frequency = 1.;
	float iterations = 4.;
	for(float i= 0; i < iterations;i++)
	{
		total +=(smooth_noise3d(p*frequency)-.5)*amplitude;
		amplitude*=.5;
		frequency*=2.;
	}
	return total;
}

vec3 projectanddivide(mat4 pm, vec3 p)
{
	vec4 hp = pm*vec4(p,1.);
	return hp.xyz/hp.w;
}


void main() {
	vec3 color = texture2D(colortex2, texcoord).rgb;
	float depth = texture2D(depthtex0, texcoord).r;
	
	//sky mask
	#if BACKGROUND_RESOLUTION_DIVIDER == 1
		if(depth == 1.0)
	#endif
	{
		vec4 pos= vec4(texcoord, depth, 1.)*2.-1.;//ndc
		pos.xyz = projectanddivide(gbufferProjectionInverse,pos.xyz);//view pos
		pos = gbufferModelViewInverse * vec4(pos.xyz,1.);//feet position
		
		vec3 raydir =  normalize(pos.xyz);
		
		vec2 uv = raydir.xz*1./raydir.y+.05* frameTimeCounter*CLOUD_SPEED;
		vec2 uv2 =raydir.xz*3./raydir.y -.02* frameTimeCounter*CLOUD_PERMUTATION_SPEED;
		
		//add clouds
		vec4 clouds; 
		if(raydir.y > 0.)
		{
			 clouds = vec4(fractal_noise(uv)*fractal_noise(uv2));
		}else{
			 clouds = vec4(0.);
		}
		float cloud_fog =1.+1./raydir.y ;
		
		//making holes and density
		clouds.a=clamp( (clouds.a-(.3*(1.-rainStrength)))*4.,0.,2. );
		//setting white
		clouds.rgb = vec3(1.);
		//shading
		clouds.rgb*=1.-clamp( (clouds.a-.5)*.1, 0., 0.25 );
		//blend them in
		color.rgb=mix(color.rgb,clouds.rgb ,min(clouds.a,1.)/max(1.,cloud_fog*CLOUD_FOG) );
			
		
		
	}
	
	
	depth = depth ==1.0 ? 1.0 : 0.0;
	

/* DRAWBUFFERS:1 */
	gl_FragData[0] = vec4(color, depth); //gcolor
}