// ROQUEN:
//
// Hacked version of the default orbit trap example.
//
// Given the nature of this beast, some locations require
// a very high number of iterations and others aren't
// practical to view given precision.

#include "Progressive2D.frag"
#info Mandelbrot

#group Navigation
vec2 mapCenter = vec2(0.5,0.5);
const float mapRadius =0.3;
uniform bool ShowMap; checkbox[true]
uniform float MapZoom; slider[0.01,2.1,100]
uniform int  MapIterations; slider[10,200,5000]

#group Coloring
uniform float R; slider[0,0,1]
uniform float G; slider[0,0.4,1]
uniform float B; slider[0,0.7,1]
uniform float Divider; slider[0,35,50]
uniform float Power; slider[0,0.6,6]
uniform float Radius; slider[0,1.332,5]

#group Mandelbrot
// Number of iterations
uniform int  Iterations; slider[10,600,5000]

// coordinate to invert to infinity
uniform vec2 InvertC; slider[(-5,-5),(0,0),(5,5)]

uniform bool Julia; checkbox[false]

uniform vec2 JuliaC; slider[(-100,-100),(0,0),(100,100)]

void init() {}

vec2 cpow2(vec2 p)
{
  float x = (p.x + p.y)*(p.x - p.y);
  float y = (p.x * p.y);
  return vec2(x, y+y);
}

// performs the active c = T(s)
vec2 domainMap(vec2 c)
{
  float s = dot(c,c);
  return c/s + InvertC;
}

// draw any overlay, including the navagation map. Broken out like
// this so a user can easily toss in any extras
vec3 addOverlay(vec2 c, vec3 inColor)
{       
  if (ShowMap) {
    vec2 w = (aaCoord-mapCenter);
    w.y/=(pixelSize.y/pixelSize.x);
    
    if (length(w)<mapRadius) {
      vec2 p = (aaCoord-mapCenter)/(mapRadius);
      p*=MapZoom; p.x/=pixelSize.x/pixelSize.y;
      
      if (abs(p.x)<3.0*pixelSize.y*MapZoom) return vec3(0.0,0.0,0.0);
      if (abs(p.y)<3.0*pixelSize.x*MapZoom) return vec3(0.0,0.0,0.0);
      
      p  = Julia ? domainMap(p+JuliaC) : p + InvertC;
      
      vec2 z = vec2(0.0);
      
      int i = 0;

      for (i=0; i<MapIterations; i++) {
        z = cpow2(z) + p;
        if (dot(z,z)> 200.0) break;
      }
      
      if (i < Iterations) {
        float co =  float(i) + 1.0 - log2(.5*log2(dot(z,z)));
        co = sqrt(co/256.0);
        vec3 color = vec3(.5+.5*cos(6.2831*co),.5+.5*cos(6.2831*co),.5+.5*cos(6.2831*co) );
        return 0.2*inColor + .8*color;
      }  else {
        return 0.5*inColor;
      }
    }
  }
  
  return inColor;
}


vec3 color(vec2 c)
{
  vec2 p0 = c;

  c = domainMap(c);
  
  vec2 p = Julia ?  c : vec2(0.0,0.0);
  vec2 k = Julia ? JuliaC : c;
  int i = 0;
  float dist = 10000.0;
  
  for (i = 0; i < Iterations; i++) {
    p = cpow2(p) + k;
    
    if (dot(p,p)> 100.0) break;
    //dist = min(dist, dot(p,p)-Radius*Radius);
    dist = min(dist, abs(length(p)-Radius));
    //dist = min(dist, length(p.y));
  }
  
  //dist = sqrt(dist);
  //dist = abs(dist-Radius);
  
  if (i < Iterations) {
    // The color scheme here is based on one
    // from Inigo Quilez's Shader Toy:
    float co = float(i) + 1.0 - log2(.5*log2(dot(p,p)));
    co = sqrt(co/256.0);
    float  co2 = dist * Divider;
    //co += co2;
    //co = co2;
    float fac = clamp(1.0/pow(co2,Power),0.0,1.0);
    vec3 color = fac*vec3( .5+.5*cos(6.2831*co+R),
                           .5+.5*cos(6.2831*co+G),
                           .5+.5*cos(6.2831*co+B) );
    return addOverlay(p0, color);
  }  else {
    return addOverlay(p0,vec3(0.0));
    //return vec3(dot(p,p));
  }
}


#preset Default
Center = 8.06362,3.80564
Zoom = 0.09133
Julia = false
InvertC = 0.28204,0.35896
Iterations = 500
R = 0
G = 0.4
B = 0.7
Julia = false
#endpreset

#preset Origin
Center = 0.77703,-0.16391
Zoom = 0.29803
Julia = false
InvertC = 0.0, 0.0
#endpreset

#preset Cusp
Center = 10.00000,-0.34754
Zoom = 0.09133
Julia = false
InvertC = 0.25, 0.0
#endpreset

#preset Cusp1
Center = -32.1753,113.933
Zoom = 0.00692533
Julia = false
InvertC = 0.27, 0.0
#endpreset

#preset Cusp2
Center =  52.2699,-120.126
Zoom = 0.00665366
Julia = false
InvertC = 0.27,0.01
#endpreset

#preset Cusp3
Center =  4.41356,-2.68176
Zoom =  0.141913
Julia = false
InvertC =0.24,0.11
#endpreset

#preset Spike
Center = 2.66332,-0.0635439
Zoom = 0.463974
Julia = false
InvertC =-2.0,0.0
#endpreset

