
#define PI 3.14159265359
#define E 2.7182818284
#define GR 1.61803398875
#define EPS .001

#define time (float(__LINE__)+iTime/PI)

float saw(float x)
{
    return acos(cos(x))/3.14;
}
vec2 saw(vec2 x)
{
    return acos(cos(x))/3.14;
}
vec3 saw(vec3 x)
{
    return acos(cos(x))/3.14;
}
vec4 saw(vec4 x)
{
    return acos(cos(x))/3.14;
}
float stair(float x)
{
    return float(int(x));
}
vec2 stair(vec2 x)
{
    return vec2(stair(x.x), stair(x.y));
}


float jag(float x)
{
    return mod(x, 1.0);
}
vec2 jag(vec2 x)
{
    return vec2(jag(x.x), jag(x.y));
}



vec2 SinCos( const in float x )
{
	return vec2(sin(x), cos(x));
}
vec3 RotateZ( const in vec3 vPos, const in vec2 vSinCos )
{
	return vec3( vSinCos.y * vPos.x + vSinCos.x * vPos.y, -vSinCos.x * vPos.x + vSinCos.y * vPos.y, vPos.z);
}
      
vec3 RotateZ( const in vec3 vPos, const in float fAngle )
{
	return RotateZ( vPos, SinCos(fAngle) );
}
vec2 RotateZ( const in vec2 vPos, const in float fAngle )
{
	return RotateZ( vec3(vPos, 0.0), SinCos(fAngle) ).xy;
}
mat4 RotateZ( const in mat4 vPos, const in float fAngle )
{
	return mat4(RotateZ( vec3(vPos[0].xy, 0.0), SinCos(fAngle) ).xy, 0.0, 0.0,
                RotateZ( vec3(vPos[1].xy, 0.0), SinCos(fAngle) ).xy, 0.0, 0.0,
                RotateZ( vec3(vPos[2].xy, 0.0), SinCos(fAngle) ).xy, 0.0, 0.0,
                RotateZ( vec3(vPos[3].xy, 0.0), SinCos(fAngle) ).xy, 0.0, 0.0);
}
mat4 translate( const in mat4 vPos, vec2 offset )
{
	return mat4(vPos[0].xy+offset, 0.0, 0.0,
                vPos[1].xy+offset, 0.0, 0.0,
                vPos[2].xy+offset, 0.0, 0.0,
                vPos[3].xy+offset, 0.0, 0.0);
} 
mat4 scale( const in mat4 vPos, vec2 factor )
{
	return mat4(vPos[0].xy*factor, 0.0, 0.0,
                vPos[1].xy*factor, 0.0, 0.0,
                vPos[2].xy*factor, 0.0, 0.0,
                vPos[3].xy*factor, 0.0, 0.0);
} 
vec4 spiral(vec4 uv)
{
    //uv = normalize(uv)*log(length(uv)+1.0);
    float r = log(length(uv)+1.0)*2.0*PI;
    float theta = mod((atan(uv.y, uv.x)+r), 2.0*PI);
    
    return vec4(saw(r), saw(theta),
               	r, theta);
}


float square(vec2 uv, float iteration)
{
	if(abs(abs(saw(uv.x*(1.5+sin(iTime*.654321))*PI+iTime*.7654321)*2.0-1.0)-abs(uv.y)) < .5)
		return 1.0-abs(abs(saw(uv.x*(1.5+sin(iTime*.654321))*PI+iTime*.7654321)*2.0-1.0)-abs(uv.y))/.5*uv.x;
	else
		return 0.0;
}



void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	vec4 uv = vec4(fragCoord.xy / iResolution.xy, 0.0, 0.0);
    
    float map = 0.0;
    
    float lambda = 4.0;
    float amplitude = 32.0;
    float scale = pow(E, saw(time)*amplitude);
    uv.xy *= scale;
    uv.xy -= scale/2.0;
	uv.x *= iResolution.x/iResolution.y;
    uv.xy = normalize(uv.xy)*log(length(uv.xy)+1.0);
    
	const int max_iterations = 1;

    float noise = 1.0;
    
    for(int i = 0; i < max_iterations; i++)
    {
        uv = spiral(uv);
        uv.xy *= scale;
        uv.xy -= scale/2.0;
        uv.xy = normalize(uv.xy)*log(length(uv.xy)+1.0);
        map += (uv.z+uv.w);
    }
    
    fragColor.rg = saw(uv.zw);//saw(uv.zw*PI);
    fragColor.b = 0.0;
    fragColor.a = 1.0;
    
    
    fragColor = vec4(vec3(saw(map),
                          saw(4.0*PI/3.0+map),
                          saw(2.0*PI/3.0+map)),
                     1.0);
    
    return;
/*
	const int max_iterations = 8;

    float noise = 1.0;
    
    for(int i = 0; i < max_iterations; i++)
    {
        noise += clamp(1.0-fwidth(map), 0.0, 1.0);
        
        uv = tree(uv); 
        
        map += square(uv, float(i)/float(max_iterations))/noise;
    } 
    map = map*PI + time;
    fragColor = vec4(vec3(saw(map),
                          saw(4.0*PI/3.0+map),
                          saw(2.0*PI/3.0+map)),
                     1.0);*/
}
