/*
This raindrop code was taken from https://www.shadertoy.com/view/ltffzl
(by Martijn Steinrucken aka BigWings) and modified by LexBoosT & ShinoNeiluj
*/

#if !defined RAINDROP_ON_SCREEN || !defined OVERWORLD
	vec2 raindropRefraction(vec2 coord) {
		return coord;
	}
#endif

#if defined OVERWORLD && defined RAINDROP_ON_SCREEN

	float rainSmooth = biomeHasRainSmooth;
	float notColdSmooth = biomeisNotColdSmooth;

	float dropSpeed = frameTimeCounter * DROP_SPEED;

	vec3 N13(float p) {

		vec3 p3 = fract(vec3(p) * vec3(0.1031, 0.11369, 0.13787));
		p3 += dot(p3, p3.yzx + 19.19);
		return fract(vec3((p3.x + p3.y) * p3.z, (p3.x + p3.z) * p3.y, (p3.y + p3.z) * p3.x));
	}

	vec4 N14(float t) {
		return fract(sin(t * vec4(123.0, 1024.0, 1456.0, 264.0)) * vec4(6547.0, 345.0, 8799.0, 1564.0));
	}
	float N(float t) {
		return fract(sin(t * 12345.564) * 7658.76);
	}

	float Saw(float b, float t) {
		return smoothstep(0.0, b, t) * smoothstep(1.0, b, t);
	}

	vec2 DropLayer2(vec2 uv, float t) {
		vec2 UV = uv;

		uv.y += t * 0.75;
		vec2 a = vec2(6.0, 1.0);
		vec2 grid = a * 2.0;
		vec2 id = floor(uv * grid);

		float colShift = N(id.x);
		uv.y += colShift;

		id = floor(uv * grid);
		vec3 n = N13(id.x * 35.2 + id.y * 2376.1);
		vec2 st = fract(uv * grid) - vec2(0.5, 0.0);

		float x = n.x - 0.5;

		float y = UV.y * 20.0;
		float wiggle = sin(y + sin(y));
		x += wiggle * (0.5 - abs(x)) * (n.z - 0.5);
		x *= 0.7;
		float ti = fract(t + n.z);
		y = (Saw(0.85, ti) - 0.5) * 0.9 + 0.5;
		vec2 p = vec2(x, y);

		float d = length((st - p) * a.yx);

		float mainDrop = smoothstep(0.4, 0.0, d);

		float r = sqrt(smoothstep(1.0, y, st.y));
		float cd = abs(st.x - x);
		float trail = smoothstep(0.13 * r, 0.15 * r * r, cd);
		float trailFront = smoothstep(- 0.02, 0.02, st.y - y);
		trail *= trailFront * r * r;

		y = UV.y;
		float trail2 = smoothstep(0.2 * r, 0.0, cd);
		float droplets = max(0.0, (sin(y * (1.0 - y) * 120.0) - st.y)) * trail2 * trailFront * n.z;
		y = fract(y * 10.0) + (st.y - 0.5);
		float dd = length(st - vec2(x, y));
		droplets = smoothstep(0.3, 0.0, dd);
		float m = mainDrop + droplets * r * trailFront;

		return vec2(m, trail);
	}

	float StaticDrops(vec2 uv, float t) {
		uv *= 40.0;

		vec2 id = floor(uv);
		uv = fract(uv) - 0.5;
		vec3 n = N13(id.x * 107.45 + id.y * 3543.654);
		vec2 p = (n.xy - 0.5) * 0.7;
		float d = length(uv - p);

		float fade = Saw(0.025, fract(t + n.z));
		float c = smoothstep(0.3, 0.0, d) * fract(n.z * 10.0) * fade;
		return c;
	}

	vec2 Drops(vec2 uv, float t, float l0, float l1, float l2) {

		float s = StaticDrops(uv, t) * l0;
		vec2 m1 = DropLayer2(uv, t) * l1;
		vec2 m2 = DropLayer2(uv * 1.85, t) * l2;

		float c = s + m1.x + m2.x;
		c = smoothstep(0.3, 1.0, c);

		return vec2(c, max(m1.y * l0, m2.y * l1));
	}

	vec2 raindropRefraction(vec2 coord) {

		#ifndef RAINDROPS_IN_COLD
			rainSmooth *= notColdSmooth;
		#endif

		float rainVisibility = eBS2;
		rainVisibility *= rainSmooth;
		rainVisibility *= rainStrengthS2;
		if (rainVisibility < 0.1)
			rainVisibility = 0.0;
		if (rainVisibility > 0.0 && isEyeInWater == 0) {

			float rainAmount0 = rainVisibility * STATIC_DROP;
			float rainAmount1 = rainVisibility * DROP_LAYER_1;
			float rainAmount2 = rainVisibility * DROP_LAYER_2;

			vec2 uv = (coord - vec2(0.5)) * vec2(aspectRatio, 1.0);
			float t = dropSpeed;
			float staticDrops = smoothstep(- 0.5, 1.0, rainAmount0) * 2.0;
			float layer1 = smoothstep(0.25, 0.75, rainAmount1);
			float layer2 = smoothstep(0.0, 0.5, rainAmount2);

			vec2 c = Drops(uv, t, staticDrops, layer1, layer2);

			vec2 e = vec2(0.001, 0.0);
			float cx = Drops(uv + e, t, staticDrops, layer1, layer2).x;
			float cy = Drops(uv + e.yx, t, staticDrops, layer1, layer2).x;
			vec2 n = vec2(cx - c.x, cy - c.x);

			return coord + n;

		} else {

			return coord;

		}
	}

#endif
