Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef GL_FRAGMENT_PRECISION_HIGH
- precision highp float;
- #else
- precision mediump float;
- #endif
- #define AA 1
- #define PI (acos(-1.0))
- #define MAXI 75.0
- #define PATHTIME 24.
- #define wobbleSize 1.
- #define wobbleSpeed 10.
- #define isJulia true
- #define gridOn false
- uniform vec2 resolution;
- uniform vec3 pointers[10];
- uniform int pointerCount;
- uniform float startRandom;
- uniform sampler2D backbuffer;
- uniform vec4 date;
- uniform float time;
- //elliptical path around julia seed, /w zoom & offset
- struct path {
- vec2 center;
- float radius;
- float elliptivity;
- float rotations;
- vec2 offsetStart;
- vec2 offsetEnd;
- float zoomStart;
- float zoomEnd;
- };
- #define NUMPATHS 22
- //update NUMPATHS if you change the number of paths here
- //replace data-structure above with a function?
- path get_path(int p) {
- //Format:
- //path(vec2(julia seed center), radius, elliptivity, rotations, vec2(offstart), vec2(offset), zoomStart, zoomEnd)
- //Data:
- //path(vec2(.0 , .0 ), .0 , 1., 1., vec2(.0 , .0) , vec2(.0, .0), 1. , 1.), //
- //p = 21;
- if (p < 9){ //0-8
- if (p < 5) { //0-4
- if (p < 3) { //0-2
- if (p == 0) return path(vec2(.35 , .36 ), .01 , 1., 1., vec2(-.2 , .5895) , vec2(-.2, .5895), 4. , 7.);
- if (p == 1) return path(vec2(-.16 , 1.03 ), .01 , 1., 1., vec2(-.35 , .51) , vec2(-.35, .51), 350. , 10.);
- if (p == 2) return path(vec2(-.12 , .74 ), .08 , 1., 3., vec2(-.3 , .85) , vec2(-.25, .85), 100. , 4.);
- } else { //3-4
- if (p == 3) return path(vec2(-1.33 , .05 ), .02 , 3., 1., vec2(.1 , .15) , vec2(.1, .1), 200. , 5.);
- if (p == 4) return path(vec2(-.755 , .01 ), .085 , .3, 5., vec2(-.6 , .2) , vec2(.0, .85), 5. , 25.);
- }
- } else { //5-8
- if (p < 7) { //5-6
- if (p == 5) return path(vec2(-1.12 , .26 ), .01, 1., 4., vec2(-1.14, .19) , vec2(-1.14, .19), 2. , 60.);
- if (p == 6) return path(vec2(-1.2 , .18 ), .04 , 1., 3., vec2(-.8 , .04) , vec2(.0, .0), 10. , 1.);
- } else { //7-8
- if (p == 7) return path(vec2(-.16 , 1.035 ), .04 , 1., 1., vec2(1.0 , -1.0) , vec2(.0, .0), 1. , 10.);
- if (p == 8) return path(vec2(-.12 , .005 ), .68 , 1., .3, vec2(-.5 , .5) , vec2(.0, .0), 5., 2.);
- }
- }
- } else { //9-17
- if (p < 14) { //9-13
- if (p < 12) { //9-11
- if (p == 9) return path(vec2(-1. , .005 ), .32 , 1., 1., vec2(-.1 , .1) , vec2(.1, -.1), 1. , 1.3);
- if (p == 10) return path(vec2(-1.32, .0025), .065, 1., 1.5, vec2(-1.4 , .0) , vec2(1.0, .0), 3. , 4.);
- if (p == 11) return path(vec2(-1.77, .0075), .02 , 1., 1., vec2(-1.0 , .0) , vec2(.0, .0), 1.5 , 11.5);
- } else { //12-13
- if (p == 12) return path(vec2(-.13 , .77 ), .12 , 1., 2., vec2(.0 , .0) , vec2(0.0, .0), 1. , 1.);
- if (p == 13) return path(vec2(-1. , .005 ), .32 , 1., 1.7, vec2(.0 , .0) , vec2(.0, .0), 1. , 1.);
- }
- } else { //14-17
- if (p < 16) { //14-15
- if (p == 14) return path(vec2(-1. , .25 ), .01 , 1., 5., vec2(1.0 , .33) , vec2(1., .0), 25. , 3.);
- if (p == 15) return path(vec2(.32 , -.01 ), .03 , .2, 2., vec2(.4 , .9) , vec2(.6, .2), 15. , 1.);
- } else { //16-17
- if (p == 16) return path(vec2(.42 , .20 ), .03 , 1., 1.5, vec2(.23 , .48) , vec2(.23, .48), 1. , 15.);
- if (p == 17) return path(vec2(-1.48, .015 ), .1, .2, 3., vec2(-1., -.1) , vec2(.8, .0), 3., 8.);
- if (p == 18) return path(vec2(-1.10, .3 ), .015, 2., 1., vec2(-.02, .46) , vec2(-.02,.46), 4., 400.);
- if (p == 19) return path(vec2(-.9, .3 ), .3, .2, 1., vec2(-.5, .1) , vec2(-.5, .1), 30., 3.);
- if (p == 20) return path(vec2(.35, .15 ), .15, .2, 1., vec2(.0, .3) , vec2(.5, .5), 1., 3.);
- if (p == 21) return path(vec2(.45, .25 ), .1, .4, 1., vec2(.0, .5) , vec2(.0, .5), 1., 3.);
- }
- }
- }
- }
- float interval(float e1, float e2, float x) {
- if (x >= e1 && x <= e2) return 1.;
- return 0.;
- }
- //dim for a small time as paths change
- float get_dimming_factor(float t) {
- if (t < .05)
- return smoothstep(.0, .05, t);
- if (t > .95)
- return 1.-smoothstep(.95, 1., t);
- return 1.;
- }
- vec2 mandel(vec2 uv0, vec2 c) {
- vec2 uv = vec2(0, 0);
- if (isJulia) {
- uv = uv0;
- //uv0 = vec2(0.0);
- }
- float xtemp, logzn, nu;
- float i = 0.0;
- if (!isJulia) {
- while (length(uv) < 64.0 && i < MAXI) {
- xtemp = uv.x*uv.x - uv.y*uv.y + uv0.x;
- uv.y = 2.0*uv.x*uv.y + uv0.y;
- uv.x = xtemp;
- i++;
- }
- } else {
- while (length(uv) < 64.0 && i < MAXI) {
- xtemp = uv.x*uv.x - uv.y*uv.y + c.x;
- uv.y = 2.0*uv.x*uv.y + c.y;
- uv.x = xtemp;
- i++;
- }
- }
- if (i < MAXI) {
- logzn = log(length(uv)) / 2.0;
- nu = log(logzn / log(2.0)) / log(2.0);
- i = i + 1.0 - nu;
- }
- //pixels in the set could be transparent/black
- if (i/MAXI > .9) i *= 1.-smoothstep(.9, 1., i/MAXI);
- return vec2(i, i);
- }
- vec4 mandel2(vec2 z, vec2 c) {
- float i;
- vec2 dz = z;
- float trap1 = 0.;
- float trap2 = 1e20;
- float co2 = 0.;
- vec2 t2c = vec2(-.5, 2.);
- t2c += .5*vec2(cos(time*.2), sin(time*.2));
- for (i = 0.; i < MAXI; i++) {
- if (dot(z,z) > 1024. ) break;
- dz = 2.*vec2(z.x*dz.x - z.y*dz.y, z.x*dz.y + z.y*dz.x) + vec2(1., 1.);
- z = c + vec2(z.x*z.x - z.y*z.y, 2.*z.x*z.y);
- //trap1
- float d1 = abs(dot(z-vec2(0.,0.), vec2(2.707)));
- float ff = step(d1, 1.);
- co2 += ff;
- trap1 += ff*d1;
- //trap2
- trap2 = min(min(trap2, dot(z-t2c, z-t2c)),dot(z*z, z*z));
- }
- float d = sqrt(dot(z,z)/dot(dz,dz))*log(dot(z,z));
- //float c1 = pow(clamp(2.*d, 0., .1), .5);
- float c2 = pow(clamp(1.5*trap1/co2, 0., .1), 2.);
- float c3 = pow(clamp(.4*trap2, 0., .1), .25);
- if (i < MAXI) {
- float logzn = log(length(z)) / 2.0;
- float nu = log(logzn / log(2.0)) / log(2.0);
- i = i + 1.0 - nu;
- }
- if (i/MAXI > .9) i *= 1.-smoothstep(.9, 1., i/MAXI);
- return vec4(i, d, c2, c3);
- }
- #define numColourModes 13.
- //mandel, time, dist
- vec4 palette(float m, float md, float t1, float t2,
- float t, float d, int colourMode) {
- //transparent inside set and far outside
- if (m == 0.0 || m < 1.0) return vec4(0.0);
- float ms = m/float(MAXI);
- vec3 r = vec3(1., 0., 0.);
- vec3 g = vec3(0., 1., 0.);
- vec3 b = vec3(0., 0., 1.);
- vec3 spread = vec3(1., 2., 3.);
- vec3 col = vec3(0.);
- //colourMode = 12;
- if (colourMode == 0) {
- //mode 0
- float c = 111.9 * d + -9.*t + 1.*m;
- r *= smoothstep(0.3, .6-0.3*sin(c), ms);
- g *= smoothstep(0.1, .6-0.3*sin(c), ms);
- b *= smoothstep(0.4, .6-0.3*sin(c), ms);
- col = ms * sqrt(r+g+b);
- } else if (colourMode == 1) {
- //mode 1
- float c = 10.9 * d + -9.*t + 3.*m;
- r *= smoothstep(0.1, 1.-0.5*sin(c), ms);
- g *= smoothstep(0.3, 1.-0.5*sin(c), ms);
- b *= smoothstep(0.5, 1.-0.5*sin(c), ms);
- col = r+g+b;
- } else if (colourMode == 2) {
- //mode 2
- float c = m * (0.45);
- c -= 6. * t;
- c += 10. * d;
- r *= sin(c);
- g *= sin(c+1.);
- b *= sin(c+2.);
- col = sqrt(ms)*vec3(r + g + b);
- } else if (colourMode == 3) {
- //mode 3
- float c = m * (0.25);
- c -= 6. * t;
- c += 6.0 * d;
- r *= sin(c+1.);
- g *= sin(c+2.);
- b *= sin(c);
- col = ms*vec3(r + g + b);
- } else if (colourMode == 4) {
- //mode 4
- col = 1.*smoothstep(0., .9, sin(1.5*ms*spread))+
- smoothstep(.98, .99, sin(100.*ms+2.*t));
- } else if (colourMode == 5) {
- //mode 5
- float c = 2.*t + 1.*m;
- r *= smoothstep(0.0, 1.-0.7*cos(t+1.), ms);
- g *= smoothstep(0.05, 1.-0.7*sin(t+2.)*cos(1.7*t), ms);
- b *= smoothstep(0.15, 1.-0.7*sin(t)*sin(1.7*t), ms);
- col = ms*((r+g+b)+
- smoothstep(.9, 1., abs(sin(300.*md)))*
- sin(vec3(10.*d, 5.*d, 3.*d)));
- } else if (colourMode == 6) {
- //mode 6
- vec3 o = vec3(1.,2.,3.);
- col = ms*sin(4.*ms + .5*t*o + 1.5*d);
- } else if (colourMode == 7) {
- //mode 7
- float c = m * (0.45);
- c -= 2.0 * t;
- c += 3.0 * d;
- col = ms*sin(ms*vec3(2.,3.,4.))*
- (.1+.9*smoothstep(.0, .1, ms));
- } else if (colourMode == 8) {
- //mode 8
- float c = 8.*t + 3.*m;
- r *= smoothstep(0.1, 1.-0.5*cos(t), ms);
- g *= smoothstep(0.3, 1.-0.5*sin(t)*cos(1.7*t), ms);
- b *= smoothstep(0.5, 1.-0.5*sin(t)*sin(1.7*t), ms);
- col = ms*((r+g+b)+
- .2*smoothstep(.97, 1., abs(sin(c))));
- }else if (colourMode == 9) {
- //mode 9
- float c = 20.8*pow(m/(.1+md), .1);
- float p1 = interval(.02, .2, fract(c))*
- 1.;
- float p2 = interval(.22, 1., fract(c))*
- 1.;
- r *= abs(sin(28.*c+1.));
- g *= abs(sin(28.*c-1.));
- b *= abs(sin(28.*c));
- vec3 c2 = vec3(
- smoothstep(.2,.5,ms),
- smoothstep(.0,.2,ms),
- smoothstep(.0,.1,ms));
- c2 = c2*vec3(.9,.8,1.);
- vec3 w = vec3(.9,.9,.99)*(
- interval(.2, .22, fract(c))+
- interval(.0, .02, fract(c)));
- col = w +
- (r+g+b)*p1 + p2*c2;
- } else if (colourMode == 10) {
- //mode 4
- col = 1.*smoothstep(0., .9, sin(10.*ms*spread))+
- smoothstep(.98, .99, sin(100.*ms+t));
- } else if (colourMode == 11) {
- //mode 4
- float c1 = pow(clamp(.1*md, 0., .1), .5);
- vec3 col1 = .8 + 5.*sin(3.+5.*t1+vec3(.0,.5,1.));
- vec3 col2 = .8 + 5.*sin(4.+2.*(2.+sin(t*.2))*t2+vec3(1.,.1,.0));
- col = .8*sqrt(c1*col1*col2);
- }else if (colourMode == 12) {
- //mode 4
- float c1 = pow(clamp(2.*md, 0., .1), .5);
- vec3 col1 = .5 + 5.*sin(3.+4.*t1+vec3(.0,.5,1.));
- vec3 col2 = .5 + 5.*sin(4.+2.*t2+vec3(1.,.5,.0));
- col = 1.8*sqrt(c1*col1*col2);
- }
- return vec4(col, ms);
- }
- vec2 path_position(path cPath, float t, float zoom) {
- vec2 elliptivity = vec2(min(cPath.elliptivity, 1.), min(1./cPath.elliptivity, 1.));
- //half circle paths
- return cPath.center +
- cPath.radius * elliptivity *
- vec2(cos(t*cPath.rotations*2.*PI),
- sin(t*cPath.rotations*2.*PI)) +
- cPath.radius * (wobbleSize/zoom) *
- vec2(cos(t*wobbleSpeed),
- sin(t*wobbleSpeed));
- }
- void main(void)
- {
- //date = year, month, day, second
- //time is seconds since load
- //rtime controls the animation, so it's
- //starting point advances slowly over time
- float rtime = 24.*60.*date.z + //days (in mins)
- 60.*floor(date.w/3600.) + //hours (in mins)
- mod(date.w,3600.)/60. + //mins+secs (in mins)
- time; //1 sec since load = 1 min
- vec4 col = vec4(0.);
- vec2 uvTex = gl_FragCoord.xy / resolution.xy;
- vec2 uv0 = gl_FragCoord.xy / resolution.xy;
- //adjust positions to fit mandelbrot:
- //x=[-1.2, 1.2]; y=[-2.5, 1.0]
- uv0.y = -1.2 + 2.4 * uv0.y;
- uv0.x = -3.0 + 4.0 * uv0.x;
- //adjust positions to julia space
- if (isJulia) {
- uv0 += vec2(1., 0.);
- }
- //calculate mandelbrot / julias
- //mandel/julia value, distance est.
- vec4 mandel;
- //path position along mandel
- vec2 pathPos;
- //int currentPath = int(mod(rtime/PATHTIME, float(NUMPATHS)));
- int currentPath = int(
- mod(floor(rtime/PATHTIME)*1.38345611,
- float(NUMPATHS)));
- float pathTime = mod(rtime, PATHTIME) / PATHTIME;
- path cPath = get_path(currentPath);
- float dimmingFactor = get_dimming_factor(pathTime);
- //zoom and offset using smooth motion
- float pathZoom =
- cPath.zoomStart * smoothstep(1., 0., pathTime) +
- cPath.zoomEnd * smoothstep(0., 1., pathTime);
- vec2 pathOffset =
- cPath.offsetStart * smoothstep(1., 0., pathTime) +
- cPath.offsetEnd * smoothstep(0., 1., pathTime);
- if (!isJulia) {
- pathZoom = 1.;
- pathOffset = vec2(0.);
- }
- int colourMode = int(
- mod(floor(rtime/PATHTIME)*1.379431,
- numColourModes));
- float d;
- for( int m=0; m<AA; m++ )
- for( int n=0; n<AA; n++ ) {
- vec2 uv = (1./pathZoom)*(uv0 + vec2(vec2(float(m), float(n))/float(AA)) / resolution.xy) + pathOffset;
- //distance
- d = 0.;
- pathPos = path_position(cPath,
- pathTime, pathZoom);
- //if (!isJulia) {
- // mandel = mandel(uv, pathPos) + mandel(uv, pathPos);
- //} else {
- mandel = mandel2(uv, pathPos);
- //}
- //distance from slowly rotating offset
- d = pathZoom*length(uv-(pathOffset+
- 3.*vec2(sin(rtime*.01),cos(rtime*.01))
- /pathZoom));
- col += (1./float(AA*AA))*
- palette(mandel.x, mandel.y, mandel.z,
- mandel.w, rtime, d, colourMode)*
- dimmingFactor;
- }
- vec4 bb = texture2D(backbuffer, 1.*uvTex+vec2(-.05));
- float bbOn = .8*smoothstep(.05, .1, uvTex.x*uvTex.y);
- //if (colourMode != 9) bbOn = 0.;
- vec4 ncol = (col + bbOn*bb);
- vec3 spread = vec3(0., 2., 4.);
- /*float pSize = .01+.3*abs(sin(rtime));
- float pModx = pSize-2.*abs(mod(uv0.x, pSize)-.5*pSize);
- pModx /= pSize;
- float pMody = pSize-2.*abs(mod(uv0.y, pSize)-.5*pSize);
- pMody /= pSize;
- col *= 1./(1.+5.*pModx) + 1./(1.+5.*pMody);
- */
- /*float aStreak = 5.*d + 2.*time;
- if (mod(aStreak, 3.*2.*PI) < 1.1*PI)
- col.rgb *= 1.-sin(aStreak+spread);
- */
- gl_FragColor = col;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement