// Soft dip
//
// Generated in Material Maker by PauloFalcao
//
// You can find the original Material Maker file here
// https://www.materialmaker.org/material?id=577
//
// A video playing with this on Material Maker
// https://youtu.be/uBpX1CG28c4
//
// Processed by 'GLSL Shader Shrinker' (Shrunk by 18,337 characters)
// (https://github.com/deanthecoder/GLSLShaderShrinker)

#define v4	vec4
#define v3	vec3
#define v2	vec2
#define RET	return
#define NM	normalize
#define _c	clamp
#define _f	float
#define iT	iTime
#define iR	iResolution

vec3 x3(v3 c) {
	_f j = 4096. * sin(dot(c, v3(17, 59.4, 15)));
	v3 r;
	r.z = fract(512. * j);
	j *= .125;
	r.x = fract(512. * j);
	j *= .125;
	r.y = fract(512. * j);
	RET r - .5;
}

float Xd(v3 p) {
	v3 s = floor(p + dot(p, v3(.3333333))),
	   x = p - s + dot(s, v3(.1666667)),
	   e = step(v3(0), x - x.yzx),
	   H = e * (1. - e.zxy),
	   I = 1. - e.zxy * (1. - e),
	   X1 = x - H + .1666667,
	   X2 = x - I + .33333,
	   X3 = x - .5;
	v4 w, d;
	w.x = dot(x, x);
	w.y = dot(X1, X1);
	w.z = dot(X2, X2);
	w.w = dot(X3, X3);
	w = max(.6 - w, 0.);
	d.x = dot(x3(s), x);
	d.y = dot(x3(s + H), X1);
	d.z = dot(x3(s + I), X2);
	d.w = dot(x3(s + 1.), X3);
	w *= w;
	w *= w;
	d *= w;
	RET dot(d, v4(52));
}

float g(v3 UV, v3 s) {
	v3 q = abs(UV) - s;
	RET length(max(q, 0.)) + min(max(q.x, max(q.y, q.z)), 0.);
}

vec3 rd(v3 p, v3 a) {
	_f c = cos(a.x),
	   s = sin(a.x);
	v3 RV;
	RV.x = p.x;
	RV.y = p.y * c + p.z * s;
	RV.z = -p.y * s + p.z * c;
	c = cos(a.y);
	s = sin(a.y);
	p.x = RV.x * c + RV.z * s;
	p.y = RV.y;
	p.z = -RV.x * s + RV.z * c;
	c = cos(a.z);
	s = sin(a.z);
	RV.x = p.x * c + p.y * s;
	RV.y = -p.x * s + p.y * c;
	RV.z = p.z;
	RET RV;
}

vec3 sY(v3 p) {
	_f d, x, C,
	   s = 6.;
	s *= .5;
	d = length(p.xz);
	x = asin(sin(atan(p.x, p.z) * s) * .493) * d;
	C = d * s;
	RET v3(x / s, p.y, mix(C, 2. * C - sqrt(x * x + C * C), 1.) / s - 1.148);
}

vec3 P(v3 p, v3 a) {
	_f c = cos(a.x),
	   s = sin(a.x);
	v3 RV;
	RV.x = p.x;
	RV.y = p.y * c + p.z * s;
	RV.z = -p.y * s + p.z * c;
	c = cos(a.y);
	s = sin(a.y);
	p.x = RV.x * c + RV.z * s;
	p.y = RV.y;
	p.z = -RV.x * s + RV.z * c;
	c = cos(a.z);
	s = sin(a.z);
	RV.x = p.x * c + p.y * s;
	RV.y = -p.x * s + p.y * c;
	RV.z = p.z;
	RET RV;
}

float we(_f x) { RET .5 - .5 * cos(6.28319 * x); }

float U(_f x, _f y, _f z) {
	_f XY = min(x + y, 2. - x - y);
	RET min(XY + z, 2. - XY - z);
}

float S(_f a, _f b, _f k) {
	_f h = max(k - abs(a - b), 0.) / k;
	RET min(a, b) - h * h * k * .25;
}

vec4 R(v4 a, v4 b) {
	_f h,
	   k = 1.;
	k = max(k, .001);
	h = S(a.w, b.w, k);
	v2 n = NM(v2(S(a.w + .001, b.w, k) - S(a.w - .001, b.w, k), S(a.w, b.w + .001, k) - S(a.w, b.w - .001, k)));
	RET v4(mix(a.xyz, b.xyz, atan(abs(n.y), abs(n.x)) / 1.5708), h);
}

vec4 Q(v4 J) {
	const v4 K = v4(0, 0, 0, 9999999),
	         L = v4(0, 0, 0, 9999999),
	         M = v4(0, 0, 0, 9999999);
	v4 t = (J.w < K.w) ? v4(J) : v4(K);
	t = (t.w < K.w) ? t : v4(K);
	t = (t.w < L.w) ? t : v4(L);
	RET (t.w < M.w) ? t : v4(M);
}

