#define GLSLIFY 1 //Screensaver. uniform float time; uniform float seed; uniform vec2 resolution; float noise3D(vec3 p){ return fract(sin(dot(p,vec3(12.9898,78.233,128.852)))*43758.5453)*2.-1.; } float simplex3D(vec3 p){ float f3=1./3.; float s=(p.x+p.y+p.z)*f3; int i=int(floor(p.x+s)); int j=int(floor(p.y+s)); int k=int(floor(p.z+s)); float g3=1./6.; float t=float((i+j+k))*g3; float x0=float(i)-t; float y0=float(j)-t; float z0=float(k)-t; x0=p.x-x0; y0=p.y-y0; z0=p.z-z0; int i1,j1,k1; int i2,j2,k2; if(x0>=y0) { if(y0>=z0){i1=1;j1=0;k1=0;i2=1;j2=1;k2=0;}// X Y Z order else if(x0>=z0){i1=1;j1=0;k1=0;i2=1;j2=0;k2=1;}// X Z Y order else{i1=0;j1=0;k1=1;i2=1;j2=0;k2=1;}// Z X Z order } else { if(y0<z0){i1=0;j1=0;k1=1;i2=0;j2=1;k2=1;}// Z Y X order else if(x0<z0){i1=0;j1=1;k1=0;i2=0;j2=1;k2=1;}// Y Z X order else{i1=0;j1=1;k1=0;i2=1;j2=1;k2=0;}// Y X Z order } float x1=x0-float(i1)+g3; float y1=y0-float(j1)+g3; float z1=z0-float(k1)+g3; float x2=x0-float(i2)+2.*g3; float y2=y0-float(j2)+2.*g3; float z2=z0-float(k2)+2.*g3; float x3=x0-1.+3.*g3; float y3=y0-1.+3.*g3; float z3=z0-1.+3.*g3; vec3 ijk0=vec3(i,j,k); vec3 ijk1=vec3(i+i1,j+j1,k+k1); vec3 ijk2=vec3(i+i2,j+j2,k+k2); vec3 ijk3=vec3(i+1,j+1,k+1); vec3 gr0=normalize(vec3(noise3D(ijk0),noise3D(ijk0*2.01),noise3D(ijk0*2.02))); vec3 gr1=normalize(vec3(noise3D(ijk1),noise3D(ijk1*2.01),noise3D(ijk1*2.02))); vec3 gr2=normalize(vec3(noise3D(ijk2),noise3D(ijk2*2.01),noise3D(ijk2*2.02))); vec3 gr3=normalize(vec3(noise3D(ijk3),noise3D(ijk3*2.01),noise3D(ijk3*2.02))); float n0=0.; float n1=0.; float n2=0.; float n3=0.; float t0=.5-x0*x0-y0*y0-z0*z0; if(t0>=0.) { t0*=t0; n0=t0*t0*dot(gr0,vec3(x0,y0,z0)); } float t1=.5-x1*x1-y1*y1-z1*z1; if(t1>=0.) { t1*=t1; n1=t1*t1*dot(gr1,vec3(x1,y1,z1)); } float t2=.5-x2*x2-y2*y2-z2*z2; if(t2>=0.) { t2*=t2; n2=t2*t2*dot(gr2,vec3(x2,y2,z2)); } float t3=.5-x3*x3-y3*y3-z3*z3; if(t3>=0.) { t3*=t3; n3=t3*t3*dot(gr3,vec3(x3,y3,z3)); } return 96.*(n0+n1+n2+n3); } //Oriented Box-exact(https://www.shadertoy.com/view/stcfzn) float sdOrientedBox(in vec2 p,in vec2 a,in vec2 b,float th) { float l=length(b-a); vec2 d=(b-a)/l; vec2 q=(p-(a+b)*.5); q=mat2(d.x,-d.y,d.y,d.x)*q; q=abs(q)-vec2(l,th)*.5; return length(max(q,0.))+min(max(q.x,q.y),0.); } const int paletteSize=12; const vec3[paletteSize]palette=vec3[]( vec3(0), vec3(0), vec3(88.,139.,139.), vec3(255.,255.,255.), vec3(255.,213.,194.), vec3(242.,143.,59.), vec3(200.,85.,61.), vec3(45.,48.,71.), vec3(147.,183.,190.), vec3(0), vec3(0), vec3(0.) ); const float lineLength=90.; const float lineThiccness=1.5; const float boxSize=25.; const float nScale=.06; const float rSpeed=.06; vec4 sdBoxLine(in int x,in int y){ float n=simplex3D(vec3(float(x)*nScale*.2562+time*rSpeed,float(y)*nScale*.5829+time*rSpeed,float(y)*nScale*.1529-time*rSpeed))*.5+.5; float r=n*3.14*2.; vec2 a=vec2(float(x)*boxSize,float(y)*boxSize); vec2 b=vec2(a.x+sin(r)*lineLength,a.y+cos(r)*lineLength); float d=max(1.-(sdOrientedBox(gl_FragCoord.xy,a,b,0.)-lineThiccness),0.); if(d==0.){ return vec4(0.); } float colN=simplex3D(vec3(float(x)*nScale*.5676+time*rSpeed,float(y)*nScale*.26457+time*rSpeed,float(y)*nScale*.1535-time*rSpeed))*.5+.5; float sColN=colN*float(paletteSize); float colF=fract(sColN); int colA=int(floor(sColN)); int colB=int(floor(mod(float(colA+1),float(paletteSize+1)))); float ld=distance(gl_FragCoord.xy,a)/lineLength; return vec4(mix(palette[colA]/255.,palette[colB]/255.,colF),pow(ld,1.)); } void main(){ vec2 uv=gl_FragCoord.xy/resolution.xy; int cols=int(resolution.x/boxSize); int rows=int(resolution.y/boxSize); int mx=int(gl_FragCoord.x/boxSize); int my=int(gl_FragCoord.y/boxSize); vec2 m=vec2(float(mx),float(my)); int c=int(ceil(lineLength/boxSize)+1.);//max neighbor distance int xs=max(-c,mx-c); int xe=min(cols+c,mx+c); int ys=max(-c,my-c); int ye=min(cols+c,my+c); vec4 col=vec4(0.); float curD=0.; for(int x=xs;x<xe;++x){ for(int y=ys;y<ye;++y){ float dist=distance(vec2(float(x),float(y)),m); vec4 newCol=sdBoxLine(x,y); if(newCol.a>0.&&dist>curD){ col=newCol; curD=dist; } } } vec4 color=vec4(mix(vec3(0.),col.rgb,col.a),1.); gl_FragColor=color; }