0x5d8e…99a2

All memos sent from and to 0x5d8e…99a2.

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.
let e,t,r,a,n,i,o,s=(t,r)=>(void 0===t?(t=0,r=1):r=r||0,t+e()*(r-t)),f=(e,t)=>~~s(e,t),l=(e=1,t=0)=>{if(i){i=0;let r=n;return n=null,t+e*r}{let r=0,a=0,o=0;do{r=s(-1,1),a=s(-1,1),o=r*r+a*a}while(o>=1||0===o);let f=M.sqrt(-2*M.log(o)/o);return n=a*f,i=1,t+e*r*f}},c=e=>s()<e,d=(e,t,r)=>M.max(M.min(e,r),t),m=(e,t,r,a,n)=>(e-t)*(n-a)/(r-t)+a,u="fefdfb1d1517302332dd2e26f87d68fcc2cbf55b4dfcc79ef7d86ea0b8acb4aab2-f8f9fae9ecefdee2e6ced4daadb5bd6c757d495057343a40212529-de2c2cfff8e8fcd581d52941990d35-d726383f88c5f49d37140f2df22b29-183945116973F67C1FD82B03F2F2F2-a31621bfdbf7053c5e1f7a8cdb222a-1e90ffff514eff7700f7e3d569b6682b9091486abd282e39-b8b8d15b5f97319177ffc145ffe0a0fffffbffb5b4ff6b6c-1b3b4bd40000b68762eef2f6e6e0dae0b299eda67de2725b-0505041d34611f487d237ba133b2cce6e6e6fdd692fb3640-1d2f53ec5c23fdc449f5f1ebf8b8a03cb8a472c1c65898c1-ffbb33f1faeea8dadc457b9d1d3557031927424b54042a2b-26437fffcc00d2292effffff0000001884bffefddfd9381e-ccdbdc9ad1d480ced7007ea70032493d5a80ee6c4d293241-d00000fefefa3f88c5032b43136f6337323e96c8a2001242-05668d02809000a89602c39af0f3bdf7e7cefffaf000bbd8-3f3f37d6d6b1f2e0b6e6a100f24500-7500009e0000bd0000c70000d10000db0000e60000fa0000ff00007500009e0000bd0000c70000d10000db0000e60000fa0000ff00007500009e0000bd0000c70000d10000db0000e60000fa0000ff0000ffffff-f2bf58ffdd8ce37f445458737660654e342b45414a120d0e-247ba033b2ccfdd692ffcc33ff8c00fb364000563fff91af-d3cdc3F03000f78355ee7749F03C004b3934260c1a252422-40190617171af0a000f0c630f0d9a5f0d0c0ff0015cceeff-095c842e84a68eaccbe7eef5e1bf9bc48e1b876930241e05283224-7fa0c2336cbc60d7a2c8f354eee349ffffffe83b83e03a2eee8534e5d694-31b3936cde7ea0e6be6ad0be35ccc800a5cc60b3ef8a99e9ffbff4ff73d0-887499aba6c4d66e7fbb697ffe683cfca13bfcf115fbc9b2a244301b151".split`-`.map((e=>e.match(/.{6}/g).map((e=>"#"+e)))),p=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,1]},b=(e=1)=>{let t=[];o=[];for(let r=0;e>r;r++){let e=f(u.length);o.push(...u[e]),t.push(e)}return o=(e=>{let t=[...o],r=t.length,a=0;for(;0!=r;)a=~~(s()*r),r--,[t[r],t[a]]=[t[a],t[r]];return t})(),t},h=e=>{return(t=o)[f(t.length)];var t},g={};const v={width:6e3,height:7500,colorSpace:"display-p3"},y=(e,t={})=>{let r={};r.canvas=D.createElement("canvas"),r.context=r.canvas.getContext(e,{colorSpace:v.colorSpace,alpha:1,...t});let{canvas:a,context:n}=r;return r.stSz=(e=1)=>{let t=v.width/v.height,n=W.innerWidth,i=W.innerHeight;r.density=W.devicePixelRatio,i*t>n?(r.width=n,r.height=n/t,r.scale=n/v.width):(r.width=i*t,r.height=i,r.scale=i/v.height),a.width=~~(r.width*r.density*e),a.height=~~(r.height*r.density*e);let o=a.style;o.width=~~r.width+"px",o.height=~~r.height+"px",o.imageRendering="pixelated"},r.sv=e=>{a.toBlob((t=>{let r=URL.createObjectURL(t),a=D.createElement("a");a.href=r,a.download=`${tokenData.hash}.png`,a.click(),e&&e()}),"image/png",1)},r.dstry=e=>{r.width=r.height=a.width=a.height=1,r.clr(),a.remove(),delete r.canvas,delete r.context,a=n=r=null},r},x=e=>{let t=y("2d",e),{context:r}=t,a={fill:0,stroke:0,blend:"source-over"},n=(e,t,n)=>{a[e]=((e,t)=>`rgba(${255*e[0]}, ${255*e[1]}, ${255*e[2]}, ${t||e[3]||1})`)(t,n),r[`${e}Style`]=a[e]},i=e=>{a.fill&&r.fill(),a.stroke&&r.stroke()};return t.djstDnsty=e=>r.scale(t.density,t.density),t.drw=(e,a)=>{r.save(),t.djstDnsty();let n=e(t,a);return r.restore(),n},t.blndMd=e=>{a.blend=e,r.globalCompositeOperation=e},t.stOpcty=e=>r.globalAlpha=e,t.clr=e=>r.clearRect(0,0,t.width*t.density,t.height*t.density),t.fll=(e,t)=>n("fill",e,t),t.strk=(e,t)=>n("stroke",e,t),t.nFll=e=>a.fill=0,t.nStrk=e=>a.stroke=0,t.strkWght=e=>r.lineWidth=e*((t.scale+t.scale)/2),t.trns=(e,a)=>r.translate(e*t.scale,a*t.scale),t.psh=e=>r.save(),t.pp=e=>r.restore(),t.rct=(e,a,n,o)=>{r.beginPath(),r.rect(e*t.scale,a*t.scale,n*t.scale,(o||n)*t.scale),i()},t.plygn=(e,a=1)=>{r.beginPath(),r.moveTo(e[0][0]*t.scale,e[0][1]*t.scale);for(let a of e)r.lineTo(a[0]*t.scale,a[1]*t.scale);a&&r.lineTo(e[0][0]*t.scale,e[0][1]*t.scale),i()},t.crvdPlygn=(e,a=1)=>{if(e.length>3){let n=[...e];a&&n.push(e[0],e[1],e[2]);let o,s=[];for(r.beginPath(),r.moveTo(n[1][0]*t.scale,n[1][1]*t.scale),o=1;o+2<n.length;o++){let e=n[o];s[0]=[e[0],e[1]],s[1]=[e[0]+(n[o+1][0]-n[o-1][0])/6,e[1]+(n[o+1][1]-n[o-1][1])/6],s[2]=[n[o+1][0]+(n[o][0]-n[o+2][0])/6,n[o+1][1]+(n[o][1]-n[o+2][1])/6],s[3]=[n[o+1][0],n[o+1][1]],r.bezierCurveTo(s[1][0]*t.scale,s[1][1]*t.scale,s[2][0]*t.scale,s[2][1]*t.scale,s[3][0]*t.scale,s[3][1]*t.scale)}i()}},t.drwPnts=e=>{r.beginPath();for(let a=e.length-1;a>=0;a--)r.rect(e[a][0]*t.scale,e[a][1]*t.scale,e[a][2]*t.scale,e[a][2]*t.scale);i()},t.img=(e,a=0,n=0,i,o)=>r.drawImage(e,a*t.scale,n*t.scale,t.canvas.width/t.density,t.canvas.height/t.density),t.gtImg=e=>createImageBitmap(r.getImageData(0,0,t.canvas.width,t.canvas.height,{colorSpaceConversion:"none",resizeQuality:"high",premultiplyAlpha:"none"})),t};let E,T=(e,t,r)=>(E||(E=_(s(98765,34567876))),E(e,t,r)),R=e=>{let t=new U32(1);return t[0]=1664525*e[0]+1013904223,t},S=1/3,w=(e,t,r,a)=>({dx:-t-e*S,dy:-r-e*S,dz:-a-e*S,xsb:t,ysb:r,zsb:a}),_=e=>{let t=[];for(let e=0;e<P.length;e+=9){let r=A[P[e]],a=null,n=null;for(let i=0;i<r.length;i+=4)n=w(r[i],r[i+1],r[i+2],r[i+3]),null===a?t[e/9]=n:a.next=n,a=n;n&&(n.next=w(P[e+1],P[e+2],P[e+3],P[e+4]),n.next.next=w(P[e+5],P[e+6],P[e+7],P[e+8]))}let r=[];for(let e=0;e<z.length;e+=2)r[z[e]]=t[z[e+1]];let a=new U8(256),n=new U8(256),i=new U8(256);for(let e=0;256>e;e++)i[e]=e;let o=new U32(1);o[0]=e,o=R(R(R(o)));for(let e=255;e>=0;e--){o=R(o);let t=new U32(1);t[0]=(o[0]+31)%(e+1),0>t[0]&&(t[0]+=e+1),a[e]=i[t[0]],n[e]=a[e]%24*3,i[t[0]]=i[e]}return(e,t,i)=>{let o=-.16666666666666666*(e+t+i),s=e+o,f=t+o,l=i+o,c=M.floor(s),d=M.floor(f),m=M.floor(l),u=(c+d+m)*S,p=e-(c+u),b=t-(d+u),h=i-(m+u),g=s-c,v=f-d,y=l-m,x=g+v+y,E=0;for(let e=r[v-y+1|g-v+1<<1|g-y+1<<2|x<<3|x+y<<5|x+v<<7|x+g<<9];void 0!==e;e=e.next){let t=p+e.dx,r=b+e.dy,i=h+e.dz,o=2-t*t-r*r-i*i;if(o>0){let s=c+e.xsb,f=d+e.ysb,l=m+e.zsb,u=a[255&s],p=a[u+f&255],b=n[p+l&255];E+=o*o*o*o*(U[b]*t+U[b+1]*r+U[b+2]*i)}}return.009708737864077669*E}},A=[[0,0,0,0,1,1,0,0,1,0,1,0,1,0,0,1],[2,1,1,0,2,1,0,1,2,0,1,1,3,1,1,1],[1,1,0,0,1,0,1,0,1,0,0,1,2,1,1,0,2,1,0,1,2,0,1,1]],U=[-11,4,4,-4,11,4,-4,4,11,11,4,4,4,11,4,4,4,11,-11,-4,4,-4,-11,4,-4,-4,11,11,-4,4,4,-11,4,4,-4,11,-11,4,-4,-4,11,-4,-4,4,-11,11,4,-4,4,11,-4,4,4,-11,-11,-4,-4,-4,-11,-4,-4,-4,-11,11,-4,-4,4,-11,-4,4,-4,-11],z=[0,2,1,1,2,2,5,1,6,0,7,0,32,2,34,2,129,1,133,1,160,5,161,5,518,0,519,0,546,4,550,4,645,3,647,3,672,5,673,5,674,4,677,3,678,4,679,3,680,13,681,13,682,12,685,14,686,12,687,14,712,20,714,18,809,21,813,23,840,20,841,21,1198,19,1199,22,1226,18,1230,19,1325,23,1327,22,1352,15,1353,17,1354,15,1357,17,1358,16,1359,16,1360,11,1361,10,1362,11,1365,10,1366,9,1367,9,1392,11,1394,11,1489,10,1493,10,1520,8,1521,8,1878,9,1879,9,1906,7,1910,7,2005,6,2007,6,2032,8,2033,8,2034,7,2037,6,2038,7,2039,6],P=[0,0,1,-1,0,0,1,0,-1,0,0,-1,1,0,0,0,1,-1,0,0,-1,0,1,0,0,-1,1,0,2,1,1,0,1,1,1,-1,0,2,1,0,1,1,1,-1,1,0,2,0,1,1,1,-1,1,1,1,3,2,1,0,3,1,2,0,1,3,2,0,1,3,1,0,2,1,3,0,2,1,3,0,1,2,1,1,1,0,0,2,2,0,0,1,1,0,1,0,2,0,2,0,1,1,0,0,1,2,0,0,2,2,0,0,0,0,1,1,-1,1,2,0,0,0,0,1,-1,1,1,2,0,0,0,0,1,1,1,-1,2,3,1,1,1,2,0,0,2,2,3,1,1,1,2,2,0,0,2,3,1,1,1,2,0,2,0,2,1,1,-1,1,2,0,0,2,2,1,1,-1,1,2,2,0,0,2,1,-1,1,1,2,0,0,2,2,1,-1,1,1,2,0,2,0,2,1,1,1,-1,2,2,0,0,2,1,1,1,-1,2,0,2,0],B="#version 300 es",I=`${B}\nprecision highp float;in vec2 position;out vec4 color;uniform sampler2D image;uniform vec2 resolution;`,N="float hash13(vec2 p,float s,float t){vec3 p3=vec3(p.x,p.y,s+t);p3=fract(p3*.1031);p3+=dot(p3,p3.zyx+31.32);return fract((p3.x+p3.y)*p3.z);}",C=e=>{let t=2*M.PI,r=e=>e%1?e:e+".",a=(e=t)=>`vec3(${[0,0,0].map((t=>r(s(e))))})`,n=(e=1)=>`vec3(${[0,0,0].map((t=>r(e*2**(s(.6)-.3))))})`;return`float wobbly(vec3 p){return dot(sin(p.xyz*${n()}+2.*sin(p.yzx*${n()}+${a()})+${a()}),sin(p.zyx*${n()}+3.*sin(p.zxy*${n()}+${a()})+${a()}));}`},k=e=>`float getNoise(int o,float p,float f,vec3 c){float a=1.;float m=0.;float s=0.;for(int i=0;i<o;++i){s+=a*${e}(c*f);f*=2.;m+=a;a*=p;}return (s/m)*.5+.5;}`;const L=`${B}\nin vec2 a_position,a_texCoord;uniform mat3 u_textureMatrix;out vec2 position;void main(){position=(u_textureMatrix*vec3(a_texCoord,1)).xy;gl_Position=vec4(a_position*2.-vec2(1),0,1);}`;let $=e=>`${I}uniform float dist,intensity;mat3 k=mat3(${e});float f=0.;void main(){vec2 i=position;vec4 v=vec4(0);for(int e=-1;e<2;e++)for(int m=-1;m<2;m++){vec4 b=texture(image,i+vec2(e,m)/(resolution/9.)*dist);float d=k[m+1][e+1];v+=b*d;f+=d;}color=mix(texture(image,i),v/f,intensity);}`;const O=(e,t)=>{let r="-1.,-.5,0.,-.5,1.,.5,0.,.5,1.",a="convolution";return"sharpen"===e&&(r="0.,-1.,0.,-1.,5.,-1.,0.,-1.,0.",a+="Sharpen"),"gaussian"===e&&(r=".00625,.125,.00625,.125,.25,.125,.00625,.125,.00625",a+="Gaussian"),t&&(a+=t),{name:a,vertex:L,fragment:$(r),uniforms:[{name:"dist",type:"uniform1f"},{name:"intensity",type:"uniform1f"}]}},X={name:"shift",vertex:L,fragment:`${I}${N}uniform float time,seed,energy,randomness,density;uniform vec2 squareSize;void main(){vec2 e=position;bool s=false;vec2 h=position-2.,r=resolution,d=floor(h*r)/r;for(int i=0;i<200;i++){vec2 f=floor(d/squareSize)*squareSize,t=vec2(hash13(f*1e3,seed/12.+float(i)*randomness,time)*2.-1.,hash13(f*1e3,seed/36.+float(i)*randomness,time)*2.-1.);if(i==0)t*=5.;if(hash13(f*1e3,seed/24.,time)<density)e.xy+=t*hash13(f*1e3,seed/6.,time)*energy,s=true;}color=texture(image,e);if(!s)color.w=0.;}`,uniforms:[{name:"time",type:"uniform1f"},{name:"seed",type:"uniform1f"},{name:"energy",type:"uniform1f"},{name:"randomness",type:"uniform1f"},{name:"density",type:"uniform1f"},{name:"squareSize",type:"uniform2f"}]};let G=e=>`${I}${e}float map(float v,float a,float b,float c,float d){return c+(v-a)*(d-c)/(b-a);}${k("wobbly")}uniform sampler2D mask;uniform float seed,noiseSize,frequency;void main(){vec2 i=position;i.y=1.-i.y;vec4 m=texture(mask,i);i=m.xy*2.-1.+position;float y=map(m.z,0.,1.,35.,1.),f=map(m.w,0.,1.,1.,10.),s=getNoise(8,.6,2.,vec3(position.xy,seed+3e4)),p=getNoise(16,.4,frequency/f,vec3(position.xy,seed))*2.-1.,v=getNoise(16,.4,frequency/f,vec3(position.xy,seed+1e4))*2.-1.;i+=vec2(p,v)/(noiseSize/y)*s/10.;if(i.x<0.)i.x=abs(i.x);if(i.y<0.)i.y=abs(i.y);if(i.x>1.)i.x=1.-i.x+1.;if(i.y>1.)i.y=1.-i.y+1.;color=texture(image,i);if(m.w==0.)color.w=0.;}`,q=e=>`${I}${N}${e}${k("wobbly")}vec4 e(vec4 n){float y=0.,v=0.,c=0.,p=n.x,g=n.y,z=n.z,r=min(p,min(g,z)),m=max(p,max(g,z));c=(m+r)/2.;if(m>r){float x=m-r;v=c<0.?x/(m+r):x/(2.-m-r);y=p==m?(g-z)/x:g==m?2.+(z-p)/x:4.+(p-g)/x;if(y<0.)y+=6.;y/=6.;}return vec4(y,v,c,n.w);}vec4 p(vec4 n){return vec4(vec3(n.z+n.y*(clamp(abs(mod(n.x*6.+vec3(0,4,2),6.)-3.)-1.,0.,1.)-.5)*(1.-abs(2.*n.z-1.))),n.w);}void main(){vec2 n=position;n.x+=(getNoise(8,1.,50.,vec3(n.xy,0))*2.-1.)/4e2;n.y+=(getNoise(8,1.,50.,vec3(n.xy,1))*2.-1.)/4e2;color=texture(image,position);vec4 v=texture(image,n);vec2 g=position,c=resolution;v.xyz+=(getNoise(8,10.,50.,vec3(position.x/7.,position.y/7.,color.x*color.y*color.z))*2.-1.)*.01;v=e(v);v.x=clamp(v.x+(getNoise(4,.8,25.,vec3(position.x/10.,position.y/10.,color))*2.-1.)*.02,0.,1.);v.y=clamp(v.y+(getNoise(4,1.,25.,vec3(position.x/10.,position.y/10.,color.y))*2.-.8)*.05,0.,1.);v.z=clamp(v.z+(getNoise(8,1.,25.,vec3(position.x/10.,position.y/10.,color.z))*2.-.5)*.03,0.,1.);v.xyz+=(hash13(floor(g*c)/c*1e3,0.,v.x*v.y*v.z)*2.-1.)/20.;color=mix(p(v),color,.6);}`,H=(e,t,r)=>{let a=e.createShader(r);return e.shaderSource(a,t),e.compileShader(a),e.getShaderParameter(a,e.COMPILE_STATUS)||e.deleteShader(a),a},Y=e=>{let t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.MIRRORED_REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.MIRRORED_REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),t};const j={name:"post",vertex:L,fragment:`${I}uniform float brightness,contrast,saturation;mat4 v(float m){return mat4(1,0,0,0,0,1,0,0,0,0,1,0,m,m,m,1);}mat4 m(float m){float b=(1.-m)/2.;return mat4(m,0,0,0,0,m,0,0,0,0,m,0,b,b,b,1);}mat4 b(float m){vec3 b=vec3(.3086,.6094,.082);float n=1.-m;vec3 f=vec3(b.x*n);f+=vec3(m,0,0);vec3 v=vec3(b.y*n);v+=vec3(0,m,0);vec3 r=vec3(b.z*n);r+=vec3(0,0,m);return mat4(f,0,v,0,r,0,0,0,0,1);}void main(){color=v(brightness)*m(contrast)*b(saturation)*texture(image,position);}`,uniforms:[{name:"brightness",type:"uniform1f"},{name:"contrast",type:"uniform1f"},{name:"saturation",type:"uniform1f"}]},K=(e,t=[])=>{let r,a=x(),n={engine:a,blndMd:"source-over",completed:0};return a.stSz(),t.length&&(r=(e=>{let t=y("webgl2",{colorSpace:"display-p3",powerPreference:"high-performance",preserveDrawingBuffer:1}),{context:r,canvas:a}=t;"drawingBufferColorSpace"in r&&(r.drawingBufferColorSpace=v.colorSpace),"unpackColorSpace"in r&&(r.unpackColorSpace=v.colorSpace);let n,i=[],o=(e,t)=>((e,t,r,a,n,i=1)=>{let{width:o,height:s}=e.canvas,f=new F([0,0,1,0,0,1,0,1,1,0,1,1]),l=((e,t,r)=>{let a=e.createProgram(),n=H(e,t,e.VERTEX_SHADER),i=H(e,r,e.FRAGMENT_SHADER);return e.attachShader(a,n),e.attachShader(a,i),e.linkProgram(a),e.getProgramParameter(a,e.LINK_STATUS)||e.deleteProgram(a),a})(e,t,r);e.useProgram(l);let c=e.getAttribLocation(l,"a_position"),d=e.getAttribLocation(l,"a_texCoord"),m=e.getUniformLocation(l,"u_textureMatrix"),u=new F([1,0,0,0,1,0,0,0,1]),p=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,p),e.vertexAttribPointer(c,2,e.FLOAT,0,0,0),e.enableVertexAttribArray(c),e.vertexAttribPointer(d,2,e.FLOAT,0,0,0),e.enableVertexAttribArray(d),e.uniformMatrix3fv(m,0,u),e.bufferData(e.ARRAY_BUFFER,f,e.STATIC_DRAW);let b={};for(let t of a)b[t.name]={type:t.type,location:e.getUniformLocation(l,t.name),texture:t.texture};let h=[];for(let t=0;i>t;t++)h.push(Y(e));let g=e.createFramebuffer();return e.bindFramebuffer(e.FRAMEBUFFER,g),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,o,s,0,e.RGBA,e.UNSIGNED_BYTE,null),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,h[0],0),{name:n,getTexture:(e=0)=>h[e],draw(t){e.useProgram(l);let r=1;for(let[a,n]of Object.entries(t))n=Array.isArray(n)?n:[n],b[a].texture?(e.activeTexture(e.TEXTURE0+r),e.bindTexture(e.TEXTURE_2D,h[r]),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,...n),e[b[a].type](b[a].location,r),r++):e[b[a].type](b[a].location,...n);e.bindBuffer(e.ARRAY_BUFFER,p),e.drawArrays(e.TRIANGLES,0,6)},set(){e.bindFramebuffer(e.FRAMEBUFFER,g)},reset(){({width:o,height:s}=e.canvas),g&&(e.bindTexture(e.TEXTURE_2D,h[0]),e.bindFramebuffer(e.FRAMEBUFFER,g),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,o,s,0,e.RGBA,e.UNSIGNED_BYTE,null),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,h[0],0))}}})(r,e.vertex,e.fragment,[{type:"uniform1i",name:"image"},{type:"uniform2f",name:"resolution"},...e.uniforms],e.name,t);r.clear(r.COLOR_BUFFER_BIT),r.disable(r.DEPTH_TEST),r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,1),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1);for(let t=0;t<e.length;t++)i.push(o(e[t],e[t].textures));n=o(j);let s=t.stSz;return t.stSz=e=>{s(),r.viewport(0,0,t.width*t.density,t.height*t.density);for(let e of[...i,n])e.reset()},t.drw=(e,t)=>{let{uniforms:a,blendModeGL:o,post:s={}}=t,{brightness:f=0,contrast:l=1,saturation:c=1}=s,d={image:0,resolution:[v.width,v.height]};for(let t=0;t<i.length;t++)r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,i[t].getTexture()),0===t&&r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,e),t+1<i.length?i[t+1].set():n.set(),i[t].draw({...d,...a[i[t].name]});n.set(),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,n.getTexture()),r.bindFramebuffer(r.FRAMEBUFFER,null),n.draw({...d,brightness:f,contrast:l,saturation:c})},t.clr=e=>r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT|r.STENCIL_BUFFER_BIT),t})(t),r.stSz(),n.engine=r,n.engine2D=a),n.draw=t=>{let i=a.drw(e,t);r&&r.drw(a.canvas,i);for(let[e,t]of Object.entries(i))n[e]=t},n.setSize=e=>{a.stSz(),r.stSz()},n.destroy=e=>{a.dstry(),r&&r.dstry()},n};let V=([e,t,r=0],[a,n,i=0])=>M.sqrt((a-e)**2+(n-t)**2+(i-r)**2),Q=(e,t)=>[e[0]+t[0],e[1]+t[1],e[2]+t[2]||0],J=([e,t,r=0],a)=>[e*a,t*a,r*a];const Z=(e,t)=>{let r=s(10,50)/t,a=(e=>{let t,r,[a,n,i]=p(e),o=M.max(a,n,i),s=M.min(a,n,i),f=(o+s)/2;if(o==s)t=r=0;else{let e=o-s;switch(r=f>.5?e/(2-o-s):e/(o+s),o){case a:t=(n-i)/e+(i>n?6:0);break;case n:t=(i-a)/e+2;break;case i:t=(a-n)/e+4}t/=6}return t*=360,r*=100,f*=100,[t,r,f,1]})(h()),n=s(.5,2),i=n/s(5,20),o=(s(123849132),f(1,10),1-s()*s()),c=[];return r*=f(10)*f(10),{calculatePoints(){c=[];for(let t=0;25>t;t++)c.push([l(r,e[0]),l(r,e[1]),M.abs(l(i,n))])},draw(e){e.fll((e=>{let t=e[0],r=e[1]/100,a=e[2]/100,n=e[3]||1,i=(1-M.abs(2*a-1))*r,o=i*(1-M.abs(t/60%2-1)),s=a-i/2,f=0,l=0,c=0;return t>=0&&60>t?(f=i,l=o,c=0):t>=60&&120>t?(f=o,l=i,c=0):t>=120&&180>t?(f=0,l=i,c=o):t>=180&&240>t?(f=0,l=o,c=i):t>=240&&300>t?(f=o,l=0,c=i):t>=300&&360>t&&(f=i,l=0,c=o),f+=s,l+=s,c+=s,[f,l,c,n]})(((e,t=.5,r,a)=>{let n=360+e[0],i=e[1],o=e[2];return r=r||e[3],n=l(t*=4,n)%360,i=d(l(t,i),.01,100),o=d(l(t,o),.01,100),a||(r=d(l(t/20,r),1e-4,1)),[n,i,o,r]})(a,1)),o),e.drwPnts(c)}}};let ee=e=>e.reduce((({t:e,b:t,r:r,l:a},[n,i])=>({t:i<e[1]?[n,i]:e,b:i>t[1]?[n,i]:t,r:n>r[0]?[n,i]:r,l:n<a[0]?[n,i]:a})),{t:e[0],b:e[0],r:e[0],l:e[0]});const te=(e,t)=>{let[r,a]=e,n=c(.5),i=n?25:f(3,7),o=360/i*(M.PI/180),d=M.PI*f(5),u=[],b=l(),v=s(20,200),y=p(h()),[x,E,R]=y,S=s(.1,.5),w=c(.7)?1:0;for(let e=0;i>e;e++)u.push([M.cos(o*e+d),M.sin(o*e+d)]);if(!n||c(.9))for(let e=0;e<g.chaos;e++)u.forEach((e=>{e[0]+=T(r/v+e[0],a/v+e[1],b)*t/500,e[1]+=T(r/v+e[0],a/v+e[1],b+531284)*t/500}));return{pos:e,radius:t,extremes:ee(u.map((r=>Q(J(r,t),e)))),draw(e){let i=n?e.crvdPlygn:e.plygn;e.psh(),e.trns(r,a),e.nStrk();for(let r=0;t>r;r++){let a=m(r,0,t,1,.5);e.fll([x,E,R,S*a]),i(u.map((e=>J(e,r))))}e.pp()},drawSilouette(e){let i=n?e.crvdPlygn:e.plygn;e.psh(),e.trns(r,a);let o=.25*t;e.nFll(),e.strkWght(.5),e.blndMd(w?"screen":"multiply");for(let r=t;t+o>r;r++){let a=m(r,t,t+o,.3,0);e.strk([w,w,w,a]),i(u.map((e=>J(e,r))))}e.pp()}}};(o=>{window.W=window,W.D=document,W.S=D.body.style,W.M=Math,W.U32=Uint32Array,W.U8=Uint8Array,W.F=Float32Array;let d,u,y,R,S,w,_,A,U=(e=>{let t=[];return{addLayers(e){t.push(...e),D.body.appendChild(t[t.length-1].engine.canvas)},render(e){let r=1;for(let a of t)a.completed||(r=0,a.draw(e));return r},reset(){t.forEach((e=>e.destroy())),t=[]},save(e){t[t.length-1].engine.sv(e)}}})(),F=e=>{A||(_=W.requestAnimationFrame(F),R=e,w=R-S,w>u&&(S=R-w%u,A=U.render({frameCount:d}),d++))},z=o=>{_&&W.cancelAnimationFrame(_),((o="tx piter")=>{e=t=r=a=n=i=null,t=U32.from([0,1,r=a=2,3].map((e=>parseInt(o.substr(8*e+2,8),16)))),e=e=>(a=t[3],t[3]=t[2],t[2]=t[1],t[1]=r=t[0],a^=a<<11,t[0]^=a^a>>>8^r>>>19,t[0]/2**32)})(tokenData.hash),E=null,U.reset(),g={palettes:b(f(2)+1),background:c(.75)?h():"#fafafa",padding:.15,exposure:f(600,1200),noiseSize:s(4,12),frequency:f(4,9),seed:50*s(7e4,9e4),wobblySeed:s(),chaos:f(4),speed:f(1e3,6e3),energy:s(.5,1)/500,randomness:c(.1)?0:s(),density:s(.15,.8),size:[s(.05,.5),s(.05,.5)],shiftSquare:s(.01,.25),shapeSize:s(.55),numberOfBlocks:f(15,35)},g.background=p(g.background),g.chaos=(g.chaos+1)**2,d=0,u=1e3/60,S=W.performance.now(),y=S,A=0,U.addLayers((e=>{let{padding:t,background:r,exposure:a,noiseSize:n,frequency:i,seed:o,wobblySeed:d,speed:u,energy:p,randomness:b,density:h,size:y,shiftSquare:E,shapeSize:R,numberOfBlocks:S}=g,{width:w,height:_}=v;t*=w;let A=w-2*t,U=_-2*t,F=[],z=f(32,64);for(let e=0;z>e;e++)for(let e=0;6>e;e++)F.push(Z([s(A),s(U)],3>e?1>e?1:2:10));let D=(e,t,r=[])=>{let a=[],n=U*t;for(;a.length<e;){let e=s(n/100,n/10),t=[s(A),s(U)],i=te(t,e),o=1;for(let e of[...a,...r])V(i.pos,e.pos)<M.max(e.radius,i.radius)&&(o=0);o&&a.push(i)}return a},P=D(S,.9+R),B=D(f(10,20),.25,P),I=[],N=[],k=[],$=[];for(let e of P){let{t:t,b:r,l:a,r:n}=e.extremes;I.push(t),N.push(r),k.push(a),$.push(n)}let{t:W}=ee(I),{b:H}=ee(N),{l:Y}=ee(k),{r:j}=ee($),J=[(Y[0]+j[0])/2,(W[1]+H[1])/2],re=Q([(ae=[A/2,U/2])[0]-(ne=J)[0],ae[1]-ne[1],ae[2]-ne[2]||0],[l(50),l(50)]);var ae,ne;let ie=y,oe=K(((e,{frameCount:r})=>{e.trns(t,t),e.nStrk();for(let t of F)t.calculatePoints(),t.draw(e);return c(E)&&(ie=[m(T(ie[0]/500,ie[1]/500,r/500),-1,1,y[0]/10,y[0]),m(T(ie[0]/500,ie[1]/500,28123412+r/500),-1,1,y[1]/10,y[1])]),{completed:r===a,uniforms:{shift:{time:r/u,seed:o,energy:p,randomness:b,density:h,squareSize:ie}}}}),[X,X]),se=K(((e,{frameCount:t})=>(e.stOpcty(.5),e.img(oe.engine.canvas),{completed:t===a,visible:0,post:{saturation:1.4,contrast:1.2,brightness:-.2},uniforms:{noise:{seed:d+t/1e3,noiseSize:n,frequency:i,mask:fe[0]}}})),[{name:"noise",vertex:L,fragment:G(C()),textures:2,uniforms:[{name:"seed",type:"uniform1f"},{name:"noiseSize",type:"uniform1f"},{name:"frequency",type:"uniform1f"},{name:"mask",type:"uniform1i",texture:1}]}]),fe=[],le=x({willReadFrequently:true});le.stSz(),le.djstDnsty();let ce=e=>{le.clr(),le.psh(),le.trns(t+re[0],t+re[1]);for(let t of e)t(le);le.gtImg().then((e=>fe.push(e))),le.pp()};ce(P.map((e=>e.draw))),ce(B.map((e=>e.draw))),ce(P.map((e=>e.drawSilouette))),P=B=null,le.dstry();let de=K(((e,{frameCount:t})=>{e.fll(r),e.rct(0,0,w,_),[oe.engine.canvas,fe[1],se.engine.canvas].forEach((t=>e.img(t)));let n=t/300;return 1>n&&e.stOpcty(n),e.img(fe[2]),{completed:t===a,post:{saturation:1.5,contrast:.9},uniforms:{convolutionGaussian:{dist:.5,intensity:.2},convolution:{dist:.5,intensity:.06},convolutionSharpen:{dist:.5,intensity:.04}}}}),[O("gaussian"),{name:"oilNoise",vertex:L,fragment:q(C()),uniforms:[]},O(),O("sharpen")]);return[oe,se,de]})()),F()};navigator.userAgent.includes("HeadlessChrome")||(W.addEventListener("resize",z),W.addEventListener("keydown",(e=>"s"===e.key?U.save():""))),z()})();
**Disconnected.** The plane landed, and suddenly my world came down crashing. Everything stopped. Time no longer made sense. It felt calm, peaceful. No pressure, no questions. I was tired, exhausted to emptiness. Yet again, feeling nothing. **Disconnected.** There was nothing waiting for me behind those doors. Just a big, empty, cold room. I lay down on the floor, motionless for hours. What was even the point? Pushing myself to the limit, trying to fill the void filling my life. Killing myself to fill (feel) those empty pixels, while burning down everything else. **Disconnected.** Disconnected from everyone, disconnected from myself. Disconnected from my heart, disconnected from my feelings. Disconnected from reality, I abandoned myself. I let go and I let in. And the sadness finally permeated that void. **Disconnected.** 2023 has been a journey to learn how to disconnect and reconnect. In a journey of healing and patience, learning how to respect myself and my practice. Like learning how to walk for the first time, I learned how to feel. And those feelings finally filled that void. **Disconnected.** Like technology, I needed a hard reboot. To be forced to face the many things I escaped from all my life. To fall in love again with my practice, this time in a healthy and conscious way. To accept that it’s ok to be disconnected if you remain connected to what really matters.
let gThreashold = 100; let gNumA = 10; let gNumB = 6; let gRatio = gNumB / gNumA; const WIDTH = 500; function setup() { createCanvas( WIDTH, WIDTH ); colorMode( HSB, 100 ); gNumA = tokenData.hash % 35; gNumB = tokenData.hash % 19; gThreashold = tokenData.hash % 100; } function draw() { background( 100, 0, 100 ); gRatio = gNumB / gNumA; initColorCount(); if( gRatio != 1 ){ divSquare( 0, 0, WIDTH, gRatio, gThreashold ); } if( isEnableCaptureImage() ){ disableCaptureImage(); const namePNG = 'NumA' + gNumA + '_NumB' + gNumB + '_Thr' + gThreashold + '.png'; captureImage( namePNG ); } drawControllerCaptions(); } // Divide a square whose length is squareWidth at ( xPos, yPos ) with some rectangles whose sides have ratio. const divSquare = ( xPos, yPos, squareWidth, ratio, threashold ) => { const xEndPos = squareWidth + xPos; const yEndPos = squareWidth + yPos; let itr = 0; setColor(); rect( xPos, yPos, squareWidth, squareWidth ); while( squareWidth > threashold + 0.1 ){ itr++; if( isOdd( itr ) ){ const nextWidth = squareWidth * ratio; while( xPos + nextWidth < xEndPos + 0.1 ){ divRect( xPos, yPos, nextWidth, ratio, threashold ); xPos += nextWidth; } squareWidth = xEndPos - xPos; }else{ const nextHeight = squareWidth / ratio; while ( yPos + nextHeight < yEndPos + 0.1 ){ divRect( xPos, yPos, squareWidth, ratio, threashold ); yPos += nextHeight; } squareWidth = yEndPos - yPos; } } } // Divide a rectangle with specified ratio whose width is squareWidth at ( xPos, yPos ) with some squares. const divRect = ( xPos, yPos, squareWidth, ratio, threashold ) => { const xEndPos = squareWidth + xPos; const yEndPos = squareWidth / ratio + yPos; let itr = 0; setColor(); rect( xPos, yPos, squareWidth, squareWidth / ratio ); while( squareWidth > threashold + 0.1 ){ itr++; if( isEven( itr ) ){ while( xPos + squareWidth < xEndPos + 0.1 ){ divSquare( xPos, yPos, squareWidth, ratio, threashold ); xPos += squareWidth; } squareWidth = xEndPos - xPos; }else{ while ( yPos + squareWidth < yEndPos + 0.1 ){ divSquare( xPos, yPos, squareWidth, ratio, threashold ); yPos += squareWidth; } squareWidth = yEndPos - yPos; } } } // The number is even or not. const isEven = ( number ) => { return ( number % 2 === 0 ); } // The number is odd or not. const isOdd = ( number ) => { return ( number % 2 === 1 ); } // Get random integer between min and max const getRandomInteger = ( min, max ) => { return Math.floor( random( min, max ) ); } // Capture Image const captureImage = ( namePNG ) => { saveCanvas( namePNG, 'png' ); } let gColorCount = 0; const initColorCount = () => { gColorCount = 0; } const gRandomColorArray = []; // Set Color for each count const setColor = () => { // If new element found, add a random color. if( gRandomColorArray.length <= gColorCount ){ gRandomColorArray.push( random( 100 ) ); } // fill( color( gRandomColorArray[ gColorCount ], 100, 100 ) ); fill( color( gRandomColorArray[ gColorCount ], 40, 100 ) ); gColorCount++; } // Change all colors in the array const changeColor = () => { gRandomColorArray.forEach( ( element, index ) => { gRandomColorArray[ index ] = random( 100 ); }); } let gIsCaptureImage = false; // Is capture image function is ready or not const isEnableCaptureImage = () => { return ( gIsCaptureImage === true ); } // Enable capture image function const enableCaptureImage = () => { gIsCaptureImage = true; } // Disable capture image function const disableCaptureImage = () => { gIsCaptureImage = false; } // Draw controller captions const drawControllerCaptions = () => { textSize(20); // Tentatively, disable stroke. noStroke(); // Draw background fill( color( 'rgba( 0, 0, 0, 0.3 )' ) ); const offset = 10; const width = 200; const height = 160; const cornerRound = 5; rect( offset, offset, width, height, cornerRound ); // Draw captions fill( color( 'white' ) ); text( 'Num A: ' + gNumA, 50, 47 ); text( 'Num B: ' + gNumB, 50, 87 ); text( 'Threashold: ' + gThreashold, 50, 127 ); // Revert stroke stroke( color( 'black' ) ); }