/* originals from https://www.shadertoy.com/view/MdXSzS and https://www.shadertoy.com/view/tttXRB

*/
#define TAU radians(360.)


const float nbCircle = 13.;

vec2 rotate(float angle, float radius)
{
    return vec2(cos(angle),-sin(angle)) * radius;
}

vec2 perp(vec2 v)
{
    return vec2(-v.y, v.x);
}

float udTriangle( vec2 p, vec2 a, vec2 b, vec2 c )
{
  vec2 ab = b - a; vec2 pa = a - p;
  vec2 bc = c - b; vec2 pb = b - p;
  vec2 ca = a - c; vec2 pc = c - p;

  float d0 = dot(perp(ab), pa);
  float d1 = dot(perp(bc), pb);
  float d2 = dot(perp(ca), pc);

  return min(min(d0, d1), d2);
}

float sdfTriangle(vec2 p)
{
    float radius = 1.2;
    float angle = iTime * 0.8;
    vec2 a = rotate( angle, radius);
    vec2 b = rotate( TAU / 3. + angle, radius);
    vec2 c = rotate( 2. * TAU / 3. + angle, radius);

    return udTriangle(p, a, b, c);
}

float radFilter(float v)
{
    return smoothstep(100. / iResolution.y, 0., abs(v-1.));
}

float distFilter(float v)
{
    return smoothstep(0., 0.5, v);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	vec2 uv = (fragCoord.xy / iResolution.xy) - .5;
	float t = iTime * .1 + ((.25 + .05 * sin(iTime * .1))/(length(uv.xy) + .07)) * 2.2;
	float si = sin(t);
	float co = cos(t);
	mat2 ma = mat2(co, si, -si, co);

	float v1, v2, v3;
	v1 = v2 = v3 = 0.0;
	vec2	p2 = (2. * fragCoord - iResolution.xy) / iResolution.y;
    float	angle = atan(p2.y, p2.x);
    float 	l = length(p2) * nbCircle;
    float	circleId = floor(l);
    #ifdef AUDIOREACT
    float	s = texture(iChannel0, vec2(0.5, 1. - circleId / nbCircle)).x;
    #else
    float	s = 0.6;
    #endif
    float	modCircleId = mod(circleId, 2.);
    float d = sdfTriangle(p2);
    d = distFilter(d);
    float speed = mix(0.1, -0.1, modCircleId);
    l+= sin((angle - iTime * speed) * circleId * 5.) * 0.5 * d * s;
    l = fract(l) * 2.;
    float	t2 = min(l, 2. - l);
    t2 = radFilter(t2);
	float s2 = 0.0;
	for (int i = 0; i < 90; i++)
	{
		vec3 p = s * vec3(uv, 0.0);
		p.xy *= ma;
		p += vec3(.22, .3, s - 1.5 - sin(iTime * .13) * .1)*d;
		for (int i = 0; i < 8; i++)	p = abs(p) / dot(p,p) - 0.659;
		v1 += dot(p,p) * .0015 * (1.8 + sin(length(uv.xy * 13.0) + .5  - iTime * .2));
		v2 += dot(p,p) * .0013 * (1.5 + sin(length(uv.xy * 14.5) + 1.2 - iTime * .3));
		v3 += length(p.xy*10.) * .0003;
		s2  += .035;
	}

	float len = length(uv);
	v1 *= smoothstep(.2, .0, len);
	v2 *= smoothstep(.5, .0, len);
	v3 *= smoothstep(.49, .0, len);

	vec3 col = vec3( v3 * (0.5 + sin(iTime * .2) * .4),
					(v1 + v3) * .3,
					 v2) + smoothstep(0.2, .0, len) * .85 + smoothstep(.0, .6, v3) * .3;

	fragColor=vec4(min(pow(abs(col), vec3(1.2)), 1.0), 1.0);
}
