0x18b75119…b783sent to0x381233d5…7acd·#19,594,889·view on Etherscan
[0,()=>{console.log("Artist 32. Kim Asendorf -- platform 0");const{abs,floor,max,min,pow,round,sign}=Math;const hsvToRgb=(h,s,v)=>{let r,g,b,i,f,p,q,t;i=floor(h*6);f=h*6-i;p=v*(1-s);q=v*(1-f*s);t=v*(1-(1-f)*s);switch(i%6){case 0:r=v,g=t,b=p;break;case 1:r=q,g=v,b=p;break;case 2:r=p,g=v,b=t;break;case 3:r=p,g=q,b=v;break;case 4:r=t,g=p,b=v;break;case 5:r=v,g=p,b=q;break}return[round(r*255),round(g*255),round(b*255)]};const weightedRandom=(...w)=>{let t=0;w.map(x=>x[0]=t+=x[0]);t=R.random_int(0,t-1);let s=w.filter(x=>t<x[0])[0].slice(1)[0];return s};const WebGL=()=>{let cvs,gl,vShad,fShad,dShad,vBuf,fProg,dProg,fbos,fboId=0,iTex,mTex,fc,bc;const init=async()=>{vShad="in vec3 pos;out vec2 vUv;void main(){gl_Position=vec4(pos,1.);vUv=.5*(pos.xy+1.);}";fShad="uniform sampler2D buf,img,mot;uniform float time;uniform vec2 dims;in vec2 vUv;out vec4 frag;float M_PI=3.1415926535897932384626433832795;float getA(){float x1=texture(mot,vUv-vec2(1./dims.x,0.)).g;float x2=texture(mot,vUv+vec2(1./dims.x,0.)).g;float y1=texture(mot,vUv+vec2(0.,1./dims.y)).g;float y2=texture(mot,vUv-vec2(0.,1./dims.y)).g;return atan(y2-y1,x2-x1);}vec3 getC(vec3 clr, bool is){float x1=texture(buf,vUv-vec2(1./dims.x,0.)).r;float x2=texture(buf,vUv+vec2(1./dims.x,0.)).r;float y1=texture(buf,vUv+vec2(0.,1./dims.y)).r;float y2=texture(buf,vUv-vec2(0.,1./dims.y)).r;if(is&&x1==x2&&y1==y2){return clr;}if(x1==1.&&x2==1.&&y1==1.&&y2==1.){return vec3(0.);}if((x1==1.&&x2==1.)||(y1==1.&&y2==1.)){return vec3(1.);}return clr;}void main(){vec2 pos=floor(vUv*dims);vec3 clr=texture(buf,vUv).rgb;vec4 d=texture(mot,vUv);float rData=floor(d.r*256.);float gData=floor(d.g*256.);vec2 rOff=vec2(0.);bool reset=false;if(step(.5,mod(rData/2.,1.))==1.){float a=getA()+M_PI*.5;rOff+=vec2(sin(a),cos(a))/dims*1.;reset=true;}if(step(.5,mod(rData/4.,1.))==1.){float a=getA()+M_PI*1.*d.g*log2(mod(time,16.)*.2);rOff+=vec2(sin(a),cos(a))/dims*1.;reset=true;}if(step(.5,mod(rData/8.,1.))==1.){float a=getA()+M_PI*1.5;rOff+=vec2(sin(a),cos(a))/dims*1.;}if(step(.5,mod(rData/16.,1.))==1.){float a=getA();rOff+=vec2(sin(a),cos(a))/dims*1.;}if(reset&&d.b>0.){clr=texture(img,vUv).rgb;}else{clr=texture(buf,mod(vUv+rOff,vec2(1.))).rgb;}if(step(.5,mod(rData/32.,1.))==1.){clr=getC(clr,false).gbr;}if(step(.5,mod(rData/64.,1.))==1.){clr=vec3(1.)-getC(clr,true).gbr;}if(step(.5,mod(rData/128.,1.))==1.){clr=texture(img,vUv).rgb;}if(step(.5,mod(rData/256.,1.))==1.){float x=mod(floor(time*5.),4.);float y=mod(floor(time*6.),7.);clr=texture(img,vUv*vec2(x,y)).rgb;}frag = vec4(clr,1.);}";dShad="uniform sampler2D buf;in vec2 vUv;out vec4 frag;void main(){frag=texture(buf,vec2(vUv.x,1.-vUv.y));}";cvs=document.querySelector("canvas");cvs.style.width=cvs.style.height="100%";cvs.style.verticalAlign="bottom";document.body.append(cvs);gl=cvs.getContext("webgl2",{antialias:false,willReadFrequently:true});gl.blendFunc(gl.ONE,gl.ONE_MINUS_SRC_ALPHA);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);gl.clearColor(0,0,0,1);vBuf=createBuffer([-1,1,0,-1,-1,0,1,1,0,1,-1,0]);fProg=createProgram(vShad,fShad);dProg=createProgram(vShad,dShad)};const setup=(w,h)=>{let hue1,hue2;let colorMode=weightedRandom([8,0],[8,1],[8,2],[40,3],[36,4]);switch(colorMode){case 0:fc=[255,255,255];bc=[0,0,0];break;case 1:fc=[0,0,0];bc=[255,255,255];break;case 2:hue1=R.random_dec();fc=hsvToRgb(hue1,1,1);bc=hsvToRgb(hue1,.8,.2);break;case 3:hue1=R.random_dec();hue2=R.random_dec();while(abs(hue1-hue2)<.166){hue2=R.random_dec()}fc=hsvToRgb(hue1,1,1);bc=hsvToRgb(hue2,1,1);break;case 4:hue1=R.random_dec();fc=hsvToRgb(0,0,0);bc=hsvToRgb(hue1,1,1);break;default:break}for(let fbo in fbos){gl.deleteFramebuffer(fbo.fbo);gl.deleteTexture(fbo.tex)}fbos=[];let p=createPixels(w,h);fbos.push(createFbo(w,h,p));fbos.push(createFbo(w,h,null));fboId=0;iTex=createTexture(w,h,p);mTex=createTexture(w,h,null)};const resizeCanvas=s=>{if(cvs.width!=cvs.clientWidth*s||cvs.height!=cvs.clientHeight*s){cvs.width=cvs.clientWidth*s;cvs.height=cvs.clientHeight*s;return[cvs.width/s,cvs.height/s]}return};const render=(w,h,s,t,p)=>{renderFeedback(w,h,t,p);renderDraw(w,h,s)};const setupProgram=p=>{gl.useProgram(p);p.vertexPosAttrib=gl.getAttribLocation(p,"pos");gl.enableVertexAttribArray(p.vertexPosAttrib);gl.bindBuffer(gl.ARRAY_BUFFER,vBuf);gl.vertexAttribPointer(p.vertexPosAttrib,3,gl.FLOAT,false,0,0)};const renderFeedback=(w,h,t,p)=>{let prevId=fboId;let curId=fboId^=1;setupProgram(fProg);gl.bindFramebuffer(gl.FRAMEBUFFER,fbos[curId].fbo);gl.viewport(0,0,w,h);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);gl.activeTexture(gl.TEXTURE0+prevId);gl.bindTexture(gl.TEXTURE_2D,fbos[prevId].tex);gl.activeTexture(gl.TEXTURE0+2);gl.bindTexture(gl.TEXTURE_2D,iTex);gl.activeTexture(gl.TEXTURE0+3);gl.bindTexture(gl.TEXTURE_2D,mTex);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,w,h,0,gl.RGBA,gl.UNSIGNED_BYTE,p);gl.uniform1f(gl.getUniformLocation(fProg,"time"),t/1e3);gl.uniform2f(gl.getUniformLocation(fProg,"dims"),w,h);gl.uniform1i(gl.getUniformLocation(fProg,"buf"),prevId);gl.uniform1i(gl.getUniformLocation(fProg,"img"),2);gl.uniform1i(gl.getUniformLocation(fProg,"mot"),3);gl.drawArrays(gl.TRIANGLE_STRIP,0,4)};const renderDraw=(w,h,s)=>{setupProgram(dProg);gl.bindFramebuffer(gl.FRAMEBUFFER,null);gl.viewport(0,0,w*s,h*s);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,fbos[fboId].tex);gl.uniform1i(gl.getUniformLocation(dProg,"buf"),0);gl.drawArrays(gl.TRIANGLE_STRIP,0,4)};const createProgram=(v,f)=>{let p=gl.createProgram();let vs=createShader("#version 300 es\n"+v,gl.VERTEX_SHADER);let fs=createShader("#version 300 es\nprecision highp float;"+f,gl.FRAGMENT_SHADER);gl.attachShader(p,vs);gl.attachShader(p,fs);gl.linkProgram(p);return p};const createShader=(src,type)=>{let s=gl.createShader(type);gl.shaderSource(s,src);gl.compileShader(s);return s};const createFbo=(w,h,p)=>{let fbo=gl.createFramebuffer();let tex=createTexture(w,h,p);gl.bindFramebuffer(gl.FRAMEBUFFER,fbo);gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,tex,0);return{fbo:fbo,tex:tex}};const createTexture=(w,h,p)=>{let tex=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,tex);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,w,h,0,gl.RGBA,gl.UNSIGNED_BYTE,p);return tex};const createBuffer=d=>{let buf=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buf);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(d),gl.STATIC_DRAW);return buf};const createPixels=(w,h)=>{let uint8=new Uint8Array(w*h*4);let g=pow(2,R.random_int(1,2));let m=R.random_bool(.5);for(let i=0;i<w*h;i++){let x=i%w;let y=floor(i/w);let c=0;if(m){c=x%g==0&&y%g==0?fc:bc}else{c=x%g==0&&(x+y)%(2*g)==0?fc:bc}uint8[i*4]=c[0];uint8[i*4+1]=c[1];uint8[i*4+2]=c[2];uint8[i*4+3]=255}return uint8};return{init:init,setup:setup,render:render,resizeCanvas:resizeCanvas}};const C2dMotion=()=>{let ops=["lighter","color-dodge","soft-light","hue","saturation","luminosity"];let cvs,ctx,objs;let ss=.25;class Obj{constructor(p,r,m,s,o){this.s=s;this.sId=0;this.idx=0;this.dir=1;this.p=p;this.r=r;this.m=m;this.o=o}update(){this.idx+=this.dir;if(this.idx>=this.p.length-1||this.idx<=0){if(this.m==1){this.idx=0}else{this.dir*=-1}}}changeStyle(){this.sId=++this.sId%this.s.length}draw(ctx){let x=this.p[this.idx][0];let y=this.p[this.idx][1];let g;if(this.o==0){g=ctx.createLinearGradient(x-this.r,0,x+this.r,0)}else{g=ctx.createLinearGradient(0,y-this.r,0,y+this.r)}g.addColorStop(0,`rgba(${this.s[this.sId]}, 255, 0, 1)`);g.addColorStop(.5,`rgba(${this.s[this.sId]}, 0, 0, 1)`);g.addColorStop(1,`rgba(${this.s[this.sId]}, 255, 0, 1)`);ctx.fillStyle=g;ctx.fillRect(x-this.r,y-this.r,this.r*2,this.r*2)}}const getLine=(x,y,s,l)=>{let p=[];for(let i=0;i<l;i++){p.push([x+s[0]*i,y+s[1]*i])}return p};const getRectangle=(x,y,s,r,a)=>{let p=[];for(let i=0;i<r;i+=s){p.push([x+i,y])}for(let i=0;i<r;i+=s){p.push([x+r,y+i])}for(let i=0;i<r;i+=s){p.push([x+r-i,y+r])}for(let i=0;i<r;i+=s){p.push([x,y+r-i])}p.push(...p.splice(0,floor(p.length/100*a)));return p};const getStepAndLength=(x,y,w,h,r)=>{let s,l;if(R.random_bool(.5)){s=[R.random_bool(.5)?-ss:ss,0];l=abs(max(0,sign(s[0]))*w-x)-r;if(l<r){s[0]*=-1;l=abs(max(0,sign(s[0]))*w-x)-r}l=r+(l-r)*(.5+R.random_num(0,.5))}else{s=[0,R.random_bool(.5)?-ss:ss];l=abs(max(0,sign(s[1]))*h-y)-r;if(l<r){s[1]*=-1;l=abs(max(0,sign(s[1]))*h-y)-r}l=r+(l-r)*(.5+R.random_num(0,.5))}return[s,l]};const setupObj=(ax,ay,aw,ah,r,m,st,v,o)=>{let x,y,s,l,sl,p,num,numX,numY,xo,yo,gap,la,rs,cr,group,c;switch(m){case 0:if(v){x=ax+aw/2;y=ay+r;s=[0,ss];l=ah-2*r}else{x=ax+r;y=ay+ah/2;s=[ss,0];l=aw-2*r}p=getLine(x,y,s,l/ss);objs.push([new Obj(p,r,0,st,o)]);break;case 1:num=R.random_int(3,8);if(v){x=ax+r;y=ay+r;s=[0,ss];l=ah-2*r;gap=(aw-2*r)/(num-1)}else{x=ax+r;y=ay+r;s=[ss,0];l=aw-2*r;gap=(ah-2*r)/(num-1)}la=R.random_bool(.7)?0:1/num;group=[];for(let i=0;i<num;i++){xo=x+gap*i*sign(s[1]);yo=y+gap*i*sign(s[0]);p=getLine(xo,yo,s,l/ss-i*l/ss*la);group.push(new Obj(p,r,0,st,o))}objs.push(group);break;case 2:x=r+R.random_num(0,aw-2*r);y=r+R.random_num(0,ah-2*r);num=R.random_int(8,40);p=[];for(let i=0;i<num;i++){sl=getStepAndLength(x,y,aw,ah,r,ss);s=sl[0];l=sl[1];l*=R.random_num(.2,1);p.push(...getLine(x,y,s,l/ss));x+=s[0]*l/ss;y+=s[1]*l/ss}objs.push([new Obj(p,r,0,st,o)]);break;case 3:cr=min(aw,ah)/2-r;x=ax+aw/2;y=ay+ah/2;s=ss;rs=R.random_num(0,100);p=getRectangle(x,y,s,cr,rs);objs.push([new Obj(p,r,1,st,o)]);break;case 4:numY=R.random_int(3,6);cr=(ah-2*r)/numY*.5;numX=min(floor((aw-2*r)/(2*cr)),8);let xOff=(aw-numX*2*cr-2*r)/2;x=ax+cr+r;y=ay+cr+r;s=ss;rs=R.random_num(0,100);group=[];c=pow(2,R.random_int(1,3));for(let i=0;i<numX;i++){for(let j=0;j<numY;j++){let cx=x+xOff+i*2*cr;let cy=y+j*2*cr;p=getRectangle(cx,cy,s,cr,rs);if(p.length){group.push(new Obj(p,r,1,st,o))}}}objs.push(group);break;default:break}};const getRadius=(w,h)=>{return 8+min(w,h)/2*.25*R.random_dec()};const getStyles=num=>{return Array.from({length:num},()=>pow(2,R.random_int(0,7)))};const init=()=>{cvs=document.createElement("canvas");ctx=cvs.getContext("2d",{willReadFrequently:true})};const comps=[];comps[0]=(w,h)=>{for(let i=0;i<16;i++){let ow=w*R.random_num(.1,1);let oh=h*R.random_num(.1,1);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),R.random_int(0,3),getStyles(3),R.random_bool(.5),R.random_int(0,1))}};comps[1]=(w,h)=>{let num=pow(2,R.random_int(4,6));let v=R.random_num(0,.5);for(let i=0;i<num;i++){let ow=w*R.random_num(.1,1);let oh=h*R.random_num(.1,1);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),0,getStyles(3),R.random_bool(.25+v),R.random_int(0,1))}};comps[2]=(w,h)=>{let ow=w*R.random_num(.7,.9);let oh=h*R.random_num(.7,.9);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),3,getStyles(4),0,R.random_int(0,1));let num=pow(2,R.random_int(3,5));for(let i=0;i<num;i++){let ow=w*R.random_num(.1,1);let oh=h/2*R.random_num(.25,1.25);setupObj(R.random_num(0,w-ow),(h-oh)*R.random_num(.5,1),ow,oh,getRadius(ow,oh),0,getStyles(2),0,R.random_int(0,1))}num=pow(2,R.random_int(3,5));for(let i=0;i<num;i++){let ow=w*R.random_num(.1,1);let oh=h/2*R.random_num(.25,1.25);setupObj(R.random_num(0,w-ow),(h-oh)*R.random_num(0,.5),ow,oh,getRadius(ow,oh),0,getStyles(2),1,R.random_int(0,1))}};comps[3]=(w,h)=>{let ow=w*R.random_num(.7,.9);let oh=h*R.random_num(.7,.9);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),1,getStyles(4),0,R.random_int(0,1));let num=pow(2,R.random_int(4,6));for(let i=0;i<num;i++){let ow=w*R.random_num(.1,1);let oh=h*R.random_num(.1,1);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),0,getStyles(3),1,R.random_int(0,1))}};comps[4]=(w,h)=>{let num=2;for(let i=0;i<num;i++){let ow=w/2*R.random_int(.4,1);let oh=h*R.random_num(.4,1);setupObj(R.random_num(0,w/2-ow)+i*w/2,R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),1,getStyles(3),1,R.random_int(0,1))}num=pow(2,R.random_int(4,5));for(let i=0;i<num;i++){let ow=w*R.random_num(.1,1);let oh=h*R.random_num(.1,1);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),3,getStyles(3),1,R.random_int(0,1))}};comps[5]=(w,h)=>{let num=pow(2,R.random_int(3,5));for(let i=0;i<num;i++){let ow=w*R.random_num(.4,1);let oh=h*R.random_num(.4,1);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),2,getStyles(3),0,R.random_int(0,1))}};comps[6]=(w,h)=>{let num=pow(2,R.random_int(4,7));for(let i=0;i<num;i++){let ow=w*R.random_num(.5,1);let oh=h*R.random_num(.5,1);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),3,getStyles(3),0,R.random_int(0,1))}};comps[7]=(w,h)=>{let num1=R.random_int(3,6);for(let i=0;i<num1;i++){let sw=w*R.random_num(.4,.6);let sh=h*R.random_num(.4,.6);let sx=R.random_num(0,w-sw);let sy=R.random_num(0,h-sh);let num2=pow(2,R.random_int(3,5));for(let j=0;j<num2;j++){let ow=sw*R.random_num(.5,1);let oh=sh*R.random_num(.5,1);setupObj(sx+R.random_num(0,sw-ow),sy+R.random_num(0,sh-oh),ow,oh,getRadius(ow,oh),3,getStyles(3),0,R.random_int(0,1))}}};comps[8]=(w,h)=>{for(let i=0;i<2;i++){for(let j=0;j<2;j++){for(let k=0;k<2;k++){if(R.random_bool(.25)){continue}let ow=w*R.random_num(.25,.5);let oh=h*R.random_num(.25,.5);setupObj(R.random_num(0,w/2-ow)+i*w/2,R.random_num(0,h/2-oh)+j*h/2,ow,oh,getRadius(ow,oh),4,getStyles(3),0,R.random_int(0,1))}}}let num=pow(2,R.random_int(3,5));for(let i=0;i<num;i++){let ow=w*R.random_num(.8,.9);let oh=h*R.random_num(.25,1);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),0,getStyles(4),0,R.random_int(0,1))}};comps[9]=(w,h)=>{let num=pow(2,R.random_int(3,4));let ow=w/num*.5;let oh=h*R.random_num(.5,.7);let y=h*R.random_num(.1,.2);let xOff=R.random_num(0,h/2);for(let i=0;i<num;i++){let r=8+min(ow,oh)/2*(i==0||i==num-1?.8:2)*R.random_dec();setupObj(ow*i+xOff,y-r,ow,oh+2*r,r,0,getStyles(3),1,R.random_int(0,1))}num=pow(2,R.random_int(2,4));for(let i=0;i<num;i++){let ow=w*R.random_num(.3,.6);let oh=h*R.random_num(.3,.6);setupObj(R.random_num(0,w-ow),R.random_num(0,h-oh),ow,oh,getRadius(ow,oh),R.random_int(0,3),getStyles(3),0,R.random_int(0,1))}};const setup=(w,h)=>{cvs.width=w;cvs.height=h;let oId=weightedRandom([16,0],[8,1],[12,2],[28,3],[16,4],[20,5]);ctx.globalCompositeOperation=ops[oId];objs=[];let cId=weightedRandom([15,0],[9,1],[7,2],[6,3],[12,4],[13,5],[16,6],[9,7],[7,8],[6,9]);comps[cId](w,h)};const draw=(w,h,t)=>{t/=1e3;ctx.clearRect(0,0,w,h);for(let group of objs){let change=R.random_bool(1e-4);for(let object of group){if(change){object.changeStyle()}object.update(t);object.draw(ctx,t)}}return ctx.getImageData(0,0,w,h)};return{init:init,setup:setup,draw:draw}};let gl=WebGL();let c2dMotion=C2dMotion();let scale,dims;async function init(){document.querySelector("html").style.height="100%";let bs=document.body.style;bs.margin="0px";bs.height="100%";bs.overflow="hidden";bs.background="black";c2dMotion.init();await gl.init();scale=min(window.devicePixelRatio,2);dims=gl.resizeCanvas(scale);mainSetup();animate(0)}function mainSetup(){R=Random();c2dMotion.setup(dims[0],dims[1]);gl.setup(dims[0],dims[1])}function animate(time){let resized=gl.resizeCanvas(scale);if(resized){scale=min(window.devicePixelRatio,2);dims=resized;mainSetup()}let mPixels=c2dMotion.draw(dims[0],dims[1],time);gl.render(dims[0],dims[1],scale,time,mPixels);requestAnimationFrame(animate)}init();
}],