#preset Spike1
Center = 61.9013,-9.59081
Zoom = 0.000344353
Julia = false
InvertC =-1.5,0.0
#endpreset

#preset Spike2
Center = -122.96,-144.132
Zoom = 0.00449765
Radius = 1.332
InvertC = -1.5,0.01
Julia = false
#endpreset

#preset Seahorse1
Center = 0,0
Zoom = 0.0677466
Julia = false
InvertC = -0.75,0
#endpreset

#preset Seahorse2
Center = 892.182,446.339
Zoom = 0.000872917
Julia = false
InvertC = -0.75,0.1
#endpreset

#preset Seahorse3
Center = 47.6429,22.2993
Zoom = 0.0139391
Julia = false
InvertC = -0.78,0.1
#endpreset

#preset Seahorse4
Center = 1837.16,16707.2
Zoom = 1.95694e-05
Julia = false
InvertC = -0.78,0.15
#endpreset

#preset Seahorse5
Center = 692.895,6717.62
Zoom = 2.94738e-05
Julia = false
InvertC = -0.79,0.151
#endpreset

#preset Seahorse6
Center = -27.6194,-201.941
Zoom = 0.000530689
Julia = false
InvertC = -0.79,0.161
#endpreset

#preset TripleSpiral1
Center = -665.699,1084.26
Zoom = 0.000541372
InvertC = -0.088,0.654
Julia = false
#endpreset

#preset TripleSpiral2
Center = -471.261,-78.1761
Zoom = 6.68937e-05
InvertC = -0.0881,0.656
Julia = false
#endpreset

#preset Elephant1
Center = -35.697,-2.74368
Zoom = 0.005104
InvertC = 0.275,0
Julia = false
#endpreset

#preset Elephant2
Center = -61.6772,129.984
Zoom = 0.00378155
InvertC = 0.275,0.003
Julia = false
#endpreset

#preset Elephant3
Center = -61.6772,129.984
Zoom = 0.00023
InvertC = 0.30103,0.01900
Julia = false
#endpreset

#preset QuadSpiral1
Center = -81.2003,2.93696
Zoom = 0.00200489
InvertC = 0.274,0.482
Julia = false
#endpreset

#preset Scepter1
Center = -55.2591,-6.69168
Zoom = 0.0109733
InvertC = -1.36,0.005
Julia = false
#endpreset

#preset Scepter2
Center = -70.6074,15.829
Zoom = 0.000851378
InvertC = -1.38,0.015
Julia = false
#endpreset

#preset ScepterV
Center = 0,0
Zoom = 0.00151033
Julia = false
InvertC = -1.108,0.23
#endpreset

#preset TooMuch1
Center = -0.780031,-0.0229885
Zoom = 0.155172
InvertC = -0.75,0.01101
Julia = false
#endpreset

#preset TooMuch2
Center = 57770,-34648
Zoom = 1.52724e-05
InvertC = -0.75,0.01101
Julia = false
#endpreset

#preset  Feigenbaum
Center = 0.0,0.0
Zoom = 0.00029
InvertC = -1.40115,0.0
Julia = false
#endpreset
 
#preset  Feigenbaum2
Center = 0.0,0.0
Zoom = 2.94208e-05
InvertC = -0.1528,1.0397
Julia = false
#endpreset

#preset  Misiurewicz4_1
Center = 0,0
Zoom = 0.001
InvertC = -0.1011,0.9563
Julia = false
#endpreset

#preset Mini1
Center = 0,0
Zoom = 0.00329094
Julia = false
InvertC = -0.15908,1.03282
#endpreset

#preset  Misiurewicz23_2
Center = 0,0
Zoom = 8.87943e-05
InvertC = -0.77568,0.13646
Julia = false
#endpreset

#preset  Minus1
Center = 0,0
Zoom = 0.15741
InvertC = -1.0,0.0
Julia = false
#endpreset

#preset  Minus1_p25
Center = 0,0
Zoom = 0.02816
InvertC = -1.0,0.25
Julia = false
#endpreset

#preset  Minus1p27
Center = 0,0
Zoom = 0.02816
InvertC = -1.27,0.25
Julia = false
#endpreset

#preset  PeriodicPoint_3_1
Center = 0,0
Zoom = 0.0053494
Julia = false
InvertC = -1.75488,0
#endpreset

#preset  PeriodicPoint_3_2
Center = 0,0
Zoom =0.08773
Julia = false
InvertC = -0.122561,0.744862
#endpreset

#preset  PeriodicPoint_3_2
Center = 0,0
Zoom =0.08773
Julia = false
InvertC = -0.122561,0.744862
#endpreset

#preset Foo1
Center = 0,0
Zoom = 1.93822e-05
Julia = false
InvertC = 0.43845,-0.3571
#endpreset

#preset Foo2
Center = 7951.2,5050.73
Zoom = 5.73643e-05
Julia = false
InvertC = -0.5714,-0.5
#endpreset

#preset Foo3
Center = 0.0,0.0
Zoom = 0.00003
Julia = false
InvertC =-1.27000,0.05101
#endpreset

#preset Foo4
Center = 0,0
Zoom = 9.53958e-05
Julia = false
InvertC = -1.25,0.021
#endpreset

#preset Foo5
Center = 0,0
Zoom = 0.000486909
InvertC = -0.945,0.24726
Julia = false
#endpreset

#preset Foo6
Center = 0,0
Zoom = 0.000103634
InvertC = 0.375,0.21
Julia = false
#endpreset
