uniform sampler2D tDiffuse;
uniform float iTime;
uniform vec2 iResolution;
varying vec2 sv;
#define PI acos(-1.)
#define cx_mul(a, b) vec2(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x)
#define cx_div(a, b) vec2(((a.x*b.x+a.y*b.y)/(b.x*b.x+b.y*b.y)),((a.y*b.x-a.x*b.y)/(b.x*b.x+b.y*b.y)))
#define cx_modulus(a) length(a)
#define cx_conj(a) vec2(a.x, -a.y)
#define cx_arg(a) atan(a.y, a.x)
#define cx_sin(a) vec2(sin(a.x) * cosh(a.y), cos(a.x) * sinh(a.y))
#define cx_cos(a) vec2(cos(a.x) * cosh(a.y), -sin(a.x) * sinh(a.y))
vec2 cx_sqrt(vec2 a) {
float r = length(a);
float rpart = sqrt(0.5*(r+a.x));
float ipart = sqrt(0.5*(r-a.x));
if (a.y < 0.0) ipart = -ipart;
return vec2(rpart,ipart);
}
vec2 cx_tan(vec2 a) {return cx_div(cx_sin(a), cx_cos(a)); }
vec2 cx_log(vec2 a) {
float rpart = sqrt((a.x*a.x)+(a.y*a.y));
float ipart = atan(a.y,a.x);
if (ipart > PI) ipart=ipart-(2.0*PI);
return vec2(log(rpart),ipart);
}
vec2 cx_mobius(vec2 a) {
vec2 c1 = a - vec2(1.0,0.0);
vec2 c2 = a + vec2(1.0,0.0);
return cx_div(c1, c2);
}
vec2 cx_z_plus_one_over_z(vec2 a) {
return a + cx_div(vec2(1.0,0.0), a);
}
vec2 cx_z_squared_plus_c(vec2 z, vec2 c) {
return cx_mul(z, z) + c;
}
vec2 cx_sin_of_one_over_z(vec2 z) {
return cx_sin(cx_div(vec2(1.0,0.0), z));
}
////////////////////////////////////////////////////////////
// end Complex Number math by julesb
////////////////////////////////////////////////////////////
// My own additions to complex number math
#define cx_sub(a, b) vec2(a.x - b.x, a.y - b.y)
#define cx_add(a, b) vec2(a.x + b.x, a.y + b.y)
#define cx_abs(a) length(a)
vec2 cx_to_polar(vec2 a) {
float phi = atan(a.y / a.x);
float r = length(a);
return vec2(r, phi);
}
// Complex power
// Let z = r(cos θ + i sin θ)
// Then z^n = r^n (cos nθ + i sin nθ)
vec2 cx_pow(vec2 a, float n) {
float angle = atan(a.y, a.x);
float r = length(a);
float real = pow(r, n) * cos(n*angle);
float im = pow(r, n) * sin(n*angle);
return vec2(real, im);
}
vec2 EvaluatedFunction(vec2 z, vec2 a, vec2 b, vec2 c)
{
vec2 z_a = cx_sub(z,a);
vec2 z_b = cx_sub(z,b);
vec2 z_c = cx_sub(z,c);
return cx_mul( cx_mul(z_a, z_b), z_c);
}
vec2 DerivativeFunction(vec2 z, vec2 a, vec2 b, vec2 c)
{
vec2 ab = cx_mul(a, b);
vec2 ac = cx_mul(a, c);
vec2 bc = cx_mul(b, c);
vec2 zz = cx_mul(z, z);
vec2 aabbcc = cx_add( cx_add(ab, ac), bc);
vec2 abc = cx_add( cx_add(a, b), c);
return cx_add( cx_add(3.0 * zz, -2.0 * cx_mul(z, abc)) , aabbcc);
}
// #define AROOT vec2(0.2, 0.4)
// #define BROOT vec2(0.0, -0.5)
// #define CROOT vec2(1.0, 0.0)
#define AROOT vec2(0.175, 0.35)
#define BROOT vec2(-0.025, -0.55)
#define CROOT vec2(0.975, -0.05)
#define EPSILON 0.00001
// #define ACOL vec3(0.6, 0.4, 0.4)
// #define BCOL vec3(0.2, 0.4, 0.8)
// #define CCOL vec3(0.2, 0.8, 0.4)
#define ACOL vec3(0.2, 0.2, 0.44)
#define BCOL vec3(0.67, 0.38, 0.8)
#define CCOL vec3(0.65, 0.86, 0.82)
void main()
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = (sv - 0.5) * iResolution.xy / iResolution.y;
//uv += vec2 (0.0, 0.1);
// uv /= 1.0 + 100.0 * fract(0.02 * iTime);
// uv /= 1.0;
float tz = 0.5 - 0.5*cos(0.225*iTime);
float zoo = pow( 0.5, 13.0*tz );
uv *= pow(0.5, 13.0 *tz);
vec2 z = uv;
float aDist = 1.0;
float bDist = 1.0;
float cDist = 1.0;
for(int i = 0; i < 40; i++)
{
//z -= (0.3 * sin(iTime) + 2.2) * cx_div(EvaluatedFunction(z, AROOT, BROOT, CROOT), DerivativeFunction(z, AROOT, BROOT, CROOT));
//z -= (0.5 * sin(iTime) + 2.0) * cx_div(EvaluatedFunction(z, AROOT, BROOT, CROOT), DerivativeFunction(z, AROOT, BROOT, CROOT));
z -= 2.0 * cx_div(EvaluatedFunction(z, AROOT, BROOT, CROOT), DerivativeFunction(z, AROOT, BROOT, CROOT));
}
aDist = length(cx_sub(z, AROOT));
bDist = length(cx_sub(z, BROOT));
cDist = length(cx_sub(z, CROOT));
vec3 col = mix(ACOL, BCOL, float(aDist > bDist));
col = mix(col, CCOL, float(min(aDist, bDist) > cDist));
// if(fv.x > 0.45) col = vec3(1.0, 0.0, 0.0);
// if(fv.y > 0.45) col = vec3(1.0, 0.0, 0.0);
gl_FragColor = vec4(col, 1.0);
}