/ Created by soma_arc, Kazushi Ahara - 2015 This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported. /
// from Syntopia http://blog.hvidtfeldts.net/index.php/2015/01/path-tracing-3d-fractals/ vec2 rand2n(vec2 co, float sampleIndex) { vec2 seed = co (sampleIndex + 1.0); seed+=vec2(-1,1); // implementation based on: lumina.sourceforge.net/Tutorials/Noise.html return vec2(fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) 43758.54530.),/1./ fract(cos(dot(seed.xy ,vec2(4.898,7.23))) 23421.6310.));/1.*/ }
/ ⠀ 𖣠⚪𔗢⚪🞋⚪𔗢⚪𖣠 ◦୦◦◯◦୦◦⠀ ⠀◦୦◦◯◦୦◦ 𖣠⚪𔗢⚪🞋⚪𔗢⚪𖣠 𔗢᯽𔗢 𔗢᯽𔗢 𖣠⚪𔗢⚪🞋⚪𔗢⚪𖣠 ◦୦◦◯◦୦◦⠀ ⠀◦୦◦◯◦୦◦ 𖣠⚪𔗢⚪🞋⚪𔗢⚪𖣠 ⠀ /
/ ·⊹· / const vec2 C01P = vec2(0.,(1.+1./sqrt(2.))); const float C01R = (1./2.+sqrt(2.)/2.);
const vec2 C02P = vec2(0.,-(1.+1./sqrt(2.))); const float C02R = (1./2.+sqrt(2.)/2.);
const vec2 C03P = vec2((1.+1./sqrt(2.)),0.); const float C03R = (1./2.+sqrt(2.)/2.);
const vec2 C04P = vec2(-(1.+1./sqrt(2.)),0.); const float C04R = (1./2.+sqrt(2.)/2.); / ·⊹· /
/ ꞉⊹꞉ / const vec2 C001P = vec2((1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.))); const float C001R = sqrt(2.)/7.-1./14.;
const vec2 C002P = vec2(-(1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.))); const float C002R = sqrt(2.)/7.-1./14.;
const vec2 C003P = vec2((1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.))); const float C003R = sqrt(2.)/7.-1./14.;
const vec2 C004P = vec2(-(1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.))); const float C004R = sqrt(2.)/7.-1./14.; / ꞉⊹꞉ /
const vec2 C0P = vec2(0.,0.); const float C0R = .5*(3.-sqrt(8.));
/ ⵔ / const vec2 C1P = vec2(0.,0.); const float C1R = .5*(3.-sqrt(8.))/(3.-sqrt(8.));
const vec2 C2P = vec2(0.,.5(2.-sqrt(2.))); const float C2R = .5(sqrt(2.)-1.);
const vec2 C3P = vec2(0.,.5-(2.-sqrt(2.))); const float C3R = .5(sqrt(2.)-1.);
const vec2 C4P = vec2(.5-(2.-sqrt(2.)),0.); const float C4R = .5(sqrt(2.)-1.);
const vec2 C5P = vec2(.5(2.-sqrt(2.)),0.); const float C5R = .5(sqrt(2.)-1.); / ⵔ /
/ · / const vec2 C6P = vec2((1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.))); const float C6R = (sqrt(2.)/7.-1./14.);
const vec2 C7P = vec2(-(1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.))); const float C7R = (sqrt(2.)/7.-1./14.);
const vec2 C8P = vec2((1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.))); const float C8R = (sqrt(2.)/7.-1./14.);
const vec2 C9P = vec2(-(1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.))); const float C9R = (sqrt(2.)/7.-1./14.); / · /
vec2 circleInverse(vec2 pos, vec2 circlePos, float circleR){ return ((pos - circlePos) circleR circleR)/(length(pos - circlePos) * length(pos - circlePos) ) + circlePos; }
const int ITERATIONS =19683;
float IIS(vec2 pos){ float loopNum = 0.; bool cont = false; for(int i = 0 ; i < ITERATIONS ; i++){ cont = false;
//if(distance(pos, C0P) < C0R){ //pos = circleInverse(pos, C0P, C0R); //cont = true; //loopNum++;
if(distance(pos, C01P) < C01R){ pos = circleInverse(pos, C01P, C01R); cont = true; loopNum++;
}else if(distance(pos, C02P) < C02R){ pos = circleInverse(pos, C02P, C02R); cont = true; loopNum++;
}else if(distance(pos, C03P) < C03R){ pos = circleInverse(pos, C03P, C03R); cont = true; loopNum++;
}else if(distance(pos, C04P) < C04R){ pos = circleInverse(pos, C04P, C04R); cont = true; loopNum++;
//}else if(distance(pos, C001P) < C001R){ //pos = circleInverse(pos, C001P, C001R); //cont = true; //loopNum++;
//}else if(distance(pos, C002P) < C002R){ //pos = circleInverse(pos, C002P, C002R); //cont = true; //loopNum++;
//}else if(distance(pos, C003P) < C003R){ //pos = circleInverse(pos, C003P, C003R); //cont = true; //loopNum++;
//}else if(distance(pos, C004P) < C004R){ //pos = circleInverse(pos, C004P, C004R); //cont = true; //loopNum++;
}else if(distance(pos, C1P) < C1R){ pos = circleInverse(pos, C1P, C1R); cont = true; loopNum++; //}else if(distance(pos, C2P) < C2R){ //pos = circleInverse(pos, C2P, C2R); //cont = true; //loopNum++; //}else if(distance(pos, C3P) < C3R){ //pos = circleInverse(pos, C3P, C3R); //cont = true; //loopNum++; //}else if(distance(pos, C4P) < C4R){ //pos = circleInverse(pos, C4P, C4R); //cont = true; //loopNum++; //}else if(distance(pos, C5P) < C5R){ //pos = circleInverse(pos, C5P, C5R); //cont = true; //loopNum++;
}else if(distance(pos, C6P) < C6R){ pos = circleInverse(pos, C6P, C6R); cont = true; loopNum++;
}else if(distance(pos, C7P) < C7R){ pos = circleInverse(pos, C7P, C7R); cont = true; loopNum++;
}else if(distance(pos, C8P) < C8R){ pos = circleInverse(pos, C8P, C8R); cont = true; loopNum++;
}else if(distance(pos, C9P) < C9R){ pos = circleInverse(pos, C9P, C9R); cont = true; loopNum++;
} if(cont == false) break; }
return loopNum; }
vec3 hsv2rgb(vec3 c) { vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); vec3 p = abs(fract(c.xxx + K.xyz) 2. - K.www); return c.z mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); }
const float SAMPLE_NUM =1.;/243/ void mainImage( out vec4 fragColor, in vec2 fragCoord ){ vec3 sum = vec3(0); float ratio = iResolution.x / iResolution.y / 2.0;
for(float i = 0. ; i < SAMPLE_NUM ; i++){ vec2 position = ((fragCoord.xy + rand2n(fragCoord.xy, i)) / iResolution.yy) - vec2(ratio, 0.5);
position *= 1.;
if (distance(position, vec2(0.0)) > .5) { sum += vec3(1.0); continue; } // -----------------------------------
float loopNum = IIS(position); if (loopNum > 0.) { sum += vec3(mod(floor(1.-loopNum), 2.)); /sum += hsv2rgb(vec3(0.0 iTime / 1.0 + .5 loopNum, 1.,1.));/ } else { sum += vec3(0.,.958,.487); } } fragColor = vec4(sum / SAMPLE_NUM, 1.0); }