float t0(v3 v, _f _) {
	_f X = 0.,
	   ve = 0.,
	   se = 1.,
	   SE = 1.;
	for (int i = 0; i < 6; i++) {
		ve += Xd(v * SE) * se;
		X += se;
		SE *= 2.;
		se *= .5;
	}

	RET ve / X;
}

float s0(_f f, _f _) { RET f * 15.505 - 7.2525; }

vec3 l0(v4 p, _f _) { RET _c(v3(s0(t0((p).xyz * 4.56 + v3(0), _) * .5 + .5, _)), v3(0), v3(1)); }

float m0(v4 p, _f _) { RET 1.; }

float q0(v4 p, _f _) { RET 1.; }

float o0(v4 p, _f _) { RET 1.; }

vec3 k0(v4 p, _f _) { RET v3(1); }

vec3 n0(v4 p, _f _) { RET v3(0, 1, 0); }

float i0(v4 p, _f _) { RET 1.; }

float j0(v4 p, _f _) { RET 1.; }

float p0(v3 p, _f _) { RET (v2(g(rd(sY(p), -v3(-32, -106, -129) * .01745329), v3(.22, 1.94, .25)) - .06, 0)).x; }

vec4 P5(v4 UV, _f _) {
	UV.xyz = P(UV.xyz - v3(0, sin(iT * .5) + 1., 0), v3(iT * .041, iT * .05, iT * .043) * 6.2831853) / .815;
	_f sf = p0(UV.xyz, _) * .815;
	if (UV.w > 18.5) RET v4(0. * j0(v4(UV.xyz, 19), _), 0, 0, sf);
	if (UV.w > 14.5) RET v4(0. * i0(v4(UV.xyz, 15), _), 0, 0, sf);
	if (UV.w > 13.5) RET v4(0. * n0(v4(UV.xyz, 14), _), sf);
	if (UV.w > 12.5) RET v4(0. * k0(v4(UV.xyz, 13), _), sf);
	if (UV.w > 4.5) RET v4(0. * o0(v4(UV.xyz, 5), _), 0, 0, sf);
	if (UV.w > 3.5) RET v4(.306 * q0(v4(UV.xyz, 4), _), 0, 0, sf);
	if (UV.w > 1.5) RET v4(0. * m0(v4(UV.xyz, 2), _), 0, 0, sf);
	if (UV.w > .5) RET v4(v4(1, 0, 0, 1).rgb * l0(v4(UV.xyz, 1), _), sf);
	RET v4(v3(0), sf);
}

float om(v3 v, _f _) {
	_f X = 0.,
	   ve = 0.,
	   se = 1.,
	   SE = 1.;
	for (int i = 0; i < 6; i++) {
		ve += Xd(v * SE) * se;
		X += se;
		SE *= 2.;
		se *= .5049;
	}

	RET ve / X;
}

float oc(_f f, _f _) { RET f * 2.42737 - .71368; }

float OM(v3 v, _f _) {
	_f X = 0.,
	   ve = 0.,
	   se = 1.,
	   SE = 1.;
	for (int i = 0; i < 6; i++) {
		ve += Xd(v * SE) * se;
		X += se;
		SE *= 2.;
		se *= 0.;
	}

	RET ve / X;
}

float OC(_f f, _f _) { RET f * 1.927 - .4635; }

vec3 OD(v4 p, _f _) {
	v3 g0 = v3(oc(om((p).xyz * 1.36 + v3(0.), _) * .5 + .5, _)),
	   h0 = v3(OC(OM((v4((p).xyz + (g0 * .655 - .5), 0)).xyz * v3(.62504, 0, .56013), _) * .5 + .5, _));
	RET v3(U(we(.79 * (v4((v4((p).xyz + (g0 * .655 - .5), 0)).xyz + (h0 * .82 - .5), 0)).x), we(0. * (v4((v4((p).xyz + (g0 * .655 - .5), 0)).xyz + (h0 * .82 - .5), 0)).y), we(0. * (v4((v4((p).xyz + (g0 * .655 - .5), 0)).xyz + (h0 * .82 - .5), 0)).z)));
}

float b0(v4 p, _f _) { RET 1.; }

float f0(v4 p, _f _) { RET 1.; }

float d0(v4 p, _f _) { RET 1.; }

vec3 a0(v4 p, _f _) { RET v3(1); }

vec3 c0(v4 p, _f _) { RET v3(0, 1, 0); }

float Z(v4 p, _f _) { RET 1.; }

float od(v4 p, _f _) { RET 1.; }

float of(v3 p, _f _) { RET g(p, v3(5, .07, 5)) - .08; }

vec3 r0(v4 p, _f _) { RET v3(sin(length((p).xz) * 6.18 - mod(iT * 8., 6.283))); }

float B(v3 UV, _f _) { RET of(UV - r0(v4(UV, 0), _) * v3(0, .062, 0), _); }

float e0(v3 p, _f _) { RET B(p, _); }

