0x7f5a…e37c

All memos sent from and to 0x7f5a…e37c.

Pressed Pause is an expression of presence. It is a hybrid motion work which gives the viewer the opportunity to choose how they would like to view the composition; live-running animation or still. The paused state is the pre-selected beginning. Behind the still image, each piece continues to advance in constant motion. The viewer can decide whether to reveal the already-running motion or keep it still, unaware of the changes taking place in the background. Through a simple interaction of pressing and holding (via touchscreen, keyboard, mouse, or a gamepad button), the viewer can resume or pause the piece.
class Random{constructor(){this.useA=!1;let t=function(t){let e=parseInt(t.substr(0,8),16),r=parseInt(t.substr(8,8),16),n=parseInt(t.substr(16,8),16),o=parseInt(t.substr(24,8),16);return function(){e|=0,r|=0,n|=0,o|=0;let t=(e+r|0)+o|0;return o=o+1|0,e=r^r>>>9,r=n+(n<<3)|0,n=n<<21|n>>>11,n=n+t|0,(t>>>0)/4294967296}};this.prngA=new t(tokenData.hash.substr(2,32)),this.prngB=new t(tokenData.hash.substr(34,32));for(let t=0;t<1e6;t+=2)this.prngA(),this.prngB()}random_dec(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}}function b(t){return R()>t}function fr(t){return flr(R()*t)}function afr(t){return t[fr(t.length)]}function abs(t){return Math.abs(t)}function flr(t){return Math.floor(t)}function cae(t,e){canvas.addEventListener(t,e)}const urlParams=new URLSearchParams(window.location.search);let m0="true"==urlParams.get("live"),rnd=new Random,R=function(){return rnd.random_dec()},tt=function(){return R()>.5};var D_S=1e3;let cDiv=document.createElement("div");cDiv.style.width=window.innerWidth+"px",cDiv.style.height=window.innerHeight+"px";var DIM=Math.max(window.innerWidth,window.innerHeight);document.body.style.backgroundColor="#000000";var bVL=.1,M=DIM/D_S,wTick=0,frame=fr(5e3)+500,tick=frame;let tS=0,tS2=0,atk=0,arsdc=0,sfo=!1,palettes=[[[249,222,89],[232,166,40],[249,131,101],[195,49,36],[161,223,251]],[[255,109,105],[254,204,80],[11,231,251],[1,11,139],[30,5,33]],[[233,255,136],[254,10,183],[229,1,133],[17,16,16],[208,204,209]],[[179,231,220],[166,180,1],[239,246,123],[213,1,2],[108,1,2]],[[0,123,0],[36,224,184],[255,204,81],[255,139,118],[255,48,49]],[[169,67,0],[255,176,0],[255,223,0],[91,155,55],[21,61,2]],[[161,5,50],[255,111,169],[255,208,204],[0,183,204],[0,95,129]],[[95,165,90],[1,180,188],[246,213,31],[250,137,37],[250,84,87]],[[99,26,17],[187,96,47],[239,216,131],[203,130,20],[68,64,101]],[[48,4,61],[142,31,81],[229,64,89],[222,131,127],[253,179,106]],[[255,251,196],[182,190,246],[53,30,191],[16,1,93],[10,0,48]],[[140,7,20],[252,64,124],[27,78,136],[5,8,30],[250,240,228]],[[0,0,63],[1,0,142],[144,1,245],[254,0,234],[255,1,120]],[[8,44,68],[114,234,245],[254,230,226],[255,169,76],[254,44,137]],[[1,99,141],[171,206,204],[255,242,205],[255,0,76],[97,13,75]],[[34,125,172],[68,57,136],[159,0,82],[255,63,32],[255,190,0]],[[129,237,247],[0,164,192],[2,116,143],[247,1,16],[110,5,22]],[[255,254,1],[255,134,6],[232,59,54],[96,5,56],[70,10,64]],[[51,51,51],[204,204,204],[0,0,0],[48,48,48],[221,221,221]],[[215,0,95],[215,215,0],[38,38,38],[175,0,95],[0,255,255]],[[85,255,255],[255,85,255],[255,255,85],[170,0,0],[0,0,170]],[[170,0,170],[170,0,0],[255,255,85],[170,85,0],[0,170,0]],[[170,0,0],[170,0,0],[255,85,85],[255,255,85],[85,85,255]],[[255,85,85],[85,255,85],[255,255,85],[85,85,85],[85,255,255]],[[255,85,255],[85,255,255],[0,0,0],[255,0,255],[255,255,255]],[[0,170,0],[0,0,0],[170,0,0],[170,85,0],[0,85,0]],[[15,139,141],[168,32,26],[236,154,41],[218,210,216],[20,54,66]],[[116,2,17],[208,169,160],[143,58,96],[195,90,102],[36,0,4]],[[175,212,204],[133,186,106],[26,119,73],[11,46,47],[1,18,28]],[[0,18,68],[0,80,134],[49,143,181],[176,202,199],[247,214,191]],[[140,66,25],[243,149,88],[238,200,176],[241,236,231],[247,217,109]],[[191,135,9],[234,197,125],[185,187,222],[128,116,144],[82,56,87]],[[44,48,57],[107,54,56],[254,108,58],[254,219,209],[158,172,183]],[[91,91,91],[195,214,211],[217,201,167],[248,233,214],[244,163,142]]],pId=flr(R()*palettes.length),plt=palettes[pId];plt.push([0,0,0]);let fv=500,cPr=R()*fv+fv,clrs=["c0","c1","c2","c3","c4","c5"],clrsI=["c0","c1","c2","c3","c4","c5"],pA=[],gls=["2","4","6","8","10","12","16"],cOs="",cOsI="",rCA=[.1,.2,.25,.5],scA=[100,200,250],rC0=afr(rCA),rC1=afr(rCA);rC0=.4*R()+.05,rC1=.4*R()+.05;let sCH=afr(scA),sCV=afr(scA);sCH=fr(500)+50,sCV=fr(250)+50;let nrm=b(.1),sCH1=afr(scA),sCV1=afr(scA);sCH1=fr(100)+50,sCV1=fr(250)+50;let dT=fr(3),dT1=fr(3);1==dT1&&(sCV=fr(200)+50);let tch=new Float32Array(2);tch[0]=DIM/2,tch[1]=DIM/2;let startTick=0,tchPrg=0,viewState=0;m0&&(viewState=1);let maxTick=0,prgDur=150,winding=!1,unwinding=!1,x0=fr(2e3)-1e3,y0=fr(2e3)-1e3,x1=fr(2e3)-1e3,y1=fr(2e3)-1e3,x2=fr(2e3)-1e3,y2=fr(2e3)-1e3,x3=fr(2e3)-1e3,y3=fr(2e3)-1e3,v0=R(),b0=tt(),b1=tt(),b2=tt(),b3=tt(),b4=tt(),b5=tt(),b6=tt();const keys={Space:"sp"};let gp,k={sp:!1},clrsS=fr(15)+15;clrsS=10;for(let t=0;t<clrsS;t++)clrsI.push(afr(clrs));for(let t=0;t<clrsI.length;t++)pA.push(cPr),cPr+=fv;let sT=R();sT<.2?clrsI.sort():sT<.5?clrsI.reverse():sT<.8&&(clrsI=shuffle(clrsI));let pct,clrsC=clrsI.length,loopCap=200*(50+clrsC)*10;for(let t=0;t<clrsC;t++)pct=Math.floor(pA[t]/cPr*1e3)/1e3,cOs+=(t>0?"else if ":"if ")+"(idx < loopPoint * "+pct+") {\n",cOs+=" gloss = "+afr(gls)+".;\n",cOs+=" cIn = "+t+".;\n",cOs+="}\n",cOsI+=(t>0?"else if ":"if ")+"(cIn == "+t+".) {\n",cOsI+=" c = "+clrsI[t]+";\n",cOsI+="}\n";let oCB=R()>.9,oCBH=R(),c="",cR="";for(let t=0;t<6;t++)c+="vec3 c"+t+" = rgb2hsv(vec3("+plt[t][0]+"./255.,"+plt[t][1]+"./255.,"+plt[t][2]+"./255.));\n",cR+="vec3 c"+t+" = vec3("+plt[t][0]+"./255.,"+plt[t][1]+"./255.,"+plt[t][2]+"./255.);\n";const canvas=document.getElementsByTagName("canvas")[0];canvas.width=DIM,canvas.height=DIM,cDiv.style.position="absolute",cDiv.style.overflow="hidden",canvas.parentElement.appendChild(cDiv),canvas.style.left="50%",canvas.style.top="50%",canvas.style.position="relative",canvas.style.transform="translate(-50%,-50%)",cDiv.appendChild(canvas);const yCul=flr(abs(canvas.offsetTop-DIM/2)),xCul=flr(abs(canvas.offsetLeft-DIM/2));let cft,cD=!0,hl=/\bHeadlessChrome/.test(navigator.userAgent),lft=0;const gl=canvas.getContext("webgl"),positionsData=new Float32Array([1,1,-1,1,1,-1,-1,-1]),indices=new Uint16Array([0,1,2,1,2,3]),textureData=new Float32Array([1,1,0,1,1,0,0,0]);var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture),texBind();const targetTexture2=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture2),texBind();const bT=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,bT),texBind();const cT=gl.createTexture();function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),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.bindTexture(gl.TEXTURE_2D,cT),texBind();const fb=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fb);const indexBuffer=gl.createBuffer();var attachmentPoint=gl.COLOR_ATTACHMENT0,level=0;gl.framebufferTexture2D(gl.FRAMEBUFFER,attachmentPoint,gl.TEXTURE_2D,targetTexture,level);var aDt={},bDt={},bDta={},cData={},fDt={};function compileShader(t,e){var r=gl.createShader(e);if(gl.shaderSource(r,t),gl.compileShader(r),!gl.getShaderParameter(r,gl.COMPILE_STATUS))throw"Shader compile failed with: "+gl.getShaderInfoLog(r);return r}function glAB(t,e){gl.activeTexture(t),gl.bindTexture(gl.TEXTURE_2D,e)}function glD(){gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indexBuffer),gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indices,gl.STATIC_DRAW),gl.drawElements(gl.TRIANGLES,indices.length,gl.UNSIGNED_SHORT,0)}function drawArt(){gl.useProgram(aPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,targetTexture,level),gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(aDt.pAt,2,gl.FLOAT,!1,8,0),gl.enableVertexAttribArray(aDt.pAt),gl.uniform1f(aDt.tickSet,tick),gl.uniform2fv(aDt.tch,tch),gl.uniform1f(aDt.frame,frame),gl.uniform1f(aDt.tchPrg,tchPrg),gl.uniform1f(aDt.viewState,viewState),glAB(gl.TEXTURE0,texture),glD()}function blurArt(t,e){gl.useProgram(blPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,e,level);var r=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDt.pAt,2,r,!1,0,0),gl.enableVertexAttribArray(bDt.pAt),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDt.tAt,2,r,!1,0,0),gl.enableVertexAttribArray(bDt.tAt),glAB(gl.TEXTURE0,t),glD()}function blendArt(t,e){gl.useProgram(bldPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,e,level);var r=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.pAt,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.pAt),glAB(gl.TEXTURE0,t),gl.uniform1i(bDta.freshTexture,0),glAB(gl.TEXTURE1,cT),gl.uniform1i(bDta.cT,1),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.tAt,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.tAt),glD()}function compositeArt(t){gl.useProgram(compositeProgram),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,cT,level);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.pAt,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.pAt),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.tAt,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.tAt),glAB(gl.TEXTURE0,t),glD()}function renderFinal(t){gl.useProgram(fPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,targetTexture,level);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.pAt,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.pAt),gl.uniform1f(fDt.tickSet,tick),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.tAt,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.tAt),glAB(gl.TEXTURE0,t),glD()}function renderCircle(t){gl.useProgram(cPg),gl.bindFramebuffer(gl.FRAMEBUFFER,null);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(cData.pAt,2,e,!1,0,0),gl.enableVertexAttribArray(cData.pAt),gl.uniform1f(cData.tickSet,tick),gl.uniform2fv(cData.tch,tch),gl.uniform1f(cData.tchPrg,tchPrg),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(cData.tAt,2,e,!1,0,0),gl.enableVertexAttribArray(cData.tAt),glAB(gl.TEXTURE0,t),glD()}let blurFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nuniform float M;\n\nvoid main() {\n vec2 resultCoords = vec2(vTextureCoord.x, vTextureCoord.y);\n\n float a = texture2D(u_texture, resultCoords).a;\n vec3 tColor = texture2D(u_texture, resultCoords).rgb;\n\n for (int i = 0;i<5;i++) {\n float bV = float(i) * .075;\n vec2 d2 = vec2(.1 * float(i), .1 * float(i));\n vec2 d3 = vec2(.1 * float(i),-.1 * float(i));\n\n tColor += texture2D(u_texture, resultCoords + d2).rgb * bV;\n tColor += texture2D(u_texture, resultCoords - d2).rgb * bV;\n tColor += texture2D(u_texture, resultCoords + d3).rgb * bV;\n tColor += texture2D(u_texture, resultCoords - d3).rgb * bV;\n\n }\n gl_FragColor = vec4(tColor, a);\n}\n",blurFragmentShader=compileShader(blurFSS,gl.FRAGMENT_SHADER),blendFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D freshTexture;\nuniform sampler2D compTexture;\nvoid main() {\n vec3 blend0 = texture2D(freshTexture, vTextureCoord).rgb;\n vec3 blend1 = texture2D(compTexture, vTextureCoord).rgb;\n vec3 compBlend = mix(blend0,blend1,.95);\n gl_FragColor = vec4(compBlend ,1.);\n}\n",blendFragmentShader=compileShader(blendFSS,gl.FRAGMENT_SHADER),finalFSS=`\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nuniform float tick;\n\nvoid main() {\n float fTick = tick;\n\n float M = float(${M});\n float DIM = float(${DIM});\n vec2 resultCoords = vec2(gl_FragCoord.x, gl_FragCoord.y)/M;\n vec2 resultCoords0 = vec2(gl_FragCoord.x, gl_FragCoord.y)/M;\n vec2 st = vec2(gl_FragCoord)/M;\n resultCoords /= 1000.;\n resultCoords0 /= 1000.;\n\n\n if (resultCoords.x < mod(resultCoords.x,.5) && ${b2}) {\n resultCoords.x = 1. - mod(resultCoords.x,.5); \n }\n\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n\n vec4 color2 = texture2D(u_texture, vec2(vTextureCoord.x,vTextureCoord.y));\n gl_FragColor *= mod(resultCoords.x + resultCoords.y,10.2);\n\n if (${dT} == 0) {\n gl_FragColor /= ((mod(resultCoords.x - resultCoords.y,float(${rC0})) - mod(resultCoords.y - resultCoords.x,float(${rC0})))) + .08;\n gl_FragColor *= 2. * float(${rC0}); \n }\n else if(${dT} == 1) {\n gl_FragColor /= ((mod(-resultCoords.x - resultCoords.y, float(${rC0})) - mod(resultCoords.y + resultCoords.x, float(${rC0})))) + .08;\n gl_FragColor *= 5. * float(${rC0}); \n }\n float shadowDepth = 3.;\n float h = ((mod(-resultCoords.y,(${sCH}./1000.)) - mod(resultCoords.y,(${sCH}./1000.))) * shadowDepth);\n float v = ((mod(-resultCoords.x,(${sCV}./1000.)) - mod(resultCoords.x,(${sCV}./1000.))) * shadowDepth);\n\n float h1 = ((mod(-resultCoords.y,(${sCH1}./1000.)) - mod(resultCoords.y,(${sCH1}./1000.))) * shadowDepth);\n float v1 = ((mod(-resultCoords.x,(${sCV1}./1000.)) - mod(resultCoords.x,(${sCV1}./1000.))) * shadowDepth);\n\nfloat dk = 2.;\n\n if (${dT1} == 0) {\n gl_FragColor /= (h1 + .0001) * 1.;\n if (${dT} < 2) {\n gl_FragColor *= (${sCV}./1000.) * 2.;\n }\n else {\n gl_FragColor *= (${sCV}./1000.) * 2.;\n }\n }\n else if (${dT1} == 1) {\n gl_FragColor /= (v + .001);\n if (${dT} < 2) {\n gl_FragColor *= (${sCV}./1000.) * 1.;\n }\n else {\n gl_FragColor *= h1 / (${sCV}./1000.) * 1.;\n }\n}\nelse if (${dT1} == 2) { \n gl_FragColor /= (h) + .0001;\n if (${dT} == 2) {\n gl_FragColor /= (v + .0001);\n gl_FragColor *= (${sCH}./1000.) * 5.;\n }\n else {\n gl_FragColor *= (${sCH}./1000.) * 1.;\n }\n}\nif (${dT} == 2 && ${dT1} < 2) {\n if (${dT1} == 0) {\n float cd = distance(resultCoords,vec2(.5,.5));\n if (cd > .1) {\n gl_FragColor /= (mod(cd,((${sCH1}./1500.))) * 10.) + .01;\n }\n }\n else {\n }\n gl_FragColor *= 2.;\n}\n\n gl_FragColor *= 2.5;\n\n\n gl_FragColor *= fract(resultCoords.x * .001) + .001;\n gl_FragColor = (gl_FragColor + mix(gl_FragColor,color2,.5))/.8;\n \n gl_FragColor = (gl_FragColor + mix(gl_FragColor,color2,.5))/.6;\n gl_FragColor *= 20.;\n gl_FragColor /= 40.5;\n\n}\n`,fFS=compileShader(finalFSS,gl.FRAGMENT_SHADER),baseVertexString="\nattribute vec2 position;\nattribute vec2 texcoord;\nvarying highp vec2 vTextureCoord;\nvoid main() {\n gl_Position = vec4(position, 0., 1.);\n vTextureCoord = texcoord;\n}\n",baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER),cFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nvoid main() {\n vec2 resultCoords = vec2(vTextureCoord.x, vTextureCoord.y);\n gl_FragColor = texture2D(u_texture, resultCoords);\n}\n",coFS=compileShader(cFSS,gl.FRAGMENT_SHADER),cFS=`\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nuniform float tick;\nuniform vec2 tch[1]; \nuniform float tchPrg;\n\nfloat PI = 3.14159;\n\nvoid main() {\n ${cR}\n float fTick = tick;\n\n float M = float(${M});\n float DIM = float(${DIM});\n vec2 resultCoords = vec2(gl_FragCoord.x, gl_FragCoord.y)/M;\n vec2 resultCoords0 = vec2(gl_FragCoord.x, gl_FragCoord.y)/M;\n vec2 st = vec2(gl_FragCoord);\n resultCoords /= 1000.;\n resultCoords0 /= 1000.;\n\n float tp;\n float dur = 2000.;\n\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n\n if (tchPrg > 0.) {\n vec2 toCenter = st - tch[0];\n\n float angle = PI / 2. - atan(toCenter.y, toCenter.x);\n if (angle < 0.0) {\n angle += 2. * PI;\n }\n if (angle < 0.0) {\n angle += 2.0 * PI;\n }\n float currentAngle = 2.0 * PI * tchPrg;\n float dist = distance(tch[0], st);\n float innerRadius = DIM * .04;\n float outerRadius = DIM * .06;\n float edgeSoftness = 0.001 * DIM;\n float alpha = 0.0;\n if (angle < currentAngle) {\n float innerSoft = smoothstep(innerRadius - edgeSoftness, innerRadius + edgeSoftness, dist);\n float outerSoft = smoothstep(outerRadius + edgeSoftness, outerRadius - edgeSoftness, dist);\n alpha = innerSoft * outerSoft;\n }\n if (alpha > 0.0) {\n vec3 colorBoost = texture2D(u_texture, vTextureCoord).rgb * 5.;\n gl_FragColor.rgb = mix(gl_FragColor.rgb, colorBoost, alpha);\n gl_FragColor.a = 1.0;\n gl_FragColor.rgb = max(gl_FragColor.rgb, .1) * .9;\n } else {\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n }\n\n\n }\n}\n`,circleFragmentShader=compileShader(cFS,gl.FRAGMENT_SHADER),artFragmentString=`\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform float tick;\nuniform vec2 tch[1]; \nuniform float frame;\nuniform float tchPrg;\nuniform float viewState;\n\nfloat PI = 3.14159;\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1, 2. / 3., 1. / 3., 3.);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6. - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0., 1.), c.y);\n}\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0., -1. / 3., 2. / 3., -1.);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6. * d + e)), d / (q.x + e), q.x);\n}\n\nvoid main()\n{\n ${c}\n float fTick = tick;\n if (viewState == 0.) {\n fTick = frame;\n }\n\n\n\n\n float w = float(${DIM});\n float M = float(${M});\n vec2 st0 = gl_FragCoord.xy / M;\n vec2 st = gl_FragCoord.xy / M;\n vec2 resultCoords = vec2(vTextureCoord.x, vTextureCoord.y);\n if (distance(tch[0]/M,st0) < (tchPrg * 1000.)) {\n fTick = tick;\n }\n\n\n vec2 cn = vec2(float(${x0}),float(${y0}));\n vec2 cn2 = vec2(float(${x1}),float(${y1}));\n vec2 cn3 = vec2(float(${x2}),float(${y2}));\n vec2 cn4 = vec2(float(${x3}),float(${y3}));\n\n \n vec2 cnC;\n vec2 cnD;\n float p;\n float rng;\n float cM;\n float cnP;\n \n float d = (distance(cn,st));\n float d2 = (distance(cn2,st));\n float d3 = (distance(cn3,st));\n float d4 = (distance(cn4,st));\n float d0 = (distance(cn,st0));\n \n float tp;\n float dur = 2000.;\n float phase = mod((fTick),dur);\n if (phase < (dur/2.)) {\n tp = phase / (dur/2.);\n }\n else {\n tp = (dur - phase) / (dur/2.);\n }\n\n tp = tp < 0.5 ? 2. * tp * tp : 1. - pow(-2. * tp + 2., 2.) / 2.;\n\n float a = ((st.x - st.y) - d) * 200.;\n float b = (abs(st.y - st.x) + d);\n a = (st.x + st.y) * 20.;\n b = (1000. - st.x) * 20.;\n bool evenYRange;\n bool evenXRange;\n float lC = 0.;\n float lCA = 50.;\n if (${dT1} == 0) {\n float sI = floor(((${sCH1}./2.) + st0.y)/${sCH1}.);\n evenYRange = mod(sI, 2.) == 0.;\n lC += lCA * sI;\n }\n else if (${dT1} == 1) {\n float sI = floor(((${sCV}./2.) + st0.x)/${sCV}.);\n evenXRange = mod(sI, 2.) == 0.;\n lC += lCA * sI;\n }\n else if (${dT1} == 2) {\n float sI = floor(((${sCH}./2.) + st0.y)/${sCH}.);\n evenYRange = mod(sI, 2.) == 0.;\n lC += lCA * sI;\n if (${dT} == 2) {\n sI = floor(((${sCV}./2.) + st0.x)/${sCV}.);\n evenXRange = mod(sI, 2.) == 0.;\n lC += lCA * sI;\n }\n }\n\n if (!evenXRange && !evenYRange && ${dT} < 2) {\n float xOffset = float(${rC0}) / 2.;\n float sI = floor((resultCoords.x + xOffset - resultCoords.y) / float(${rC0}));\n evenXRange = mod(sI, 2.) == 0.;\n evenYRange = mod(sI, 2.) == 0.;\n lC += lCA * sI;\n }\n if (${dT} == 2 && ${dT1} < 2) {\n if (${dT1} == 0) {\n float cd = distance(resultCoords,vec2(.5,.5));\n if (cd >= float(${sCH1})/1000.) {\n float ringWidth = float(${sCH1}) / 1500.;\n float ringIndex = floor(cd / ringWidth);\n evenXRange = mod(ringIndex, 2.) == 0.;\n evenYRange = evenXRange;\n lC += lCA * ringIndex;\n \n\n }\n }\n }\n float idx = d * 10.;\n if (evenXRange) {\n st.y += 100.;\n st.x -= 100.;\n idx = (st.x-(st.y * d)) * .05;\n } \n if (evenYRange) {\n st.x += 100.;\n st.y -= 100.;\n idx = (st.x+(st.y * d)) * .05;\n }\n float phase_a = mod(fTick, 2000.);\n float transitionDuration_b = 1000.;\n float transitionStart_c = floor(phase_a / 2000.) * 2000.;\n float factor_d = clamp((phase_a - transitionStart_c) / transitionDuration_b, 0., 1.);\n float idx1_e = fTick + (st.x + st.y) * 20.;\n float idx2_f = fTick + (st.x - st.y) * 20.;\n if (mod(floor(fTick / 2000.), 2.) == 0.) {\n idx *= mix(idx1_e, idx2_f, factor_d);\n } else {\n idx *= mix(idx2_f, idx1_e, factor_d);\n }\n\n idx /= 6000.;\n idx += (fTick * 100.);\n idx = floor(idx);\n\n vec3 c;\n float cIn;\n float idxO = 200.;\n\n float loopCap = 100. + ${clrsC}.;\n float loopPoint = loopCap * 5000.;\n idx = mod(abs(idx),loopPoint);\n\n float gloss = 0.;\n ${cOs}\n\n if (evenYRange || evenXRange) {\n cIn += lC * 10. + 10.;\n cIn = mod(cIn,${clrsC}.);\n }\n\n ${cOsI}\n gl_FragColor = vec4(hsv2rgb(vec3(c.x + (mod(d - (st.x/10.),100.)/2000.),c.y,c.z)),1.);\n gl_FragColor = vec4(hsv2rgb(vec3(c.x,c.y,c.z)),1.);\n gl_FragColor *= .8;\n\n}\n`;var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);function cpr(t){let e=gl.createProgram();return gl.attachShader(e,baseVertShader),gl.attachShader(e,t),gl.linkProgram(e),e}function gPP(t,e){if(!gl.getProgramParameter(t,gl.LINK_STATUS))throw new Error("Failed to link "+e+" program")}const aPg=cpr(artFragmentShader),blPg=cpr(blurFragmentShader),bldPg=cpr(blendFragmentShader),cPg=cpr(circleFragmentShader),compositeProgram=cpr(coFS),fPg=cpr(fFS);gPP(aPg,"art"),gPP(blPg,"blur"),gPP(bldPg,"blend"),gPP(compositeProgram,"composite"),gPP(fPg,"final");const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();function draw(){cft=Date.now(),cD&&(hl?(drawArt(),blendArt(targetTexture,bT),compositeArt(bT),renderFinal(cT),renderCircle(targetTexture),tick++):cft-lft<100&&(cD&&(gpC(),tCa=(cft-lft)/16,!m0&&winding?(tchPrg=easing(wTick/prgDur),tchPrg>=.999?(frame=tick,wTick=0,tchPrg=0,viewState=1-viewState,winding=!1):wTick+=tCa):!m0&&unwinding&&(tchPrg=easing(wTick/prgDur),tchPrg<=.001?(tchPrg=0,unwinding=!1):wTick-=tCa),drawArt(),blendArt(targetTexture,bT),compositeArt(bT),renderFinal(cT),renderCircle(targetTexture)),tick+=tCa)),lft=cft,requestAnimationFrame(draw)}function clamp(t,e,r){return t>r?r:t<e?e:t}function shuffle(t){let e,r=t.length;for(;0!=r;)e=flr(R()*r),r--,[t[r],t[e]]=[t[e],t[r]];return t}function average(t,e,r){if(r<=e)return 0;let n=0;for(let o=e;o<r;o++)n+=t[o];return n/(r-e)}function cae(t,e){canvas.addEventListener(t,e)}function d(t){t.preventDefault(),tch[0]=(t.touches?t.touches[0].clientX:t.clientX)+xCul,tch[1]=Math.abs((t.touches?t.touches[0].clientY:t.clientY)+yCul-DIM),winding=!0}function u(t){t.preventDefault(),winding&&(unwinding=!0,winding=!1)}function easing(t){return-(Math.cos(Math.PI*t)-1)/2}function gpC(){if(!m0&&gp)for(let t=0;t<gp.buttons.length;t++)gp.buttons[t].pressed&&!gp.buttonStates[t]?(gp.buttonStates[t]=!0,winding=!0):!gp.buttons[t].pressed&&gp.buttonStates[t]&&(unwinding=!0,winding=!1,gp.buttonStates[t]=!1)}gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW),aDt.pAt=gl.getAttribLocation(aPg,"position"),aDt.tickSet=gl.getUniformLocation(aPg,"tick"),aDt.frame=gl.getUniformLocation(aPg,"frame"),aDt.tchPrg=gl.getUniformLocation(aPg,"tchPrg"),aDt.tch=gl.getUniformLocation(aPg,"tch"),aDt.viewState=gl.getUniformLocation(aPg,"viewState"),bDt.pAt=gl.getAttribLocation(blPg,"position"),bDt.tAt=gl.getAttribLocation(blPg,"texcoord"),bDt.d=gl.getUniformLocation(blPg,"d"),bDta.pAt=gl.getAttribLocation(bldPg,"position"),bDta.tAt=gl.getAttribLocation(bldPg,"texcoord"),bDta.cT=gl.getUniformLocation(bldPg,"compTexture"),bDta.freshTexture=gl.getUniformLocation(bldPg,"freshTexture"),cData.pAt=gl.getAttribLocation(cPg,"position"),cData.tAt=gl.getAttribLocation(cPg,"texcoord"),cData.finalTexture=gl.getUniformLocation(cPg,"finalTexture"),cData.tickSet=gl.getUniformLocation(cPg,"tick"),cData.tch=gl.getUniformLocation(cPg,"tch"),cData.tchPrg=gl.getUniformLocation(cPg,"tchPrg"),fDt.pAt=gl.getAttribLocation(fPg,"position"),fDt.tAt=gl.getAttribLocation(fPg,"texcoord"),fDt.pAt=gl.getAttribLocation(fPg,"position"),fDt.tickSet=gl.getUniformLocation(fPg,"tick"),fDt.tch=gl.getUniformLocation(fPg,"tch"),fDt.tchPrg=gl.getUniformLocation(fPg,"tchPrg"),cae("touchstart",d),cae("mousedown",d),cae("touchend",u),cae("mouseup",u),document.addEventListener("keyup",(t=>{k[keys[t.code]]=!1,unwinding=!0,winding=!1})),document.addEventListener("keydown",(t=>{"Space"!==t.code||k.sp||(k.sp=!0,winding=!0);let e=!1;t.code in keys&&!k[keys[t.code]]&&(e=!0,k[keys[t.code]]=!0)})),window.addEventListener("gamepadconnected",(t=>{gp=t.gamepad,gp.buttonStates=[],gp.an=!1;for(let t=0;t<gp.buttons.length;t++)gp.buttonStates.push(!1)})),window.addEventListener("gamepaddisconnected",(t=>{gp==t.gamepad&&(gp=null)})),requestAnimationFrame(draw);
Pressed Pause is an expression of presence. It is a hybrid motion work which gives the viewer the opportunity to choose how they would like to view the composition; live-running animation or still. The paused state is the pre-selected beginning. Behind the still image, each piece continues to advance in constant motion. The viewer can decide whether to reveal the already-running motion or keep it still, unaware of the changes taking place in the background. Through a simple interaction, the viewer can resume or pause the piece.
class e{constructor(){this.useA=!1;let e=function(e){let t=parseInt(e.substr(0,8),16),n=parseInt(e.substr(8,8),16),r=parseInt(e.substr(16,8),16),o=parseInt(e.substr(24,8),16);return function(){t|=0,n|=0,r|=0,o|=0;let e=(t+n|0)+o|0;return o=o+1|0,t=n^n>>>9,n=r+(r<<3)|0,r=r<<21|r>>>11,r=r+e|0,(e>>>0)/4294967296}};this.prngA=new e(tokenData.hash.substr(2,32)),this.prngB=new e(tokenData.hash.substr(34,32));for(let e=0;e<1e6;e+=2)this.prngA(),this.prngB()}random_dec(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}}function t(e){return l(i()*e)}function n(e,t){return l(i()*(t-e))+e}function r(e,t){return i()*(t-e)+e}function o(e){return e[t(e.length)]}function a(e){return Math.abs(e)}function l(e){return Math.floor(e)}let c=new e,i=function(){return c.random_dec()};var f=1e3;let u=document.createElement("div");u.style.width=window.innerWidth+"px",u.style.height=window.innerHeight+"px";var s=window.devicePixelRatio||1,g=Math.max(window.innerWidth,window.innerHeight);document.body.style.backgroundColor="#000000";var d=g/f;const v=document.createElement("canvas");document.body.appendChild(v),v.width=g,v.height=g,u.style.position="absolute",u.style.overflow="hidden",v.parentElement.appendChild(u),v.style.left="50%",v.style.top="50%",v.style.position="relative",v.style.transform="translate(-50%,-50%)",u.appendChild(v);const x=v.getContext("webgl");x.viewport(0,0,x.drawingBufferWidth,x.drawingBufferHeight);let m,h,b,_,p=!0,E=/\bHeadlessChrome/.test(navigator.userAgent),T=0;var C=0;function R(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return[parseInt(t[1],16)/255,parseInt(t[2],16)/255,parseInt(t[3],16)/255]}function y(e){return e.map(R)}let A=[];function F(e,t){e.includes(t)||e.push(t)}function D(e,n){for(;e.length>n;){let n=t(e.length);e.splice(n,1)}return e}function M(e){return A.length<100&&F(A,e),e}function U(e){let t=Array.from({length:e-1},(()=>i())),n=t.reduce(((e,t)=>e+t),0),r=t.map((e=>e/n*.99));r.push(1-r.reduce(((e,t)=>e+t),0));let o=0,a=[];for(let t=0;t<e;t++)o+=r[t],o=Number(o.toFixed(3)),a.push(o);return a}const I=["#ffadad","#ffd6a5","#fdffb6","#caffbf","#9bf6ff","#a0c4ff","#bdb2ff","#ffc6ff"],P=["#ade8f4","#90e0ef","#caf0f8","#d8f3dc","#d9ed92","#e9c46a","#f5cb5c","#ffcb91"],B=["#f08080","#cd5c5c","#dc143c","#b22222","#ff1493","#ff4500","#ff7f50","#ff8c00"],w=["#191970","#000080","#00008b","#483d8b","#4b0082","#6a0dad","#7b68ee","#8b008b"];let L=[[["#bf4040","#d55757","#e67272","#f39292","#fbb6b6"],["#260d0d","#471212","#6c1313","#951111","#c20a0a"]],[["#e052a5","#ec6cb7","#f589c8","#fca9d9","#ffccea"],["#570f39","#710e48","#8e0b57","#ac0767","#cc0077"]],[["#bf8a40","#d5a057","#e6b672","#f3cb92","#fbdeb6"],["#261c0d","#473112","#6c4713","#955e11","#c2750a"]],[["#f7b36e","#fac28a","#fdd2a8","#fee2c6","#fff2e6"],["#c2660a","#d77008","#ec7906","#fc8309","#ff8c1a"]],[["#8040bf","#9657d5","#ac72e6","#c292f3","#d9b6fb"],["#1a0d26","#2d1247","#40136c","#531195","#660ac2"]],[["#e0d452","#eae06e","#f2ea8c","#f8f2ac","#fcf9cf"],["#6c6513","#8b8114","#ac9f13","#cebf11","#f2df0d"]],[["#40bf40","#57d557","#72e672","#92f392","#b6fbb6"],["#0d260d","#124712","#136c13","#119511","#0ac20a"]],[["#4095bf","#57abd5","#72bfe6","#92d3f3","#b6e4fb"],["#0d1e26","#123647","#134f6c","#116995","#0a85c2"]],[["#4040bf","#5757d5","#7272e6","#9292f3","#b6b6fb"],["#0d0d26","#121247","#13136c","#111195","#0a0ac2"]]],S=[],V=[],X=6,q=$e(X),N=0;const G=6,O=10,W=2,H=4,Y=-10,$=10;Ye(),A=y(A);let z=i()>.5,k=i()>.5,K=i()>.5,j=i()>.5,J=100,Q=i()*J+J,Z=["c0","c1","c2","c3","c4"],ee=["c0","c1","c2","c3","c4"],te=[],ne=["2","4","6","8","10","12","16"],re="",oe=[];for(let e=0;e<10;e++)oe.push(o(A));A=dt(A);var ae=.01;te=U(A.length);let le,ce=ee.length;for(let e=0;e<A.length;e++)le=te[e],re+=(e>0?"else if ":"if ")+"(idx < loopPoint * float("+le+")) {\n",re+=" gloss = "+o(ne)+".;\n",re+=" cIn = "+e+".;\n",re+=" c = c"+e+";\n",re+="}\n";let ie="";for(let e=0;e<A.length;e++)ie+="vec3 c"+e+" = vec3("+A[e][0]+","+A[e][1]+","+A[e][2]+");\n";var fe=x.createFramebuffer();x.bindFramebuffer(x.FRAMEBUFFER,fe);var ue=x.createBuffer();x.bindBuffer(x.ARRAY_BUFFER,ue);var se=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1];x.bufferData(x.ARRAY_BUFFER,new Float32Array(se),x.STATIC_DRAW);var ge=x.createBuffer();x.bindBuffer(x.ARRAY_BUFFER,ge);var de=[0,0,1,0,0,1,0,1,1,0,1,1];function ve(e,t,n,r,o){var a=e.createTexture();return e.bindTexture(e.TEXTURE_2D,a),n?e.texImage2D(e.TEXTURE_2D,0,e.RGBA,r,o,0,e.RGBA,e.UNSIGNED_BYTE,null):e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),a}function xe(e,t,n,r,o){e.useProgram(t);var a=e.getAttribLocation(t,"a_position");e.enableVertexAttribArray(a),e.bindBuffer(e.ARRAY_BUFFER,ue),e.vertexAttribPointer(a,2,e.FLOAT,!1,0,0);var l=e.getAttribLocation(t,"a_texCoord");e.enableVertexAttribArray(l),e.bindBuffer(e.ARRAY_BUFFER,ge),e.vertexAttribPointer(l,2,e.FLOAT,!1,0,0);for(let r=0;r<n.length;++r){e.activeTexture(e.TEXTURE0+r),e.bindTexture(e.TEXTURE_2D,n[r]);var c=e.getUniformLocation(t,"u_image"+(r+1));e.uniform1i(c,r)}for(let t=0;t<r.length;++t){let n=r[t],a=o[t];Array.isArray(a)?1===a.length?e.uniform1fv(n,a):2===a.length?e.uniform2fv(n,a):3===a.length?e.uniform3fv(n,a):4===a.length&&e.uniform4fv(n,a):e.uniform1f(n,a)}e.drawArrays(e.TRIANGLES,0,6)}function me(e,t,n){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;e.deleteShader(r)}function he(e,t,n){var r=me(e,e.VERTEX_SHADER,t),o=me(e,e.FRAGMENT_SHADER,n),a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,o),e.linkProgram(a),e.getProgramParameter(a,e.LINK_STATUS))return a;e.deleteProgram(a)}x.bufferData(x.ARRAY_BUFFER,new Float32Array(de),x.STATIC_DRAW);var be="\n attribute vec2 a_position;\n attribute vec2 a_texCoord;\n varying vec2 v_texCoord;\n\n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_texCoord = a_texCoord;\n }\n ",_e=ve(x,S[0].canvas,!1),pe=ve(x,S[1].canvas,!1),Ee=ve(x,S[2].canvas,!1),Te=ve(x,S[3].canvas,!1),Ce=ve(x,S[4].canvas,!1),Re=ve(x,S[5].canvas,!1),ye=ve(x,null,!0,g,g),Ae=ve(x,null,!0,g,g),Fe=ve(x,null,!0,g,g),De=ve(x,null,!0,g,g),Me=`\nprecision highp float;\nuniform float tick;\n\nvoid main()\n{\n ${ie}\n\n float w = float(${g});\n float M = float(${d});\n vec2 st = floor(gl_FragCoord.xy / M);\n st.x += 1000.;\n st.y += 1000.;\n \n float idx = sqrt(st.y * st.x)/(250. * mod(st.x,6. + float(${s}))) + 1.;\n idx += abs(st.y - 500.)/1000.;\n idx *= st.y/10.;\n idx *= mod(st.y,.1) + .1;\n idx /= mod((mod(st.x,1200.) + 1.) * 10000.,10.1) * st.x/100. + 0.0001;\n idx *= (mod(st.x,.1) + .1) * 500.;\n //idx /= 10.5;\n idx += (tick * .04);\n //idx /= .5;\n\n vec3 c;\n float cIn;\n float idxO = 200.;\n\n float loopCap = float(${ce}); // max value before color values cycle back\n float loopPoint = loopCap * 100.;\n idx = mod(abs(idx),loopPoint);\n\n float gloss = 0.;\n ${re}\n gl_FragColor = vec4(c,1.);\n}\n`,Ue=he(x,be,Me);let Ie=x.createTexture();x.bindTexture(x.TEXTURE_2D,Ie),x.texParameteri(x.TEXTURE_2D,x.TEXTURE_MIN_FILTER,x.LINEAR),x.texParameteri(x.TEXTURE_2D,x.TEXTURE_WRAP_S,x.CLAMP_TO_EDGE),x.texParameteri(x.TEXTURE_2D,x.TEXTURE_WRAP_T,x.CLAMP_TO_EDGE);let Pe=new Uint8Array(3*A.length);for(let e=0;e<A.length;e++)Pe[3*e]=255*A[e][0],Pe[3*e+1]=255*A[e][1],Pe[3*e+2]=255*A[e][2];x.texImage2D(x.TEXTURE_2D,0,x.RGB,A.length,1,0,x.RGB,x.UNSIGNED_BYTE,Pe),x.activeTexture(x.TEXTURE0),x.bindTexture(x.TEXTURE_2D,Ie);var Be=x.createFramebuffer();x.bindFramebuffer(x.FRAMEBUFFER,Be),x.framebufferTexture2D(x.FRAMEBUFFER,x.COLOR_ATTACHMENT0,x.TEXTURE_2D,ye,0);var we="\nprecision highp float;\nuniform sampler2D u_image1;\nuniform sampler2D u_image2;\nuniform sampler2D u_image3;\nuniform sampler2D u_image4;\nuniform sampler2D u_image5;\nuniform sampler2D u_image6;\nuniform sampler2D u_image7;\nuniform vec3 t0;\nuniform vec3 t1;\nuniform vec3 t2;\nuniform vec3 t3;\nuniform vec3 t4;\nuniform vec3 t5;\nvarying highp vec2 v_texCoord;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nfloat comp(vec3 c0, vec3 c1) {\n float tr = .075;\n //return all(lessThan(abs(rgb2hsv(c0.rgb) - rgb2hsv(c1)), vec3(tr)));\n float v = abs(rgb2hsv(c0.rgb).x - rgb2hsv(c1.rgb).x);\n if (v < tr) {\n return v;\n }\n return 1000.;\n}\n\nvoid main() {\n \n\n vec3 l0 = texture2D(u_image1, v_texCoord).rgb;\n vec3 l1 = texture2D(u_image2, vec2(v_texCoord.x,1. - v_texCoord.y)).rgb;\n vec3 l2 = texture2D(u_image3, vec2(v_texCoord.x,1. - v_texCoord.y)).rgb;\n vec3 l3 = texture2D(u_image4, vec2(v_texCoord.x,1. - v_texCoord.y)).rgb;\n vec3 l4 = texture2D(u_image5, vec2(v_texCoord.x,1. - v_texCoord.y)).rgb;\n vec3 l5 = texture2D(u_image6, vec2(v_texCoord.x,1. - v_texCoord.y)).rgb;\n\n vec3 art = texture2D(u_image7, vec2(abs(v_texCoord.x),v_texCoord.y)).rgb;\n float cV1 = comp(art,l1);\n float cV2 = comp(art,l2);\n float cV3 = comp(art,l3);\n float cV4 = comp(art,l4);\n float cV5 = comp(art,l5);\n\n float minVal = 1000.;\n vec3 minLn = art;\n float t = .25;\n l0 = mix(l0,t0,t);\n l1 = mix(l1,t1,t);\n l2 = mix(l2,t2,t);\n l3 = mix(l3,t3,t);\n l4 = mix(l4,t4,t);\n l5 = mix(l5,t5,t);\n\n if (cV1 < minVal) { minVal = cV1; minLn = l1; }\n if (cV2 < minVal) { minVal = cV2; minLn = l2; }\n if (cV3 < minVal) { minVal = cV3; minLn = l3; }\n if (cV4 < minVal) { minVal = cV4; minLn = l4; }\n if (cV5 < minVal) { minVal = cV5; minLn = l5; }\n\n gl_FragColor = vec4(minLn,1.);\n //gl_FragColor = vec4(art,1.);\n\n\n}\n",Le=he(x,be,we),Se=x.createFramebuffer();x.bindFramebuffer(x.FRAMEBUFFER,Se),x.framebufferTexture2D(x.FRAMEBUFFER,x.COLOR_ATTACHMENT0,x.TEXTURE_2D,De,0);var Ve=`\nprecision highp float;\nvarying highp vec2 v_texCoord;\nuniform sampler2D u_image1;\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nbool comp(vec3 c0, vec3 c1) {\n float tr = .05;\n return abs(rgb2hsv(c0.rgb).x - rgb2hsv(c1).x) < tr;\n}\n\nvec4 getAverageSurrounding(sampler2D u_sampler, vec2 texCoord) {\n // Calculate the size of a single texel\n vec2 oneTexel = vec2(1.0) / vec2(float(${g}),float(${g}));\n vec4 averageColor = vec4(0.0);\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(-1, 1)); // NW\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(0, 1)); // N\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(1, 1)); // NE\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(1, 0)); // E\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(1, -1)); // SE\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(0, -1)); // S\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(-1, -1)); // SW\n averageColor += texture2D(u_sampler, texCoord + oneTexel * vec2(-1, 0)); // W\n\n\n // Divide by the total number of texels to get the average\n averageColor /= 8.0;\n return averageColor;\n}\n\nvoid main() {\n${ie} \n vec2 resultCoords = vec2(v_texCoord.x, v_texCoord.y);\n vec2 resultCoords0 = vec2(v_texCoord.x, v_texCoord.y);\n\n float tp;\n\n float rsx = resultCoords.x;\n\n gl_FragColor = texture2D(u_image1, resultCoords);\n \n float a = abs(.5 - resultCoords.y);\n float b = abs(.5 - resultCoords.x);\n \n vec4 color2 = texture2D(u_image1, vec2(resultCoords.x,resultCoords.y));\n color2 += texture2D(u_image1, vec2(abs(gl_FragColor.r - resultCoords0.x),abs(gl_FragColor.g - resultCoords0.y)));\n gl_FragColor = mix(gl_FragColor,color2,abs(gl_FragColor.r - color2.b));\n gl_FragColor = texture2D(u_image1, resultCoords);\n //gl_FragColor.xyz *= 6.2;\n //gl_FragColor.xyz *= .1;\n if (comp(gl_FragColor.rgb,c3)) {\n vec4 avg = getAverageSurrounding(u_image1, v_texCoord);\n //gl_FragColor += avg/2.;\n}\n gl_FragColor.w = 1.;\n}`,Xe=he(x,be,Ve);let qe="precision highp float;\nvarying highp vec2 v_texCoord;\n\nuniform sampler2D u_image1;\n\n\nvoid main() {\n gl_FragColor = texture2D(u_image1, v_texCoord);\n}";var Ne=he(x,be,qe),Ge=x.createFramebuffer();x.bindFramebuffer(x.FRAMEBUFFER,Ge),x.framebufferTexture2D(x.FRAMEBUFFER,x.COLOR_ATTACHMENT0,x.TEXTURE_2D,Fe,0);let Oe=[x.getUniformLocation(Le,"t0"),x.getUniformLocation(Le,"t1"),x.getUniformLocation(Le,"t2"),x.getUniformLocation(Le,"t3"),x.getUniformLocation(Le,"t4"),x.getUniformLocation(Le,"t5")],We=Array(6).fill([]);function He(){x.clear(x.COLOR_BUFFER_BIT|x.DEPTH_BUFFER_BIT),x.bindFramebuffer(x.FRAMEBUFFER,Be),xe(x,Ue,[Ie],[x.getUniformLocation(Ue,"tick")],[C]);for(let e=0;e<V.length;e++)We[e]=xt(V[e]);x.bindFramebuffer(x.FRAMEBUFFER,Se),xe(x,Le,[_e,pe,Ee,Te,Ce,Re,ye],Oe,We),x.bindFramebuffer(x.FRAMEBUFFER,null),xe(x,Xe,[De],[],[])}function Ye(){for(N=0;N<X;N++){if(_=S[N],0==N){_.fillStyle=L[nt()][tt()][t(5)],_.fillRect(0,0,v.width,v.height);continue}let e=Math.floor(r(4,10));e=Math.floor(r(4,10));for(let t=0;t<e;t++){h=ft(r(100,400),r(100,400),r(100,900),r(100,900),0,r(60,120));let e=st(h,.6,[20,60],[0,359],[60,100]);h=ut(h,e),b=[h],rt(b)}let n=Math.floor(r(8,30));for(let e=0;e<n;e++){let e=ct({x:r(50,950),y:r(1100,1300)},r(-105,-75),r(1,3),20);je(M(L[nt()][tt()][t(5)]),e)}e=Math.floor(r(4,10));for(let t=0;t<e;t++)h=it(r(8,60),r(-4,-2)-5),b=[h],rt(b);if(i()>.8){e=Math.floor(r(8,30));let n=M(L[nt()][0][t(5)]),o={x:r(300,700),y:r(300,700)},a=r(0,359);for(let t=0;t<e;t++){h=it(Math.floor(r(4,9)),r(.1,.7),[10,30],o.x,o.y);let e=st(h,.8,[8,20],[0,359],[5,20]);h=ut(h,e),b=[h],rt(b,n,0),o=lt(o,a,50),a+=r(-45,45)}}}}function $e(e){const n=Array.from({length:9},((e,t)=>t));let r=[];for(let a=0;a<e;a++){let e=[];const l=t(2)+1;if(0!==a&&l>1){const t=r[a-1];e.push(t[t.length-1])}for(;e.length<l;){const t=o(n);e.includes(t)||e.push(t)}r.push(e);let c=document.createElement("canvas");c.style.display="none",document.body.appendChild(c);let i=c.getContext("2d");if(c.width=g,c.height=g,V.push([o(w),o(I),o(P),o(B)]),a>0){let e=Math.pow(2,a-1),t=(g-g*e)/4;i.translate(t,g*(1-e)),i.scale(e,e)}S.push(i)}return r}const ze=(e,t)=>({x:e.x+t.x,y:e.y+t.y}),ke=(e,t)=>({x:e.x*t,y:e.y*t});function Ke(e){return e.right.reverse(),[...e.left,...e.right]}function je(e,t){et(Ke(t))}function Je(e,t,n,r,o,a){_.save(),_.translate(e*d,t*d),_.rotate(o),_.fillStyle=a,Qe(_,-n/2,-r/2,n,r,r/2),_.restore()}function Qe(e,t,n,r,o,a){e.beginPath(),e.moveTo((t+a)*d,n*d),e.arcTo((t+r)*d,n*d,(t+r)*d,(n+o)*d,a*d),e.arcTo((t+r)*d,(n+o)*d,t*d,(n+o)*d,a*d),e.arcTo(t*d,(n+o)*d,t*d,n*d,a*d),e.arcTo(t*d,n*d,(t+r)*d,n*d,a*d),e.closePath(),e.fill()}function Ze(e,t,n,o,a){const l=n-e,c=o-t,f=Math.atan2(c,l)*(180/Math.PI);for(let n=0;n<=1;n+=.05*i())if(i()<.6){const o=e+l*n,i=t+c*n;let u=f+r(Y,$);u*=Math.PI/180,Je(o,i,r(G,O),r(W,H),u,a)}}function et(e){let n=tt();_.fillStyle=M(L[nt()][n][t(5)]),_.beginPath(),_.moveTo(e[0].x*d,e[0].y*d);for(let t=1;t<e.length;t++)_.lineTo(e[t].x*d,e[t].y*d);_.closePath(),_.fill();for(let r=0;r<e.length;r++)if(r+1!=e.length/2&&r+1!=e.length){const o=e[r],a=e[(r+1)%e.length];Ze(o.x,o.y,a.x,a.y,M(L[nt()][1-n][t(5)]))}}function tt(){return i()>.5?0:1}function nt(){if(N<0||N>=q.length)return null;const e=q[N];return e[t(e.length)]}function rt(e,n=null,r=null){e.forEach((e=>{let o=null==r?tt():r,a=null==n?M(L[nt()][o][t(5)]):n;_.fillStyle=a,_.beginPath(),_.moveTo(e[0].x*d,e[0].y*d);for(let t=1;t<e.length;t++)_.lineTo(e[t].x*d,e[t].y*d);_.closePath(),_.fill();for(let t=0;t<e.length;t++){const n=e[t],r=e[(t+1)%e.length];a=M(L[nt()][1-o][Math.floor(2*i())]),Ze(n.x,n.y,r.x,r.y,a)}}))}function ot(e,t,n,r){let o=n*Math.PI/180;return{x:e+r*Math.cos(o),y:t+r*Math.sin(o)}}function at(e,t,n,r){return{left:ot(e,t,n-90,r),right:ot(e,t,n+90,r)}}function lt(e,t,n){let r=ot(0,0,t,n);return{x:e.x+r.x,y:e.y+r.y}}function ct(e,t,n,o){let a,l=e,c=[],f=[],u=t,s=n;for(let e=0;e<o;e++){let e=at(l.x,l.y,u,s);c.push(e.left),f.push(e.right),u+=30*i()-15,s+=r(-1,1),s<2&&(s=2),a=lt(l,u,50*i()+50),l.x=a.x,l.y=a.y}return{left:c,right:f}}function it(e,t=.2,n=[10,30],o=null,a=null){const l=[],c=r(n[0],n[1]),f=null==o?r(100,900):o,u=null==a?r(100,900):a;for(let n=0;n<e;n++){const r=2*Math.PI*n/e;let o=c*(1+i()*t);const a={x:f+Math.cos(r)*o,y:u+Math.sin(r)*o};l.push(a)}return l.sort(((e,t)=>Math.atan2(e.y-u,e.x-f)-Math.atan2(t.y-u,t.x-f))),l}function ft(e,t,n,r,o,a){let l=[],c=0,i=2*Math.PI/a;for(let f=0;f<a;f++){let a=n+e*Math.cos(c)*Math.cos(o)-t*Math.sin(c)*Math.sin(o),f=r+e*Math.cos(c)*Math.sin(o)+t*Math.sin(c)*Math.cos(o);l.push({x:a,y:f}),c+=i}return l}function ut(e,t){return e.map((e=>{let{x:n,y:r}=e;return t.forEach((e=>{let{posX:t,posY:o,direction:a,length:l,radius:c}=e,i=n-t,f=r-o;if(Math.sqrt(i*i+f*f)<=c){let e=a*Math.PI/180,t=l*Math.cos(e),o=l*Math.sin(e);n+=t,r+=o}})),{x:n,y:r}}))}function st(e,n,o,a,l){let c=Math.floor(e.length*n),i=[];for(let n=0;n<c;n++){let n=t(e.length),{x:c,y:f}=e[n],u=r(o[0],o[1]),s=r(a[0],a[1]),g=r(l[0],l[1]);i.push({posX:c,posY:f,direction:s,length:u,radius:g})}return i}function gt(){m=Date.now(),p&&(E?(He(),C++):m-T<100&&(p&&(tCa=(m-T)/16,He()),C+=tCa)),T=m,requestAnimationFrame(gt)}function dt(e){let t,n=e.length;for(;0!=n;)t=l(i()*n),n--,[e[n],e[t]]=[e[t],e[n]];return e}function vt(e,t,n){return"#"+((1<<24)+(Math.round((1-n)*parseInt(e.slice(1,3),16)+n*parseInt(t.slice(1,3),16))<<16)+(Math.round((1-n)*parseInt(e.slice(3,5),16)+n*parseInt(t.slice(3,5),16))<<8)+Math.round((1-n)*parseInt(e.slice(5,7),16)+n*parseInt(t.slice(5,7),16))).toString(16).slice(1)}function xt(e){let t,n=new Date,r=n.getHours(),o=n.getMinutes(),[a,l,c,i]=e;return t=r>=6&&r<7?o<30?vt(a,l,o/30):vt(l,c,(o-30)/30):r>=7&&r<19?c:r>=19&&r<20?o<30?vt(c,i,o/30):vt(i,a,(o-30)/30):a,mt(t)}function mt(e){return[parseInt(e.slice(1,3),16)/255,parseInt(e.slice(3,5),16)/255,parseInt(e.slice(5,7),16)/255]}requestAnimationFrame(gt);
"Efflorescence" was made in response to the vibrant colors present in Harold Cohen's "In AARON’s Garden" series. It is my hope that Efflorescence feels like exploring AARON’s Garden from my perspective. I accentuated its multilayered relationships of color and applied motion techniques I've developed over the years to evoke a sense of curiosity. My process to create this kinetic art series started with re-creating the core concepts of "In AARON’s Garden", including a weighted analysis of Cohen’s color palettes. In each piece, five unique scenes are produced and layered together in varied depths; sometimes you’ll notice a detail-view of a branch or flower while other times you’ll see a larger expanse of foliage. A wash of semi-glitch strokes partially reveals each scene based on color relationships. The state of constant motion gives life and mystery to each layer, blending them together and highlighting different aspects as time progresses. The scene also evolves based on the viewer’s time of day. Subtle tints (derived from Cohen’s palettes) emerge to represent sunrise, day, sunset, and night. The title comes from the state of blooming of a flower; "Efflorescence" is an active word and emphasizes the importance of change within nature. When I look at "In AARON’s Garden", I find a wonderful world of color and variety. I wanted to capture this and reinforce the importance of change, growth, and exploration.
DIVERGENCE Divergence, a never-ending abstract motion work, reacts to audio and touch inputs. Dive into stacks of deterministic layers to explore emerging patterns, and fine-tune the audio reactivity to your preferences. You may wish to use the controls to wander within Divergence until the aesthetic feels right to you, or complements your audio input. Navigating the art in this way gives a tangible window into my artistic process. My aesthetic is influenced by the music I listen to as I code. I enjoy experimenting and looking for the art in the algorithm. This can mean playing with overarching ideas, but also making many small changes until I find consistent visual appeal over a range of outputs. Divergence exhibits animations changing over time in expanding, textural layers. It elaborates on concepts I’ve developed in previous works: my approach to color in phase; linear motion in Parade; interlacing lines and expansion/contraction in Kaleidoscope; and the noise textures of Sift. Newly explored is continuous animation with touch and audio inputs, which affect the viewing position in time and space. A common quip in the Art Blocks community is that motion art has a penalty. Many enjoy a final product that is printable to frame at home. As technology advances, I believe it is equally important to create work that can only exist on a screen, and is unique to digital art. Larger displays are catching up to the artistic space and becoming more accessible, but I also want my work to be approachable immediately. Keeping the code lean and performant allows it to run well on a range of screen sizes and processor powers, from mobile devices to multi-story displays. There has been discussion that a body of motion work takes a long time to sift through, as it needs to be viewed live. In consideration of this, I made Divergence immersive, rather than a static experience. I want the extra time spent with it to be fun and entertaining. Usage: Navigate left/right to traverse the timeline; navigate up/down to travel through the layers and expand/contract the patterns. Please see “Display Notes” for further instructions (user input, audio reactivity, url parameters). Accessibility is important to me, so Divergence accepts inputs from touch, keyboard, mouse, and gaming controllers with an analog stick. *Photosensitive seizure warning: These artworks contain flashing colors and moving patterns.
`;var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);function cpr(a){let b=gl.createProgram();return gl.attachShader(b,baseVertShader),gl.attachShader(b,a),gl.linkProgram(b),b}function gPP(a,b){if(!gl.getProgramParameter(a,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(aPg)),new Error("Failed to link "+b+" program")}const aPg=cpr(artFragmentShader),blPg=cpr(blurFragmentShader),bldPg=cpr(blendFragmentShader),compositeProgram=cpr(compFragmentShader),fPg=cpr(finalFragmentShader);gPP(aPg,"art"),gPP(blPg,"blur"),gPP(bldPg,"blend"),gPP(compositeProgram,"composite"),gPP(fPg,"final");const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW),aDt.positionAttribute=gl.getAttribLocation(aPg,"position"),aDt.mxy=gl.getUniformLocation(aPg,"mxy"),aDt.mxy2=gl.getUniformLocation(aPg,"mxy2"),aDt.ad0=gl.getUniformLocation(aPg,"ad0"),aDt.tickSet=gl.getUniformLocation(aPg,"tick"),bDt.positionAttribute=gl.getAttribLocation(blPg,"position"),bDt.textureAttribute=gl.getAttribLocation(blPg,"texcoord"),bDt.d=gl.getUniformLocation(blPg,"d"),bDta.positionAttribute=gl.getAttribLocation(bldPg,"position"),bDta.textureAttribute=gl.getAttribLocation(bldPg,"texcoord"),bDta.cT=gl.getUniformLocation(bldPg,"compTexture"),bDta.freshTexture=gl.getUniformLocation(bldPg,"freshTexture"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position"),fDt.textureAttribute=gl.getAttribLocation(fPg,"texcoord"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position"),fDt.sst=gl.getUniformLocation(fPg,"sst"),fDt.afv=gl.getUniformLocation(fPg,"afv"),fDt.sqfv=gl.getUniformLocation(fPg,"sqfv"),fDt.clkC=gl.getUniformLocation(fPg,"clkC"),fDt.iM=gl.getUniformLocation(fPg,"iM");const keys={KeyM:"m",Space:"sp",ArrowLeft:"l",ArrowRight:"r",ArrowUp:"u",ArrowDown:"d",KeyA:"l",KeyD:"r",KeyW:"u",KeyS:"d"};function tCD(){iM?imclk():(cD?tTick=tick:tick=tTick,cD=!cD,iM=!cD,iM&&(clkC=0,clkCC=audE?3-clkC:clkC,sqfv=1))}function frR(){fR=!1,tS=0,pT=Date.now()}function draw(){if(cft=Date.now(),cD||gp)if(hl)drawArt(),blendArt(targetTexture,bT),compositeArt(bT),renderFinal(cT),tick++;else if(100>cft-lft){if(cD||gpC(),cD){if(tCa=(cft-lft)/16,audE){const c=analyser.getValue(),d=atk;for(let e=0;e<amplitudes.length;e++){const f=amplitudes[e],a=-100,g=-50,h=Math.max(a,Math.min(g,c[e])),i=inverseLerp(a,g,h),b=1e-4+(1.99-1e-4)*(-sstT+1)/2;amplitudes[e]=(amplitudes[e]+spring(f,i,250,d))/2*b}for(let a=0;a<amplitudes.length-1;a++)amplitudes[a]=(amplitudes[a]+amplitudes[a+1])/2,amplitudes[a]=flr(1e3*amplitudes[a])/1e3}audE||fO||fR||!(cft-pT>=fT)||(fR=!0),fR&&(lm.x=2*Math.sin(tS*tra),lm.y=-.25*Math.sin(tS*tra),mxyD.x=lm.x,mxyD.y=lm.y,360<=tS?frR():tS+=tCa/2),cD&&(handleInput(),drawArt(),0!=mxyD.x||0!=mxyD.y?(blurArt(targetTexture,targetTexture2),blendArt(targetTexture2,bT)):blendArt(targetTexture,bT),compositeArt(bT)),renderFinal(cT),aud=0,audE&&(aud=3*(amplitudes[1]+amplitudes[3]+amplitudes[7]+amplitudes[10]),0!=amplitudes[2]&&(mxyD.x=2*(amplitudes[1]+amplitudes[2]+amplitudes[5]+amplitudes[9])),0==audD[0]?audD.fill(0):(audD[audDP]=amplitudes[1],audDP++,audDP%=audD.length),0!=amplitudes[0]&&(mxy2.y=mxy2O-average(audD,0,50))),sq1FT&&(sq1FT=!1)}sdTA&&(2<=tS/60?(sdTA=!1,fd=!0,aFT=Date.now(),tS=0):tS+=tCa),fd&&(0>=afv?(tS=0,fd=!1):(afv=lerp(1,0,tS/60),tS+=tCa)),(!sfo||cD)&&(atk+=tCa,tick+=(0>mxyD.x?-1:1)*abs(mxyD.x)**2+aud+tCa,atk=atk>loopCap?0:atk,tick=tick>loopCap?0:tick)}(iM||3==clkCC)&&(renderFinal(cT),1<=arsdc/60?(sfo=!0,arsdc=0,tS2=0):arsdc+=tCa,sfo&&(0>=sqfv?(sfo=!1,iM=!1,clkC=0,clkCC=clkC):(sqfv=lerp(1,0,tS2/30),tS2+=tCa))),lft=cft,requestAnimationFrame(draw)}function d(a){a.preventDefault(),mdt=Date.now(),mxyD={x:0,y:0},deltaX=0,deltaY=0,sd=!0,dh=!1,fd=!1,null!=a.touches&&(a=a.touches[0]),audE&&(sdTA=!1),msx=a.clientX,msy=a.clientY,msx=(msx-canvas.offsetLeft)/DIM*D_S+500,msy=(msy-canvas.offsetTop)/DIM*D_S+500,pte.x=msx,pte.y=msy,mxyS={x:msx,y:msy,ip:"m"}}function u(a){a.preventDefault(),null==a.touches?(msy=a.clientY,msy=(msy-canvas.offsetTop)/DIM*D_S+500):(msy=te.y,msy=(msy-canvas.offsetTop)/DIM*D_S+500),dv=0,sd=!1,audE&&(sdTA=!0,tS=0,aFT=Date.now()),dh?cD=!0:200>Date.now()-mdt&&tCD()}function m(a){a.preventDefault(),null!=a.touches&&(a=a.touches[0]),msx=a.clientX,msy=a.clientY,msx=(msx-canvas.offsetLeft)/DIM*D_S+500,msy=(msy-canvas.offsetTop)/DIM*D_S+500,te.x=msx,te.y=msy,audE||!sd||cD||(cD=!0),sd&&0!=msx-mxyS.x&&0!=msy-mxyS.Y&&(dh=!0),!audE&&sd?mxyD={x:(msx-mxyS.x)/100,y:(msy-mxyS.y)/100}:audE&&sd&&cD&&(afv=1,clp=(nAmp+te.y-pte.y)/1e3,-1<clp&&1>clp&&(sstD+=te.y-pte.y,aDlt((te.y-pte.y)/1e3),sstT=clamp(sstD/1e3,-1,1))),pte.x=msx,pte.y=msy}cae("touchstart",d),cae("mousedown",d),cae("touchend",u),cae("mouseup",u),cae("touchmove",m),cae("mousemove",m),document.addEventListener("keyup",a=>{k[keys[a.code]]=!1,!audE||k.d&&k.u||(sdTA=!0,sT=0,aFT=Date.now())}),document.addEventListener("keydown",a=>{"Space"!==a.code||k.sp||(tCD(),k.sp=!0);let b=!1;a.code in keys&&!k[keys[a.code]]&&(b=!0,k[keys[a.code]]=!0)}),window.addEventListener("gamepadconnected",a=>{gp=a.gamepad,gp.buttonStates=[],gp.an=!1;for(let b=0;b<gp.buttons.length;b++)gp.buttonStates.push(!1)}),window.addEventListener("gamepaddisconnected",a=>{gp==a.gamepad&&(gp=null)});function clamp(a,b,c){return a>c?c:a<b?b:a}function shuffle(a){for(let b,c=a.length;0!=c;)b=flr(R()*c),c--,[a[c],a[b]]=[a[b],a[c]];return a}function imclk(){reactive||(frR(),clkC++,clkCC=audE?3-clkC:clkC,sfo=!1,arsdc=0,sqfv=1,3==clkC&&(clkC=0,audE=!audE,cD=!0,audE?(Tone.context.resume(),mxy2O=mxy2.y):(afv=0,sdTA=!1,fd=!1,amplitudes.fill(0),pT=Date.now())))}function gpC(){if(gp)for(let a=0;a<gp.buttons.length;a++)gp.buttons[a].pressed&&!gp.buttonStates[a]?(gp.buttonStates[a]=!0,tCD()):gp.buttons[a].pressed||(gp.buttonStates[a]=!1)}let nAmp=0;function aDlt(a){nAmp=Math.min(Math.max(nAmp+a,-1),1)}function handleInput(){gp&&(!audE&&(.1>Math.max(abs(gp.axes[0]),abs(gp.axes[2]))&&.1>Math.max(abs(gp.axes[1]),abs(gp.axes[3]))?(ipt=!1,gp.an=!1):(ipt=!0,gp.an=!0,mxyD.x+=(abs(gp.axes[0])>abs(gp.axes[2])?gp.axes[0]:gp.axes[2])/100,mxyD.y+=(abs(gp.axes[1])>abs(gp.axes[3])?gp.axes[1]:gp.axes[3])/100)),gpC()),audE?(cD&&(k.u||k.d)&&(sdTA=!1,fd=!1,afv=1,clp=(nAmp+(k.u?-2:k.d?2:0))/500,-1<clp&&1>clp&&(aDlt((k.u?-2:k.d?2:0)/500),sstD+=k.u?-2:k.d?2:0,sstT=clamp(sstD/500,-1,1))),gp&&(gpA=flr(100*(abs(gp.axes[1])>abs(gp.axes[3])?gp.axes[1]:gp.axes[3]))/100,.2<abs(gpA)?(sdTA=!1,fd=!1,afv=1,clp=(nAmp+gpA)/250,-1<clp&&1>clp&&(sstD+=gpA,aDlt(gpA/250),sstT=clamp(sstD/250,-1,1))):!(sd||k.l||k.r||k.u||k.d)&&!sdTA&&(sdTA=!0,tS=0,aFT=Date.now()))):(k.l&&(mxyD.x+=-.01),k.r&&(mxyD.x+=.01),k.u&&(mxyD.y+=-.01),k.d&&(mxyD.y+=.01));audE||(ipt=sd||k.l||k.r||k.u||k.d,drgO.x=!k.l&&!k.r,drgO.y=!k.u&&!k.d,(gp&&gp.an||ipt)&&fR&&frR(),(gp&&gp.an||ipt||fR)&&(mxy2.x+=mxyD.x/1e3,mxy2.y+=mxyD.y/1e3),(gp&&!gp.an||!gp)&&!sd&&(drgO.x||drgO.y)&&(mxyD.x*=drgO.x?drg:1,mxyD.y*=drgO.y?drg:1,drgO.x&&.05>abs(mxyD.x)&&(mxyD.x=0),drgO.y&&.05>abs(mxyD.y)&&(mxyD.y=0)),mxyD.x=clamp(mxyD.x,-5,5),mxyD.y=clamp(mxyD.y,-5,5))}let analyser=new Tone.Analyser("fft",16);amplitudes=Array(analyser.size).fill(0);const fft=new Tone.FFT,mic=new Tone.UserMedia().connect(fft);mic.open().then(()=>{fft.connect(analyser)}).catch(()=>{});function lerp(a,b,c){return a*(1-c)+b*c}function inverseLerp(a,b,c){return 1e-10>abs(a-b)?0:(c-a)/(b-a)}function spring(c,a,b,d){return lerp(c,a,1-Math.exp(-b*d))}function average(a,b,c){if(c<=b)return 0;let d=0;for(let e=b;e<c;e++)d+=a[e];return d/(c-b)}requestAnimationFrame(draw);
class Random{constructor(){this.useA=!1;let a=function(e){let f=parseInt(e.substr(0,8),16),g=parseInt(e.substr(8,8),16),h=parseInt(e.substr(16,8),16),i=parseInt(e.substr(24,8),16);return function(){f|=0,g|=0,h|=0,i|=0;let a=0|(0|f+g)+i;return i=0|i+1,f=g^g>>>9,g=0|h+(h<<3),h=h<<21|h>>>11,h=0|h+a,(a>>>0)/4294967296}};this.prngA=new a(tokenData.hash.substr(2,32)),this.prngB=new a(tokenData.hash.substr(34,32));for(let a=0;1e6>a;a+=2)this.prngA(),this.prngB()}random_dec(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}}function fr(a){return flr(R()*a)}function afr(b){return b[fr(b.length)]}function abs(a){return Math.abs(a)}function flr(a){return Math.floor(a)}function cae(a,b){canvas.addEventListener(a,b)}const urlParams=new URLSearchParams(window.location.search);let fO="false"==urlParams.get("flourish"),reactive="true"==urlParams.get("reactive"),hideUI="true"==urlParams.get("hideui"),rnd=new Random,R=function(){return rnd.random_dec()},tt=function(){return .5<R()},cx=function(){return fr(th)-fv},sdF=function(){return fr(450)+50+"."},segF=function(){return afr(segSa)};var D_S=1e3;let cDiv=document.createElement("div");cDiv.style.width=window.innerWidth+"px",cDiv.style.height=window.innerHeight+"px";var DIM=Math.max(window.innerWidth,window.innerHeight);document.body.style.backgroundColor="#000000";var bVL=.1,M=DIM/1000,tick=0;let tS=0,tS2=0,atk=0,arsdc=0,sfo=!1,palettes=[[[249,222,89],[232,166,40],[249,131,101],[195,49,36],[161,223,251]],[[255,109,105],[254,204,80],[11,231,251],[1,11,139],[30,5,33]],[[233,255,136],[254,10,183],[229,1,133],[17,16,16],[208,204,209]],[[179,231,220],[166,180,1],[239,246,123],[213,1,2],[108,1,2]],[[0,123,0],[36,224,184],[255,204,81],[255,139,118],[255,48,49]],[[169,67,0],[255,176,0],[255,223,0],[91,155,55],[21,61,2]],[[161,5,50],[255,111,169],[255,208,204],[0,183,204],[0,95,129]],[[95,165,90],[1,180,188],[246,213,31],[250,137,37],[250,84,87]],[[99,26,17],[187,96,47],[239,216,131],[203,130,20],[68,64,101]],[[48,4,61],[142,31,81],[229,64,89],[222,131,127],[253,179,106]],[[255,251,196],[182,190,246],[53,30,191],[16,1,93],[10,0,48]],[[140,7,20],[252,64,124],[27,78,136],[5,8,30],[250,240,228]],[[0,0,63],[1,0,142],[144,1,245],[254,0,234],[255,1,120]],[[8,44,68],[114,234,245],[254,230,226],[255,169,76],[254,44,137]],[[1,99,141],[171,206,204],[255,242,205],[255,0,76],[97,13,75]],[[34,125,172],[68,57,136],[159,0,82],[255,63,32],[255,190,0]],[[129,237,247],[0,164,192],[2,116,143],[247,1,16],[110,5,22]],[[255,254,1],[255,134,6],[232,59,54],[96,5,56],[70,10,64]],[[51,51,51],[204,204,204],[48,48,48],[221,221,221],[0,0,0]],[[215,0,95],[215,215,0],[38,38,38],[175,0,95],[0,255,255]],[[85,255,255],[255,85,255],[255,255,85],[170,0,0],[0,0,170]],[[170,0,170],[170,0,0],[255,255,85],[170,85,0],[0,170,0]],[[170,0,0],[170,0,0],[255,85,85],[255,255,85],[85,85,255]],[[255,85,85],[85,255,85],[255,255,85],[85,85,85],[85,255,255]],[[0,0,0],[255,85,255],[85,255,255],[255,0,255],[255,255,255]],[[0,0,0],[0,170,0],[170,0,0],[170,85,0],[0,85,0]],[[116,2,17],[208,169,160],[143,58,96],[195,90,102],[36,0,4]],[[175,212,204],[133,186,106],[26,119,73],[11,46,47],[1,18,28]],[[0,18,68],[0,80,134],[49,143,181],[176,202,199],[247,214,191]],[[140,66,25],[243,149,88],[238,200,176],[241,236,231],[247,217,109]],[[218,210,216],[20,54,66],[15,139,141],[236,154,41],[168,32,26]],[[191,135,9],[234,197,125],[185,187,222],[128,116,144],[82,56,87]],[[44,48,57],[107,54,56],[254,108,58],[254,219,209],[158,172,183]],[[61,82,32],[183,203,153],[119,143,210],[42,55,89],[67,29,50]],[[91,91,91],[195,214,211],[217,201,167],[248,233,214],[244,163,142]]],th=2e3,fv=500,cX=cx(),cY=cx(),c2X=cx(),c2Y=cx(),c3X=cx(),c3Y=cx(),c4X=cx(),c4Y=cx(),c5X=cx(),c5Y=cx(),c6X=cx(),c6Y=cx(),segAa=[5,10,20,50,100,200,250,fv],segC=afr(segAa),segD=afr(segAa),segV0=tt(),segV1=tt(),segV2=tt(),segV3=tt(),co=tt(),ofX=.6<R(),ofY=.6<R(),oXYa=[250,fv,th],oXY={x:afr(oXYa),y:afr(oXYa)},sprA=["5.","10.","20."],spr=afr(sprA),y0=fr(750)+250,y1=fr(750)+250,v12=flr((y0+y1)/2),segSa=[">","<"],segSc0=segF(),segSc1=segF(),segSc2=segF(),segSc3=segF(),irOp=.5<R()?"-":"+",dA=["d",`((st.y + ${y0}.) + d3)/(d/1000.)`,`(((st.x + ${y1}.)/d6) ${irOp} ((st.y + ${v12}.)/.5))`],dI=fr(dA.length),dC=dA[dI],sD=sdF(),sD2=sdF(),sD3=sdF(),sD4=sdF(),sD5=sdF(),sD6=sdF(),pId=flr(R()*palettes.length),palette=palettes[pId],currentPercent=R()*fv+fv,clrs=["c0","c1","c2","c3","c4"],clrsI=["c0","c1","c2","c3","c4"],pA=[],gls=["2","4","6","8","10","12","16"],cOs="",inc=.7<R(),rvA=["100.","200.","250.","500.","1000."],rvV=afr(rvA),rvV2=afr(rvA),iM=!1;2===dI&&(inc=!1),1===dI;let clrsS=fr(15)+15;for(let a=0;a<clrsS;a++)clrsI.push(afr(clrs));for(let a=0;a<clrsI.length;a++)pA.push(currentPercent),currentPercent+=R()*fv+fv;let sT=R();.2>sT?clrsI.sort():.5>sT?clrsI.reverse():.8>sT?clrsI=shuffle(clrsI):sT;let pct,clrsC=clrsI.length,loopCap=10*(200*(50+clrsC));for(let a=0;a<clrsI.length;a++)pct=Math.floor(1e3*(pA[a]/currentPercent))/1e3,cOs+=(0<a?"else if ":"if ")+"(idx < loopPoint * "+pct+") {\n",cOs+=" gloss = "+afr(gls)+".;\n",cOs+=" cIn = "+a+".;\n",cOs+=" c = "+clrsI[a]+";\n",cOs+="}\n";cOs+="else {\n",cOs+=" gl_FragColor = vec4(0.,0.,0.,1.);",cOs+=" return;",cOs+="}\n";let cnA=["cn","cn2","cn3","cn4","cn5","cn6"],cns="";for(let a,b=6;-1<b;b--){a=[];for(let c=0;6>c;c++)b!=c&&a.push(cnA[c]);a=shuffle(a),a.unshift(cnA[(6-b)%6]),cns+="rng = "+fr(6e3)+4e3+".;",cns+="cM = rng * 6.;",cns+="cnP = mod(tick,cM);";for(let b=0;6>b;b++)cns+=(0<b?"else ":"")+(5>b?"if (cnP <= "+(0<b?b+1+". * ":"")+"rng) {\n":"{\n"),cns+=" cnC = "+a[b]+";\n",cns+=" cnD = "+a[(b+1)%6]+";\n",cns+=" p = 1. - ((("+(0<b?b+1+". * ":"")+"rng) - cnP) / rng);\n",cns+="}\n";cns+=" p = 1. - (1. - p) * (1. - p);\n",cns+=a[b]+" = mix(cnC,cnD,p);\n"}let oCB=.9<R(),oCBH=R(),c="";for(let a=0;5>a;a++)c+="vec3 c"+a+" = "+(oCB?"":"rgb2hsv(")+"vec3("+(oCB?oCBH:palette[a][0]+"./255.")+","+(oCB?".8":palette[a][1]+"./255.")+","+(oCB?a/6+.2:palette[a][2]+"./255.")+(oCB?"":")")+");\n";const canvas=document.getElementsByTagName("canvas")[0];canvas.width=DIM,canvas.height=DIM,cDiv.style.position="absolute",cDiv.style.overflow="hidden",canvas.parentElement.appendChild(cDiv),canvas.style.left="50%",canvas.style.top="50%",canvas.style.position="relative",canvas.style.transform="translate(-50%,-50%)",cDiv.appendChild(canvas);const yCul=flr(abs(canvas.offsetTop-DIM/2)/M),xCul=flr(abs(canvas.offsetLeft-DIM/2)/M);let cft,msx,msy,clp,aud,gp,gpA,gpAO,tCa,cD=!0,hl=/\bHeadlessChrome/.test(navigator.userAgent),lft=0,dh=!1,sd=!1,mxyS={x:500,y:500,ip:null},mxyD={x:0,y:0},mxy2={x:0,y:0},mxy2O=0,sstT=0,sstD=0,drg=.97,ac=1.1,k={m:!1,l:!1,r:!1,u:!1,d:!1,sp:!1},ipt=!1,drgO={x:!1,y:!1},audE=reactive,audDP=0,audD=Array(50).fill(0),clkT=0,clkC=0,clkCC=0,att=!0,arsF=!1,fT=18e4,pT=Date.now(),aFT=Date.now(),sqFT=Date.now(),fR=!1,lm={x:0,y:0},tTick=0,sdTA=!1,fd=!1,afv=0,sqfv=0,mdt=0,te={x:0,y:0},pte={x:0,y:0},sq1FT=!1,tra=3.14159/180,sqr="";for(let a,b=0;4>b;b++)a=xCul+55+30*b,sqr+=`(clkC - float(`+(b+1)+`) >= 0. && st.x > float(${xCul}) + float(${a}) && st.x < float(${xCul}) + float(${a+25}))`+(3>b?" || ":")")+"\n";let sqr2="";for(let a,b=0;4>b;b++)a=xCul+55+30*b,sqr2+=`(clkC - float(`+(b+1)+`) >= 0. && st.x > float(${xCul}) + float(${a}) + 23. && st.x < float(${xCul}) + float(${a+25}))`+(3>b?" || ":")")+"\n";const gl=canvas.getContext("webgl"),positionsData=new Float32Array([1,1,-1,1,1,-1,-1,-1]),indices=new Uint16Array([0,1,2,1,2,3]),textureData=new Float32Array([1,1,0,1,1,0,0,0]);var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture),texBind();const targetTexture2=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture2),texBind();const bT=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,bT),texBind();const cT=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,cT),texBind();function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),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)}const fb=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fb);const indexBuffer=gl.createBuffer();var attachmentPoint=gl.COLOR_ATTACHMENT0,level=0;gl.framebufferTexture2D(gl.FRAMEBUFFER,attachmentPoint,gl.TEXTURE_2D,targetTexture,level);var aDt={},bDt={},bDta={},compositeData={},fDt={};function compileShader(a,b){var c=gl.createShader(b);if(gl.shaderSource(c,a),gl.compileShader(c),!gl.getShaderParameter(c,gl.COMPILE_STATUS))throw"Shader compile failed with: "+gl.getShaderInfoLog(c);return c}function glAB(a,b){gl.activeTexture(a),gl.bindTexture(gl.TEXTURE_2D,b)}function glD(){gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indexBuffer),gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indices,gl.STATIC_DRAW),gl.drawElements(gl.TRIANGLES,indices.length,gl.UNSIGNED_SHORT,0)}function drawArt(){gl.useProgram(aPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,targetTexture,level),gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(aDt.positionAttribute,2,gl.FLOAT,!1,8,0),gl.enableVertexAttribArray(aDt.positionAttribute),gl.uniform1f(aDt.tickSet,tick),gl.uniform2f(aDt.mxy2,mxy2.x,mxy2.y),gl.uniform4f(aDt.ad0,amplitudes[1]/2,0,0,0),glAB(gl.TEXTURE0,texture),glD()}function blurArt(a,b){gl.useProgram(blPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,b,level);var c=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDt.positionAttribute,2,c,!1,0,0),gl.enableVertexAttribArray(bDt.positionAttribute),gl.uniform3f(bDt.d,mxyD.x,mxyD.y,audE?amplitudes[14]/16:0),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDt.textureAttribute,2,c,!1,0,0),gl.enableVertexAttribArray(bDt.textureAttribute),glAB(gl.TEXTURE0,a),glD()}function blendArt(a,b){gl.useProgram(bldPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,b,level);var c=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,c,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),glAB(gl.TEXTURE0,a),gl.uniform1i(bDta.freshTexture,0),glAB(gl.TEXTURE1,cT),gl.uniform1i(bDta.cT,1),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,c,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),glD()}function compositeArt(a){gl.useProgram(compositeProgram),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,cT,level);var b=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,b,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,b,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),glAB(gl.TEXTURE0,a),glD()}function renderFinal(a){gl.useProgram(fPg),gl.bindFramebuffer(gl.FRAMEBUFFER,null);var b=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,b,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,b,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),hideUI||(gl.uniform1f(fDt.sst,-nAmp),gl.uniform1f(fDt.sqfv,sqfv),gl.uniform1f(fDt.afv,afv),gl.uniform1f(fDt.iM,iM?1:0),gl.uniform1f(fDt.clkC,clkCC)),glAB(gl.TEXTURE0,a),glD()}let blurFSS=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D u_texture; uniform vec3 d; uniform float M; void main() { vec2 resultCoords = vec2(vTextureCoord.x, vTextureCoord.y); float a = texture2D(u_texture, resultCoords).a; float dv = max(abs(d.y),abs(d.x)); vec2 dnorm = normalize(d.xy); float r = texture2D(u_texture, resultCoords - (d.xy * .005)).r; float g = texture2D(u_texture, resultCoords).g; float b = texture2D(u_texture, resultCoords + (d.xy * .005)).b; float dvD = dv/200.; vec3 c = vec3(r,g,b); vec2 d2 = vec2(dvD * float(0), -dvD * float(0)); vec2 d3 = vec2(dvD * float(0), dvD * float(0)); for (int i = 1; i < 11; i++) { d2 += vec2(dvD * float(i), -dvD * float(i)); d3 += vec2(dvD * float(i), dvD * float(i)); } c += texture2D(u_texture, resultCoords + d2).rgb * (dvD + d.z); c += texture2D(u_texture, resultCoords - d2).rgb * (dvD + d.z); c += texture2D(u_texture, resultCoords + d3).rgb * (dvD + d.z); c += texture2D(u_texture, resultCoords - d3).rgb * (dvD + d.z); gl_FragColor = vec4(c,1.); } `,blurFragmentShader=compileShader("\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nuniform vec3 d;\nuniform float M;\n\nvoid main() {\n\n vec2 resultCoords = vec2(vTextureCoord.x, vTextureCoord.y);\n\n float a = texture2D(u_texture, resultCoords).a;\n float dv = max(abs(d.y),abs(d.x));\n vec2 dnorm = normalize(d.xy);\n\n float r = texture2D(u_texture, resultCoords - (d.xy * .005)).r;\n float g = texture2D(u_texture, resultCoords).g;\n float b = texture2D(u_texture, resultCoords + (d.xy * .005)).b;\n\n float dvD = dv/200.;\n\n vec3 c = vec3(r,g,b);\n \n vec2 d2 = vec2(dvD * float(0), -dvD * float(0));\n vec2 d3 = vec2(dvD * float(0), dvD * float(0));\n for (int i = 1; i < 11; i++) {\n d2 += vec2(dvD * float(i), -dvD * float(i));\n d3 += vec2(dvD * float(i), dvD * float(i));\n }\n c += texture2D(u_texture, resultCoords + d2).rgb * (dvD + d.z);\n c += texture2D(u_texture, resultCoords - d2).rgb * (dvD + d.z);\n c += texture2D(u_texture, resultCoords + d3).rgb * (dvD + d.z);\n c += texture2D(u_texture, resultCoords - d3).rgb * (dvD + d.z);\n \n\n gl_FragColor = vec4(c,1.);\n}\n",gl.FRAGMENT_SHADER),blendFSS=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D freshTexture; uniform sampler2D compTexture; void main() { vec3 blend0 = texture2D(freshTexture, vTextureCoord).rgb; vec3 blend1 = texture2D(compTexture, vTextureCoord).rgb; vec3 compBlend = mix(blend0,blend1,.9); gl_FragColor = vec4(compBlend ,1.); } `,blendFragmentShader=compileShader(blendFSS,gl.FRAGMENT_SHADER),finalFSS=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D u_texture; uniform float sst; uniform float afv; uniform float sqfv; uniform float clkC; uniform float iM; void main() { vec3 c0 = (vec3(${palette[0][0]}. / 255. ,${palette[0][1]}. / 255. ,${palette[0][2]}. / 255.)); vec3 c1 = (vec3(${palette[1][0]}. / 255. ,${palette[1][1]}. / 255. ,${palette[1][2]}. / 255. )); vec3 c2 = (vec3(${palette[2][0]}. / 255. ,${palette[2][1]}. / 255. ,${palette[2][2]}. / 255. )); vec3 c3 = (vec3(${palette[3][0]}. / 255. ,${palette[3][1]}. / 255. ,${palette[3][2]}. / 255.)); vec3 c4 = (vec3(${palette[4][0]}. / 255. ,${palette[4][1]}. / 255. ,${palette[4][2]}. / 255.)); float M = float(${M}); vec3 bar = texture2D(u_texture, vTextureCoord).rgb; vec2 st = (gl_FragCoord.xy / M); float v; if (sst > 0.) { v = 500. + (1000. - float(${yCul}) - 515.) * sst; } else if (sst < 0.) { v = 500. + (float(${yCul}) - 485.) * abs(sst); } gl_FragColor = vec4(bar,1.); if (sst != 0. && afv != 0.) { if (st.x > float(${xCul}) + 25. && st.x < float(${xCul}) + 50. && ((st.y > 500. && st.y < v) || (st.y < 500. && st.y > v))) { gl_FragColor = vec4(mix(bar,vec3(1.,1.,1.),afv),1.); if (st.x > float(${xCul}) + 48. && st.x < float(${xCul}) + 50. && ((st.y > 500. && st.y < v) || (st.y < 500. && st.y > v))) { gl_FragColor = vec4(mix(bar,vec3(0.,0.,0.),afv),1.); } } } if (iM == 1. && st.x > 441. && st.x < 559. && st.y > float(${yCul}) + 13. && st.y < float(${yCul}) + 62. ) { gl_FragColor = vec4(mix(bar,vec3(0.,0.,0.),sqfv),1.); if (st.x > 443. && st.x < 557. && st.y > float(${yCul}) + 15. && st.y < float(${yCul}) + 60. ) { gl_FragColor = vec4(mix(bar,vec3(1.,1.,1.),sqfv),1.); if ((st.x > 450.5 && st.x < 479.5 && st.y > float(${yCul}) + 23. && st.y < float(${yCul}) + 52.) || (st.x > 485.5 && st.x < 514.5 && st.y > float(${yCul}) + 23. && st.y < float(${yCul}) + 52.) || (st.x > 520.5 && st.x < 549.5 && st.y > float(${yCul}) + 23. && st.y < float(${yCul}) + 52.)) { gl_FragColor = vec4(mix(bar,vec3(0.,0.,0.),sqfv),1.); } if (st.x > 452.5 && st.x < 477.5 && st.y > float(${yCul}) + 25. && st.y < float(${yCul}) + 50.) { gl_FragColor = vec4(bar,1.); if (clkC > 0. && clkC <= 3.) { gl_FragColor = vec4(mix(bar,vec3(1.,1.,1.),sqfv),1.); if (st.x > 452.5 + 8. && st.x < 477.5 - 8. && st.y > float(${yCul}) + 25. + 8. && st.y < float(${yCul}) + 50. - 8.) { gl_FragColor = vec4(mix(bar,vec3(0.,0.,0.),sqfv),1.); } } } if (st.x > 487.5 && st.x < 512.5 && st.y > float(${yCul}) + 25. && st.y < float(${yCul}) + 50.) { gl_FragColor = vec4(bar,1.); if (clkC > 1. && clkC <= 3.) { gl_FragColor = vec4(mix(bar,vec3(1.,1.,1.),sqfv),1.); if (st.x > 487.5 + 8. && st.x < 512.5 - 8. && st.y > float(${yCul}) + 25. + 8. && st.y < float(${yCul}) + 50. - 8.) { gl_FragColor = vec4(mix(bar,vec3(0.,0.,0.),sqfv),1.); } } } if (st.x > 522.5 && st.x < 547.5 && st.y > float(${yCul}) + 25. && st.y < float(${yCul}) + 50.) { gl_FragColor = vec4(bar,1.); if (clkC == 3.) { gl_FragColor = vec4(mix(bar,vec3(1.,1.,1.),sqfv),1.); if (st.x > 522.5 + 8. && st.x < 547.5 - 8. && st.y > float(${yCul}) + 25. + 8. && st.y < float(${yCul}) + 50. - 8.) { gl_FragColor = vec4(mix(bar,vec3(0.,0.,0.),sqfv),1.); } } } } } } `,finalFragmentShader=compileShader(finalFSS,gl.FRAGMENT_SHADER),baseVertexString=` attribute vec2 position; attribute vec2 texcoord; varying highp vec2 vTextureCoord; void main() { gl_Position = vec4(position, 0.0, 1.0); vTextureCoord = texcoord; } `,baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER),compFragmentShaderString=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D u_texture; void main() { gl_FragColor = texture2D(u_texture, vTextureCoord); } `,compFragmentShader=compileShader(compFragmentShaderString,gl.FRAGMENT_SHADER),artFragmentString=` precision highp float; uniform float tick; uniform vec2 mxy2; uniform vec4 ad0; uniform vec4 ad1; uniform vec4 ad2; uniform vec4 ad3; 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) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } vec3 rgb2hsv(vec3 c) { vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); float d = q.x - min(q.w, q.y); float e = 1.0e-10; return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); } void main() { ${c} vec3 c5 = vec3(0.,0.,0.); float w = float(${DIM}); float M = float(${M}); vec2 st0 = (gl_FragCoord.xy / M); vec2 st = (gl_FragCoord.xy / M); if (st.x < float(${xCul}) || st.x > 1000. - float(${xCul}) || st.y < float(${yCul}) || st.y > 1000. - float(${yCul})) { return; } if (${segV2} && st.x ${segSc0} 500.) { st.x = 1000. - st.x; } if (${segV0} && mod(st.x, ${segC}.) ${segSc1} (${segC}./2.)) { st.x = (st.x + (${segC}./2.)) - ${segC}.; } if (${segV3} && st.y ${segSc2} 500.) { st.y = 1000. - st.y; } if (${segV1} && mod(st.y, ${segD}.) ${segSc3} (${segD}./2.)) { st.y = (st.y + (${segD}./2.)) - ${segD}.; } if(${ofX}){ st.x = abs((${oXY.y}. - st.y) - (${oXY.x}. - st.x)); } if(${ofY}){ st.y = abs((${oXY.x}. - st.x) - (${oXY.y}. - st.y)); } st0.y += 2. * mxy2.y; vec2 cn = vec2(${cX}. + (ad0.x - .5) * 200.,${cY}. + (ad0.y - .5) * 200.); vec2 cn2 = vec2(${c2X}. + (ad0.y - .5) * 200.,${c2Y}. + (ad0.z - .5) * 200.); vec2 cn3 = vec2(${c3X}. + (ad0.z - .5) * 200.,${c3Y}. + (ad0.w - .5) * 200.); vec2 cn4 = vec2(${c4X},${c4Y}); vec2 cn5 = vec2(${c5X},${c5Y}); vec2 cn6 = vec2(${c6X},${c6Y}); vec2 cnC; vec2 cnD; float p; float rng; float cM; float cnP; ${cns} cn = (cn + mxy2); float d = floor(distance(cn,st)); float d2 = floor(distance(cn2,st)); float d3 = floor(distance(cn3,st)); float d4 = floor(distance(cn4,st)); float d5 = floor(distance(cn5,st)); float d6 = floor(distance(cn6,st)); float d0 = (distance(cn,st0)); float d02 = (distance(cn2,st0)); float d03 = (distance(cn3,st0)); float d04 = (distance(cn4,st0)); float d05 = (distance(cn5,st0)); float d06 = (distance(cn6,st0)); d = (d + d2 + d3 + d4 + d5 + d6) / (1. + mxy2.y); d0 = (d0 + d02 + d03 + d04 + d05 + d06) / (1. + mxy2.y); d = (d+d02)/2.; d2 = (d2+d03)/2.; d3 = (d3+d04)/2.; d4 = (d4+d05)/2.; d5 = (d5+d06)/2.; d6 = (d6+d0)/2.; d = (d+d2)/2.; d2 = (d2+d3)/2.; d3 = (d3+d4)/2.; d4 = (d4+d5)/2.; d5 = (d5+d6)/2.; d6 = (d6+d)/2.; if (${co}) { d = floor(d/${sD}) * ${sD} + mxy2.y; d2 = floor(d2/${sD}) * ${sD} + mxy2.y; d3 = floor(d3/${sD}) * ${sD} + mxy2.y; d4 = floor(d4/${sD}) * ${sD} + mxy2.y; d5 = floor(d5/${sD}) * ${sD} + mxy2.y; d6 = floor(d6/${sD}) * ${sD} + mxy2.y; } if (${inc}) { st.x = abs(${dC} - st0.x) / ${spr} + (mxy2.y); } else { st.x = abs(${dC} - st.x) / ${spr} + (mxy2.y); } float idx = (${dC} * 2.) / (100. * 20.); idx += floor(${dC} / 100.) + abs(st.x - st.y) * (5. + (mxy2.y * 10.)); idx *= mod(abs(st.x - st.y), .5 + (mxy2.y/4.)); idx += floor(st.x/(10. + mxy2.y)) * d6; idx += st.x + st.y + mxy2.y; idx *= 10.; idx *= 1.1; if (${dC} < 500.) { } float s0 = floor((st.x + 100.) / 100.); float s1 = floor((st.y + 50.) / 50.); float s2 = floor((${dC} + 50.) / 50.); idx += (s0 - s1) * ((1. - (ad0.y + ad0.z)/2.) * 1000.); idx -= s2 * 50.; idx /= (st.x / st.y - ${dC}) * .001; if (${dI} == 1) { idx += (tick * 20.); } if (${dI} == 2) { idx += (tick * 60.); } else { if (${co}) { idx += (tick * floor(40. - ${clrsC}. / 5.)); } else { idx += (tick * 20.); } } vec3 c; float cIn; float idxO = 40.; idxO = 200.; float loopCap = 100. + ${clrsC}.; float loopPoint = loopCap * idxO * 5.; loopPoint += (ad0.z + ad0.w)/2. * (loopPoint/2.); idx = mod(abs(idx),loopPoint); float gloss = 0.; ${cOs} c.z += (cIn/(${clrsC}.)) * 1.75; c.z -= mod(abs(st.y - st.x),1.4) * .15; gloss *= 3.5 + abs(ad0.x * 10.); if (mod((idx/500.),mod((abs(st.x - st.y) * 500.),500.)) >= 50.) { gl_FragColor = vec4(hsv2rgb(vec3(c.x,c.y,c.z * abs(-1. - mod((${dC} - 500.),5.)) * (st.y + 1000.)/500.)) - d * d2/200. / gloss/20.,1.); } else { gl_FragColor = vec4(hsv2rgb(vec3(c.x,c.y,c.z * abs(-1. - mod((${dC} - 500.),5.)) * (st.x + 1000.)/500.)) - d * d2/200. / gloss/20.,1.); } gl_FragColor += vec4(hsv2rgb(vec3(c.x + ((st.y - st.x) * .15),c.y,c.z + ((${dC} + (st.x/10.))/10.) * .0001)),0.); gl_FragColor *= vec4(.1,.1,.1,1.); gl_FragColor *= vec4(hsv2rgb(vec3(c.x + (mod(${dC},100. + mxy2.y)/50.),c.y - (mod(${dC},100.)/50.),c.z * 1.8)),1.); }
DIVERGENCE Divergence, a never-ending abstract motion work, reacts to audio and touch inputs. Dive into stacks of deterministic layers to explore emerging patterns, and fine-tune the audio reactivity to your preferences. You may wish to use the controls to wander within Divergence until the aesthetic feels right to you, or complements your audio input. Navigating the art in this way gives a tangible window into my artistic process. My aesthetic is influenced by the music I listen to as I code. I enjoy experimenting and looking for the art in the algorithm. This can mean playing with overarching ideas, but also making many small changes until I find consistent visual appeal over a range of outputs. Divergence exhibits animations changing over time in expanding, textural layers. It elaborates on concepts I’ve developed in previous works: my approach to color in phase; linear motion in Parade; interlacing lines and expansion/contraction in Kaleidoscope; and the noise textures of Sift. Newly explored is continuous animation with touch and audio inputs, which affect the viewing position in time and space. A common quip in the Art Blocks community is that motion art has a penalty. Many enjoy a final product that is printable to frame at home. As technology advances, I believe it is equally important to create work that can only exist on a screen, and is unique to digital art. Larger displays are catching up to the artistic space and becoming more accessible, but I also want my work to be approachable immediately. Keeping the code lean and performant allows it to run well on a range of screen sizes and processor powers, from mobile devices to multi-story displays. There has been discussion that a body of motion work takes a long time to sift through, as it needs to be viewed live. In consideration of this, I made Divergence immersive, rather than a static experience. I want the extra time spent with it to be fun and entertaining. Usage: Navigate left/right to traverse the timeline; navigate up/down to travel through the layers and expand/contract the patterns. Please see “Display Notes” for further instructions (user input, audio reactivity, url parameters). Accessibility is important to me, so Diverenge accepts inputs from touch, keyboard, mouse, and gaming controllers with an analog stick. *Photosensitive seizure warning: These artworks contain flashing colors and moving patterns.
0x7f5a0a68…e37c·#16,308,882·0x94c24f8e…5010d6
Loren Bednar EditionsAddress: call to non-contractAddress: call to non-contractAddress: low-level delegate call failedAddress: low-level delegate call failed
S=Uint32Array.from([0,1,s=t=2,3].map(t=>parseInt(tokenData.hash.substr(8*t+2,8),16))),R=(e=>(t=S[3],S[3]=S[2],S[2]=S[1],S[1]=s=S[0],t^=t<<11,S[0]^=t^t>>>8^s>>>19,S[0]/2**32));var DEFAULT_SIZE=1e3,DIM=Math.min(window.innerWidth,window.innerHeight),M=DIM/DEFAULT_SIZE;let palettes=[[[116,2,17],[208,169,160],[143,58,96],[195,90,102],[36,0,4]],[[175,212,204],[133,186,106],[26,119,73],[11,46,47],[1,18,28]],[[0,18,68],[0,80,134],[49,143,181],[176,202,199],[247,214,191]],[[249,222,89],[232,166,40],[249,131,101],[195,49,36],[161,223,251]],[[30,5,33],[1,11,139],[254,204,80],[11,231,251],[255,109,105]],[[17,16,16],[208,204,209],[233,255,136],[254,10,183],[229,1,133]],[[179,231,220],[166,180,1],[239,246,123],[213,1,2],[108,1,2]],[[36,224,184],[255,204,81],[255,139,118],[255,48,49],[0,123,0]],[[169,67,0],[255,176,0],[91,155,55],[21,61,2],[255,223,0]],[[161,5,50],[255,111,169],[0,183,204],[0,95,129],[255,208,204]],[[99,26,17],[187,96,47],[203,130,20],[68,64,101],[239,216,131]],[[48,4,61],[142,31,81],[229,64,89],[222,131,127],[253,179,106]],[[10,0,48],[255,251,196],[182,190,246],[53,30,191],[16,1,93]],[[140,7,20],[252,64,124],[27,78,136],[5,8,30],[250,240,228]],[[0,0,63],[1,0,142],[144,1,245],[254,0,234],[255,1,120]],[[8,44,68],[114,234,245],[254,230,226],[255,169,76],[254,44,137]],[[1,99,141],[171,206,204],[255,242,205],[255,0,76],[97,13,75]],[[34,125,172],[68,57,136],[159,0,82],[255,63,32],[255,190,0]],[[129,237,247],[2,116,143],[247,1,16],[110,5,22],[0,164,192]],[[255,254,1],[255,134,6],[232,59,54],[96,5,56],[70,10,64]],[[51,51,51],[204,204,204],[48,48,48],[221,221,221],[0,0,0]],[[215,0,95],[215,215,0],[38,38,38],[175,0,95],[0,255,255]],[[0,0,170],[255,85,255],[255,255,85],[170,0,0],[85,255,255]],[[255,85,85],[85,255,85],[255,255,85],[85,255,255],[85,85,85]],[[0,0,0],[255,85,255],[85,255,255],[255,0,255],[255,255,255]],[[15,139,141],[168,32,26],[236,154,41],[218,210,216],[20,54,66]]],pId=Math.floor(R()*palettes.length),palette=palettes[pId],vrs=R(),mrr=R()>.6,goe=R()>.6,tp=Math.floor(3*R()),v0A=["1.","2.","4."],v0=v0A[Math.floor(R()*v0A.length)],v1A=["32.","64.","128.","256.","512."],v1=v1A[Math.floor(R()*v1A.length)],v2A=[".25",".5","1.","2."],v2=v2A[Math.floor(R()*v2A.length)],v3A=[".1",".25",".5",".75"],v3=v3A[Math.floor(R()*v3A.length)],v4A=[".5","1.","2."],v4=v4A[Math.floor(R()*v4A.length)],v5A=["2.","4.","5.","6.","8."],v5=v5A[Math.floor(R()*v5A.length)],v6=Math.floor(10*R())+1,v7=R()>.5,v8A=["10.","20.","30."],v8=v8A[Math.floor(R()*v8A.length)],v9=R()+.1,v10A=["1.","5.","10.","20.","40."],v10=v10A[Math.floor(R()*v10A.length)],v11=Math.floor(490*R())+10;pOR=R()>.9;let mR=R()>.5,cnX0=Math.floor(1e3*R()),cnX1=Math.floor(1e3*R()),cnY0=Math.floor(1e3*R()),cnY1=Math.floor(1e3*R()),pO=R();if(pOR)for(let t=0;t<palette.length;t++)palette[t]=hsv2rgb(360*pO,1,.9-2*t*.1);document.body.style.backgroundColor="rgb("+palette[4][0]+","+palette[4][1]+","+palette[4][2]+")";var tick=0;const canvas=document.getElementsByTagName("canvas")[0];canvas.width=DIM,canvas.height=DIM;const gl=canvas.getContext("webgl"),positionsData=new Float32Array([1,1,-1,1,1,-1,-1,-1]),textureData=new Float32Array([1,1,0,1,1,0,0,0]);var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture),texBind();const targetTexture2=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture2),texBind();const bT=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,bT),texBind();const cT=gl.createTexture();function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),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.bindTexture(gl.TEXTURE_2D,cT),texBind();const fb=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fb);var attachmentPoint=gl.COLOR_ATTACHMENT0,level=0;gl.framebufferTexture2D(gl.FRAMEBUFFER,attachmentPoint,gl.TEXTURE_2D,targetTexture,level);let cs=[10,20,25,50],bd=["0.",".25",".75",".9"],c=cs[Math.floor(R()*cs.length)],r=cs[Math.floor(R()*cs.length)],cM=cs[Math.floor(R()*cs.length)],rM=cs[Math.floor(R()*cs.length)],cMO=Math.floor(5*R())+1,rMO=Math.floor(5*R())+1,d2x=Math.floor(R()*c),d2y=Math.floor(R()*r),dAA=["idx /= jF + iF * tick;"],sB=["idx += iF * jF;","idx -= iF * jF;",`idx += iF * ((${DEFAULT_SIZE}. / pxS) - jF);`,`idx += ((${DEFAULT_SIZE}. / pyS) - iF) * jF;`],sBO=sB[Math.floor(R()*sB.length)],rmA=R()>0,rA0=R()>.5,rA1=R()>.5,rA2=R()>.5,rA3=Math.floor(100*R()),rA4=R()>.5,dA=dAA[Math.floor(R()*dAA.length)],bdA=bd[Math.floor(R()*bd.length)];function hsv2rgb(t,e,r){let n=(n,l=(n+t/60)%6)=>r-r*e*Math.max(Math.min(l,4-l,1),0);return[Math.floor(255*n(5)),Math.floor(255*n(3)),Math.floor(255*n(1))]}var gridOffset="ps.x",aDt={},bDta={},compositeData={},fDt={};function compileShader(t,e){var r=gl.createShader(e);if(gl.shaderSource(r,t),gl.compileShader(r),!gl.getShaderParameter(r,gl.COMPILE_STATUS))throw"Shader compile failed with: "+gl.getShaderInfoLog(r);return r}function drawArt(){gl.useProgram(aPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,targetTexture,level),gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(aDt.positionAttribute,2,gl.FLOAT,!1,8,0),gl.enableVertexAttribArray(aDt.positionAttribute),gl.uniform1f(aDt.tickSet,tick),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,texture),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function blendArt(t,e){gl.useProgram(bldPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,e,level);var r=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.uniform1i(bDta.freshTexture,0),gl.activeTexture(gl.TEXTURE1),gl.bindTexture(gl.TEXTURE_2D,cT),gl.uniform1i(bDta.cT,1),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function compositeArt(t){gl.useProgram(compositeProgram),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,cT,level);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function renderFinal(t){gl.useProgram(fPg),gl.bindFramebuffer(gl.FRAMEBUFFER,null);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}let blendFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D freshTexture;\nuniform sampler2D compTexture;\nvoid main() {\n vec3 blend0 = texture2D(freshTexture, vTextureCoord).rgb;\n vec3 blend1 = texture2D(compTexture, vTextureCoord).rgb;\n vec3 compBlend = mix(blend0,blend1,.9);\n gl_FragColor = vec4(compBlend ,1.0);\n}\n",blendFragmentShader=compileShader(blendFSS,gl.FRAGMENT_SHADER),finalFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nvoid main() {\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n}\n",finalFragmentShader=compileShader(finalFSS,gl.FRAGMENT_SHADER),baseVertexString="\nattribute vec2 position;\nattribute vec2 texcoord;\nvarying highp vec2 vTextureCoord;\nvoid main() {\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = texcoord;\n}\n",baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER),compFragmentShaderString="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nvoid main() {\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n}\n",compFragmentShader=compileShader(compFragmentShaderString,gl.FRAGMENT_SHADER),artFragmentString=`\nprecision highp float;\nuniform float tick;\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n\nvoid main()\n{\n vec3 c0 = vec3(${palette[0][0]}. / 255.,${palette[0][1]}. / 255.,${palette[0][2]}. / 255.);\n vec3 c1 = vec3(${palette[1][0]}. / 255.,${palette[1][1]}. / 255.,${palette[1][2]}. / 255.);\n vec3 c2 = vec3(${palette[2][0]}. / 255.,${palette[2][1]}. / 255.,${palette[2][2]}. / 255.);\n vec3 c3 = vec3(${palette[3][0]}. / 255.,${palette[3][1]}. / 255.,${palette[3][2]}. / 255.);\n vec3 c4 = vec3(${palette[4][0]}. / 255.,${palette[4][1]}. / 255.,${palette[4][2]}. / 255.);\n\n\n float w = float(${DIM});\n float M = float(${M});\n vec2 st = gl_FragCoord.xy / M;\n float idx = 0.;\n\n if (${tp} == 0 || ${tp} == 2) {\n if (st.x > 500.) {\n st.x = 1000. - st.x;\n }\n }\n\n if (${rA4}) {\n st = gl_FragCoord.yx / M;\n }\n\n if (${rA1}) {\n st.x = ${DEFAULT_SIZE}. - st.x;\n }\n if (${rA2}) {\n st.y = ${DEFAULT_SIZE}. - st.y;\n }\n\n if (st.x > 500. && ${mR}) {\n st.x = 1000. - st.x;\n }\n if (mod(floor(st.y * M),2.) == 0.) {\n st.y = 1000. - st.y;\n }\n\n\n if (${tp} == 0) {\n //st.x = (st.x * ${v9});\n }\n else if(${tp} == 1) {\n st.x = floor(st.x * ${v0}); \n st.y = floor(st.y * ${v1}); \n }\n else if(${tp} == 2) {\n st.x *= ${v4};\n st.y = (st.x / (st.y + .01)) * ${v5};\n }\n\n vec2 cn = vec2(st.x - ${cnX0}.,st.y - ${cnY0}.);\n vec2 cn2 = vec2(${cnX1}.,${cnY1}.);\n\n if (${tp} == 0) {\n idx = (st.x * 1.) * (st.y * 2.1);\n idx += (st.y * 10.) * (st.y * 2.);\n idx *= distance(cn,st) / st.x;\n \n idx -= st.x - st.y;\n idx -= (st.x / st.y) / .5;\n \n if (st.x > st.y) {\n idx /= floor(st.y / ${v2}) * 20.;\n idx *= 20.;\n }\n else {\n idx /= floor(st.x / ${v3}) * 10.;\n idx /= floor((st.x - ${cnX0}.) / ${vrs} / 2.) * ${v8}; \n\n idx *= (st.x / .5) * 2.; \n idx *= 20.;\n }\n \n idx /= 10.;\n idx += tick * 3.;\n idx /= 20.;\n \n idx += ${vrs} * st.y;\n }\n else if (${tp} == 1) {\n st.x = abs(cn2.x - st.x) / 100.;\n\n idx = (st.x * 1.) * (st.x * 1.);\n idx += (st.y * 10.) * (st.y * 2.);\n idx -= distance(cn,st) * st.x;\n \n idx *= (st.x / st.y) / 25.; \n idx /= floor(st.x / .5) * 10.;\n idx /= 10.;\n idx += tick * 2.;\n idx /= 10.;\n idx += ${v11}./st.x; \n }\n else if (${tp} == 2) {\n idx = (st.x * .01) * (st.x * .01);\n idx += (st.y * 10.) * (st.y * 2.);\n \n if (st.x > st.y) {\n idx += st.x - st.y;\n }\n idx += st.x - st.y;\n \n if (mod(floor(st.y / 2.),2.) == 0.) {\n idx *= ${v6}.;\n } \n \n if (mod(floor(st.x),4.) == 0.) {\n idx /= 2.;\n }\n else {\n idx /= 2.;\n }\n \n if (mod(st.y,2.) == 0.) {\n idx *= (floor(st.x / 200.) + 200.) / 2.;\n }\n else {\n idx *= (floor(st.y / 200.) + 200.) / 10.;\n }\n \n if (${v7}) {\n idx *= (st.x / st.y) / 100.;\n }\n \n if (st.x > st.y) {\n idx /= floor(st.y / 1.) * 50.; \n }\n else {\n idx /= floor(st.x / .1) * 200.;\n }\n\n idx += tick / 2.;\n idx /= 2.;\n }\n \n idx *= 1.5;\n idx = abs(mod(idx,50.));\n \n if (idx < 10.) {\n \n gl_FragColor = vec4(c0.x,c0.y,c0.z,1.);\n }\n else if (idx < 20.) {\n gl_FragColor = vec4(c1.x,c1.y,c1.z,1.);\n }\n else if (idx < 30.) {\n gl_FragColor = vec4(c2.x,c2.y,c2.z,1.);\n }\n else if (idx < 40.) {\n gl_FragColor = vec4(c3.x,c3.y,c3.z,1.);\n }\n else {\n gl_FragColor = vec4(c4.x,c4.y,c4.z,1.);\n }\n}\n`;var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);const aPg=gl.createProgram();gl.attachShader(aPg,baseVertShader),gl.attachShader(aPg,artFragmentShader),gl.linkProgram(aPg);const bldPg=gl.createProgram();gl.attachShader(bldPg,baseVertShader),gl.attachShader(bldPg,blendFragmentShader),gl.linkProgram(bldPg);const compositeProgram=gl.createProgram();gl.attachShader(compositeProgram,baseVertShader),gl.attachShader(compositeProgram,compFragmentShader),gl.linkProgram(compositeProgram);const fPg=gl.createProgram();if(gl.attachShader(fPg,baseVertShader),gl.attachShader(fPg,finalFragmentShader),gl.linkProgram(fPg),!gl.getProgramParameter(aPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(aPg)),new Error("Failed to link art program");if(!gl.getProgramParameter(bldPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(bldPg)),new Error("Failed to link blend program");if(!gl.getProgramParameter(compositeProgram,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(compositeProgram)),new Error("Failed to link composite program");if(!gl.getProgramParameter(fPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(fPg)),new Error("Failed to link final program");const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW),aDt.positionAttribute=gl.getAttribLocation(aPg,"position"),aDt.colorOffset=gl.getUniformLocation(aPg,"colorOffset"),aDt.hues=gl.getUniformLocation(aPg,"hues"),aDt.sats=gl.getUniformLocation(aPg,"sats"),aDt.brights=gl.getUniformLocation(aPg,"brights"),aDt.tickSet=gl.getUniformLocation(aPg,"tick"),bDta.positionAttribute=gl.getAttribLocation(bldPg,"position"),bDta.textureAttribute=gl.getAttribLocation(bldPg,"texcoord"),bDta.cT=gl.getUniformLocation(bldPg,"compTexture"),bDta.freshTexture=gl.getUniformLocation(bldPg,"freshTexture"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position"),fDt.textureAttribute=gl.getAttribLocation(fPg,"texcoord"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position");let cft,cD=!0,lft=0,hl=/\bHeadlessChrome/.test(navigator.userAgent);function draw(){cft=Date.now(),hl?(drawArt(),blendArt(targetTexture,bT),compositeArt(bT),renderFinal(cT),tick++):cD&&lft>0&&(drawArt(),blendArt(targetTexture,bT),compositeArt(bT),renderFinal(cT),(tick+=(cft-lft)/16)>11e6&&(tick=0)),lft=cft,requestAnimationFrame(draw)}requestAnimationFrame(draw),document.body.addEventListener("click",function(t){cD=!cD}),document.addEventListener("keydown",function(t){cD=!cD});
S=Uint32Array.from([0,1,s=t=2,3].map(t=>parseInt(tokenData.hash.substr(8*t+2,8),16))),R=(e=>(t=S[3],S[3]=S[2],S[2]=S[1],S[1]=s=S[0],t^=t<<11,S[0]^=t^t>>>8^s>>>19,S[0]/2**32));var DEFAULT_SIZE=1e3,DIM=Math.min(window.innerWidth,window.innerHeight),M=DIM/DEFAULT_SIZE;let palettes=[[[116,2,17],[208,169,160],[143,58,96],[195,90,102],[36,0,4]],[[175,212,204],[133,186,106],[26,119,73],[11,46,47],[1,18,28]],[[0,18,68],[0,80,134],[49,143,181],[176,202,199],[247,214,191]],[[249,222,89],[232,166,40],[249,131,101],[195,49,36],[161,223,251]],[[30,5,33],[1,11,139],[254,204,80],[11,231,251],[255,109,105]],[[17,16,16],[208,204,209],[233,255,136],[254,10,183],[229,1,133]],[[179,231,220],[166,180,1],[239,246,123],[213,1,2],[108,1,2]],[[36,224,184],[255,204,81],[255,139,118],[255,48,49],[0,123,0]],[[169,67,0],[255,176,0],[91,155,55],[21,61,2],[255,223,0]],[[161,5,50],[255,111,169],[0,183,204],[0,95,129],[255,208,204]],[[99,26,17],[187,96,47],[203,130,20],[68,64,101],[239,216,131]],[[48,4,61],[142,31,81],[229,64,89],[222,131,127],[253,179,106]],[[10,0,48],[255,251,196],[182,190,246],[53,30,191],[16,1,93]],[[140,7,20],[252,64,124],[27,78,136],[5,8,30],[250,240,228]],[[0,0,63],[1,0,142],[144,1,245],[254,0,234],[255,1,120]],[[8,44,68],[114,234,245],[254,230,226],[255,169,76],[254,44,137]],[[1,99,141],[171,206,204],[255,242,205],[255,0,76],[97,13,75]],[[34,125,172],[68,57,136],[159,0,82],[255,63,32],[255,190,0]],[[129,237,247],[2,116,143],[247,1,16],[110,5,22],[0,164,192]],[[255,254,1],[255,134,6],[232,59,54],[96,5,56],[70,10,64]],[[51,51,51],[204,204,204],[48,48,48],[221,221,221],[0,0,0]],[[215,0,95],[215,215,0],[38,38,38],[175,0,95],[0,255,255]],[[0,0,170],[255,85,255],[255,255,85],[170,0,0],[85,255,255]],[[255,85,85],[85,255,85],[255,255,85],[85,255,255],[85,85,85]],[[0,0,0],[255,85,255],[85,255,255],[255,0,255],[255,255,255]],[[15,139,141],[168,32,26],[236,154,41],[218,210,216],[20,54,66]]],pId=Math.floor(R()*palettes.length),palette=palettes[pId],vrs=R(),mrr=R()>.6,goe=R()>.6,tp=Math.floor(3*R()),v0A=["1.","2.","4."],v0=v0A[Math.floor(R()*v0A.length)],v1A=["32.","64.","128.","256.","512."],v1=v1A[Math.floor(R()*v1A.length)],v2A=[".25",".5","1.","2."],v2=v2A[Math.floor(R()*v2A.length)],v3A=[".1",".25",".5",".75"],v3=v3A[Math.floor(R()*v3A.length)],v4A=[".5","1.","2."],v4=v4A[Math.floor(R()*v4A.length)],v5A=["2.","4.","5.","6.","8."],v5=v5A[Math.floor(R()*v5A.length)],v6=Math.floor(10*R())+1,v7=R()>.5,v8A=["10.","20.","30."],v8=v8A[Math.floor(R()*v8A.length)],v9=R()+.1,v10A=["1.","5.","10.","20.","40."],v10=v10A[Math.floor(R()*v10A.length)],v11=Math.floor(490*R())+10;pOR=R()>.9;let mR=R()>.5,cnX0=Math.floor(1e3*R()),cnX1=Math.floor(1e3*R()),cnY0=Math.floor(1e3*R()),cnY1=Math.floor(1e3*R()),pO=R();if(pOR)for(let t=0;t<palette.length;t++)palette[t]=hsv2rgb(360*pO,1,.9-2*t*.1);document.body.style.backgroundColor="rgb("+palette[4][0]+","+palette[4][1]+","+palette[4][2]+")";var tick=0;const canvas=document.getElementsByTagName("canvas")[0];canvas.width=DIM,canvas.height=DIM;const gl=canvas.getContext("webgl"),positionsData=new Float32Array([1,1,-1,1,1,-1,-1,-1]),textureData=new Float32Array([1,1,0,1,1,0,0,0]);var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture),texBind();const targetTexture2=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture2),texBind();const bT=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,bT),texBind();const cT=gl.createTexture();function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),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.bindTexture(gl.TEXTURE_2D,cT),texBind();const fb=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fb);var attachmentPoint=gl.COLOR_ATTACHMENT0,level=0;gl.framebufferTexture2D(gl.FRAMEBUFFER,attachmentPoint,gl.TEXTURE_2D,targetTexture,level);let cs=[10,20,25,50],bd=["0.",".25",".75",".9"],c=cs[Math.floor(R()*cs.length)],r=cs[Math.floor(R()*cs.length)],cM=cs[Math.floor(R()*cs.length)],rM=cs[Math.floor(R()*cs.length)],cMO=Math.floor(5*R())+1,rMO=Math.floor(5*R())+1,d2x=Math.floor(R()*c),d2y=Math.floor(R()*r),dAA=["idx /= jF + iF * tick;"],sB=["idx += iF * jF;","idx -= iF * jF;",`idx += iF * ((${DEFAULT_SIZE}. / pxS) - jF);`,`idx += ((${DEFAULT_SIZE}. / pyS) - iF) * jF;`],sBO=sB[Math.floor(R()*sB.length)],rmA=R()>0,rA0=R()>.5,rA1=R()>.5,rA2=R()>.5,rA3=Math.floor(100*R()),rA4=R()>.5,dA=dAA[Math.floor(R()*dAA.length)],bdA=bd[Math.floor(R()*bd.length)];function hsv2rgb(t,e,r){let n=(n,l=(n+t/60)%6)=>r-r*e*Math.max(Math.min(l,4-l,1),0);return[Math.floor(255*n(5)),Math.floor(255*n(3)),Math.floor(255*n(1))]}var gridOffset="ps.x",aDt={},bDta={},compositeData={},fDt={};function compileShader(t,e){var r=gl.createShader(e);if(gl.shaderSource(r,t),gl.compileShader(r),!gl.getShaderParameter(r,gl.COMPILE_STATUS))throw"Shader compile failed with: "+gl.getShaderInfoLog(r);return r}function drawArt(){gl.useProgram(aPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,targetTexture,level),gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(aDt.positionAttribute,2,gl.FLOAT,!1,8,0),gl.enableVertexAttribArray(aDt.positionAttribute),gl.uniform1f(aDt.tickSet,tick),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,texture),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function blendArt(t,e){gl.useProgram(bldPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,e,level);var r=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.uniform1i(bDta.freshTexture,0),gl.activeTexture(gl.TEXTURE1),gl.bindTexture(gl.TEXTURE_2D,cT),gl.uniform1i(bDta.cT,1),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function compositeArt(t){gl.useProgram(compositeProgram),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,cT,level);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function renderFinal(t){gl.useProgram(fPg),gl.bindFramebuffer(gl.FRAMEBUFFER,null);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}let blendFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D freshTexture;\nuniform sampler2D compTexture;\nvoid main() {\n vec3 blend0 = texture2D(freshTexture, vTextureCoord).rgb;\n vec3 blend1 = texture2D(compTexture, vTextureCoord).rgb;\n vec3 compBlend = mix(blend0,blend1,.9);\n gl_FragColor = vec4(compBlend ,1.0);\n}\n",blendFragmentShader=compileShader(blendFSS,gl.FRAGMENT_SHADER),finalFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nvoid main() {\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n}\n",finalFragmentShader=compileShader(finalFSS,gl.FRAGMENT_SHADER),baseVertexString="\nattribute vec2 position;\nattribute vec2 texcoord;\nvarying highp vec2 vTextureCoord;\nvoid main() {\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = texcoord;\n}\n",baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER),compFragmentShaderString="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nvoid main() {\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n}\n",compFragmentShader=compileShader(compFragmentShaderString,gl.FRAGMENT_SHADER),artFragmentString=`\nprecision highp float;\nuniform float tick;\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n\nvoid main()\n{\n vec3 c0 = vec3(${palette[0][0]}. / 255.,${palette[0][1]}. / 255.,${palette[0][2]}. / 255.);\n vec3 c1 = vec3(${palette[1][0]}. / 255.,${palette[1][1]}. / 255.,${palette[1][2]}. / 255.);\n vec3 c2 = vec3(${palette[2][0]}. / 255.,${palette[2][1]}. / 255.,${palette[2][2]}. / 255.);\n vec3 c3 = vec3(${palette[3][0]}. / 255.,${palette[3][1]}. / 255.,${palette[3][2]}. / 255.);\n vec3 c4 = vec3(${palette[4][0]}. / 255.,${palette[4][1]}. / 255.,${palette[4][2]}. / 255.);\n\n\n float w = float(${DIM});\n float M = float(${M});\n vec2 st = gl_FragCoord.xy / M;\n float idx = 0.;\n\n if (${tp} == 0 || ${tp} == 2) {\n if (st.x > 500.) {\n st.x = 1000. - st.x;\n }\n }\n\n if (${rA4}) {\n st = gl_FragCoord.yx / M;\n }\n\n if (${rA1}) {\n st.x = ${DEFAULT_SIZE}. - st.x;\n }\n if (${rA2}) {\n st.y = ${DEFAULT_SIZE}. - st.y;\n }\n\n if (st.x > 500. && ${mR}) {\n st.x = 1000. - st.x;\n }\n if (mod(floor(st.y * M),2.) == 0.) {\n st.y = 1000. - st.y;\n }\n\n\n if (${tp} == 0) {\n //st.x = (st.x * ${v9});\n }\n else if(${tp} == 1) {\n st.x = floor(st.x * ${v0}); \n st.y = floor(st.y * ${v1}); \n }\n else if(${tp} == 2) {\n st.x *= ${v4};\n st.y = (st.x / (st.y + .01)) * ${v5};\n }\n\n vec2 cn = vec2(st.x - ${cnX0}.,st.y - ${cnY0}.);\n vec2 cn2 = vec2(${cnX1}.,${cnY1}.);\n\n if (${tp} == 0) {\n idx = (st.x * 1.) * (st.y * 2.1);\n idx += (st.y * 10.) * (st.y * 2.);\n idx *= distance(cn,st) / st.x;\n \n idx -= st.x - st.y;\n idx -= (st.x / st.y) / .5;\n \n if (st.x > st.y) {\n idx /= floor(st.y / ${v2}) * 20.;\n idx *= 20.;\n }\n else {\n idx /= floor(st.x / ${v3}) * 10.;\n idx /= floor((st.x - ${cnX0}.) / ${vrs} / 2.) * ${v8}; \n\n idx *= (st.x / .5) * 2.; \n idx *= 20.;\n }\n \n idx /= 10.;\n idx += tick * 3.;\n idx /= 20.;\n \n idx += ${vrs} * st.y;\n }\n else if (${tp} == 1) {\n st.x = abs(cn2.x - st.x) / 100.;\n\n idx = (st.x * 1.) * (st.x * 1.);\n idx += (st.y * 10.) * (st.y * 2.);\n idx -= distance(cn,st) * st.x;\n \n idx *= (st.x / st.y) / 25.; \n idx /= floor(st.x / .5) * 10.;\n idx /= 10.;\n idx += tick * 2.;\n idx /= 10.;\n idx += ${v11}./st.x; \n }\n else if (${tp} == 2) {\n idx = (st.x * .01) * (st.x * .01);\n idx += (st.y * 10.) * (st.y * 2.);\n \n if (st.x > st.y) {\n idx += st.x - st.y;\n }\n idx += st.x - st.y;\n \n if (mod(floor(st.y / 2.),2.) == 0.) {\n idx *= ${v6}.;\n } \n \n if (mod(floor(st.x),4.) == 0.) {\n idx /= 2.;\n }\n else {\n idx /= 2.;\n }\n \n if (mod(st.y,2.) == 0.) {\n idx *= (floor(st.x / 200.) + 200.) / 2.;\n }\n else {\n idx *= (floor(st.y / 200.) + 200.) / 10.;\n }\n \n if (${v7}) {\n idx *= (st.x / st.y) / 100.;\n }\n \n if (st.x > st.y) {\n idx /= floor(st.y / 1.) * 50.; \n }\n else {\n idx /= floor(st.x / .1) * 200.;\n }\n\n idx += tick / 2.;\n idx /= 2.;\n }\n \n idx *= 1.5;\n idx = abs(mod(idx,50.));\n \n if (idx < 10.) {\n \n gl_FragColor = vec4(c0.x,c0.y,c0.z,1.);\n }\n else if (idx < 20.) {\n gl_FragColor = vec4(c1.x,c1.y,c1.z,1.);\n }\n else if (idx < 30.) {\n gl_FragColor = vec4(c2.x,c2.y,c2.z,1.);\n }\n else if (idx < 40.) {\n gl_FragColor = vec4(c3.x,c3.y,c3.z,1.);\n }\n else {\n gl_FragColor = vec4(c4.x,c4.y,c4.z,1.);\n }\n}\n`;var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);const aPg=gl.createProgram();gl.attachShader(aPg,baseVertShader),gl.attachShader(aPg,artFragmentShader),gl.linkProgram(aPg);const bldPg=gl.createProgram();gl.attachShader(bldPg,baseVertShader),gl.attachShader(bldPg,blendFragmentShader),gl.linkProgram(bldPg);const compositeProgram=gl.createProgram();gl.attachShader(compositeProgram,baseVertShader),gl.attachShader(compositeProgram,compFragmentShader),gl.linkProgram(compositeProgram);const fPg=gl.createProgram();if(gl.attachShader(fPg,baseVertShader),gl.attachShader(fPg,finalFragmentShader),gl.linkProgram(fPg),!gl.getProgramParameter(aPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(aPg)),new Error("Failed to link art program");if(!gl.getProgramParameter(bldPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(bldPg)),new Error("Failed to link blend program");if(!gl.getProgramParameter(compositeProgram,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(compositeProgram)),new Error("Failed to link composite program");if(!gl.getProgramParameter(fPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(fPg)),new Error("Failed to link final program");const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW),aDt.positionAttribute=gl.getAttribLocation(aPg,"position"),aDt.colorOffset=gl.getUniformLocation(aPg,"colorOffset"),aDt.hues=gl.getUniformLocation(aPg,"hues"),aDt.sats=gl.getUniformLocation(aPg,"sats"),aDt.brights=gl.getUniformLocation(aPg,"brights"),aDt.tickSet=gl.getUniformLocation(aPg,"tick"),bDta.positionAttribute=gl.getAttribLocation(bldPg,"position"),bDta.textureAttribute=gl.getAttribLocation(bldPg,"texcoord"),bDta.cT=gl.getUniformLocation(bldPg,"compTexture"),bDta.freshTexture=gl.getUniformLocation(bldPg,"freshTexture"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position"),fDt.textureAttribute=gl.getAttribLocation(fPg,"texcoord"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position");let cft,cD=!0,lft=0;function draw(){cft=Date.now(),cD&&lft>0&&(drawArt(),blendArt(targetTexture,bT),compositeArt(bT),renderFinal(cT),(tick+=(cft-lft)/16)>11e6&&(tick=0)),lft=cft,requestAnimationFrame(draw)}requestAnimationFrame(draw),document.body.addEventListener("click",function(t){cD=!cD}),document.addEventListener("keydown",function(t){cD=!cD});
S=Uint32Array.from([0,1,s=t=2,3].map(t=>parseInt(tokenData.hash.substr(8*t+2,8),16))),R=(e=>(t=S[3],S[3]=S[2],S[2]=S[1],S[1]=s=S[0],t^=t<<11,S[0]^=t^t>>>8^s>>>19,S[0]/2**32));var DEFAULT_SIZE=1e3,DIM=Math.min(window.innerWidth,window.innerHeight),M=DIM/DEFAULT_SIZE;let palettes=[[[116,2,17],[208,169,160],[143,58,96],[195,90,102],[36,0,4]],[[175,212,204],[133,186,106],[26,119,73],[11,46,47],[1,18,28]],[[0,18,68],[0,80,134],[49,143,181],[176,202,199],[247,214,191]],[[249,222,89],[232,166,40],[249,131,101],[195,49,36],[161,223,251]],[[30,5,33],[1,11,139],[254,204,80],[11,231,251],[255,109,105]],[[17,16,16],[208,204,209],[233,255,136],[254,10,183],[229,1,133]],[[179,231,220],[166,180,1],[239,246,123],[213,1,2],[108,1,2]],[[36,224,184],[255,204,81],[255,139,118],[255,48,49],[0,123,0]],[[169,67,0],[255,176,0],[91,155,55],[21,61,2],[255,223,0]],[[161,5,50],[255,111,169],[0,183,204],[0,95,129],[255,208,204]],[[99,26,17],[187,96,47],[203,130,20],[68,64,101],[239,216,131]],[[48,4,61],[142,31,81],[229,64,89],[222,131,127],[253,179,106]],[[10,0,48],[255,251,196],[182,190,246],[53,30,191],[16,1,93]],[[140,7,20],[252,64,124],[27,78,136],[5,8,30],[250,240,228]],[[0,0,63],[1,0,142],[144,1,245],[254,0,234],[255,1,120]],[[8,44,68],[114,234,245],[254,230,226],[255,169,76],[254,44,137]],[[1,99,141],[171,206,204],[255,242,205],[255,0,76],[97,13,75]],[[34,125,172],[68,57,136],[159,0,82],[255,63,32],[255,190,0]],[[129,237,247],[2,116,143],[247,1,16],[110,5,22],[0,164,192]],[[255,254,1],[255,134,6],[232,59,54],[96,5,56],[70,10,64]],[[51,51,51],[204,204,204],[48,48,48],[221,221,221],[0,0,0]],[[215,0,95],[215,215,0],[38,38,38],[175,0,95],[0,255,255]],[[0,0,170],[255,85,255],[255,255,85],[170,0,0],[85,255,255]],[[255,85,85],[85,255,85],[255,255,85],[85,255,255],[85,85,85]],[[0,0,0],[255,85,255],[85,255,255],[255,0,255],[255,255,255]],[[15,139,141],[168,32,26],[236,154,41],[218,210,216],[20,54,66]]],pId=Math.floor(R()*palettes.length),palette=palettes[pId],vrs=R(),mrr=R()>.6,goe=R()>.6,tp=Math.floor(3*R()),v0A=["1.","2.","4."],v0=v0A[Math.floor(R()*v0A.length)],v1A=["32.","64.","128.","256.","512."],v1=v1A[Math.floor(R()*v1A.length)],v2A=[".25",".5","1.","2."],v2=v2A[Math.floor(R()*v2A.length)],v3A=[".1",".25",".5",".75"],v3=v3A[Math.floor(R()*v3A.length)],v4A=[".5","1.","2."],v4=v4A[Math.floor(R()*v4A.length)],v5A=["2.","4.","5.","6.","8."],v5=v5A[Math.floor(R()*v5A.length)],v6=Math.floor(10*R())+1,v7=R()>.5,v8A=["10.","20.","30."],v8=v8A[Math.floor(R()*v8A.length)],v9=R()+.1,v10A=["1.","5.","10.","20.","40."],v10=v10A[Math.floor(R()*v10A.length)],v11=Math.floor(490*R())+10;pOR=R()>.9;let mR=R()>.5,cnX0=Math.floor(1e3*R()),cnX1=Math.floor(1e3*R()),cnY0=Math.floor(1e3*R()),cnY1=Math.floor(1e3*R()),pO=R();if(pOR)for(let t=0;t<palette.length;t++)palette[t]=hsv2rgb(360*pO,1,.9-2*t*.1);document.body.style.backgroundColor="rgb("+palette[4][0]+","+palette[4][1]+","+palette[4][2]+")";var tick=0;const canvas=document.getElementsByTagName("canvas")[0];canvas.width=DIM,canvas.height=DIM;const gl=canvas.getContext("webgl"),positionsData=new Float32Array([1,1,-1,1,1,-1,-1,-1]),textureData=new Float32Array([1,1,0,1,1,0,0,0]);var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture),texBind();const targetTexture2=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture2),texBind();const bT=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,bT),texBind();const cT=gl.createTexture();function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),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.bindTexture(gl.TEXTURE_2D,cT),texBind();const fb=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fb);var attachmentPoint=gl.COLOR_ATTACHMENT0,level=0;gl.framebufferTexture2D(gl.FRAMEBUFFER,attachmentPoint,gl.TEXTURE_2D,targetTexture,level);let cs=[10,20,25,50],bd=["0.",".25",".75",".9"],c=cs[Math.floor(R()*cs.length)],r=cs[Math.floor(R()*cs.length)],cM=cs[Math.floor(R()*cs.length)],rM=cs[Math.floor(R()*cs.length)],cMO=Math.floor(5*R())+1,rMO=Math.floor(5*R())+1,d2x=Math.floor(R()*c),d2y=Math.floor(R()*r),dAA=["idx /= jF + iF * tick;"],sB=["idx += iF * jF;","idx -= iF * jF;",`idx += iF * ((${DEFAULT_SIZE}. / pxS) - jF);`,`idx += ((${DEFAULT_SIZE}. / pyS) - iF) * jF;`],sBO=sB[Math.floor(R()*sB.length)],rmA=R()>0,rA0=R()>.5,rA1=R()>.5,rA2=R()>.5,rA3=Math.floor(100*R()),rA4=R()>.5,dA=dAA[Math.floor(R()*dAA.length)],bdA=bd[Math.floor(R()*bd.length)];function hsv2rgb(t,e,r){let n=(n,l=(n+t/60)%6)=>r-r*e*Math.max(Math.min(l,4-l,1),0);return[Math.floor(255*n(5)),Math.floor(255*n(3)),Math.floor(255*n(1))]}var gridOffset="ps.x",aDt={},bDta={},compositeData={},fDt={};function compileShader(t,e){var r=gl.createShader(e);if(gl.shaderSource(r,t),gl.compileShader(r),!gl.getShaderParameter(r,gl.COMPILE_STATUS))throw"Shader compile failed with: "+gl.getShaderInfoLog(r);return r}function drawArt(){gl.useProgram(aPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,targetTexture,level),gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(aDt.positionAttribute,2,gl.FLOAT,!1,8,0),gl.enableVertexAttribArray(aDt.positionAttribute),gl.uniform1f(aDt.tickSet,tick),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,texture),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function blendArt(t,e){gl.useProgram(bldPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,e,level);var r=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.uniform1i(bDta.freshTexture,0),gl.activeTexture(gl.TEXTURE1),gl.bindTexture(gl.TEXTURE_2D,cT),gl.uniform1i(bDta.cT,1),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,r,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function compositeArt(t){gl.useProgram(compositeProgram),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,cT,level);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function renderFinal(t){gl.useProgram(fPg),gl.bindFramebuffer(gl.FRAMEBUFFER,null);var e=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,e,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,t),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}let blendFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D freshTexture;\nuniform sampler2D compTexture;\nvoid main() {\n vec3 blend0 = texture2D(freshTexture, vTextureCoord).rgb;\n vec3 blend1 = texture2D(compTexture, vTextureCoord).rgb;\n vec3 compBlend = mix(blend0,blend1,.9);\n gl_FragColor = vec4(compBlend ,1.0);\n}\n",blendFragmentShader=compileShader(blendFSS,gl.FRAGMENT_SHADER),finalFSS="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nvoid main() {\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n}\n",finalFragmentShader=compileShader(finalFSS,gl.FRAGMENT_SHADER),baseVertexString="\nattribute vec2 position;\nattribute vec2 texcoord;\nvarying highp vec2 vTextureCoord;\nvoid main() {\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = texcoord;\n}\n",baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER),compFragmentShaderString="\nprecision highp float;\nvarying highp vec2 vTextureCoord;\nuniform sampler2D u_texture;\nvoid main() {\n gl_FragColor = texture2D(u_texture, vTextureCoord);\n}\n",compFragmentShader=compileShader(compFragmentShaderString,gl.FRAGMENT_SHADER),artFragmentString=`\nprecision highp float;\nuniform float tick;\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n\nvoid main()\n{\n vec3 c0 = vec3(${palette[0][0]}. / 255.,${palette[0][1]}. / 255.,${palette[0][2]}. / 255.);\n vec3 c1 = vec3(${palette[1][0]}. / 255.,${palette[1][1]}. / 255.,${palette[1][2]}. / 255.);\n vec3 c2 = vec3(${palette[2][0]}. / 255.,${palette[2][1]}. / 255.,${palette[2][2]}. / 255.);\n vec3 c3 = vec3(${palette[3][0]}. / 255.,${palette[3][1]}. / 255.,${palette[3][2]}. / 255.);\n vec3 c4 = vec3(${palette[4][0]}. / 255.,${palette[4][1]}. / 255.,${palette[4][2]}. / 255.);\n\n\n float w = float(${DIM});\n float M = float(${M});\n vec2 st = gl_FragCoord.xy / M;\n float idx = 0.;\n\n if (${tp} == 0 || ${tp} == 2) {\n if (st.x > 500.) {\n st.x = 1000. - st.x;\n }\n }\n\n if (${rA4}) {\n st = gl_FragCoord.yx / M;\n }\n\n if (${rA1}) {\n st.x = ${DEFAULT_SIZE}. - st.x;\n }\n if (${rA2}) {\n st.y = ${DEFAULT_SIZE}. - st.y;\n }\n\n if (st.x > 500. && ${mR}) {\n st.x = 1000. - st.x;\n }\n if (mod(floor(st.y),2.) == 0.) {\n st.y = 1000. - st.y;\n }\n\n\n if (${tp} == 0) {\n //st.x = (st.x * ${v9});\n }\n else if(${tp} == 1) {\n st.x = floor(st.x * ${v0}); \n st.y = floor(st.y * ${v1}); \n }\n else if(${tp} == 2) {\n st.x *= ${v4};\n st.y = (st.x / (st.y + .01)) * ${v5};\n }\n\n vec2 cn = vec2(st.x - ${cnX0}.,st.y - ${cnY0}.);\n vec2 cn2 = vec2(${cnX1}.,${cnY1}.);\n\n if (${tp} == 0) {\n idx = (st.x * 1.) * (st.y * 2.1);\n idx += (st.y * 10.) * (st.y * 2.);\n idx *= distance(cn,st) / st.x;\n \n idx -= st.x - st.y;\n idx -= (st.x / st.y) / .5;\n \n if (st.x > st.y) {\n idx /= floor(st.y / ${v2}) * 20.;\n idx *= 20.;\n }\n else {\n idx /= floor(st.x / ${v3}) * 10.;\n idx /= floor((st.x - ${cnX0}.) / ${vrs} / 2.) * ${v8}; \n\n idx *= (st.x / .5) * 2.; \n idx *= 20.;\n }\n \n idx /= 10.;\n idx += tick * 3.;\n idx /= 20.;\n \n idx += ${vrs} * st.y;\n }\n else if (${tp} == 1) {\n st.x = abs(cn2.x - st.x) / 100.;\n\n idx = (st.x * 1.) * (st.x * 1.);\n idx += (st.y * 10.) * (st.y * 2.);\n idx -= distance(cn,st) * st.x;\n \n idx *= (st.x / st.y) / 25.; \n idx /= floor(st.x / .5) * 10.;\n idx /= 10.;\n idx += tick * 2.;\n idx /= 10.;\n idx += ${v11}./st.x; \n }\n else if (${tp} == 2) {\n idx = (st.x * .01) * (st.x * .01);\n idx += (st.y * 10.) * (st.y * 2.);\n \n if (st.x > st.y) {\n idx += st.x - st.y;\n }\n idx += st.x - st.y;\n \n if (mod(floor(st.y / 2.),2.) == 0.) {\n idx *= ${v6}.;\n } \n \n if (mod(floor(st.x),4.) == 0.) {\n idx /= 2.;\n }\n else {\n idx /= 2.;\n }\n \n if (mod(st.y,2.) == 0.) {\n idx *= (floor(st.x / 200.) + 200.) / 2.;\n }\n else {\n idx *= (floor(st.y / 200.) + 200.) / 10.;\n }\n \n if (${v7}) {\n idx *= (st.x / st.y) / 100.;\n }\n \n if (st.x > st.y) {\n idx /= floor(st.y / 1.) * 50.; \n }\n else {\n idx /= floor(st.x / .1) * 200.;\n }\n\n idx += tick / 2.;\n idx /= 2.;\n }\n \n idx *= 1.5;\n idx = abs(mod(idx,50.));\n \n if (idx < 10.) {\n \n gl_FragColor = vec4(c0.x,c0.y,c0.z,1.);\n }\n else if (idx < 20.) {\n gl_FragColor = vec4(c1.x,c1.y,c1.z,1.);\n }\n else if (idx < 30.) {\n gl_FragColor = vec4(c2.x,c2.y,c2.z,1.);\n }\n else if (idx < 40.) {\n gl_FragColor = vec4(c3.x,c3.y,c3.z,1.);\n }\n else {\n gl_FragColor = vec4(c4.x,c4.y,c4.z,1.);\n }\n}\n`;var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);const aPg=gl.createProgram();gl.attachShader(aPg,baseVertShader),gl.attachShader(aPg,artFragmentShader),gl.linkProgram(aPg);const bldPg=gl.createProgram();gl.attachShader(bldPg,baseVertShader),gl.attachShader(bldPg,blendFragmentShader),gl.linkProgram(bldPg);const compositeProgram=gl.createProgram();gl.attachShader(compositeProgram,baseVertShader),gl.attachShader(compositeProgram,compFragmentShader),gl.linkProgram(compositeProgram);const fPg=gl.createProgram();if(gl.attachShader(fPg,baseVertShader),gl.attachShader(fPg,finalFragmentShader),gl.linkProgram(fPg),!gl.getProgramParameter(aPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(aPg)),new Error("Failed to link art program");if(!gl.getProgramParameter(bldPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(bldPg)),new Error("Failed to link blend program");if(!gl.getProgramParameter(compositeProgram,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(compositeProgram)),new Error("Failed to link composite program");if(!gl.getProgramParameter(fPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(fPg)),new Error("Failed to link final program");const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW),aDt.positionAttribute=gl.getAttribLocation(aPg,"position"),aDt.colorOffset=gl.getUniformLocation(aPg,"colorOffset"),aDt.hues=gl.getUniformLocation(aPg,"hues"),aDt.sats=gl.getUniformLocation(aPg,"sats"),aDt.brights=gl.getUniformLocation(aPg,"brights"),aDt.tickSet=gl.getUniformLocation(aPg,"tick"),bDta.positionAttribute=gl.getAttribLocation(bldPg,"position"),bDta.textureAttribute=gl.getAttribLocation(bldPg,"texcoord"),bDta.cT=gl.getUniformLocation(bldPg,"compTexture"),bDta.freshTexture=gl.getUniformLocation(bldPg,"freshTexture"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position"),fDt.textureAttribute=gl.getAttribLocation(fPg,"texcoord"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position");let cft,cD=!0,lft=0;function draw(){cft=Date.now(),cD&&lft>0&&(drawArt(),blendArt(targetTexture,bT),compositeArt(bT),renderFinal(cT),(tick+=(cft-lft)/16)>11e6&&(tick=0)),lft=cft,requestAnimationFrame(draw)}requestAnimationFrame(draw),document.body.addEventListener("click",function(t){cD=!cD}),document.addEventListener("keydown",function(t){cD=!cD});
S=Uint32Array.from([0,1,s=t=2,3].map(i=>parseInt(tokenData.hash.substr(i*8+2,8),16)));R=_=>(t=S[3],S[3]=S[2],S[2]=S[1],S[1]=s=S[0],t^=t<<11,S[0]^=(t^t>>>8)^(s>>>19),S[0]/2**32);'tx piter, you rock :)';let acH = `<svg width="1024" height="224" viewBox="0 0 1024 224" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect width="1024" height="224" fill="white"/> <path d="M995.432 124.388V102.958H954.372L995.432 52.0077V30.5777H904.509V200.094H999V178.664L955.305 124.388H995.432ZM759.043 30.5777V200.094H802.254C824.46 199.77 845.647 190.697 861.236 174.837C876.824 158.977 885.563 137.604 885.563 115.336C885.563 93.0681 876.824 71.6945 861.236 55.8345C845.647 39.9745 824.46 30.9019 802.254 30.5777H759.043ZM740.862 115.327C740.862 67.4869 702.869 28.9057 656.34 28.9057C609.812 28.9057 571.567 67.4869 571.567 115.327C571.567 163.167 609.561 202 656.34 202C703.12 202 740.862 163.185 740.862 115.327ZM511.825 115.327L565.489 48.43C550.525 35.6333 531.492 28.6196 511.825 28.654C465.045 28.672 427.231 67.4869 427.231 115.327C427.231 163.167 464.884 202 511.753 202C531.421 202.034 550.453 195.021 565.417 182.224L511.825 115.327ZM302.259 30.5777V52.0077H335.268V200.094H392.25V52.0077H425.026V30.5777H302.259ZM245.618 125.089C251.885 125.212 258.113 124.08 263.938 121.76C269.763 119.44 275.068 115.979 279.543 111.579C284.018 107.179 287.572 101.928 289.999 96.1335C292.426 90.3392 293.676 84.1178 293.676 77.8334C293.676 71.5489 292.426 65.3276 289.999 59.5333C287.572 53.739 284.018 48.4881 279.543 44.0879C275.068 39.6876 269.763 36.2264 263.938 33.9066C258.113 31.5868 251.885 30.4551 245.618 30.5777H182.864V200.094H305.612L245.618 125.089ZM23 200.094H167.121L95.1861 27L23 200.094Z" stroke="black" stroke-width="2" stroke-miterlimit="9.24"/> <path d="M647 90V96.2438H651.896V140H659V90H647Z" fill="black"/> </svg> `;let svgd = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(acH)}` let bS=f=>beginShape(),inv=.5<R();var canvas,DS=1024,DIM=Math.min(window.innerWidth,window.innerHeight),M=DIM/DS;let cMn=Math.floor(14*R()),cMx=Math.floor(15*R())-cMn,stms=.2<R(),pdm=.5<R(),flt=.9<R(),uTB=.75<R(),uOvr=.7<R(),uOvrv=.5<R(),fTf=.75<R(),fct=.85<R(),cPat=R(),os=DIM/2,c=Math.pow(2,Math.floor(5*R())+4),r=Math.pow(2,Math.floor(4*R())+4),an=!1;var frameOffset=0;let gA=Math.floor(128*R())+2,gB=Math.floor(128*R())+2,gC=Math.floor(128*R())+2,agp,ahd,ahdV=!1,gm=R(),gmO=.7<R(),wFr=.8<R();fTf&&(wFr=!1);let fld=c<32&&r<128&&!fTf,fldT=R(),flOsc=stms&&!flt&&c<128;flOsc||(wFr=!1);let palettes=[["#740211","#d0a9a0","#8f3a60","#c35a66","#240004"],["#afd4cc","#85ba6a","#1a7749","#0b2e2f","#01121c"],["#001244","#005086","#318fb5","#b0cac7","#f7d6bf"],["#8c4219","#f39558","#eec8b0","#f1ece7","#f7d96d"],["#b3e7dc","#a6b401","#eff67b","#d50102","#6c0102"],["#007b00","#24e0b8","#ffcc51","#ff8b76","#ff3031"],["#a94300","#ffb000","#ffdf00","#5b9b37","#153d02"],["#a10532","#ff6fa9","#ffd0cc","#00b7cc","#005f81"],["#631a11","#bb602f","#efd883","#cb8214","#444065"],["#30043d","#8e1f51","#e54059","#de837f","#fdb36a"],["#fffbc4","#b6bef6","#351ebf","#10015d","#0a0030"],["#8c0714","#fc407c","#1b4e88","#05081e","#faf0e4"],["#082c44","#72eaf5","#fee6e2","#ffa94c","#fe2c89"],["#01638d","#abcecc","#fff2cd","#ff004c","#610d4b"],["#227dac","#443988","#9f0052","#ff3f20","#ffbe00"],["#81edf7","#00a4c0","#02748f","#f70110","#6e0516"],["#fffe01","#ff8606","#e83b36","#600538","#460a40"],["#333333","#cccccc","#303030","#dddddd","#000000"],["#000000","#ff55ff","#55ffff","#ff00ff","#ffffff"],["#dad2d8","#143642","#0f8b8d","#ec9a29","#a8201a"]],bgc,fxC=.8<R(),invC=.5<R(),pvO=.95<R(),pVOI=.5<R(),mno=.95<R(),bh;pvO&&(bh=Math.floor(360*R()),mno=!1),mno&&(pvO=!1);let pId=Math.floor(R()*palettes.length),palette=palettes[pId],wgl=!1;function m(f){return f*M}let objs=[];function setup(){if(ahd=loadImage(svgd),c<64||r<64&&256!=c&&32!=r&&256!=c&&128!=r?(os=0,canvas=createCanvas(DIM,DIM),agp=createGraphics(DIM,DIM)):(wgl=!0,canvas=createCanvas(DIM,DIM,WEBGL),agp=createGraphics(DIM,DIM,WEBGL),agp.setAttributes("antialias",!0)),agp.colorMode(HSB,360,100,100),agp.noStroke(),pvO){palette=[];for(let f=0;f<5;f++)0==f?pVOI?palette.push(agp.color(bh,100,100)):palette.push(agp.color(bh,100,10)):pVOI?palette.push(agp.color(bh,100,10+15*(f-1))):palette.push(agp.color(bh,100,100-15*(f-1)))}if(mno){palette=[];for(let f=0;f<5;f++)0==f?pVOI?palette.push(agp.color(0,0,10)):palette.push(agp.color(0,0,70)):pVOI?palette.push(agp.color(0,0,70)):palette.push(agp.color(0,0,10))}bgc=agp.color(palette[floor(R()*palette.length)]),(pvO||mno)&&(bgc=palette[0]);for(let f=0;f<palette.length;f++)palette[f]=agp.color(palette[f]);let e=createVector(floor(R()*(DS/c)),floor(R()*(DS/r))),t=createVector(floor(R()*(DS/c)),floor(R()*(DS/r))),o=[],a=[];for(let f=0;f<DS/c;f++)flOsc&&fct?(o.push(floor(R()*(DS/r/1.5-2))),a.push(floor(R()*(DS/r/1.5-2)))):(o.push(0),a.push(0));let D=0,u=!1;for(let d=0;d<DS/r;d++)if(d,!(stms&&!flt&&d<2))for(let h=0;h<DS/c;h++)if(u=!1,0!=d&&0!=h&&h+1!=DS/c&&d+1!=DS/r&&h%gA!=0&&h%gB!=0&&h%gC!=0&&!(d<=o[h])){if(uTB){if(d>=DS/r-a[d])continue}else if(d>=DS/r-a[h])continue;var S=createVector(h,d);R();var M,V=e.dist(S);let f=e.dist(S);f=128*R()-64,f=S.x%2*64;let O=0,v=!1;pdm&&S.x<DS/c/2&&(v=!0,f=t.dist(S),O=m(c)),f=f%r*c,f+=S.x/(S.y+1),R()>R()&&(f=S.y*S.x/(8*R())),.1<R()&&c<256&&(u=!0,f=R()*DS+DS/2),.7<R()&&S.x,flt&&(f=c);let i;fill(0,0,inv?70:20),i=cPat<.25?floor(V)%palette.length:cPat<.5?floor((S.x+S.y)/2)%palette.length:cPat<.75?floor(S.x*S.y/2)%palette.length:floor(abs(sin(S.x/4)*S.y))%palette.length;let g=stms?r-f:0;if(256==c&&(g=0),uOvr?g=uOvrv?r:0:.5<R()&&(g=r),!(g&&f==c&&m(S.y*r+g)<m(r))){let f=!1;m(S.y*r+g)<m(r)&&(f=!0);let e,t;if(e=u||flt?(t=v?m(S.x*c):m(S.x*c+c),m(S.y*r+g)):(t=m(S.x*c+c)-O,max(m(S.y*r+g),m(r))),f&&(t=m(S.x*c+c),M=R()*(S.y*r)-r+r,e=m(M)),32<c&&32<r&&fTf&&(e=m(r)),c<32&&r<128&&!fTf&&(e=m(R()*r*(DS/r))),fld)if(fldT<.3){if(S.y>DS/r/4)continue}else if(fldT<.6&&S.y>DS/r/2)continue;let o;o=flOsc&&wFr?(j=c,x=m(R()*j),x=m(V/(DS/r)*j%j),x=min(x,m(c/1.5)),v?createVector(t+x-os,m(DS)-e-os):createVector(t-x-os,m(DS)-e-os)):createVector(t-os,m(DS)-e-os);var j=createVector(m(S.x*c)+O-os,m(DS)-m(S.y*r)-os),x=createVector(m(S.x*c)+O-os,m(DS)-m(S.y*r+r)-os),S=abs(j.x-o.x);let a,l,b,s=0,p=!1,n=!1;gm<.15?(b=D%5*20,s=D%10*5+10,a=floor(100*R())+50,l=a):gm<.3?(a=256==c?floor(200*R())+100:floor(100*R())+50,b=floor(V)+1,l=a,p=!0,n=!0):gm<.5?(a=256==c?floor(200*R())+100:floor(100*R())+50,b=1,l=a,p=!0,n=!0):l=(gm<.7?(b=h*d%8+50,s=h*d%8+25,a=50*i+25):b=gm<.85?(a=i%4*50+50,i%4*50+50):(a=floor(50*R())+25,200),a),objs.push({v0:j,v1:o,v2:x,h:hue(palette[i]),s:saturation(palette[i]),b:brightness(palette[i]),w:S,viD:b,hiD:s,fiD:a,foD:l,aT:0,rvO:b,rvV:100,rvD:0,rvA:!1,rvOfs:0,rvSO:!1,rVV:p,rVH:n}),D++}}}let cOb,ltt;function draw(){agp.background(bgc);for(let f=0;f<objs.length;f++)cOb=objs[f],ltt=frameCount-cOb.rvOfs-1,an?(0==cOb.rvD&&(0==cOb.foD?agp.fill(cOb.h,cOb.s,cOb.b,0):agp.fill(cOb.h,cOb.s,cOb.b,lerp(1,0,ltt/cOb.foD)),ltt==cOb.foD&&(objs[f].rvD=1,objs[f].rvOfs=frameCount,ltt=frameCount-cOb.rvOfs)),1==cOb.rvD&&ltt==cOb.hiD&&(cOb.rVV&&(objs[f].rvVS=256==c?floor(200*R())+100:floor(100*R())+50,objs[f].rvHS=objs[f].rvVS),agp.fill(cOb.h,cOb.s,cOb.b,0),objs[f].rvD=2,objs[f].rvOfs=frameCount,ltt=frameCount-cOb.rvOfs),2==cOb.rvD&&(0==cOb.fiD?agp.fill(cOb.h,cOb.s,cOb.b,1):agp.fill(cOb.h,cOb.s,cOb.b,lerp(0,1,ltt/cOb.fiD)),ltt==cOb.fiD&&(objs[f].rvD=3,objs[f].rvOfs=frameCount,ltt=frameCount-cOb.rvOfs)),3==cOb.rvD&&(agp.fill(cOb.h,cOb.s,cOb.b,1),ltt==cOb.viD&&(cOb.rVH&&(objs[f].rvVS=256==c?floor(200*R())+100:floor(100*R())+50,objs[f].rvHS=objs[f].rvVS),objs[f].rvD=0,objs[f].rvOfs=frameCount,ltt=frameCount-cOb.rvOfs))):agp.fill(cOb.h,cOb.s,cOb.b),agp.beginShape(),agp.vertex(objs[f].v0.x,objs[f].v0.y),agp.vertex(objs[f].v1.x,objs[f].v1.y),agp.vertex(objs[f].v2.x,objs[f].v2.y),agp.endShape();image(agp,-os,-os),ahdV&&image(ahd,-os,-os,1024*M,224*M)}function perform(){if(an=!an,an)for(let f=0;f<objs.length;f++)objs[f].rvSO=!0,objs[f].rvD=0,objs[f].rvOfs=frameCount}function keyPressed(){ahdV=!ahdV}function doubleClicked(){ahdV=!ahdV}function mouseClicked(){perform()}
A visual abstraction of musical performances. Each "Ensemble" is solely composed of triangles, which represent the components of written music notes (stem, flag, notehead). The triangular notes animate in the rhythm of musical styles: Tremolo, Vivace, Rondo, Flourish, Call and Response, Capriccio. In the absence of sound, the animation highlights the exchange of ideas among a group of musicians during a performance. A written composition provides musicians with direction, expecting live performers to apply their own influences and flair. "Ensemble" draws a comparison between musical performance and on-chain generative art. The cryptographic hash provides a unique composition of letters and numbers, which is interpreted and performed by the artist’s code. Click to start the performance! Press any key or double click to show/hide the ARTCODE header. *Photosensitive seizure warning: These artworks contain flashing colors and moving patterns.
In this optical parade, motion is created from the harmonious expansion and contraction of colorful bars. Click to pause. *Photosensitive seizure warning: These artworks contain flashing colors and moving patterns. Dutch auction starting at 2 Eth and proceeding through the following tiers every 5 minutes until a resting price of .5 Eth is reached: 2 -> 1.5 -> 1 -> .5
S=Uint32Array.from([0,1,s=t=2,3].map(i=>parseInt(tokenData.hash.substr(i*8+2,8),16)));R=_=>(t=S[3],S[3]=S[2],S[2]=S[1],S[1]=s=S[0],t^=t<<11,S[0]^=(t^t>>>8)^(s>>>19),S[0]/2**32);'tx piter, you rock :)' var DEFAULT_SIZE=1024;var DIM=Math.min(window.innerWidth,window.innerHeight) var M=DIM/DEFAULT_SIZE let we=Math.floor(R(255)+1);let mW=Math.floor(R(8)+1)*20;let palettes=[[[249,222,89],[232,166,40],[249,131,101],[195,49,36],[161,223,251]],[[30,5,33],[1,11,139],[254,204,80],[11,231,251],[255,109,105]],[[17,16,16],[208,204,209],[233,255,136],[254,10,183],[229,1,133]],[[179,231,220],[166,180,1],[239,246,123],[213,1,2],[108,1,2]],[[36,224,184],[255,204,81],[255,139,118],[255,48,49],[0,123,0]],[[169,67,0],[255,176,0],[91,155,55],[21,61,2],[255,223,0]],[[161,5,50],[255,111,169],[0,183,204],[0,95,129],[255,208,204]],[[246,213,31],[95,165,90],[1,180,188],[250,137,37],[250,84,87]],[[99,26,17],[187,96,47],[203,130,20],[68,64,101],[239,216,131]],[[48,4,61],[142,31,81],[229,64,89],[222,131,127],[253,179,106]],[[10,0,48],[255,251,196],[182,190,246],[53,30,191],[16,1,93]],[[140,7,20],[252,64,124],[27,78,136],[5,8,30],[250,240,228]],[[0,0,63],[1,0,142],[144,1,245],[254,0,234],[255,1,120]],[[8,44,68],[114,234,245],[254,230,226],[255,169,76],[254,44,137]],[[1,99,141],[171,206,204],[255,242,205],[255,0,76],[97,13,75]],[[34,125,172],[68,57,136],[159,0,82],[255,63,32],[255,190,0]],[[129,237,247],[2,116,143],[247,1,16],[110,5,22],[0,164,192]],[[255,254,1],[255,134,6],[232,59,54],[96,5,56],[70,10,64]],[[51,51,51],[204,204,204],[48,48,48],[221,221,221],[0,0,0]],[[215,0,95],[215,215,0],[38,38,38],[175,0,95],[0,255,255]],[[0,0,170],[255,85,255],[255,255,85],[170,0,0],[85,255,255]],[[255,85,85],[85,255,85],[255,255,85],[85,255,255],[85,85,85]],[[0,0,0],[255,85,255],[85,255,255],[255,0,255],[255,255,255]],[[0,0,0],[0,85,0],[0,170,0],[170,0,0],[170,85,0]],[[15,139,141],[168,32,26],[236,154,41],[218,210,216],[20,54,66]]] let radiations=["vec3(1.,1.,0.)","vec3(1.,0.,0.)","vec3(0.,1.,1.)","vec3(0.,0.,1.)","vec3(1.,0.,1.)","vec3(0.,1.,0.)","vec3(1.,1.,1.)","vec3(0.,0.,0.)","vec3(1.,2.,3.)",] let rad=gV(radiations) let cls=rad==="vec3(0.,0.,0.)"?!0:!1;let rbw=rad==="vec3(1.,2.,3.)"?!0:!1;if(rbw){cls=!1} let pId=Math.floor(R()*palettes.length);let pT=Math.floor(R()*16);let pq=palettes[pId];let rbwS=[`(iF + jF)`,`(iF - jF)`,`(jF - iF)`,`abs(jF - iF)`] let mwSM=[`mX /= .25;`,`mX /= .5;`,`mX /= 2.;`,`mX /= 4.;`,`mX /= 8.;`,] let mwS=[`mX = bcSize;`,`mX = bcSize * float(${mW});${gV(mwSM)}`,`mX = bcSize * (abs(jF - (float(bc) / 2.)) + bcSize);`,`mX = bcSize * (abs(iF - (float(vCount) / 2.)) + bcSize);`] let mwO=[``,`mX = segmentHeight / .25;`,`mX = segmentHeight / .5;`] let hS=[`0.`,`(segmentHeight / 8.)`,`(segmentHeight / 4.)`] let hSv=gV(hS);let n=['2.','4.','8.','16.','32.',] let n2=['.25','.5','2.','4.',] let wB=[`wd = dis / ${gV(n)};`,`wd = dis * ${gV(n)};`,`wd = (jF + 1.);`,`wd = mX * (jF + 1.);`,`wd = mX * (iF + 1.);`,`wd = (iF + 1.);`,`wd = (iF + 1.) * (jF + 1.);`,`wd = sqrt((iF + 1.) * (jF + 1.));`,`wd = iF - jF;`,`wd = jF - iF;`,`wd = jF + iF;`,] let wM=[``,`wd *= we * (jF + 1.);`,`wd *= we * (iF + 1.);`,`wd *= sin((jF + 1.) / float(bc));`,`wd *= cos((iF + 1.) / float(vCount));`,`wd *= sin(2. / ${gV(n)}) * dis;`,`wd *= dis;`,`wd += (iF + 1.) * (jF + 1.);`,`wd *= dis2;`] let wM2=[``,`wd /= we;`,`wd -= dis2;`,`wd -= dis;`,`wd -= xM * yM;`,`wd -= xM;`,`wd -= yM;`,`wd -= sqrt(xM * yM);`,] let wM3=[``,`wd *= 2.;`,`wd *= 4.;`,`wd *= 8.;`,] let wMo=[`wd = floor(mod(wd,(mX + 1.)));`,`wd = floor(mod(wd,(mX + 1.) * 2.));`,`wd = floor(mod(wd,(mX + 1.) * 4.));`,`wd = floor(mod(wd,(mX + 1.) * 8.));`] let fn=[0,128,256,512,768,1024] let fn1=[4,8,16,32,64] let f0=[`vec2 focus = vec2(${gV(fn)}., ${gV(fn)}.);`] let f1=[`vec2 focus2 = vec2(${gV(fn)}., ${gV(fn)}.);`] let dz=[``,`if (dis < ${gV(fn)}.) {wd = mX;}`,`if (dis > ${gV(fn)}.) {wd = mX;}`,`float aW0 = ${gV(fn)}.;if (dis < aW0 && dis > aW0 - ${gV(fn1)}.) {wd *= 2.;}`,`float aW1 = ${gV(fn)}.;if (dis < aW1 && dis > aW1 - ${gV(fn1)}.) {wd /= 2.; }`] let dz2=[``,`if (jF < iF) {wd *= ${gV(n2)};}`,`if (jF > iF) {wd *= ${gV(n2)};}`,`if (jF > ${gV(n)}) {wd /= ${gV(n2)};}`,`if (iF > ${gV(n2)}) {wd /= ${gV(n2)};}`,`if (jF < ${gV(n)}) {wd /= ${gV(n2)};}`,`if (iF < ${gV(n)}) {wd /= ${gV(n2)}; }`] let aa=[`wd *= 1. - (lineDistance / 512.);`,`wd *= 2. - ((lineDistance / 512.) * 2.);`,`wd *= 4. - ((lineDistance / 512.) * 4.);`,`wd *= 1. - (n < 0.5 ? 4. * n * n * n : 1. - pow(-2. * n + 2., 3.) / 2.);`,`wd *= 1. - (n < 0.5 ? (1. - sqrt(1. - pow(2. * n, 2.))) / 2. : (sqrt(1. - pow(-2. * n + 2., 2.)) + 1.) / 2.);`] var tz=0;var canDraw=!0;const canvas = document.getElementsByTagName("canvas")[0];canvas.width=DIM;canvas.height=DIM;const gl=canvas.getContext('webgl');let barCounts=[1,4,16,32,64,128] let barCount=barCounts[Math.floor(R()*barCounts.length)] let vCounts=[8,16,32,64,128];let vCount=vCounts[Math.floor(R()*vCounts.length)];let oR=(R()*10)>5;if(barCount<16){oR=!1} let barInit=` const int bc = ${barCount}; vec3 a[bc]; `;function gV(a){let temp=Math.floor(R()*a.length);return a[temp]} const positionsData=new Float32Array([1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,-1.0]);const textureData=new Float32Array([1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0]) var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture);{texBind()} function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);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)} var attachmentPoint=gl.COLOR_ATTACHMENT0;var level=0;function HSVtoRGB(h,s,v){var r,g,b,i,f,p,q,t;if(arguments.length===1){s=h.s,v=h.v,h=h.h} i=Math.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{r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)}} var aDt={} function compileShader(shaderSource,shaderType){var shader=gl.createShader(shaderType);gl.shaderSource(shader,shaderSource);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){throw "Shader compile failed with: "+gl.getShaderInfoLog(shader)} return shader} function drawArt(){gl.useProgram(aPg);gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.vertexAttribPointer(aDt.positionAttribute,2,gl.FLOAT,!1,2*4,0);gl.enableVertexAttribArray(aDt.positionAttribute);gl.uniform1f(aDt.tickSet,tz);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,texture);gl.drawArrays(gl.TRIANGLE_STRIP,0,4)} let baseVertexString=` attribute vec2 position; attribute vec2 texcoord; varying highp vec2 vTextureCoord; void main() { gl_Position = vec4(position, 0.0, 1.0); vTextureCoord = texcoord; } ` let baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER);let artFragmentString=` precision highp float; uniform float tz; 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) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } void main() { float tV = 255.; ${barInit} vec3 c0 = vec3(${pq[0][0]}./tV,${pq[0][1]}./tV,${pq[0][2]}./tV); vec3 c1 = vec3(${pq[1][0]}./tV,${pq[1][1]}./tV,${pq[1][2]}./tV); vec3 c2 = vec3(${pq[2][0]}./tV,${pq[2][1]}./tV,${pq[2][2]}./tV); vec3 c3 = vec3(${pq[3][0]}./tV,${pq[3][1]}./tV,${pq[3][2]}./tV); vec3 c4 = vec3(${pq[4][0]}./tV,${pq[4][1]}./tV,${pq[4][2]}./tV); float w = float(${DIM}); float M = float(${M}); float we = float(${we}); vec2 st = gl_FragCoord.xy / M; ${gV(f0)} ${gV(f1)} float mX; float wd; float bcSize = 1024. / float(bc); int vCount = ${vCount}; float segmentHeight = 1024. / float(vCount); int i = int(st.y / segmentHeight); int j = int(st.x / bcSize); float iF = float(i); float jF = float(j); float wStart; float hx = (iF * segmentHeight) + ${hSv}; segmentHeight -= ${hSv} * 2.; float xM = (jF * bcSize) + (bcSize / 2.); float yM = hx + (segmentHeight / 2.); vec2 pos = vec2(xM,yM); gl_FragColor = vec4(.3,.3,.3,1.); bool bar = false; float linePos = ((256. - tz) * 8.) - 512.; float lineDistance; if(${oR}) { lineDistance = abs(1024. - st.x - linePos); } else { lineDistance = abs(st.y - linePos); } float dis = distance(focus,pos); float dis2 = distance(focus2,pos);${gV(mwS)}${gV(mwO)}${gV(wB)}${gV(wM)}${gV(wM3)}${gV(wM2)}${gV(dz)}${gV(dz2)} mX = mod(mX,480.);mX += 32.;wd = abs(floor(wd - mX));wd += mX;float n = (lineDistance / 512.);${gV(wMo)}${gV(aa)} if (wd < 2.) { wd = 2.; } if ( lineDistance > 512.) { wd = 2.; } wStart = xM - (wd / 2.); if(st.x >= wStart && st.x <= wStart + wd && st.y >= hx && st.y <= hx + segmentHeight) { bar = true; } if (${pT} > 14) { if (bar) { vec3 colorBase = vec3(.2,.2,.2) / (mX - wd) * 256.; gl_FragColor = vec4(colorBase * ${rad},1.); if (${cls}) { gl_FragColor = vec4(.2,.2,.2,1.); } if (${rbw}) { gl_FragColor = vec4(colorBase * hsv2rgb(vec3(${gV(rbwS)} / float(vCount + bc),1.,1.)),1.0); } } else { gl_FragColor = vec4(0.,0.,0.,1.); if (${cls}) { gl_FragColor = vec4(.6,.6,.6,1.); } } } else { if (bar) { if (wd / mX < .3) { gl_FragColor = vec4(c4.x,c4.y,c4.z,1.);}else if (wd / mX < .6) {gl_FragColor = vec4(c3.x,c3.y,c3.z,1.);}else if (wd / mX < .85) { gl_FragColor = vec4(c2.x,c2.y,c2.z,1.); } else { gl_FragColor = vec4(c1.x,c1.y,c1.z,1.); } } else { gl_FragColor = vec4(c0.x,c0.y,c0.z,1.); } } } ` var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);const aPg=gl.createProgram();gl.attachShader(aPg,baseVertShader);gl.attachShader(aPg,artFragmentShader);gl.linkProgram(aPg);if(!gl.getProgramParameter(aPg,gl.LINK_STATUS)){console.error(gl.getProgramInfoLog(aPg));throw new Error('Failed to link art program')} const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer);gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW);aDt.positionAttribute=gl.getAttribLocation(aPg,'position');aDt.tickSet=gl.getUniformLocation(aPg,'tz');let cD=!0;let lft = 0;let cft;function draw(){cft = Date.now();if(cD){if(lft>0){drawArt();tz += (cft-lft)/16;if(tz > 255){tz = 0;}}}lft = cft; requestAnimationFrame(draw)} canvas.addEventListener('pointerdown',(e)=>{cD=!cD}) requestAnimationFrame(draw)
S=Uint32Array.from([0,1,s=t=2,3].map(i=>parseInt(tokenData.hash.substr(i*8+2,8),16)));R=_=>(t=S[3],S[3]=S[2],S[2]=S[1],S[1]=s=S[0],t^=t<<11,S[0]^=(t^t>>>8)^(s>>>19),S[0]/2**32);'tx piter, you rock :)' var DEFAULT_SIZE=1024;var DIM=Math.min(window.innerWidth,window.innerHeight) var M=DIM/DEFAULT_SIZE let we=Math.floor(R(255)+1);let mW=Math.floor(R(8)+1)*20;let palettes=[[[249,222,89],[232,166,40],[249,131,101],[195,49,36],[161,223,251]],[[30,5,33],[1,11,139],[254,204,80],[11,231,251],[255,109,105]],[[17,16,16],[208,204,209],[233,255,136],[254,10,183],[229,1,133]],[[179,231,220],[166,180,1],[239,246,123],[213,1,2],[108,1,2]],[[36,224,184],[255,204,81],[255,139,118],[255,48,49],[0,123,0]],[[169,67,0],[255,176,0],[91,155,55],[21,61,2],[255,223,0]],[[161,5,50],[255,111,169],[0,183,204],[0,95,129],[255,208,204]],[[246,213,31],[95,165,90],[1,180,188],[250,137,37],[250,84,87]],[[99,26,17],[187,96,47],[203,130,20],[68,64,101],[239,216,131]],[[48,4,61],[142,31,81],[229,64,89],[222,131,127],[253,179,106]],[[10,0,48],[255,251,196],[182,190,246],[53,30,191],[16,1,93]],[[140,7,20],[252,64,124],[27,78,136],[5,8,30],[250,240,228]],[[0,0,63],[1,0,142],[144,1,245],[254,0,234],[255,1,120]],[[8,44,68],[114,234,245],[254,230,226],[255,169,76],[254,44,137]],[[1,99,141],[171,206,204],[255,242,205],[255,0,76],[97,13,75]],[[34,125,172],[68,57,136],[159,0,82],[255,63,32],[255,190,0]],[[129,237,247],[2,116,143],[247,1,16],[110,5,22],[0,164,192]],[[255,254,1],[255,134,6],[232,59,54],[96,5,56],[70,10,64]],[[51,51,51],[204,204,204],[48,48,48],[221,221,221],[0,0,0]],[[215,0,95],[215,215,0],[38,38,38],[175,0,95],[0,255,255]],[[0,0,170],[255,85,255],[255,255,85],[170,0,0],[85,255,255]],[[255,85,85],[85,255,85],[255,255,85],[85,255,255],[85,85,85]],[[0,0,0],[255,85,255],[85,255,255],[255,0,255],[255,255,255]],[[0,0,0],[0,85,0],[0,170,0],[170,0,0],[170,85,0]],[[15,139,141],[168,32,26],[236,154,41],[218,210,216],[20,54,66]]] let radiations=["vec3(1.,1.,0.)","vec3(1.,0.,0.)","vec3(0.,1.,1.)","vec3(0.,0.,1.)","vec3(1.,0.,1.)","vec3(0.,1.,0.)","vec3(1.,1.,1.)","vec3(0.,0.,0.)","vec3(1.,2.,3.)",] let rad=gV(radiations) let cls=rad==="vec3(0.,0.,0.)"?!0:!1;let rbw=rad==="vec3(1.,2.,3.)"?!0:!1;if(rbw){cls=!1} let pId=Math.floor(R()*palettes.length);let pT=Math.floor(R()*16);let pq=palettes[pId];let rbwS=[`(iF + jF)`,`(iF - jF)`,`(jF - iF)`,`abs(jF - iF)`] let mwSM=[`mX /= .25;`,`mX /= .5;`,`mX /= 2.;`,`mX /= 4.;`,`mX /= 8.;`,] let mwS=[`mX = bcSize;`,`mX = bcSize * float(${mW});${gV(mwSM)}`,`mX = bcSize * (abs(jF - (float(bc) / 2.)) + bcSize);`,`mX = bcSize * (abs(iF - (float(vCount) / 2.)) + bcSize);`] let mwO=[``,`mX = segmentHeight / .25;`,`mX = segmentHeight / .5;`] let hS=[`0.`,`(segmentHeight / 8.)`,`(segmentHeight / 4.)`] let hSv=gV(hS);let n=['2.','4.','8.','16.','32.',] let n2=['.25','.5','2.','4.',] let wB=[`wd = dis / ${gV(n)};`,`wd = dis * ${gV(n)};`,`wd = (jF + 1.);`,`wd = mX * (jF + 1.);`,`wd = mX * (iF + 1.);`,`wd = (iF + 1.);`,`wd = (iF + 1.) * (jF + 1.);`,`wd = sqrt((iF + 1.) * (jF + 1.));`,`wd = iF - jF;`,`wd = jF - iF;`,`wd = jF + iF;`,] let wM=[``,`wd *= we * (jF + 1.);`,`wd *= we * (iF + 1.);`,`wd *= sin((jF + 1.) / float(bc));`,`wd *= cos((iF + 1.) / float(vCount));`,`wd *= sin(2. / ${gV(n)}) * dis;`,`wd *= dis;`,`wd += (iF + 1.) * (jF + 1.);`,`wd *= dis2;`] let wM2=[``,`wd /= we;`,`wd -= dis2;`,`wd -= dis;`,`wd -= xM * yM;`,`wd -= xM;`,`wd -= yM;`,`wd -= sqrt(xM * yM);`,] let wM3=[``,`wd *= 2.;`,`wd *= 4.;`,`wd *= 8.;`,] let wMo=[`wd = floor(mod(wd,(mX + 1.)));`,`wd = floor(mod(wd,(mX + 1.) * 2.));`,`wd = floor(mod(wd,(mX + 1.) * 4.));`,`wd = floor(mod(wd,(mX + 1.) * 8.));`] let fn=[0,128,256,512,768,1024] let fn1=[4,8,16,32,64] let f0=[`vec2 focus = vec2(${gV(fn)}., ${gV(fn)}.);`] let f1=[`vec2 focus2 = vec2(${gV(fn)}., ${gV(fn)}.);`] let dz=[``,`if (dis < ${gV(fn)}.) {wd = mX;}`,`if (dis > ${gV(fn)}.) {wd = mX;}`,`float aW0 = ${gV(fn)}.;if (dis < aW0 && dis > aW0 - ${gV(fn1)}.) {wd *= 2.;}`,`float aW1 = ${gV(fn)}.;if (dis < aW1 && dis > aW1 - ${gV(fn1)}.) {wd /= 2.; }`] let dz2=[``,`if (jF < iF) {wd *= ${gV(n2)};}`,`if (jF > iF) {wd *= ${gV(n2)};}`,`if (jF > ${gV(n)}) {wd /= ${gV(n2)};}`,`if (iF > ${gV(n2)}) {wd /= ${gV(n2)};}`,`if (jF < ${gV(n)}) {wd /= ${gV(n2)};}`,`if (iF < ${gV(n)}) {wd /= ${gV(n2)}; }`] let aa=[`wd *= 1. - (lineDistance / 512.);`,`wd *= 2. - ((lineDistance / 512.) * 2.);`,`wd *= 4. - ((lineDistance / 512.) * 4.);`,`wd *= 1. - (n < 0.5 ? 4. * n * n * n : 1. - pow(-2. * n + 2., 3.) / 2.);`,`wd *= 1. - (n < 0.5 ? (1. - sqrt(1. - pow(2. * n, 2.))) / 2. : (sqrt(1. - pow(-2. * n + 2., 2.)) + 1.) / 2.);`] var tz=0;var canDraw=!0;const canvas = document.getElementsByTagName("canvas")[0];canvas.width=DIM;canvas.height=DIM;const gl=canvas.getContext('webgl');let barCounts=[1,4,16,32,64,128] let barCount=barCounts[Math.floor(R()*barCounts.length)] let vCounts=[8,16,32,64,128];let vCount=vCounts[Math.floor(R()*vCounts.length)];let oR=(R()*10)>5;if(barCount<16){oR=!1} let barInit=` const int bc = ${barCount}; vec3 a[bc]; `;function gV(a){let temp=Math.floor(R()*a.length);return a[temp]} const positionsData=new Float32Array([1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,-1.0]);const textureData=new Float32Array([1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0]) var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture);{texBind()} function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);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)} var attachmentPoint=gl.COLOR_ATTACHMENT0;var level=0;function HSVtoRGB(h,s,v){var r,g,b,i,f,p,q,t;if(arguments.length===1){s=h.s,v=h.v,h=h.h} i=Math.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{r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)}} var aDt={} function compileShader(shaderSource,shaderType){var shader=gl.createShader(shaderType);gl.shaderSource(shader,shaderSource);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){throw "Shader compile failed with: "+gl.getShaderInfoLog(shader)} return shader} function drawArt(){gl.useProgram(aPg);gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.vertexAttribPointer(aDt.positionAttribute,2,gl.FLOAT,!1,2*4,0);gl.enableVertexAttribArray(aDt.positionAttribute);gl.uniform1f(aDt.tickSet,tz);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,texture);gl.drawArrays(gl.TRIANGLE_STRIP,0,4)} let baseVertexString=` attribute vec2 position; attribute vec2 texcoord; varying highp vec2 vTextureCoord; void main() { gl_Position = vec4(position, 0.0, 1.0); vTextureCoord = texcoord; } ` let baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER);let artFragmentString=` precision highp float; uniform float tz; 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) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } void main() { float tV = 255.; ${barInit} vec3 c0 = vec3(${pq[0][0]}./tV,${pq[0][1]}./tV,${pq[0][2]}./tV); vec3 c1 = vec3(${pq[1][0]}./tV,${pq[1][1]}./tV,${pq[1][2]}./tV); vec3 c2 = vec3(${pq[2][0]}./tV,${pq[2][1]}./tV,${pq[2][2]}./tV); vec3 c3 = vec3(${pq[3][0]}./tV,${pq[3][1]}./tV,${pq[3][2]}./tV); vec3 c4 = vec3(${pq[4][0]}./tV,${pq[4][1]}./tV,${pq[4][2]}./tV); float w = float(${DIM}); float M = float(${M}); float we = float(${we}); vec2 st = gl_FragCoord.xy / M; ${gV(f0)} ${gV(f1)} float mX; float wd; float bcSize = 1024. / float(bc); int vCount = ${vCount}; float segmentHeight = 1024. / float(vCount); int i = int(st.y / segmentHeight); int j = int(st.x / bcSize); float iF = float(i); float jF = float(j); float wStart; float hx = (iF * segmentHeight) + ${hSv}; segmentHeight -= ${hSv} * 2.; float xM = (jF * bcSize) + (bcSize / 2.); float yM = hx + (segmentHeight / 2.); vec2 pos = vec2(xM,yM); gl_FragColor = vec4(.3,.3,.3,1.); bool bar = false; float linePos = ((256. - tz) * 8.) - 512.; float lineDistance; if(${oR}) { lineDistance = abs(1024. - st.x - linePos); } else { lineDistance = abs(st.y - linePos); } float dis = distance(focus,pos); float dis2 = distance(focus2,pos);${gV(mwS)}${gV(mwO)}${gV(wB)}${gV(wM)}${gV(wM3)}${gV(wM2)}${gV(dz)}${gV(dz2)} mX = mod(mX,480.);mX += 32.;wd = abs(floor(wd - mX));wd += mX;float n = (lineDistance / 512.);${gV(wMo)}${gV(aa)} if (wd < 2.) { wd = 2.; } if ( lineDistance > 512.) { wd = 2.; } wStart = xM - (wd / 2.); if(st.x >= wStart && st.x <= wStart + wd && st.y >= hx && st.y <= hx + segmentHeight) { bar = true; } if (${pT} > 14) { if (bar) { vec3 colorBase = vec3(.2,.2,.2) / (mX - wd) * 256.; gl_FragColor = vec4(colorBase * ${rad},1.); if (${cls}) { gl_FragColor = vec4(.2,.2,.2,1.); } if (${rbw}) { gl_FragColor = vec4(colorBase * hsv2rgb(vec3(${gV(rbwS)} / float(vCount + bc),1.,1.)),1.0); } } else { gl_FragColor = vec4(0.,0.,0.,1.); if (${cls}) { gl_FragColor = vec4(.6,.6,.6,1.); } } } else { if (bar) { if (wd / mX < .3) { gl_FragColor = vec4(c4.x,c4.y,c4.z,1.);}else if (wd / mX < .6) {gl_FragColor = vec4(c3.x,c3.y,c3.z,1.);}else if (wd / mX < .85) { gl_FragColor = vec4(c2.x,c2.y,c2.z,1.); } else { gl_FragColor = vec4(c1.x,c1.y,c1.z,1.); } } else { gl_FragColor = vec4(c0.x,c0.y,c0.z,1.); } } } ` var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);const aPg=gl.createProgram();gl.attachShader(aPg,baseVertShader);gl.attachShader(aPg,artFragmentShader);gl.linkProgram(aPg);if(!gl.getProgramParameter(aPg,gl.LINK_STATUS)){console.error(gl.getProgramInfoLog(aPg));throw new Error('Failed to link art program')} const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer);gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW);aDt.positionAttribute=gl.getAttribLocation(aPg,'position');aDt.tickSet=gl.getUniformLocation(aPg,'tz');let cD=!0;function draw(){if(cD){drawArt();tz++;tz=tz%256} requestAnimationFrame(draw)} canvas.addEventListener('pointerdown',(e)=>{cD=!cD}) requestAnimationFrame(draw)
In this optical parade, motion is created from the harmonious expansion and contraction of colorful bars. Click to pause. *Photosensitive seizure warning: These artworks contain flashing colors and moving patterns.
This project is a visual representation of realities that are out of phase. Interference patterns, colorful echoes, and emerging secrets are explored. Mathematical functions produce constant motion, but rarely, a peaceful scene resolves within the chaos. Click or press any key to pause. *Photosensitive seizure warning: These artworks contain flashing colors and moving patterns.
const hashPairs=[];for(let e=0;e<32;e++)hashPairs.push(tokenData.hash.slice(2+2*e,4+2*e));const decPairs=hashPairs.map(e=>parseInt(e,16));var baseHue=decPairs[0]/256,DEFAULT_SIZE=Math.pow(2,Math.floor(decPairs[31]/256*7)+4),DIM=Math.min(window.innerWidth,window.innerHeight),M=DIM/DEFAULT_SIZE,tick=0,canDraw=!0;const canvas=document.getElementsByTagName("canvas")[0];canvas.width=DIM,canvas.height=DIM;const gl=canvas.getContext("webgl"),positionsData=new Float32Array([1,1,-1,1,1,-1,-1,-1]),textureData=new Float32Array([1,1,0,1,1,0,0,0]);var texture=gl.createTexture();const targetTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture),texBind();const targetTexture2=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,targetTexture2),texBind();const bT=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,bT),texBind();const cT=gl.createTexture();function texBind(){gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,DIM,DIM,0,gl.RGBA,gl.UNSIGNED_BYTE,null),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),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.bindTexture(gl.TEXTURE_2D,cT),texBind();const fb=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,fb);var attachmentPoint=gl.COLOR_ATTACHMENT0,level=0;gl.framebufferTexture2D(gl.FRAMEBUFFER,attachmentPoint,gl.TEXTURE_2D,targetTexture,level);let palettes=[["#f9de59","#e8a628","#f98365","#c33124","#a1dffb"],["#ff6d69","#fecc50","#0be7fb","#010b8b","#1e0521"],["#e9ff88","#fe0ab7","#e50185","#111010","#d0ccd1"],["#b3e7dc","#a6b401","#eff67b","#d50102","#6c0102"],["#007b00","#24e0b8","#ffcc51","#ff8b76","#ff3031"],["#a94300","#ffb000","#ffdf00","#5b9b37","#153d02"],["#a10532","#ff6fa9","#ffd0cc","#00b7cc","#005f81"],["#5fa55a","#01b4bc","#f6d51f","#fa8925","#fa5457"],["#631a11","#bb602f","#efd883","#cb8214","#444065"],["#30043d","#8e1f51","#e54059","#de837f","#fdb36a"],["#fffbc4","#b6bef6","#351ebf","#10015d","#0a0030"],["#8c0714","#fc407c","#1b4e88","#05081e","#faf0e4"],["#00003f","#01008e","#9001f5","#fe00ea","#ff0178"],["#082c44","#72eaf5","#fee6e2","#ffa94c","#fe2c89"],["#01638d","#abcecc","#fff2cd","#ff004c","#610d4b"],["#227dac","#443988","#9f0052","#ff3f20","#ffbe00"],["#81edf7","#00a4c0","#02748f","#f70110","#6e0516"],["#fffe01","#ff8606","#e83b36","#600538","#460a40"],["#333333","#cccccc","#303030","#dddddd","#000000"],["#D7005F","#D7D700","#262626","#AF005F","#00FFFF"],["#55FFFF","#FF55FF","#FFFF55","#AA0000","#0000AA"],["#AA00AA","#AA0000","#FFFF55","#AA5500","#00AA00"],["#AA0000","#AA0000","#FF5555","#FFFF55","#5555FF"],["#FF5555","#55FF55","#FFFF55","#555555","#55FFFF"],["#000000","#ff55ff","#55ffff","#ff00ff","#ffffff"],["#000000","#00aa00","#aa0000","#aa5500","#005500"]],pPool;pPool=DEFAULT_SIZE<=64?palettes.length:DEFAULT_SIZE<=256?palettes.length-3:palettes.length-7;let pID=Math.floor(decPairs[0]/256*pPool),palette=palettes[pID],phaseLevel=Math.floor(decPairs[15]/256*5),processedHues=[],processedSats=[],processedBrights=[],basicTiming=["ac += tick;","ac += tick * 2.0;"],cABP=["ac += 0.0;","ac += 0.0;","ac *= ps.x;","ac += ps.y;","ac += ps.x + ps.y;","ac += ps.x + ps.x;","ac += ps.y + ps.y;"],circA=["ac += 0.0;","ac += 0.0;","ac += dis / tick;","ac += 0.0;","ac += 0.0;","ac += tick / dis;","ac += 0.0;","ac += 0.0;","ac += 0.0;","ac *= tick / dis;","ac += 0.0;","ac += 0.0;","ac += 0.0;","ac *= dis;"],circB=["ac += 0.0;","ac += 0.0;","ac += 0.0;","ac += 0.0;","ac += 0.0;",`if (dis < fWMax / 2.) { ac += tick + ps.x; } else { ac /= dis; } `,"ac += 0.0;","ac += 0.0;","ac += 0.0;","ac += 0.0;","ac += 0.0;",`if (dis < fWMax * 2.) { ac += tick + ps.x; } else { ac /= dis; } `,`if (dis < fWMax / 2.0) { ac += (ps.x * ps.y) / fWMax + tick; } else { ac /= dis; } `,`if (dis < fWMax / 4.0) { ac += (ps.x * ps.y) / fWMax + tick; } else { ac /= dis; } `,"ac += 0.0;","ac += 0.0;",`if (dis < fWMax) { ac += (ps.x * ps.y) / fWMax + tick; } else { ac /= dis; } `,"ac += 0.0;"],sliceSizes=[".05",".1",".2",".25",".3333333",".5"],sliceTicks=["0.","tick/10.","tick/50.","tick/100.","tick/250.","tick/500.","tick/1000."],slices=["ac *= floor(((fWMax * oSS) + ps.x) / (fWMax * oSS)) + sT;","ac *= floor(((fWMax * oSS) + ps.y) / (fWMax * oSS)) + sT;","ac *= floor(((fWMax * oSS) + (ps.y * ps.x)) + (fWMax * oSS)) + sT;"],rSC=["ac *= ps.x + tick;","ac *= ps.y + tick;","ac *= floor(fWMax / ps.x) + tick;","ac *= fWMax - ps.y + tick;","ac *= ps.x / ps.y + tick;","ac *= ps.x + (tick / 2.0);","ac *= ps.x + ps.y / tick;","ac /= sqrt(ps.x * ps.y) + tick;","ac *= sqrt(ps.x * ps.y) - tick;"],dSC=["ac += abs((fWMax / 2.) - ps.x) + tick;","ac += abs((fWMax / 2.) + ps.x) + tick;","ac += abs((fWMax / 2.) - ps.y) + tick;","ac += abs((fWMax / 2.) + ps.y) + tick;","ac += abs((fWMax / 2.) / ps.y) + tick;","ac += abs((fWMax / 2.) / ps.x) + tick;","ac /= dis + tick;","ac /= dis + tick;"],dSC2=["ac *= dis / fWMax + (tick / .1); ","ac += dis / fWMax + (tick / .5); ","ac -= dis * fWMax + (tick / 2.); "],wp=["ac *= (floor(ps.x * ps.y) + tick)/2.;","ac *= (ps.x + tick) / 2.;","ac *= (floor(ps.x) * floor(ps.y)) / 2.;","ac *= (floor(ps.y) * floor(ps.y)) / 2.;","ac *= (floor((fWMax - ps.y) * ps.x) + tick) / 2.;","ac *= (floor((fWMax - ps.y) * (fWMax - ps.x)) + tick) / 2.;"],sectionSizes=[".1",".2",".25",".3333333"],rectSections=["","","",`if (ps.x >= min && ps.x <= max) { `+rSC[Math.floor(decPairs[13]/256*rSC.length)]+` }`,"","",`if (ps.y >= min && ps.y <= max) { `+rSC[Math.floor(decPairs[13]/256*rSC.length)]+` }`,"",""],xCO=["10.","100.","1000.","tick"],xC=["","if (fWMax - floor(ps.x) >= floor(ps.y)) {ac *= "+gDR(xCO,18)+";}","","","","if (floor(ps.y) >= floor(ps.x)) {ac *= "+gDR(xCO,18)+";}","","","","if (floor(ps.x) >= floor(ps.y)) {ac *= "+gDR(xCO,18)+";}","","","","if (floor(ps.x) >= floor(ps.y)) {ac *= "+gDR(xCO,18)+`;} if (fWMax - floor(ps.x) >= floor(ps.y)) {ac *= `+gDR(xCO,18)+`;} `,"","","",""];32==DEFAULT_SIZE&&7<decPairs[17]&&60<=decPairs[1]&&4==phaseLevel&&(xC=[""]);let movement=["ac *= floor(((fWMax * .4) + (ps.y * ps.x)) + (fWMax * .2)) + tick;","ac *= floor(((fWMax * .2) * ps.x) / (fWMax * .2));","ac *= ps.x + tick;","ac *= ps.y + tick;"],pf=["","","ac += (ps.x - ps.y) * (fWMax * "+gDR(sliceSizes,13)+") * (dis / tick);","","","ac -= (ps.x + ps.y) * (fWMax * "+gDR(sliceSizes,13)+") * (dis / tick);","","","ac += (ps.x + ps.y) * (fWMax * "+gDR(sliceSizes,13)+") / (dis - tick);","",""],st0=["ac += ","ac += fWMax * "],st1=["ps.x + ","ps.x - ","ps.y + ","ps.y - "],st2=["tick + ","tick * "],st3=["ps.x + fWMax;","ps.y + fWMax * 2.;","fWMax / 2.;"],ec=["ac += (fWMax - ps.x) + tick;","ac += ps.y + tick;","ac += (fWMax - ps.y) + tick;","ac += ps.y + tick;","ac -= (fWMax - ps.x) + tick;","ac -= ps.y + tick;","ac -= (fWMax - ps.y) + tick;","ac -= ps.y + tick;"],ps=["vec2 ps = st / M;","vec2 ps = vec2(fWMax - (st.x / M), st.y / M);","vec2 ps = vec2(st.x / M, fWMax - (st.y / M));","vec2 ps = vec2(fWMax - (st.y / M), st.x / M);","vec2 ps = vec2(st.y / M, fWMax - (st.x / M));","vec2 ps = vec2(st.y / M, st.x / M);","vec2 ps = fWMax - (st / M);"];32==DEFAULT_SIZE&&7<decPairs[17]&&60<=decPairs[1]&&4==phaseLevel&&(ps=["vec2 ps = vec2(st.x / M * 1.75, st.y / M);"]);let st=gDR(st0,28)+gDR(st1,29)+gDR(st2,30)+gDR(st3,31),useMovement=decPairs[0]>decPairs[30];function checkMovement(){return useMovement?gDR(wp,22):gDR(cABP,2)}let bVL=".075";2!=phaseLevel&&3!=phaseLevel||(bVL=.07);let centerPoint="vec2 centerPoint = vec2(fWMax * float("+decPairs[2]/256+"),fWMax * float("+decPairs[3]/256+"));",paletteOverride=130<decPairs[1]&&135<decPairs[11]&&140<decPairs[21],cP2="vec2 cP2 = vec2(fWMax * float("+decPairs[21]/256+"),fWMax * float("+decPairs[22]/256+"));",cal=!paletteOverride&&165<decPairs[10]&&165<decPairs[20]&&165<decPairs[30],kp=Math.floor(decPairs[25]/256*5),s=decPairs[25]/256*.8+.2,bOffset=Math.floor(decPairs[26]/256*20)+5;bOffset/=20;let rad="tColor /= "+(decPairs[21]/256*1.9+.8)+";";if(cal&&(rad="tColor /= "+(decPairs[21]/256*3.1+.15)+";"),paletteOverride)for(let t=0;t<5;t++){let e=1-t*bOffset;processedHues.push(Math.floor(100*baseHue)/100),processedSats.push(Math.floor(100*s)/100),processedBrights.push(Math.floor(100*e)/100)}else for(let t=0;t<palette.length;t++){let e=hexToHSV(palette[t]);cal&&t!=kp?(e.s=0,e.v=.0125*t):(cal&&t==kp&&(e.v=2),e.v=Math.min(Math.max(e.v,0),1)),processedHues.push(e.h),processedSats.push(e.s),processedBrights.push(e.v)}function gDI(e,t){return Math.floor(decPairs[t]/256*e.length)}function gDR(e,t){return e[gDI(e,t)]}processedHues.push(0),processedSats.push(0),processedBrights.push(cal?.3:.1);var paletteInit=` const int paletteSize = 6; uniform float hues[6]; uniform float sats[6]; uniform float brights[6]; `;let pL=Math.floor(decPairs[10]/256*2e3)+1e3;function hexToHSV(e){let t=0,r=0,a=0;4==e.length?(t="0x"+e[1]+e[1],r="0x"+e[2]+e[2],a="0x"+e[3]+e[3]):7==e.length&&(t="0x"+e[1]+e[2],r="0x"+e[3]+e[4],a="0x"+e[5]+e[6]),t/=255,r/=255,a/=255;let o=Math.min(t,r,a),c=Math.max(t,r,a),l=c-o,i=0,s=0,g=0;return i=0==l?0:c==t?(r-a)/l%6:c==r?(a-t)/l+2:(t-r)/l+4,i=Math.round(60*i),i<0&&(i+=360),i/=360,g=(c+o)/2,s=0==l?0:l/(1-Math.abs(2*g-1)),s=+s.toFixed(1),g=+g.toFixed(1),HSLtoHSV(i,s,g)}function HSLtoHSV(e,t,r){return 1===arguments.length&&(t=e.s,r=e.l,e=e.h),{h:e,s:(r*=2)+(t*=r<=1?r:2-r)==0?0:2*t/(r+t),v:(r+t)/2}}var gridOffset=decPairs[1]<30?"ps.x":decPairs[1]<60?"ps.y":"ps.x + ps.y",aDt={},bDt={},bDta={},compositeData={},fDt={};function compileShader(e,t){t=gl.createShader(t);if(gl.shaderSource(t,e),gl.compileShader(t),!gl.getShaderParameter(t,gl.COMPILE_STATUS))throw"Shader compile failed with: "+gl.getShaderInfoLog(t);return t}function drawArt(){gl.useProgram(aPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,targetTexture,level),gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(aDt.positionAttribute,2,gl.FLOAT,!1,8,0),gl.enableVertexAttribArray(aDt.positionAttribute),gl.uniform1fv(aDt.hues,processedHues),gl.uniform1fv(aDt.sats,processedSats),gl.uniform1fv(aDt.brights,processedBrights),gl.uniform1f(aDt.tickSet,tick),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,texture),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function blurArt(e,t,r){gl.useProgram(blPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,t,level);t=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDt.positionAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDt.positionAttribute),gl.uniform1i(bDt.pLv,r),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDt.textureAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDt.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,e),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function blendArt(e,t){gl.useProgram(bldPg),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,t,level);t=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDta.positionAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDta.positionAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,e),gl.uniform1i(bDta.freshTexture,0),gl.activeTexture(gl.TEXTURE1),gl.bindTexture(gl.TEXTURE_2D,cT),gl.uniform1i(bDta.cT,1),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDta.textureAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDta.textureAttribute),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function compositeArt(e){gl.useProgram(compositeProgram),gl.bindFramebuffer(gl.FRAMEBUFFER,fb),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,cT,level);var t=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDt.positionAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDt.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDt.textureAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDt.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,e),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}function renderFinal(e){gl.useProgram(fPg),gl.bindFramebuffer(gl.FRAMEBUFFER,null);var t=gl.FLOAT;gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.vertexAttribPointer(bDt.positionAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDt.positionAttribute),gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.vertexAttribPointer(bDt.textureAttribute,2,t,!1,0,0),gl.enableVertexAttribArray(bDt.textureAttribute),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,e),gl.drawArrays(gl.TRIANGLE_STRIP,0,4)}let blurFSS=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D u_texture; uniform int pLv; uniform float M; int wMax = ${DIM}; float fWMax; float scaleOffset; void main() { vec2 resultCoords = vec2(vTextureCoord.x, vTextureCoord.y); float a = texture2D(u_texture, resultCoords).a; vec3 tColor = texture2D(u_texture, resultCoords).rgb; for (int i = 0;i<5;i++) { float bV = float(i) * ${bVL}; vec2 d0 = vec2(0.,.1 * float(i)); vec2 d1 = vec2(.1 * float(i),0.); vec2 d2 = vec2(.1 * float(i), .1 * float(i)); vec2 d3 = vec2(.1 * float(i),-.1 * float(i)); if (pLv == 0) { tColor += texture2D(u_texture, resultCoords + d0).rgb * bV; tColor += texture2D(u_texture, resultCoords - d0).rgb * bV; } else if (pLv == 1) { tColor += texture2D(u_texture, resultCoords + d1).rgb * bV; tColor += texture2D(u_texture, resultCoords - d1).rgb * bV; } else if (pLv == 2) { tColor += texture2D(u_texture, resultCoords + d0).rgb * bV; tColor += texture2D(u_texture, resultCoords - d0).rgb * bV; tColor += texture2D(u_texture, resultCoords + d1).rgb * bV; tColor += texture2D(u_texture, resultCoords - d1).rgb * bV; } else if (pLv == 3) { tColor += texture2D(u_texture, resultCoords + d2).rgb * bV; tColor += texture2D(u_texture, resultCoords - d2).rgb * bV; tColor += texture2D(u_texture, resultCoords + d3).rgb * bV; tColor += texture2D(u_texture, resultCoords - d3).rgb * bV; } } if (!${cal} && (pLv == 0 || pLv == 1)) { if (${pID} == 0) { tColor /= 1.5; } else { tColor /= 1.2; } } if (!${cal} && (pLv == 3 || pLv == 2)) { if (${pID} == 0) { tColor /= 2.5; } else { tColor /= 2.1; } } ${rad} if (${cal}){ tColor.x = mod(tColor.x,1.); tColor.y = mod(tColor.y,1.); tColor.z = mod(tColor.z,1.); } gl_FragColor = vec4(tColor, a); } `,blurFragmentShader=compileShader(blurFSS,gl.FRAGMENT_SHADER),blendFSS=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D freshTexture; uniform sampler2D compTexture; void main() { vec3 blend0 = texture2D(freshTexture, vTextureCoord).rgb; vec3 blend1 = texture2D(compTexture, vTextureCoord).rgb; vec3 compBlend = mix(blend0,blend1,.9); gl_FragColor = vec4(compBlend ,1.0); } `,blendFragmentShader=compileShader(blendFSS,gl.FRAGMENT_SHADER),finalFSS=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D u_texture; float M = float(${M}); int wMax = ${DIM}; float fWMax; float scaleOffset; vec3 rgb2hsv(vec3 c) { vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); float d = q.x - min(q.w, q.y); float e = 1.0e-10; return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); } 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) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } void main() { fWMax = float(wMax) / M; float scale = fWMax / 2.0; scaleOffset = ((float(${DEFAULT_SIZE}) / M)/scale); vec2 st = gl_FragCoord.xy/scaleOffset; vec2 ps = floor(st / M); vec2 resultCoords = vec2(vTextureCoord.x, vTextureCoord.y); vec4 tColor = texture2D(u_texture, resultCoords); vec3 cBase = rgb2hsv(vec3(tColor.x,tColor.y,tColor.z)); float cbOff; cbOff = mod(${gridOffset},2.); cBase.z *= clamp(cbOff * 10.0,0.0,1.0); vec3 cAdjust = hsv2rgb(vec3(cBase.x,cBase.y,cBase.z)); gl_FragColor = vec4(cAdjust,tColor.a); } `,finalFragmentShader=compileShader(finalFSS,gl.FRAGMENT_SHADER),baseVertexString=` attribute vec2 position; attribute vec2 texcoord; varying highp vec2 vTextureCoord; void main() { gl_Position = vec4(position, 0.0, 1.0); vTextureCoord = texcoord; } `,baseVertShader=compileShader(baseVertexString,gl.VERTEX_SHADER),compFragmentShaderString=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D u_texture; void main() { gl_FragColor = texture2D(u_texture, vTextureCoord); } `,compFragmentShader=compileShader(compFragmentShaderString,gl.FRAGMENT_SHADER),artFragmentString=` precision highp float; varying highp vec2 vTextureCoord; uniform sampler2D u_texture; uniform float tick; float M = float(${M}); ${paletteInit} int wMax = ${DIM}; float fWMax; float scaleOffset; 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) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } float gCV(float cProp[paletteSize], int idx) { for (int i = 0;i<paletteSize;i++) { if (idx == i) { return cProp[i]; } } return 0.0; } void main() { fWMax = float(${DEFAULT_SIZE}); vec2 st = gl_FragCoord.xy; ${gDR(ps,6)} vec2 psO = floor(st); ps = floor(ps); ${centerPoint} ${cP2} float dis = distance(centerPoint,ps); float sBase = 1.; float vBase = 1.; float oSS = 0.; float sT = 0.; float minPercent = ${gDR(sectionSizes,11)}; float min = fWMax * minPercent; float max = fWMax * (1. - minPercent); float pL = float(${pL}); float ac = 0.0; ${gDR(basicTiming,1)} ${gDR(rectSections,12)} oSS = ${gDR(sliceSizes,7)}; sT = ${gDR(sliceTicks,26)}; ${gDR(slices,8)} ${st} ${gDR(circA,23)} ${gDR(circB,24)} ${checkMovement()} dis = distance(cP2,ps); ${gDR(circA,3)} ${gDR(circB,4)} ${gDR(dSC2,30)} ${gDR(ec,25)} oSS = ${gDR(sliceSizes,9)}; sT = ${gDR(sliceTicks,27)}; ${gDR(slices,10)} ${gDR(xC,19)} ${gDR(pf,20)} int cI = 0; ac *= tick; ac = abs(ac); ac = sqrt(ac / (pL - tick)); if (abs(ac) > 10000000000000000.) { ac = abs(ac) / 100000000000.; } if (abs(ac) * abs(ac) < 100000000.) { ac *= 50000000000.0; } else { ac *= 100000.0; } ac = sqrt(abs(ac)); int cC = int(mod(abs(ac),1000000.)); if (cC > 50000 && cC < 100000) { cI = 0; } else if (cC > 0 && cC < 200000) { cI = 1; } else if (cC > 0 && cC < 350000) { cI = 2; } else if (cC > 0 && cC < 450000) { cI = 3; } else if (cC > 0 && cC < 700000) { cI = 4; } else if (cC > 0 && cC < 900000) { cI = 5; } else { cI = int((float(tick) / pL) * 5.); } float mVa = 2.; vec3 rgbConvert = hsv2rgb(vec3(gCV(hues,cI),gCV(sats,cI),gCV(brights,cI))); if (psO.x < mVa) { rgbConvert = hsv2rgb(vec3(gCV(hues,0),gCV(sats,0),gCV(brights,0))); } if (psO.y < mVa) { rgbConvert = hsv2rgb(vec3(gCV(hues,1),gCV(sats,1),gCV(brights,1))); } if (float(${DIM}) - psO.y < mVa) { rgbConvert = hsv2rgb(vec3(gCV(hues,2),gCV(sats,2),gCV(brights,2))); } if (float(${DIM}) - psO.x < mVa) { rgbConvert = hsv2rgb(vec3(gCV(hues,3),gCV(sats,3),gCV(brights,3))); } gl_FragColor = vec4(rgbConvert,1.0); } `;var artFragmentShader=compileShader(artFragmentString,gl.FRAGMENT_SHADER);const aPg=gl.createProgram();gl.attachShader(aPg,baseVertShader),gl.attachShader(aPg,artFragmentShader),gl.linkProgram(aPg);const blPg=gl.createProgram();gl.attachShader(blPg,baseVertShader),gl.attachShader(blPg,blurFragmentShader),gl.linkProgram(blPg);const bldPg=gl.createProgram();gl.attachShader(bldPg,baseVertShader),gl.attachShader(bldPg,blendFragmentShader),gl.linkProgram(bldPg);const compositeProgram=gl.createProgram();gl.attachShader(compositeProgram,baseVertShader),gl.attachShader(compositeProgram,compFragmentShader),gl.linkProgram(compositeProgram);const fPg=gl.createProgram();if(gl.attachShader(fPg,baseVertShader),gl.attachShader(fPg,finalFragmentShader),gl.linkProgram(fPg),!gl.getProgramParameter(aPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(aPg)),new Error("Failed to link art program");if(!gl.getProgramParameter(blPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(blPg)),new Error("Failed to link blur program");if(!gl.getProgramParameter(bldPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(bldPg)),new Error("Failed to link blend program");if(!gl.getProgramParameter(compositeProgram,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(compositeProgram)),new Error("Failed to link composite program");if(!gl.getProgramParameter(fPg,gl.LINK_STATUS))throw console.error(gl.getProgramInfoLog(fPg)),new Error("Failed to link final program");const buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer),gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);var texcoordBuffer=gl.createBuffer();function draw(){if(canDraw){switch(drawArt(),phaseLevel){case 0:blurArt(targetTexture,targetTexture2,0),blendArt(targetTexture2,bT);break;case 1:blurArt(targetTexture,targetTexture2,1),blendArt(targetTexture2,bT);break;case 2:blurArt(targetTexture,targetTexture2,2),blendArt(targetTexture2,bT);break;case 3:blurArt(targetTexture,targetTexture2,3),blendArt(targetTexture2,bT);break;case 4:blendArt(targetTexture,bT)}compositeArt(bT),renderFinal(cT),tick%=pL,tick++}requestAnimationFrame(draw)}gl.bindBuffer(gl.ARRAY_BUFFER,texcoordBuffer),gl.bufferData(gl.ARRAY_BUFFER,textureData,gl.STATIC_DRAW),aDt.positionAttribute=gl.getAttribLocation(aPg,"position"),aDt.colorOffset=gl.getUniformLocation(aPg,"colorOffset"),aDt.hues=gl.getUniformLocation(aPg,"hues"),aDt.sats=gl.getUniformLocation(aPg,"sats"),aDt.brights=gl.getUniformLocation(aPg,"brights"),aDt.tickSet=gl.getUniformLocation(aPg,"tick"),bDt.positionAttribute=gl.getAttribLocation(blPg,"position"),bDt.textureAttribute=gl.getAttribLocation(blPg,"texcoord"),bDt.pLv=gl.getUniformLocation(blPg,"pLv"),bDta.positionAttribute=gl.getAttribLocation(bldPg,"position"),bDta.textureAttribute=gl.getAttribLocation(bldPg,"texcoord"),bDta.cT=gl.getUniformLocation(bldPg,"compTexture"),bDta.freshTexture=gl.getUniformLocation(bldPg,"freshTexture"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position"),fDt.textureAttribute=gl.getAttribLocation(fPg,"texcoord"),fDt.positionAttribute=gl.getAttribLocation(fPg,"position"),requestAnimationFrame(draw),document.body.addEventListener("click",function(e){canDraw=!canDraw}),document.addEventListener("keydown",function(e){canDraw=!canDraw});
This project is a visual representation of realities that are out of phase. Interference patterns, colorful echoes, and emerging secrets are explored. Mathematical functions produce constant motion, but rarely, a peaceful scene resolves within the chaos. Click or press any key to pause. *Photosensitive seizure warning: These artworks contain flashing colors and moving patterns. This is a Dutch Auction where the price decreases every 5 minutes as follows: 3 -> 2.5 -> 2 -> 1.5 -> 1.25 -> 1 -> .75 -> .5 -> .25
This series explores color in layered intersections. The unique hash determines the procedure of each traversal; endpoints, divergences, elevations, and color immersion. Left click or press any key for coruscation.
This series explores color in layered intersections. The unique hash determines the procedure of each traversal; endpoints, divergences, elevations, and color immersion. Left click or press any key for coruscation
const hashPairs=[];for(let e=0;e<32;e++)hashPairs.push(tokenData.hash.slice(2+2*e,4+2*e));const decPairs=hashPairs.map(e=>parseInt(e,16));var div,canvas,pad,gap,cycleSeed,bgColor,DEFAULT_SIZE=1024,DIM=Math.min(window.innerWidth,window.innerHeight),M=1,segments=new Array,shapes=new Array,frameOffset=0,coruscating=!1,canCoruscate=!1;let cVal,dTVal,cBVal,dz,solid,cB,dT;function setup(){canvas=createCanvas(DIM,DIM),pixelDensity(2),div=createDiv("").size(200,100),strokeCap(PROJECT),colorMode(HSB,300,100,100),bgColor=color(0,0,0),pad=(DEFAULT_SIZE-DEFAULT_SIZE/16)/6,gap=DEFAULT_SIZE/32,segments=new Array,cVal=decPairs[3]+decPairs[4]+decPairs[5],dTVal=decPairs[6]+decPairs[7]+decPairs[8],cBVal=decPairs[0]+decPairs[2]+decPairs[4]+decPairs[6]+decPairs[8]+decPairs[10],dz=cVal<300,solid=620<cVal,cB=cBVal<350,dT=620<dTVal,(cB||solid)&&strokeCap(ROUND);var e=floor(decPairs[0]/256*4)+1,s=floor(decPairs[1]/256*4)+1,a=round(DIM/e),e=round(DIM/s),s=Math.min(a,e);let r=new Array;noStroke();let t=2*(2+floor(decPairs[0]/256*6)),o=1;r[0]=new Array,r[1]=new Array,r[2]=new Array,r[3]=new Array;for(let e=o;e<t+o;e+=2){var c=validateNode(floor(decPairs[e]/256*7),r[0],7),n=floor(decPairs[e+1]/256*7);r[0].push(new Array(c,n)),nodeExists(n,r[2])||r[2].push(new Array(n,c))}o+=t,t=2*(2+floor(decPairs[o]/256*4)),o++;for(let e=o;e<t+o;e+=2){var l=validateNode(floor(decPairs[e]/256*5),r[3],5),i=floor(decPairs[e+1]/256*5);r[3].push(new Array(l,i)),nodeExists(i,r[1])||r[1].push(new Array(i,l))}let h=new Array;for(let s=0;s<r.length;s++)if(r[s].sort(),1<s&&r[s].reverse(),0==(new Array).length)for(let e=0;e<r[s].length;e++)h.push(mapSideToPos(s,r[s][e]));for(let s=0;s<h.length;s++){var p=h[s];let a=new Array;a.push(p[0]);for(let e=0;e<h.length;e++)if(s!=e){var g=intersection(p,h[e]);if(null!=g&&!compareVec(p[0],g)&&!compareVec(p[1],g)){let s=!0;for(let e=0;e<a.length;e++)if(compareVec(g,a[e])){s=!1;break}s&&a.push(g)}}a.push(p[1]),segments.push(a)}rescale()}function draw(){let h=floor(decPairs[1]/255*4)+1;!cB&&!solid&&dz||(h=1);let p=0;(cB||200<decPairs[22])&&(bgColor=color(0,0,100));var e=h*segments.length;bgColor=color((floor(decPairs[0]/2*4)+e*(decPairs[0]/128+2))%300,70,10),1!=h||solid||(bgColor=color((floor(decPairs[0]/2*4)+e*(decPairs[0]/128+2))%300,20,90)),dz&&(bgColor=color((floor(decPairs[0]/2*4)+e*(decPairs[0]/128+2))%300,70,10)),dT&&dTVal<700?bgColor=color(0,0,0):dT&&dTVal<768&&(bgColor=color(0,0,100)),cB&&(bgColor=color(0,0,100)),background(bgColor);for(let i=0;i<h;i++){cycleSeed=decPairs[i];let l=floor(cycleSeed/256*(cycleSeed/64))+1;solid&&(l=1);var g=floor(cycleSeed/256*(segments.length-1));for(let n=0;n<segments.length;n++){var d=(g+n)%segments.length,f=segments[d],u=(d+l)%segments.length,y=segments[u],x=valFromRange(0,f.length-2,decPairs[d]),m=valFromRange(x+1,f.length-1,(decPairs[d]+decPairs[d])%255),d=valFromRange(0,y.length-2,decPairs[u]),b=valFromRange(d+1,y.length-1,(decPairs[u]+decPairs[u])%255);let s=new Array;for(let e=x;e<=m;e++)s.push(f[e]);let a=new Array;for(let e=d;e<=b;e++)a.push(y[e]);getSharedPoint(s,a);let e=(floor(decPairs[0]/2*4)+p*(decPairs[0]/128+2))%300;30<e&&e;let r=90,t=40+cycleSeed*n;dz?(t%=100,t=max(80,min(100,t)),1==h&&(t=max(90,min(100,t)))):(t%=80,t=max(20,min(85,t)),t);let o=max(.1,min(.8,cycleSeed/400));if(dz?1==h&&(o=max(.4,min(.8,cycleSeed/400))):o=.1+cycleSeed/512+(1-n/segments.length),e,dT?(e=(floor(cycleSeed/2*4)+n*(cycleSeed/128+2))%300,r=0,t=20+cycleSeed*n%100,o=(floor(cycleSeed/256*5)+5)/10):!cB&&solid?(t=90,r=100,e+=cycleSeed/256*i+p,e=max(0,min(300,e)),o=1):cB&&(r=0,t=100,o=1),1==frameCount)shapes.push({baseBright:t,baseHue:e,baseSat:r,baseOpacity:o,bright:t,hue:e,sat:r,opacity:o,sDir:1,bDir:-1,oDir:128<cycleSeed?-1:1,frameToStartCoruscation:frameCount-frameOffset+5*p,coruscationTicker:0,isCoruscating:!1});else if(canCoruscate)if(shapes[p].isCoruscating||frameCount-frameOffset!=shapes[p].frameToStartCoruscation||(shapes[p].hue=shapes[p].baseHue,shapes[p].bright=dT?shapes[p].bright:100,shapes[p].sat=0,shapes[p].isCoruscating=!0,shapes[p].coruscationTicker=0),shapes[p].isCoruscating){if(shapes[p].coruscationTicker++,15<shapes[p].coruscationTicker||cB||dT){shapes[p].bright+=2*shapes[p].bDir,shapes[p].sat+=2*shapes[p].sDir;let e=0;dT&&(shapes[p].hue+=1,shapes[p].hue=shapes[p].hue%360),cB||dT?(shapes[p].bright<70&&(shapes[p].bright=70,shapes[p].bDir=1),shapes[p].bright>=shapes[p].baseBright&&(shapes[p].bright=shapes[p].baseBright,e++),90<shapes[p].sat&&(shapes[p].sat=90,shapes[p].sDir=-1),shapes[p].sat<=shapes[p].baseSat&&(shapes[p].sat=shapes[p].baseSat,e++),2==e&&(shapes[p].bright=shapes[p].baseBright,shapes[p].sat=shapes[p].baseSat,shapes[p].frameToStartCoruscation=-1,shapes[p].isCoruscating=!1,p+1==shapes.length&&(coruscating=!1))):(shapes[p].bright<shapes[p].baseBright&&(e++,shapes[p].bright=shapes[p].baseBright),shapes[p].sat>shapes[p].baseSat&&(e++,shapes[p].sat=shapes[p].baseSat),2==e&&(shapes[p].frameToStartCoruscation=-1,shapes[p].isCoruscating=!1,p+1==shapes.length&&(coruscating=!1)))}}else shapes[p].bright=shapes[p].baseBright,shapes[p].sat=shapes[p].baseSat;e=shapes[p].hue,r=shapes[p].sat,t=shapes[p].bright,o=shapes[p].opacity,fill(e,r,t,o);decPairs[0],decPairs[1],decPairs[2];let c=new Array;cB||solid,cB||solid?128<decPairs[30]&&(cB||solid)?(beginShape(),vertex(f[0].x,f[0].y),vertex(y[0].x,y[0].y),vertex(y[1].x,y[1].y),vertex(f[1].x,f[1].y),endShape(),c.push(createVector(f[0].x,f[0].y)),c.push(createVector(y[0].x,y[0].y)),c.push(createVector(y[1].x,y[1].y)),c.push(createVector(f[1].x,f[1].y))):(beginShape(),vertex(f[0].x,f[0].y),vertex(f[f.length-1].x,f[f.length-1].y),vertex(y[y.length-1].x,y[y.length-1].y),vertex(y[0].x,y[0].y),endShape(),c.push(createVector(f[0].x,f[0].y)),c.push(createVector(f[f.length-1].x,f[f.length-1].y)),c.push(createVector(y[y.length-1].x,y[y.length-1].y)),c.push(createVector(y[0].x,y[0].y))):cB||solid?(beginShape(),vertex(f[0].x,f[0].y),vertex(y[0].x,y[0].y),vertex(y[1].x,y[1].y),vertex(f[1].x,f[1].y),endShape(),c.push(createVector(f[0].x,f[0].y)),c.push(createVector(y[0].x,y[0].y)),c.push(createVector(y[1].x,y[1].y)),c.push(createVector(f[1].x,f[1].y))):(beginShape(),vertex(s[0].x,s[0].y),vertex(s[s.length-1].x,s[s.length-1].y),vertex(a[a.length-1].x,a[a.length-1].y),vertex(a[0].x,a[0].y),endShape(),c.push(createVector(s[0].x,s[0].y)),c.push(createVector(s[s.length-1].x,s[s.length-1].y)),c.push(createVector(a[a.length-1].x,a[a.length-1].y)),c.push(createVector(a[0].x,a[0].y)));d=round(M*(10*floor(decPairs[6]/256*2)+4));if(strokeWeight(d),stroke(bgColor),cB&&(strokeWeight(round(14*M)),stroke(0,0,0)),cB||solid)for(let s=0;s<c.length;s++){var P=c[s];let e;e=s+1==c.length?c[0]:c[s+1],line(P.x,P.y,e.x,e.y)}else line(f[0].x,f[0].y,f[f.length-1].x,f[f.length-1].y),line(y[0].x,y[0].y,y[y.length-1].x,y[y.length-1].y);noStroke(),p++}}}function getSharedPoint(a,r){for(let s=0;s<a.length;s++)for(let e=0;e<r.length;e++)if(compareVec(a[s],r[e]))return a[s];return null}function mapSideToPos(e,s){let a=createVector(),r=createVector();switch(e){case 0:a.set(fM(M,gap)+fM(s[0],pad),fM(M,gap)),r.set(fM(M,gap)+fM(s[1],pad),fM(M,gap)+fM(6,pad));break;case 1:a.set(fM(M,gap)+fM(6,pad),fM(M,gap)+fM(s[0]+1,pad)),r.set(fM(M,gap),fM(M,gap)+fM(s[1]+1,pad));break;case 2:a.set(fM(M,gap)+fM(s[0],pad),fM(M,gap)+fM(6,pad)),r.set(fM(M,gap)+fM(s[1],pad),fM(M,gap));break;case 3:a.set(fM(M,gap),fM(M,gap)+fM(s[0]+1,pad)),r.set(fM(M,gap)+fM(6,pad),fM(M,gap)+fM(s[1]+1,pad))}return a.set(floor(a.x),floor(a.y)),r.set(floor(r.x),floor(r.y)),new Array(a,r)}function fM(e,s){return floor(e*s)}function nodeExists(s,a){for(let e=0;e<a.length;e++)if(a[e][0]==s)return!0;return!1}function validateNode(e,s,a){for(var r=e;;){let e=!1;for(var t=0;t<s.length;t++)if(r==s[t][0]){e=!0;break}if(!e)return r;r=(r+1)%a}}function valFromRange(e,s,a){return floor(a/255*(s-e))+e}function compareVec(e,s){return e.x==s.x&&e.y==s.y}function rescale(){M=DIM/DEFAULT_SIZE;for(let s=0;s<segments.length;s++)for(let e=0;e<segments[s].length;e++)segments[s][e].x*=M,segments[s][e].y*=M,segments[s][e].x=floor(segments[s][e].x),segments[s][e].y=floor(segments[s][e].y)}function intersection(e,s){var a=(s[1].y-s[0].y)*(e[1].x-e[0].x)-(s[1].x-s[0].x)*(e[1].y-e[0].y),r=(s[1].x-s[0].x)*(e[0].y-s[0].y)-(s[1].y-s[0].y)*(e[0].x-s[0].x),s=(s[1].x-e[0].x)*(e[0].y-s[0].y)-(s[1].y-e[0].y)*(e[0].x-s[0].x);if(0==a)return null;r/=a,a=s/a;if(0<=r&&r<=1&&0<=a&&a<=1){a=createVector();return a.x=e[0].x+r*(e[1].x-e[0].x),a.y=e[0].y+r*(e[1].y-e[0].y),a}return null}function countInRange(e,s,a){return((e-s)%(a-s)+(a-s))%(a-s)+s}function coruscate(){if(canCoruscate=!0,!coruscating){coruscating=!0,frameOffset=frameCount;for(let e=0;e<shapes.length;e++)shapes[e].sDir=1,shapes[e].bDir=-1,shapes[e].frameToStartCoruscation=frameCount-frameOffset+5*e+5}}function keyPressed(){coruscate()}function mouseClicked(){coruscate()}
Generative art exploring the relationships between color, shape and sky. I love all the feelings colorful skies can evoke and have attempted to share some of mine with this piece. 4096 x 4096 https://ipfs.io/ipfs/QmcsKs6tr54R2W3Ro4yTyHDZyw5prux3HVhnMxqefdz8N7
A generative art piece comprised of many nested circles interacting with each other, blending colors, shapes and refractions. Dimensions: 4096 x 4096https://ipfs.io/ipfs/QmSgEu4gAZBq7p2P5y2p32fVoJhZKtYkDJgwYJobymWSQQ