Josip Štajdohar

Newtons fractal fragment code:


                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);
                }