vec4 P9(v4 UV, _f _) {
	UV.xyz = P(UV.xyz - v3(0), v3(0));
	_f sf = e0(UV.xyz, _);
	if (UV.w > 18.5) RET v4(0. * od(v4(UV.xyz, 19), _), 0, 0, sf);
	if (UV.w > 14.5) RET v4(0. * Z(v4(UV.xyz, 15), _), 0, 0, sf);
	if (UV.w > 13.5) RET v4(0. * c0(v4(UV.xyz, 14), _), sf);
	if (UV.w > 12.5) RET v4(0. * a0(v4(UV.xyz, 13), _), sf);
	if (UV.w > 4.5) RET v4(0. * d0(v4(UV.xyz, 5), _), 0, 0, sf);
	if (UV.w > 3.5) RET v4(.5 * f0(v4(UV.xyz, 4), _), 0, 0, sf);
	if (UV.w > 1.5) RET v4(0. * b0(v4(UV.xyz, 2), _), 0, 0, sf);
	if (UV.w > .5) RET v4(v4(1).rgb * OD(v4(UV.xyz, 1), _), sf);
	RET v4(v3(0), sf);
}

vec4 Y(v4 p, _f _) { RET Q(R(P5(p, _), P9(p, _))); }

vec3 E(v3 p, _f PO) {
	p = p.yzx;
	RET pow(texture(iChannel0, p).xyz, v3(2.2)) + pow(texture(iChannel0, p).xxx, v3(16)) * PO;
}

vec3 W(v3 p, _f _) {
	const v3 e = v3(.001, -.001, 0);
	_f V1 = Y(v4(p + e.xyy, 0), _).w,
	   V2 = Y(v4(p + e.yyx, 0), _).w,
	   V3 = Y(v4(p + e.yxy, 0), _).w,
	   V4 = Y(v4(p + e.xxx, 0), _).w;
	RET NM(v3(V4 + V1 - V3 - V2, V3 + V4 - V1 - V2, V2 + V4 - V3 - V1));
}

void O(inout float d, inout vec3 p, _f D, v3 RO, v3 RD, _f _) {
	for (int i = 0; i < 500; i++) {
		p = RO + RD * d;
		D = Y(v4(p, 0), _).w;
		d += D;
		if (d > 50. || abs(D) < 1e-4) break;
	}
}

float i(v3 ps, v3 V, _f _) {
	_f u0 = 0.,
	   sa = 1.;
	for (int i = 0; i < 5; i++) {
		_f h = .001 + .25 * _f(i) / 4.,
		   d = Y(v4(ps + h * V, 0), _).w;
		u0 += (h - d) * sa;
		sa *= .98;
	}

	RET _c(1. - 1.6 * u0, 0., 1.);
}

float m(v3 RO, v3 RD, _f _) {
	_f rs = 1.,
	   t = .05;
	for (int i = 0; i < 32; i++) {
		_f h = Y(v4(RO + RD * t, 0), _).w;
		rs = min(rs, 10. * h / t);
		t += h;
		if (rs < 1e-4 || t > 5.) break;
	}

	RET _c(rs, 0., 1.);
}

vec3 r1(v2 UV) {
	_f OR, os,
	   _ = 0.,
	   d = 0.,
	   D = 0.;
	UV -= .5;
	v3 or, N,
	   u = v3(0),
	   o = v3(sin(iT * .1) * 5., 4.077, cos(iT * .13) * 5.) * 1.153,
	   ry = NM(v3(0, .289, 0) - o),
	   A = NM(cross(v3(0, 1, 0), ry)),
	   RD = NM(ry * 1.5 + A * UV.x + NM(cross(A, ry)) * UV.y),
	   RO = o,
	   p = v3(0);
	O(d, p, D, RO, RD, _);
	or = Y(v4(p, 1), _).xyz;
	OR = Y(v4(p, 4), _).x * .2;
	os = Y(v4(p, 5), _).x;
	N = v3(22e-5, 1, 22e-5);
	if (d < 50.) {
		v3 rf, OF,
		   n = W(p, _);
		_f l = _c(dot(-N, -n), 0., 1.);
		rf = NM(reflect(RD, -n));
		u = min(v3(max(mix(1., m(p, N, _), 1.), .07)), max(l, .07)) * max(mix(1., i(p, n, _), 1.), .07) * or + 4. * pow(_c(dot(rf, N), 0., 1.), pow(256., 1. - os)) * OR;
		d = .01;
		O(d, p, D, p, rf, _);
		OF = v3(0);
		if (d < 50.) {
			OF = Y(v4(p, 1), _).xyz;
			n = W(p, _);
			l = _c(dot(-N, -n), 0., 1.);
			OF = max(l, .07) * OF;
		}
		else OF = E(rf.xzy, 6.);

		u = mix(u, OF, OR);
	}
	else u = E(RD.xzy, 0.);

	RET pow(u, v3(.50942));
}

void mainImage(out vec4 F, v2 G) {
	_f T = min(iR.x, iR.y);
	F = v4(r1(v2(0, 1) + v2(1, -1) * (G - .5 * (iR.xy - v2(T))) / T), 1);
}
