0xedc8…fea4

All memos sent from and to 0xedc8…fea4.

et r=X1([e+1,s*9,i],.05,"x",10,2),o=999;T1>.5?o=ns(e,s+w1,i-v1,Ka,o,P1)*(1/(1+2*Math.abs(Ji)))}var Y=z.r_choice,q`t)=>(e%t+t)%t,G1=( )}e.putChar(t.x+r,t.y+n!H,s,!v ){t>r.x&&t< r+2,o+1,n.label /n.speed+n.phases[u%:Y(["THROUGHPUT","LOAD p #X n.harmonics)m+[f]&) d.status;x!4)).substring!}"( z 100).toFixed(1'(`p Start(4,"0"&O,51,52,53,54,55,56,57 ~ETRY ACTIVE ///@DATA RELAY ONLINE@QUANTUM SYNC OK@ ? K ESTABLISH &SHAK`d BUFFER OVERI( e).repeat(q,|2* err",s=G1(#= ={ok:[`${s}'J ERR'C ECKSUM`]};9Al=c.getSeconds()+`e="0123456789ABCDEF"0NWvar H1=navigator.userAgent* a?.mobile??win#|"3tchMedia("(poin1es,ee=4,j=docum K("&T vas");j.id=!1`5 ie;H1?ie=1: :os,Wireframe:as}a no wallet found \u2014 is MetaMafe%* ("https://g" ${t} Issued At@"STATUS:AUTOPILOT{PVS:U1,PFS:_1,draw@ength;a+=4)o[a]=Math-
=e,{controller:h,mcubes:c,wind:l,heightfield:f,explosionGeo:d,@+Target:x,hud:m}=t,{h:u,sprite:p,flaps:g,activeWid@- v,seed:A,w`E,cells:T,color:R}=m,w={boostCh@i:0,turboReady:!1 ",wasGroundHit@9 status:"AUTOPILOT",pendingL@!fram!M []},S=1e3/30,P@,D=_=>({numWaypoints:5+_, ghness:z.r_dec()});fun!>on F(){let _=Z.`\,O=t.sample(_);M.normalize(O.dt,@),k=b.create();b`\{shipPos:$,pursuer@@/ ,K=ct<1;k&&!w.$e TRACKING ":K||#aleAndAdd(k,_$i mu.)Y s-15,5,"LEVEL:"}),Oe.clearR U(B.title="GAMERS - ho:n,dt:i,r:o,n:adown"!S >{switch(s. ("a");typeof i$=
et r=X1([e+1,s*9,i],.05,"x",10,2),o=999;T1>.5?o=ns(e,s+w1,i-v1,Ka,o,P1)*(1/(1+2*Math.abs(Ji)))}var Y=z.r_choice,q`t)=>(e%t+t)%t,G1=( )}e.putChar(t.x+r,t.y+n!H,s,!v ){t>r.x&&t< r+2,o+1,n.label /n.speed+n.phases[u%:Y(["THROUGHPUT","LOAD p #X n.harmonics)m+[f]&) d.status;x!4)).substring!}"( z 100).toFixed(1'(`p Start(4,"0"&O,51,52,53,54,55,56,57 ~ETRY ACTIVE ///@DATA RELAY ONLINE@QUANTUM SYNC OK@ ? K ESTABLISH &SHAK`d BUFFER OVERI( e).repeat(q,|2* err",s=G1(#= ={ok:[`${s}'J ERR'C ECKSUM`]};9Al=c.getSeconds()+`e="0123456789ABCDEF"0NWvar H1=navigator.userAgent* a?.mobile??win#|"3tchMedia("(poin1es,ee=4,j=docum K("&T vas");j.id=!1`5 ie;H1?ie=1: :os,Wireframe:as}a no wallet found \u2014 is MetaMafe%* ("https://g" ${t} Issued At@"STATUS:AUTOPILOT{PVS:U1,PFS:_1,draw@ength;a+=4)o[a]=Math-
l)continue;let[K,$,ft]=ct,qe=K*h+$*f+ft*m;if(qe>this.grid[ot]){_barycentric2D(t,i,s,n,r,o,a,h){ c=(o-h)*(s-a)+(a-r Math.abs(c)<1e-10)return nullA4sqrt(i*i+s*s+n*n);r>@};var Ve=tokenData;+s e.log(Ve.has*k@%0)/4294967296}},z=new"0,M1=Array.from(@,s*2,(n+73)%99,r+-=a,t-=h,i-=c,e* Sat; `,cs=` layout(locaN = 0) in vec3 aPosi@ uni1 m mat4 uProjecmix@O 4(c.bg, K.wA1 mod(52.9829189 9 at bayer4xgtA&138196601125010504E`,N1=(e,t)=>(e*e+t*t)**.5,Y,ss`% A e>0&&t>0?N1`l*o:l*r;n==="x"?e=a xs=mt(.5+.5*(t-e)/i,0,$:
h=0;h<s;h++)r?this.putChar(t,i+h *n,45,o,a):,s,n,r,o=16,a=46,h=[1,`],c){for(let l=0;l<=o;l xf=l/o,d=n+f*(r-n),x=Math.round p`h=r[1]==="l"?t:t+s-1,c },Zi=Be;var jt=class{constructoa=0,s=[0,0,-1]){`rota`' b.create()linearDamping=.92bilizeStrength=3doubleTapWindow=30ow.addEventListener(" @w!_ t.isPrimary!iGeodesicSpher!߀,n=new Map,r=1e6>O 9`g=h>1?p/(h-1):0,v u`COLOR_ATTACHMENTZ+G*H,O=[[lt,_],
is.normalCache=new Float32Array(TMP_VEC3_A=M.create(Volume(t){let i=`},s=i.values,n=0;for(@$c;s[n++]=t.surfaceFunc(l,h,o)} [r]}gener!= Mesh(t=40){a8marchingCube(o,r,n,t);i+=a}f=Gi[l];if(f===0)l=`${h}-${c}`;t.has(l)||(tA,l,f,d,x,m,u;a>=h&& ?(v[l]-m)/d:0,y=x;var Zt=class{c3Hm1={BURGUNDY:[145,78,112+RIGHT_RED:[241,80,96],F/woff;base64,d09GRgABA@DXIoxDXw889QALAy B4nGNgZGBg2vN/DgMDswIDA5hkZ#BJgYE0AMRABQ+AP HicY2BhVmCcwMDKwMCswKzAwM"LJwMMMDMggTC9ID2 yYGtWymPf/nMDAw7WFIAYkDh nwrxxZ+MQBjdSDH6lhCn1jBcLkLLSkRa4OrNgDjAhpEeAOXCuZu6cOjVda8G2pSzqdVunpo1z0sSyWKOCkeZpA78gyvzXyeP+bGCdAbwLtf5Gzi8df4Qcw1RUvCIO18kphfEYxxv/4D+7atPqPcKWHWCQ+sYzq4AzdRpUNVVGMfxL/wRF0BREQER7r1w/ojijgt4VcQNN8QFXFF2lcUNUVEUMi2yLMos2ohCRYVKCRJBiibM0aYZqVHxHrjcmt43zTQ1zXA7/UGHcWrqdc/MmXOed585z+8cQOPxCsSF3uN5o3Pp6920UmOvoAR3giimigtUU0sd12nhC25zh3Ye0MmP/Myv/E4PyuU17axWrlVpF7XL2jWtQWvV2rSvTRaT1VRsqjafM1+yBFiCLeGWOEuqJTPENcQ7xCwQrsJTeAsf4ScCRaiIEJHCKnJFiTgpSsVL4qyoFLWiTjSJm6JNfCMe6VY9Ro/VU/R0PUvPUapXTmWf7wpXaaDJ8LX1+7r5iV/4jT/+4as3fF895SszfP6WoCe+jD6f6V98Cf2+sr/5OvTofl+mnt3rUz8oh+pWXcqmOtQDdV+1q3vqjrqlWtXnqkXdVM2qSTUq3ak7LU4/p6/Tx+nl9HC69KiePx1VjtOOOIe5O6o7zH7dXm+vsZ+xF9jzux523e1qll2yU34v78lv5V15W7bKG7JO1shyeUqekMWySBbKPJkmk2WSTJTxMk5abZ22R7YOW7Pthq3R1mBMu4L/c7kYiXRjg!GgQxiMEPwwBMvhuLKMLwZzghG4sMofBmNH/4EMMbI71gjtcGYMGMhhFAEOmGMI5zxlOYyjSmE8kMZjKL2UQRzRyszGUe84lhAbEsZBGLWcJS4ljG/wklXEs5oE1rCWdawnkSQ2sJFNbGYLW0lmG9tJIZU00skgkyx NdZJNDLnnsZg972cd+8j$Qc5xGEKOcJRijjGcePVlRgX4 zW2A+8BBg4d4eHoNdR3mPXzESJ9RvqP9/APGBI4NCjaZLSGhQg8bFz5+QsTESZOnTJ02PXLGzFmzo6LnWOfOmx+zIHbho"{lsYtW75i5ar41Qlr1q5bn5i0YeOmzVu2Jm/bnpKalp6RmbVj567snNy83Xv27tuff6Dg4KHDhUeOFh07Xlxy7o3yt95+5933Kyo/4MPzFy9UX7pyuab2o08+vnqN+k8b PuP0syefu/$p49H9ibfvfiw49QZ4/glz5e1VPH6iRfaG+9T+irPPDXa3q/kSb3y3yH4C+xyPzeaAft4nA3CXUQkcQAA8Pn+/t7Zmdn5/M/s1EOyctZKkpxz1llJD1n7sE5yD+sk62QlPZ2kh4yTk5XsQ05yclZPOStZOSO5hyQ95GQlSZJzkuTy+0EQ1PMiD81CDWgfuoQ5OAvn4Un4M7wJHyMQ0o3UkAjZRA6Ra5RC36Hj6Dy6ijbRGO2gfzED68PyL0rYFLaKtbEn/C1ewufwBn6MX+FPBEN&DxkVgkdogO8UQCMk9WyDrZIn+T15RG9VBFaoH6QZ1QD7RND9PjdIWO6E26RZ8wBKqzB5zwSpsyA6xFXaFPWIfuYDLcmWuyn3h1rkmd8rd8xrfx4/y0/wy/50/4C8FTgDCgFAUasKKsC3Ewq0oiRmxJC6Ie+K5+CwBqVcakSrS8ouG1JKuZEkek6flbbkln8sPiqEMKEVlUllUDhJEIp+YSjQS+4mOKqm96rj6Vf2pdpJScjBZTW4kD5N3mqTltJK2pO1oR9qVLugZfUyf0et6rN8bjNFrFIyasW60jRvjOZVLTaSi1G7qwhTMnFkwK+aS2TZPzX+Wag1ZRatqLVkb1i/rxlZtYA/aH+wZO7Lb9rlDOBlnzJlwak7krDlb&TO2fOtfPsSm7gZt2CW3ar7oJbd5vugXvm3nuU53r9XsF779W8yNvyYu+P9wA0kAFvwASYBRHYBkfg1jf Bb0Azi4CJ4TCvpV+mRdDW9kY5DO8yHn8K1cD/sdFFd3V2F/1mZo9gh1Vw9b2NZcr2PbLbcbg3GD8SD0LMYTBOE 0FiY9oImCAU(P8CBAzfgwMEG/gv8AYuNJ52JHOgH3HihcIN2bDtT2Op11alT99Z9JGend9rArgRJ JPVe3br1cer"AmWPksp/c9sSPN0kf782y797KvvLp6k//2Lb58ufv3Vd/OZPEzfzvXlhb783cXT7t1X33X6+q7f9a92/fqzX/3nL385Gx7/+7Puv4TaLKXf/GJ2N7tLz9OnKe13+12/ku/1sO5W+9U4dg/v34y&Sb9/d4di/PZ7ej3HshP2n+Uu5VfvT+ZbpKPxEqstZq3e+61bDq96uhk5/r/W4Q&S4uxvHx9ez28dvZrfvL7uDkgfhS/1R0qO8pK+NssiTsobTV+pCT7YyrPY3wuMedHd 73Pr4zVhJC"JUNandLCXoXKi25HjpQSvvf6LRfjcvnSTetf3bhRiDRkn72Kaw8a+G7oxC+jU79Ah3I3eQkna9nVWjnq5X6hthLK6yHb3TmTD3mS5UufZN1ZirS+OM3TjtR2ga9swslT1oS5LuUkwuweRObpGvsxet0DlsSvMZvtUP9iO4OYTQeRqgCG9fylKMOunb989xa7gBCfpBEyvC12k27EYrZiLdfyV61lhBa7w6gWYhr1V0a5K667tJWvscUeQlzKc1n99aiX261gIY98RUmltChyUz4+SUN6kdKWnIjdyp7n+5VqYy/W0hsDG2oT/qDUVI$)cdv9KWE/SndW6FbPGK7L/qFhcz73Qvdp9LNSgY6VXLB9t7f60r62+hWXzU/MF9VcirzxmdHM5fgt6aL4rt/HGSoHH6R1ulV+du1vDYs5dFS1hRdr3t/Lj/iUGszj5yrF5U9vX+jNiwb8//bftUIoefirwoQ7y9z9LVPoZfGyyCxnPVid87m+uIHvfmjylfuMXMX04Cdj9STaOhmDRXFLZdtg1k4TS7OE3DF7Pk24GBSIq/Ekhb8G0AgK8xl/lWdk udPUm9ciyLx /2YlEFdWgy9wdMpFT,6LPZb8dd0qTY36K6AwPJ3AAqvhl5f$lNfsgacLmf840BHFiX'qqyPy226hXbsUc9(a1fs6wu1ptXeUOSUgIW7wxglfAxJ0BVlLNJdRioiKdeG25o6-L99zsNQJWS3YLzUSXgO8jsAk2tGrs3+mr+G3J6fXGlwh1YAwgdG1GAmdYQ/B1wVg5qJbl0vsJDzXGDBNPHE7HmCBFo5Odt6+7Ni7UMND4Tw57b+KZO5p6Ke+YidZTd6D9pWuJ+L1LKQNx5JokZlt8I3W6W8X4B4Wi7mAgJ/YyY0y4g/0Gb+TGHTjlZykv5YkbYt/AUPxBmBDpuv7VO4jEN7YvINnXlgMMC1GYeqrhuZJQoDf4DZ7r+35WfPbY7+B1SlslcSM8i90NF7IT3RH+J6+Nbnr8Bb4luGbLNIpOxNt0qcsz663Sdfpp+rO0hXZVQPsrdQj52erq5ADeAp4u5NkVUXusArP1KzdB0XhsecKB3rKBrYjuRXsP4Enk0elaijFr0z7NJIsOFMgfGt4t'T07kEVotV0OMJGr6nnn8tkvoXsshLApUHexibvMP1pogyXESKQVIqtdHl5AJjNmP0iQgmIsMd4UDW0fyppk9rxPkS/VSGv/mFoIBK6RmupOYMbseKF0Jf8OKgGLvcAy-tTBB5XG3HI1NaOcLTc/YTOwT7WWUz/j+a8U8rY74da9CZgq7rPvLSfvzbN6WLkGlDc0iJGlhOflGvOBjJm+f+s1iMVs/S3xSS3VPJLaRIJv/Dwt/Kj8NH4ig7sBQ32xDnZ3biF1Lrm846vjaNnqAE3qhUrbQWmTc6MSxbzIcGVR6a9Y40mB4Ag5edJ4Mc9CHnFCpFG0evaOMBdB/8xQgdm7Jl4eEc8ZDV1Y/obtpTZ15ISGD44IbBkyEjwl/wlN/bg8od1ig0iu6VNye4hWPmbmSRTPgk15A+RNeXdH8vatwnJGnAgab6krJ809CG7JSxDtMd6oY/1BnIHSbSylQ1idnB1xroHYgc8TfHOvA1fUqaaP8s1Jo+kWlnvHVc082W0Gon3uv88yR25f+EStvVK/57Byhqasqc/DpozwzpBBvB7Qy8Yre7mjel71p/iq6PilwL1Yf0TaBton9HtknbWEXX7fcQg5E E1BJV2QI3C"TbdtovahVpvgn5Gfj21Tc92HqrgUv"t5vYQ2BOuWlppR2/Vb90n7Lj664i6h54Kyz21x2W7x+oP1RPqzqiQ6KcXDTd95cTrW7qmsGKdkyZ+dmFPzX5G7+RokMYmwrXPwrV9uRLXCdXpHhXDmz2iAv96Vj*VxU4Pt7z3cb/gxXpY7qXVuzO93L4+tmPxZ3UuwfmN9ntDtghFGfxifwyTsWVf7KiLpYsP1JprFbG9hfmW8PV561MT/MTMeq VrDAXpwh7XXCviG6zO4lvrf1Z7gtL1mW PqVq1ustWs6DYbFgE9tPHe9nDVUlEkuEJVNalEGmLd4fF1ThMc/iE9nwcY8IPRCfUBkLVaVDfxIxqWQjj3UGrkGvEk+/RyyvAf9s9EAyWwLV+wDbX6vOGhj1yopZ3xaHBdpKKztNImgtBSmd6rHVk+fWzLQR.tWOac3pfD6pktNu0ZYWcUMs37PrUeJUKbP9Fe/BTfzkJ9aD03zoJiDu1gxt3XrGZaiWJLd7Ddt/dkbGqM9u2L3y0Fx3NWS4tdiG+1IacYY/kbI4a+oJZp0HNePn2QzTLkRZN8W6OIQ60HOrWYWsMuQs7&[e51jR2qr9YJsucq4odmOfx/qJGgWzIb6j//XuhLor3l8cTBLiNz6brXqtZyo9OEyzDfBipO9lv6Bc8rxkb91jWP9KQLWQ9vTsgYLqyjGf0PgR7FV6vhp4ONKn1KnEKedMnjEaWrbCTuKDkubR7N63kjfNk/d LGVn1ON+czbzsV87D+gQa2ZLfuKa8+9ytiqyHUbq4C0Iw0uP752XJC1iW83lv2U6oC7Njgk8uS636OcZ+mFr8Qaz2et9rVGQjZ09HJgbrorsmeM3a/QhF8NNU"2E23OcglyuT5JFYldvv6ZUF3yMnEbRrzOUC)E 1PVn/W6pM90E3t0cyewd2+ygh1ealyO2qo6tt8P+lDJ9qS3cser5tskPnOdBKcHWS6+mpATC/hun6YLvAv81j9lZFjMyh7H5QdCvdmsHdppl3dlt1qpzpGxdNtUmql axd6YzGf9gB+r0rGOY35hnOeNof7zPYbKwoWBPt5/CZX2709tc+AN6VhAL876(c0dJGQUXJsyI8k8/jbfYR/RfSdzZET0IcQGXVmtW6VdsrQaXhiO5YXLEL+afRjm71#/je76aYb+lyebZhvnOG7p49#X7sObDOTN3f3ZC7jXGs+faM7deeI7N1xexhm5i/DSmeNfT5VvsKlhzv4voZPaf2di+DPcW+/L+JZC1Yz/6gh2cjSfO7fIVL9q4WPpP3hvwhrINjb0tAtjqQr8+YT6vrnN3mva0/ocPeIPd02KjbzNddEdifh/rZUS8XBpIHq1tvm99ioKC1pW3ycs17zUPtEw3WkchNJlF6O72wECKMVtGUDAbNREom/jXPf0NZowuLX5ZlOI5BM4Wm5mujydMk4oWc3nR1WcDY2MVqF0q802mPd2WGWxacloQzvD2Uf/0OoD3I2pKHvSvxfzwDl733cFgwwLHYFXxMENMz8rZDRJxTyTffOT/Ks9XYHvmq0vWUWrV18xsz8yDyubN3xoG0I/rUh6hAodyelo3+tISZAb+17urfPdyc+C9lkTeE1PfCiXYo4xtx43pELbEWS2obBNyDklQPzMmHuU/upNwYyLfcn5tcm+scFCmWDx7Azs4bbmKJAdo8Kw1iic2XCjp7BMo+rTm/Zt2YDV9bRqLOtGhspHS03U6"l7uMf4yxizdJYEt/VZ78d6W2sSeEQA2-Sm18MsXdRD/44+FpqXl+keDX+TH3tRfqcEzmbAYpsr2ilVzjfs.JE4Dm5Xrr1guG4S/CVHJatxjX39xdn1ddYW8cG9ngRYNTjFSYME49WxL9lxdaFPnL5O53BXzLUYj1cErRpFwfCKH7EfRUGmlJv9ht2wb+q9zdstuVsNPUb+ZhZSQUNDK gnDO0yJ0jjVua4/6z3b8ZgwmF/wBteEWZ9HWRGzx94BSPJdFakzMZERrmDJpDJLcahNi LLzN6EDZM3FzNm66SWz08YDBuStzN.qUOLKRhHSshOGIiRFyzKfdWSeN5m3c/dL5H/aa5j97llZEuI/dgeOhD0zVNzhalve9eAYUBP4ttbISHvCztsbz8eH1I2Hts>Wxa5rnTM+td26P63mu22rjA6dm+t1U5ZM*lg9kmDOU7teSlvnFr2tPDjToPOjZpeg+cQ46ThsGhqfp+GnqR5fdzBqI5fiXpv63Cj3sjOQXfmo08naw1Yq640WUUyRPlPHktCwTXKER1G+7hE04'Z2REvPBKKUSDIqIMMcPNY7lr6&csggz8CjIQMiZPNVe9W3pb5YlilDgwnILWx55uMcUjwpNu/TcJwstQ6O3jn3Lo63fjJFZo0cWj6sqea7J2h5N+hVoVXphJ6QWhX7XmL1Bj3D9UFqVSyaH7vphOxK5wAOOa0nD4O3PKUcMOv1RLlvMmJfhDyXq0U23WmdiYCGYfJKO8vs/j7oujRTkFsKIlaXzIWcxKPe0nFpwiZmFTu>ft3IIwFZmhCdx19C+2J9PUIv5jVbRwCQZac/SCXNBj4x1KsjEwicipf9wYr7tESic5YjzlqPjBTS8QB1+8vQk/YbTjrbXV27nDdTPXjF/NgBhHR71VuoSi3ImbU50qqSlUzSUf+3yaSYJvnM9+MypmBE4I4MYbX3GdhxxN940DDRLPPt4MXxRYvh8qqV96d90ASXGoiekcm84TqmY434b7IlZb6n,87e9fb9jx6bwH0eIZWeLtgV3av52h1YH2rDe7QR5vkx+uCddjCLs XYjvCIuWbLX9UzdNvUABICFqWQj+4uQoRJWbfK0as6EqMxwtKSUDBnJob9xgYnZk 9Dz+LSe9ewZK/V( NwVv6qdj780DQP4BW+67Cs6sXqZeh4i1m3n7efA9PmqHu9lLSZbzlvr7E58/x9qUsmfcbiH27XXu+UcUrOcShTHk58pUGjbcg6rhkHCsJlz2pC9WTWZLhxcp5Qznb5+aEwxfHu772CQ613PS+QKcYWTFrzrpoQBtjXAyj7l4lNGnrXRwPpuZz9jKpGJP06PwuvFF5/13UxITOBtw0q3VL8r7GEyeVoWj08E5LzKBhVnZ3jxz0dQXaNRaUyuM16OF5THUFj/0/TE/5n0BGs9z0Cd06fIoc5fs5V=66hnFO4Lui083dx+BilFOT6dh2Mjb1a1bO3ff/IWf2P/T8fVjjg8/4/;9R/n/SMf/70S1nc7NH23HOyC9xS+p6RA3b54FzkNnd+PjaY894aoYTYl6Z3/RtzMuEwjH+rTo4+x6Iozxo6+8cCDWHHWa0A41Jz3ef6weWbG9BwTZTE55VfnA09fzKHD+XBotBl/EW10mWsQvGyE/kKdTQZ3KkLbMO5e+CnTrlS4/JRds7tI:Lj6it2OtM6cWtEu85/QxtvIKSY4fP9ocpumj74E72It1hHlGNp&oj8t+SW4tKmVrHXMtN5jvxjjbkVzz/4sZzZHU6PyNrdZv7S7B41wktAdsdzuZh760FMhGunmL7X1d0CMMd/sHsJcQCO39O77/U+9WWjSf28HG/WDACrr#z/p2LsbW3xkHxoI+JGZxDxdOZ62UjNS7tQe2jVhNxsHWMoo0kGHCacwEJ0jHj2v16xsPYxj/VJitvY/Rsr9wrzhGtJ/91YiiXnADOclXO/QwlJlccBUzC53gxxhsXer3Oa9cLRRLe1yLqoFzSdlX0Pcz7ITHBqxsykQI1wfek2Hrr20&=rtztwLFjIr1y2IFD3quR7r27UYcFd7Ul/vSx5CXeqJJgt9K0x1cazB3l01giz6EyPtVLOWFa4EfY0UuBx8gDxM13yZPY0iC7VfJI0WE/VwIGzKz/r2FoM17zRDB+KvaGdMD+nLHa9nU0Q2T6+toPZwgqdo/rGc7eFXbUGiiPrk9KDKbkgkaWDWZidWbcOl1e/mpd77Hyd5=Hj0m+gy/yDIJGBuRCkM77S9pr8cvnUUa0mE2mmN69zSm8f9eRD80Z9wN4AppodIYar8mbW49KrLnLTEilpjtTvmYBCxihNFczv9Td3Jtr5pKr+fXOWf"HywFMVpXq5t+KLkNKKZF6qMeKrCSoyK!jYgX0am8SZyMnYBFt/Hm0rd2Q+5zNXjMmk/I1+D2dc1kVn0kD3BMYGNBadpB8uoR+/xF336ctSrv2WovT/yuea01M9s5ciz95g4Yyh22Fv8jVKtu?|LVupIg47irKb6zldfU+8zfSCvjGbHfB++dFnvl2oqfx/ZlVu74f6v+5Q/9cd6n0L/K/898nRvFJnKM23JxMeDEpQeNnUeNNZ kr9n/cv0l+m@/m/4u/X36h/SP6Z@d/Sf+a/i39e/p5+g/LA/39ODqX7Dh/2nIuvJ3Mo/B/Vkqfd17Gt8l31/ZTZ9Pr588j7V$14hlfStHJU5viVHFvW/m8/VlYGHtlHLDlefdk+iVfVxyn9SZhRfr/Mj2W$<HjD5BJeUvO+f0ePzuxBXsfpsRyrVukf3No2VltP905n3rH/ye6!jIIPeY/1h36mwY/9bI3f9TM9PtZncvyhfabMH8LnaDwpvvxxP4/k/+vzUz7+59l81M/aSb8vnyH0Yz676SN+lsz/AatKDHE|_rZO/btNQFMY/O2npf4lKRQwdLIREW9Vx4kRUZCLNUHUorVKpLEiRbV2lVl27sm8s8gZsLDwCCy/AwMrGyCPwAqwMDHy+O,1Q6g5srJ7557/nzn+gTAunUCC9PP'JW1jDR2EbD/BNuIYN66lwHWvWRHgGS9Yn4VnafwjPYcauC8,wkv4qH9UniJXAov44X*gFjdoH4VWs1X6yulW26VUVKxhS28FbYZ8UW4xk6-exZR0Iz+Cx9V54lvbPwnNYsH4Jz2PBXhBexBN7XXiJPBBeRm6/E17Bm9pz4VVs1b7iEGNoJIiRQsHBBkr+RrRlyLFJS7XPUdDEBN+n3Cf8GSAbe58NM2Dw7'zhLnXDinMSJGmw7ftOn42vGhuigjR3GH2CXWTVtR+gzU5u5HNIeenRVYae94xzsTrQ66vvtptPfo3lA7xHVJwioDwM1GicB4UpZ9x+qdNmnjwYf97IbFy0uGN3dW1V0S7/hu1VHbqt1H03dKeL3+NbCw2vFxpeFRqaQle3NO3v=pc2pc8G48rmpCNKU0aW+Y6RjRReuLruf)qD5PFN+kZkRpJrFP73OuauoK7nsmb87z0MzsdB5dHDNzYKJ7Zo7PTHSH1arr3jf1 qwlOJXtmKGH!welrncTjWnFf3+DTIVS+Jz5TTaTSd8rPA2qoyC52WN0Q3t0Tfnfrj2jLuJ5ZVV8PPNfckkBearYu7ydSORFU3XVNXlJHKm0UIUXTtwi8KjMu4ep+wPOMOgtAAB4nF2TV3PbRhSFz7EEUaSKe++92wIISqK08tlS+4VJEACFghQKJRc4u6Ut0zqQyaZTO okvyCT1/yl5D0g(>7j13gQssgRxmchH/G9yeXEvYwU4q7GKG3cwyxx72so/9XMplXM4VXMl wt3MptSYYOdEJBFzLoRhY59KAXfejHUizDcqzASqzCaqzBWqzDemzARmzCZmzBVmzDduzATuzCbuzBXu4hzAQRzCYRzBUQxAhYY8dBQwiCEMo4hjO0zGMEoxjCOCUxiCmdxDudxARdxCZdxBdO4imuYwSyu4wZu4h wEe4hEM7uBO/Ih3eI+v8CG+xW/4CW/xOXfha3yMv/Adfsc/+Bs/oIQyPk3eo4UKqrDxCR7DwRxcePgePuZRR4AQMSI0sIBFP MUTPMNz/IGXeIF /3ch/38wAP8hC+4WEe4VF8xAGq1JinzgIHOcRhFnkMP+MzHucJ/MqT+A:nOCk5ziWZ7jeV7gRV7iZV7hNK/yGmc4y/t8wId8RIMllmnSYoVV2nT4mHN0WaNHnIiDEbXOAin/Apn/E5P+ALvuQrvuYbvuUDMFxQVVQE8wL6oIFwUHBIcFhwaLgiOCo4JjghOBkm6rwV4WvKnxV4asKX1X4qsJXFb6q8FWFryp8VeGrCl9VnE8V/qrwHxIcse07bRW8yNFxXDrtqGYlhsZGaseOq7v?rKjLijrrtZK3FsmvUzJLb3KMlDl11K0ySZY0g8BdcqxJlWiqu51oMnKodtRdNf8F=qFViutphZzfhDZftX3DLfX8SIrCK1y5PhejzUfOw3Dtbyypdh+HFp9gdVw/apTNlzPj3LN4GpguFE9laWoe2ZSbbbDQFOoQgykIi+FJoUuxbAURSkGpRiSo"LvNocntBWhRk5rzMo8knmozRZJ6CLFWXevKpkEu6tFBTU5lZ,utxfSA6Z59PbvVi+5fnkuk3zLJpX2zK20GURiHoW2YVpK654x51rMVhzXtcySv5h rqyD54pkoc9XG8zEHPTa9OtdJWdoOxaWcdr%IkU9RU4llYc5J+NMpW0kCNdNIRxl5XxaovLLtxSbEtI7EwHaPm!PLQ5FU1n9/9FJ7/8LJx6XaQA@B//8AAnicY2BkgAAeBhEGFiDNBMSMEAwAANrY4hU=)");var Le=class{constructor(t,i,s){this.index=t,`* position=[0,0] static=!1}setT`h`' gridToWorldaޠu=n),!0):!ek@lAc@f-c),m=h<l?1:-1,u=c<f p-=x,h+=m),g<d@+,c<0?%~ 2*h+1:(a--E
[s,r,n]),this.addFace([n o])}}applyTransformation(t){ vertices.length;i++){@#2]}}updateFromPa@o=r*i+n,a=t[n][r];if(oqrt(a*a+h*h),l=1/(1+c*.5),f=t*lT=y*y+E*E;T<c&&(c=T)}C1,l/r)),d=f*f*(3-2*f),x _ f9ai x*x+m*m),p=ai ,A=g*g+v*v;A<l!ls@< STATIC_DRAW@null)}};var Xt=class{c ;DEPTH_COMPONENT32F = 0) in vec3 aP265,515,778,103"309,2575,2822,308 331,3593,3840,40 :,`6@@`J`S [@c@k`t]);var p1={xMin: },Ht=class extends st{constructor(t={},i=1){super(),this.volume=.width=Math.flo Qvalues=new Float32Array
,s);break;case n.FLOAT_MAT3:n.uniformMatrix3fv(t,!1default:console.warn(`Unhandled type: ${i}`)}}_valuesEqual i){if(t===i)return!0;1;!l (let s=0;s<of t!="object"?t:`k )}compileShade!"BCOMPILE_STATUS))throw AfloatSupported=tALOR_ATTACHMENT0+s UNPACK_PREMULTIPLY_ALPHA_WEBGL,!a:!a=r<o?`${r},${o}`: split(",").map(Numb&,n)})}renderWith8 ?(i.wireframeEqmPOLYGON_OFFSET_FILLG]t 7 UNSIGNED_SHORT1Πi}};var gt=class ext*Wbetween 0 (exclusive) and 1 (intude:a=5,rfunc:h}=t/PI*2,m=s+h()*(n-%
:()=>Vt,hermite`Mr});function Ot(){let e=new V(3);return V!=Flo l2Array&&(e[0]=0,e[1o!a@v o*(2*r-3)+1!{t=t===void 0?1:t;BATr=ni,Er=ri,Pr=2Da,h;2O (i||(i=3),s default:throw QEVr=ci,Nr=hi,Si=li,Yr=fi,qr=di,Wr=vi'f =xi,we=ve,X#*3e=pi,Gr=Te,Ee=mi,kr=Ee,Pe=ui,Hr=wt=class{construct$\ his.targetFPS5-`e1={signature:"GIF",vers&:"89a",trailer:59,exten@Label:255,graphicCo@3 49,imageSepara#qglobalColorTableFlagMask:128,c@ disposalMethod`J *(r<o?2:1.125)>>>$,3,7,15,31,63,127 k3,2047,4095,819 6383,32767,65535]S],D=(P<<Re)+E,F= l|=S<<f:l=S,f+=u;f>=8;)r[yCe<<8&63488|t<<2&992|i>>3 e>>4|t&240|(i@ expected RGBA$R ~ w],R.tm>=R.%tG? only works >Liniti6l apacity:t=Mgl.VERTEX_SHADER%
(()=>{var Es=Object.defineProperi,{get:t[i],enumerable:!0})}`?V=typeof Float32Array<"u"?,ht=Math.random,We="zyx";function ut(e){return e>=0?At={};_t(At,{add:(!ge(){let e=new V(9); s@n s@n s@n s@n sf=l*o-a*c,d=-l*r+a*h,x=c*r-o }@x }@x }@x }@x }@x }@x '-@~'-@x'-@r&T@l&T@f&T@`&T@ZfT >fT]fS >FR >FQ >FP >FO >[ ,c,l,f,d,x,m,uo!$@o!$@oA$@pA$c5,y,E,T,R,w,S,P,D,F,U,C,XA@!<!u` O!<!v }var zn=Je;function Fb={};_t(b,{add:()=>q=
GAMERS is an experimental real-time videogame artwork set in an entirely procedurally generated world. The game invites audiences to play a game of spaceship tag. One ship escapes, the other follows. When left idle, the game plays itself in autopilot mode forever. But as soon as the user presses the throttle, manual mode is enabled and the chase is on. &nbsp; **Objective: tag the ship as many times as you can to get a high score!** &nbsp; Tag the ship by entering its hit box. Each tag earns 2 points and 1 turbo credit. Collect 10 turbo credits to enable TURBO boost for 2 seconds. Every 10 points, the level increments along with the difficulty. You lose 1 point for crashing and every second that the game is idle, your score decreases by 0.03 points, so keep playing to preserve your score! &nbsp; Token owners can submit their score to the GAMERS arcade leaderboard (www.gamers.gallery), which tracks the all-time high scores of all minted editions. Scores are stored off-chain but are associated with the minted token’s ID. Therefore, if a token is traded, its new owner also owns the high score associated with it, producing a secondary economy of high scores. Rank is not defined by features or rarity, but rather by players skill. &nbsp; ## Players: - Press ‘w’ or click/tap anywhere for throttle (enables manual override). - Double tap ‘w’ or double click/tap anywhere for TURBO boost (only when turbo meter is full). - Press ‘a’ to roll left. - Press ‘d’ to roll right. - Arrow keys change direction (only during manual override). - Press the spacebar to pause. - Press 'h' to toggle the heads up display. - Press 'g' to record a GIF. - Press 'v' to save a screenshot. ## Token owners: - Press ‘1’ to connect your wallet (requires browser wallet). - Press ‘2’ to submit your current score to the leaderboard. &nbsp; *Tip: begin by slowly tapping the throttle to get a feel for the acceleration and let the autopilot help you steer!*
var b=class{constructor(o,a){thi s.targetFPS=o,`*(Math.PI*2)}};B W="ontouchs"F t"in document.;function Pe(r){let o={x:0,y c@2 ed!")},hasT@=!0,o.x=t-v.left i=parseInt(n.sub&l=l+1|0,i=t^t>>>9 0)/4294967296%&a1length-1)]}},V=k9,92],MED_BLUE:[5#U08,47],LIGHT_GRAY:[136,137 8],CORNFLOWER:[9Cy 8,229],SKYAe=["VERTEX_SHADER","FRAGMENTr.COMPILE_STATUS)( bz.xyz, sdCross, vec2(0.3,0.07), pe R opSmoothUnCV length(v-y)-f;h } 3(S+S,-o-S, ||i>z)break;i+= x*7 cument.querySeIbody.appendChild+6' style.backgrou &@w.devicePixelRa$t("webgl2",{anti#multipliedAlpha@.h,w,C,Y,he,me,E,T,ue=$"\Data(c.ARRAY_BUFFER,n e.TEXTURE_2D,fB8!OLOR_ATTACHMENTAdelta>m)T$Q val&&!U){m.upd)pp(features); });
var b=class{constructor(o,a){thi s.targetFPS=o,`*(Math.PI*2)}};B W="ontouchs"F t"in document.;function Pe(r){let o={x:0,y c@2 ed!")},hasT@=!0,o.x=t-v.left i=parseInt(n.sub&l=l+1|0,i=t^t>>>9 0)/4294967296%&a1length-1)]}},V=k9,92],MED_BLUE:[5#U08,47],LIGHT_GRAY:[136,137 8],CORNFLOWER:[9Cy 8,229],SKYAe=["VERTEX_SHADER","FRAGMENTr.COMPILE_STATUS)( bz.xyz, sdCross, vec2(0.3,0.07), pe R opSmoothUnCV length(v-y)-f;h } 3(S+S,-o-S, ||i>z)break;i+= x*7 cument.querySeIbody.appendChild+6' style.backgrou &@w.devicePixelRa$t("webgl2",{anti#multipliedAlpha@.h,w,C,Y,he,me,E,T,ue=$"\Data(c.ARRAY_BUFFER,n e.TEXTURE_2D,fB8!OLOR_ATTACHMENTAdelta>m)T$Q val&&!U){m.upd)pp(features); });
var b=class{constructor(o,a){thi s.targetFPS=o,`*(Math.PI*2)}};B W="ontouchs"F t"in document.;function Pe(r){let o={x:0,y c@2 ed!")},hasT@=!0,o.x=t-v.left i=parseInt(n.sub&l=l+1|0,i=t^t>>>9 0)/4294967296%&a1length-1)]}},V=k9,92],MED_BLUE:[5#U08,47],LIGHT_GRAY:[136,137 8],CORNFLOWER:[9Cy 8,229],SKYAe=["VERTEX_SHADER","FRAGMENTr.COMPILE_STATUS)( bz.xyz, sdCross, vec2(0.3,0.07), pe R opSmoothUnCV length(v-y)-f;h } 3(S+S,-o-S, ||i>z)break;i+= x*7 cument.querySeIbody.appendChild+6' style.backgrou &@w.devicePixelRa$t("webgl2",{anti#multipliedAlpha@.h,w,C,Y,he,me,E,T,ue=$"\Data(c.ARRAY_BUFFER,n e.TEXTURE_2D,fB8!OLOR_ATTACHMENTAdelta>m)T$Q val&&!U){m.upd)pp(features); });
``` lightweight reconstruction ┌─────┬─────┬─────┐ │ H×M │ M │ M×E │ ├─────┼─────┼─────┤ │ H │ H×E │ E │ ├─────┼─────┼─────┤ │ H×R │ R │ R×E │ └─────┴─────┴─────┘ fig. 1. combinatorial matrix ``` This project is part of an ongoing experiment in contextualizing and representing digital tectonics (simulated particles, 3D meshes, physics engines, etc) called Lightweight Construction. This generative iteration of the project follows Gottfried Semper’s speculations on the core elements of architecture laid out in the seminal 1851 essay The Four Elements of Architecture: hearth (H), mound (M), enclosure (E), and roof (R). Using Semper as a starting point, we developed a combinatorial matrix that suggests various types of ways the four elements can be assembled in pairs. The generative ruleset creates a limited set of assemblies that are expressed as blended mathematical primitives. Roofs are expressed as geometric extrusions, Mounds as tiled platforms, Hearths as smooth volumes, and Enclosures as rectilinear frames. Representing these as functions allows them to morph smoothly into each other in virtual space; something almost impossible to do in physical space. ``` hearth --> [] mound --> _/\_ roof --> >|(< enclosure --> |==| ``` In lightweight reconstruction, Semper’s speculative history of architecture’s fundamental elements provides a model for interpreting digital materials, contemporary visual effects, and mathematical representations of the physical world. Each iteration of the algorithm generates assemblies of parts and objects that are somewhat familiar yet impossible to construct in the physical world. They are produced through mathematical approximations of surfaces and volumes rendered using a custom made path-tracing engine (a common technique for visualizing unbuilt architectures). The generated assemblies can be read as Semper’s Four Elements, but they can also exist as hybrids and hint at new categories. These impossible, strangely familiar details from another world ask us to reflect on how the instruments we use affect our imagination. Double click/tap to pause the rendering. Press 's' to save a still image. ``` -office ca, 2024 ```
class Vector{constructor(t,e,i){this.x=t||0,this.y=e||0,this.z=i||0}static zero(){return new Vector(0,0,0)}static fromAngle(t){return new Vector(Math.cos(t),Math.sin(t))}static random2D(){return Vector.fromAngle(Math.random()*Math.PI*2)}static add(t,e){return new Vector(t.x+e.x,t.y+e.y,t.z+e.z)}static sub(t,e){return new Vector(t.x-e.x,t.y-e.y,t.z-e.z)}static div(t,e){return new Vector(t.x/e,t.y/e,t.z/e)}static mult(t,e){return new Vector(t.x*e,t.y*e,t.z*e)}static average(t){if(0===t.length)return;let e=new Vector;return t.forEach((t=>e.addVector(t))),e.div(t.length),e}static distXY(t,e,i,s){let r=Math.abs(e-t),n=Math.abs(s-i);return Math.sqrt(n*n+r*r)}dist(t){let e=t.x-this.x,i=t.y-this.y,s=t.z-this.z;return Math.sqrt(e*e+i*i+s*s)}distXY(t,e){let i=t-this.x,s=e-this.y;return Math.sqrt(i*i+s*s)}addVector(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}add(t,e,i){return this.x+=t,this.y+=e,this.z+=i,this}subVector(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}sub(t,e,i){return this.x-=t,this.y-=e,this.z-=i,this}mult(t){return this.x*=t,this.y*=t,this.z*=t,this}div(t){return this.x/=t,this.y/=t,this.z/=t,this}magnitude(){return Math.sqrt(this.x*this.x+this.y*this.y)}magnitudeSquared(){return this.x*this.x+this.y*this.y+this.z*this.z}heading2D(){return Math.atan2(this.y,this.x)}normal(){let t=Math.sqrt(this.x*this.x+this.y*this.y);return new Vector(this.x/t,this.y/t,0)}normalize(){let t=this.magnitude();return this.div(t),this}normalizeTo(t){let e=this.magnitude();return e>0&&(e=t/e,this.mult(e)),this}setMag(t){return this.normalize(),this.mult(t),this}copy(){return new Vector(this.x,this.y,this.z)}rotate(t,e){let i=Math.PI/180*e,s=Math.cos(i),r=Math.sin(i),n=s*(this.x-t.x)+r*(this.y-t.y)+t.x,o=s*(this.y-t.y)-r*(this.x-t.x)+t.y;return new Vector(n,o,0)}zero(){this.x=this.y=this.z=0}set(t,e,i){this.x=t,this.y=e,this.z=i}setFromVector(t){this.x=t.x,this.y=t.y,this.z=t.z}setXYZ(t,e,i){this.x=t,this.y=e,this.z=i}swapXY(){let t=this.x;this.x=this.y,this.y=t}toString(){return"<"+this.x+", "+this.y+", "+this.z+">"}}class Point{constructor(t,e,i,s){this.pos=new Vector(t,e,0),this.oldpos=new Vector(t,e,0),this.vel=new Vector(0,0,0),this.pinned=!1,this.grabbed=!1,this.grabbable=!1,this.friction=FRICTION,this.bounce=.9,this.index=0,this.isCollided=!1,this.gravity=new Vector(0,0,0),this.radius=i,this.color=s,this.mass=1}pin(){return this.pinned=!0,this}unpin(){return this.pinned=!1,this}applyImpulse(t,e,i){this.applyForce(new Vector(t,e,i))}applyForce(t){this.pos.addVector(t)}collide(t,e){this.index=e;for(let e=0;e<t.length;e++){let i=t[e];if(i.index!=this.index){let t=Math.abs(i.pos.x-this.pos.x),e=Math.abs(i.pos.y-this.pos.y),s=Math.sqrt(Math.pow(t,2)+Math.pow(e,2));if(s<this.radius+i.radius){let t=this.pos.copy();t=t.subVector(i.pos),t=t.div(s),t=t.mult(s-(this.radius+i.radius)),t=t.mult(-this.bounce),this.pos=this.pos.addVector(t),i.pos=i.pos.subVector(t)}}}}resolveBehaviors(t,e=this.radius,i=1){let s=Vector.sub(this.pos,t.pos),r=s.magnitudeSquared(),n=e*e;if(r<n){var o=s.normalizeTo(1-r/n).mult(i);this.applyForce(o)}}update(t,e,i,s){this.pinned||(this.grabbable&&s?this.grabbed=!0:s||(this.grabbed=!1),this.grabbed?(this.pos.x=e,this.pos.y=i,this.oldpos.setXYZ(this.pos.x,this.pos.y,0)):(this.vel=Vector.sub(this.pos,this.oldpos),this.vel.mult(this.friction),this.oldpos.setXYZ(this.pos.x,this.pos.y,0),this.pos.addVector(this.vel),this.pos.addVector(this.gravity)))}constrain(t,e){this.vel=Vector.sub(this.pos,this.oldpos),this.vel.mult(this.friction),this.pos.x>t.width-e-this.radius&&(this.pos.x=t.width-e-this.radius,this.oldpos.x=this.pos.x+this.vel.x*this.restitution),this.pos.x<this.radius+e&&(this.pos.x=this.radius+e,this.oldpos.x=this.pos.x+this.vel.x*this.restitution),this.pos.y>t.height-e-this.radius&&(this.pos.y=t.height-e-this.radius,this.oldpos.y=this.pos.y+this.vel.y*this.restitution),this.pos.y<this.radius+e&&(this.pos.y=this.radius+e,this.oldpos.y=this.pos.y+this.vel.y*this.restitution)}}class Spring{constructor(t,e,i,s){this.startPoint=t,this.endPoint=e,this.stiffness=i,this.color=s,this.weight=1,length?this.length=length:this.length=this.startPoint.pos.dist(this.endPoint.pos)}update(){let t=this.endPoint.pos.x-this.startPoint.pos.x,e=this.endPoint.pos.y-this.startPoint.pos.y,i=Math.sqrt(t*t+e*e),s=(this.length-i)/i*this.stiffness,r=t*s*.1,n=e*s*.1,o=this.startPoint.mass+this.endPoint.mass,a=this.startPoint.mass/o;o=this.endPoint.mass/o,this.startPoint.pinned||(this.startPoint.pos.x-=r*o,this.startPoint.pos.y-=n*o),this.endPoint.pinned||(this.endPoint.pos.x+=r*a,this.endPoint.pos.y+=n*a)}drawPixelCtx(t,e,i,s){t[Math.floor(i)*Math.floor(192)+Math.floor(e)]=s,SHADOW&&(t[Math.floor(i-2)*Math.floor(192)+Math.floor(e-0)]=0)}pixelLine(t,e,i,s,r){let n,o,a,h,l,d,g,p,c,u,x;if(a=s-e,h=r-i,l=Math.abs(a),d=Math.abs(h),g=2*d-l,p=2*l-d,d<=l)for(a>=0?(n=e,o=i,c=s):(n=s,o=r,c=e),this.drawPixelCtx(t,n,o,this.color),x=0;n<c;x++)n+=1,g<0?g+=2*d:(a<0&&h<0||a>0&&h>0?o+=1:o-=1,g+=2*(d-l)),this.drawPixelCtx(t,n,o,this.color);else for(h>=0?(n=e,o=i,u=r):(n=s,o=r,u=i),this.drawPixelCtx(t,n,o,this.color),x=0;o<u;x++)o+=1,p<=0?p+=2*l:(a<0&&h<0||a>0&&h>0?n+=1:n-=1,p+=2*(l-d)),this.drawPixelCtx(t,n,o,this.color)}render(t){this.pixelLine(t,this.startPoint.pos.x,this.startPoint.pos.y,this.endPoint.pos.x,this.endPoint.pos.y)}}class Body{constructor(t){this.points=[],this.springs=[],this.iterations=t||4}addPoint(t,e,i,s){this.points.push(new Point(t,e,i,s))}addSpring(t,e,i,s,r){this.springs.push(new Spring(t,e,i,s,r))}removeSpring(t){this.springs.splice(this.springs.indexOf(t),1)}trackPoints(t,e){for(let i=0;i<this.points.length;i++){let s=t-this.points[i].pos.x,r=e-this.points[i].pos.y;s*s/Math.pow(this.points[i].radius,2)+r*r/Math.pow(this.points[i].radius,2)<=1?this.points.find((t=>1==t.grabbed))||(this.points[i].grabbable=!0):this.points[i].grabbable=!1}}collidePoints(){for(let t=0;t<this.points.length;t++){this.points[t].collide(this.points,t)}}updatePoints(t,e,i,s){for(let r=0;r<this.points.length;r++)this.points[r].update(t,e,i,s)}updateSprings(){for(let t=0;t<this.springs.length;t++)this.springs[t].update()}updateConstraints(t,e){for(let i=0;i<this.points.length;i++)this.points[i].constrain(t,e)}renderSprings(t,e){for(let i=0;i<this.springs.length;i++)this.springs[i].render(t,e)}update(t,e,i,s,r){this.trackPoints(i,s),this.updatePoints(e,i,s,r);for(let t=0;t<this.iterations;t++)this.collidePoints(),this.updateSprings(),this.updateConstraints(e,MARGIN);this.renderSprings(t,e)}}class wormJoint{constructor(t,e){this.points=t,this.springs=[],this.targetVolume=this.getArea(),this.color=e;for(let t=1;t<this.points.length-1;t++)this.addSprings(t)}getArea(){let t=0;t+=this.points[this.points.length-1].pos.x*this.points[0].pos.y-this.points[0].pos.x*this.points[this.points.length-1].pos.y;for(let e=0;e<this.points.length-1;e++)t+=this.points[e].pos.x*this.points[e+1].pos.y-this.points[e+1].pos.x*this.points[e].pos.y;return t*=.5,t}getConnectedPts(t){let e,i;return 0==t?e=this.points[this.points.length-1]:t>=1&&(e=this.points[t-1]),t==this.points.length-1?i=this.points[0]:t<=this.points.length-1&&(i=this.points[t+1]),{previousPt:e,nextPt:i}}addSprings(t){let e=this.getConnectedPts(t);e.previousPt.pos.x,e.nextPt.pos.x,e.previousPt.pos.y,e.nextPt.pos.y,e.previousPt.pos.dist(e.nextPt.pos);this.springs.push(new Spring(e.previousPt,e.nextPt,5,this.color))}update(){for(let t=0;t<this.springs.length;t++)this.springs[t].update()}}class World{constructor(){this.bodies=[],this.joints=[]}joinBodies(...t){let e=new Body(this.iterations),i=[],s=[];for(let e=0;e<t.length;e++){i.push(t[e].points),s.push(t[e].springs);let r=this.bodies.indexOf(t[e]);this.bodies.splice(r,1)}return i=[].concat.apply([],i),s=[].concat.apply([],s),e.points=i,e.springs=s,this.addBody(e),e}addBody(t){this.bodies.push(t)}addJoint(t){this.joints.push(t)}update(t,e,i,s,r){for(let t=0;t<this.joints.length;t++)this.joints[t].update();for(let n=0;n<this.bodies.length;n++)this.bodies[n].update(t,e,i,s,r)}}function Grad(t,e,i){this.x=t,this.y=e,this.z=i}Grad.prototype.dot2=function(t,e){return this.x*t+this.y*e};let grad3=[new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0),new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1),new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)],p=[151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180],perm=new Array(512),gradP=new Array(512);for(let t=0;t<256;t++){let e;e=0^p[t],perm[t]=perm[t+256]=e,gradP[t]=gradP[t+256]=grad3[e%12]}let F2=.5*(Math.sqrt(3)-1),G2=(3-Math.sqrt(3))/6;class Simplex{get(t,e){let i,s,r,n,o,a=(t+e)*F2,h=Math.floor(t+a),l=Math.floor(e+a),d=(h+l)*G2,g=t-h+d,p=e-l+d;g>p?(n=1,o=0):(n=0,o=1);let c=g-n+G2,u=p-o+G2,x=g-1+2*G2,w=p-1+2*G2;h&=255,l&=255;let m=gradP[h+perm[l]],y=gradP[h+n+perm[l+o]],f=gradP[h+1+perm[l+1]],b=.5-g*g-p*p;b<0?i=0:(b*=b,i=b*b*m.dot2(g,p));let v=.5-c*c-u*u;v<0?s=0:(v*=v,s=v*v*y.dot2(c,u));let E=.5-x*x-w*w;return E<0?r=0:(E*=E,r=E*E*f.dot2(x,w)),70*(i+s+r)}}function distSquared(t,e,i,s){return(t=i-t)*t+(e=s-e)*e}class qPoint{constructor(t,e){this.x=t,this.y=e}}class Rectangle{constructor(t,e,i,s){this.x=t,this.y=e,this.w=i,this.h=s}contains(t){return t[0]>=this.x-this.w&&t[0]<this.x+this.w&&t[1]>=this.y-this.h&&t[1]<this.y+this.h}intersects(t){return!(t.x-t.w>this.x+this.w||t.x+t.w<this.x-this.w||t.y-t.h>this.y+this.h||t.y+t.h<this.y-this.h)}}class Circle{constructor(t,e,i){this.x=t,this.y=e,this.r=2*i,this.rSquared=this.r*this.r}contains(t){return distSquared(this.x,this.y,t.x,t.y)<=this.rSquared}}class QuadTree{constructor(t,e){this.bnd=t,this.capacity=e,this.points=[],this.divided=!1}subdivide(){let t=this.bnd.x,e=this.bnd.y,i=this.bnd.w,s=this.bnd.h,r=new Rectangle(t+i/2,e-s/2,i/2,s/2);this.ne=new QuadTree(r,this.capacity);let n=new Rectangle(t-i/2,e-s/2,i/2,s/2);this.nw=new QuadTree(n,this.capacity);let o=new Rectangle(t+i/2,e+s/2,i/2,s/2);this.se=new QuadTree(o,this.capacity);let a=new Rectangle(t-i/2,e+s/2,i/2,s/2);this.sw=new QuadTree(a,this.capacity),this.divided=!0}insert(t){return!!this.bnd.contains(t)&&(this.points.length<this.capacity?(this.points.push(t),!0):(this.divided||this.subdivide(),!!this.ne.insert(t)||(!!this.nw.insert(t)||(!!this.se.insert(t)||(!!this.sw.insert(t)||void 0)))))}query(t,e){if(e||(e=[]),this.bnd.intersects(t)){for(let i of this.points)t.contains(i)&&e.push(i);return this.divided&&(this.nw.query(t,e),this.ne.query(t,e),this.sw.query(t,e),this.se.query(t,e)),e}}}class Random{constructor(){this.useA=!1;let t=function(t){let e=parseInt(t.substr(0,8),16),i=parseInt(t.substr(8,8),16),s=parseInt(t.substr(16,8),16),r=parseInt(t.substr(24,8),16);return function(){e|=0,i|=0,s|=0,r|=0;let t=(e+i|0)+r|0;return r=r+1|0,e=i^i>>>9,i=s+(s<<3)|0,s=s<<21|s>>>11,s=s+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()}r_d(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}r_n(t,e){return t+(e-t)*this.r_d()}r_i(t,e){return Math.floor(this.r_n(t,e+1))}r_b(t){return this.r_d()<t}r_c(t){return t[this.r_i(0,t.length-1)]}}function color(){let t=R.r_d(),e=R.r_d(),i=R.r_d();return Math.round(255)<<24|Math.round(255*t)<<16|Math.round(255*e)<<8|Math.round(255*i)}function constrain(t,e,i){return Math.max(Math.min(t,i),e)}function map(t,e,i,s,r,n){const o=(t-e)/(i-e)*(r-s)+s;return n?s<r?constrain(o,s,r):constrain(o,r,s):o}function random(t,e){return(e-t)*R.r_d()+t}function radians(t){return t*(Math.PI/180)}function dist(t,e,i,s){let r=i-t,n=s-e;return Math.sqrt(n*n+r*r)}function fbm(t,e,i,s,r,n,o){let a=0,h=1,l=r,d=0;for(let r=0;r<t;r++)d+=noise.get(e*l+XOFF,i*l+YOFF)*h,a+=h,h*=s,l*=2;return d/=a,d=d*(o-n)/2+(o+n)/2,d}let projectNumber=Math.floor(parseInt(tokenData.tokenId)/1e6),mintNumber=parseInt(tokenData.tokenId)%1e6,R=new Random,noise=new Simplex;const C=document.createElement("canvas");document.body.appendChild(C);let w,h,devicePixelRatio=window.devicePixelRatio||1;window.innerHeight<=window.innerWidth?(w=.75*Math.max(window.innerHeight,1),h=Math.max(window.innerHeight,1)):(w=Math.max(window.innerWidth,1),h=Math.max(window.innerWidth,1)/.75),C.width=w,C.height=h;const idata=new ImageData(192,256);let u32=new Uint32Array(idata.data.buffer);const gl=C.getContext("webgl",{antialias:!1,preserveDrawingBuffer:!0});let program,numVtx;C.style.imageRendering="pixelated",C.imageSmoothingEnabled=!1;let time=0;const drawCan=document.createElement("canvas"),ctx=drawCan.getContext("2d");ctx.imageSmoothingEnabled=!1,drawCan.width=192,drawCan.height=256;let qtree,mouseX=0,mouseY=0,grabbing=!1,polygons=[],points=[];const eps=2,THETA=R.r_c([1,5,30]),DELTA=R.r_c([1,360]),N=R.r_c([.01,.1,.3,.6,.7]),FRICTION=R.r_c([.99,.95]),SHADOW=R.r_d()>.8,BG=color(),MARGIN=R.r_c([4,8,12,18]),XOFF=R.r_i(0,9999),YOFF=R.r_i(0,9999),LEN=R.r_c([drawCan.width,drawCan.width/2]),FLOW=R.r_d(),PINDEX=parseInt(10*R.r_d()),colorPalettes={riso:[145/256,78/256,114/256,0,.46875,191/256,255/256,116/256,119/256,241/256,.3125,.375,118/256,91/256,167/256,255/256,102/256,94/256,255/256,.90625,0,210/256,81/256,94/256,255/256,108/256,47/256,210/256,81/256,94/256],midnight:[.96875,249/256,250/256,233/256,236/256,239/256,222/256,226/256,230/256,206/256,212/256,218/256,173/256,181/256,189/256,73/256,130/256,207/256,73/256,.3125,87/256,52/256,58/256,.25,33/256,37/256,41/256,27/256,28/256,29/256],poster:[0,.1875,73/256,214/256,40/256,40/256,247/256,127/256,0,252/256,191/256,73/256,234/256,226/256,183/256,244/256,241/256,222/256,.875,122/256,95/256,61/256,.25,91/256,129/256,178/256,154/256,242/256,204/256,143/256],ancient:[0,18/256,25/256,0,95/256,115/256,10/256,147/256,150/256,148/256,210/256,189/256,233/256,.84375,166/256,238/256,155/256,0,202/256,103/256,2/256,187/256,62/256,3/256,174/256,.125,18/256,155/256,34/256,38/256],inca:[214/256,.25,69/256,233/256,255/256,249/256,158/256,.84375,219/256,70/256,117/256,153/256,29/256,51/256,84/256,21/256,.375,100/256,0,196/256,154/256,.96875,225/256,108/256,255/256,194/256,180/256,251/256,143/256,103/256],midcentury:[61/256,49/256,91/256,68/256,75/256,110/256,.4375,139/256,117/256,154/256,.71875,122/256,.96875,249/256,145/256,58/256,46/256,57/256,30/256,85/256,92/256,244/256,.84375,205/256,237/256,177/256,131/256,241/256,81/256,82/256],dreamy:[255/256,205/256,178/256,255/256,180/256,162/256,229/256,.59375,155/256,181/256,131/256,141/256,109/256,.40625,117/256,188/256,212/256,222/256,165/256,204/256,209/256,.625,185/256,191/256,157/256,172/256,178/256,148/256,155/256,.625],gameboy:[95/256,99/256,79/256,155/256,196/256,203/256,207/256,235/256,223/256,226/256,250/256,219/256,219/256,239/256,188/256,245/256,253/256,198/256,245/256,195/256,150/256,.8125,177/256,122/256,.65625,159/256,.40625,65/256,82/256,31/256],fruity:[255/256,116/256,119/256,249/256,65/256,68/256,.4375,116/256,124/256,98/256,.65625,229/256,73/256,130/256,207/256,249/256,199/256,79/256,246/256,.625,77/256,238/256,127/256,75/256,25/256,151/256,93/256,.71875,199/256,196/256],hollywood:[.96875,249/256,250/256,233/256,236/256,239/256,222/256,226/256,230/256,206/256,212/256,218/256,173/256,181/256,189/256,249/256,65/256,68/256,73/256,.3125,87/256,52/256,58/256,.25,33/256,37/256,41/256,27/256,28/256,29/256]},palettes=Object.keys(colorPalettes),palette=colorPalettes[palettes[PINDEX]];let world;function drawLine(t){let e=new Body(1),i=color();for(let s=0;s<t.length;s++)e.addPoint(t[s][0],t[s][1],2,i);for(let s=0;s<t.length-1;s++)e.addSpring(e.points[s],e.points[s+1],.999,i);let s=new wormJoint(e.points,color());return world.addJoint(s),e}document.body.style.backgroundColor=`rgb(${255*palette[12]}, ${255*palette[13]}, ${255*palette[14]})`,C.style.boxShadow=`0px 0px 30px rgb(${255*palette[27]}, ${255*palette[28]}, ${255*palette[29]})`;const start=t=>{let e=BG,i=new Rectangle(0,0,drawCan.width,drawCan.height);qtree=new QuadTree(i,2),world=new World(4);let s=[];for(let t=0;t<2e3;t++){let t=generatePolygon();if(canPutPoly(t,points)&&polygons.length<100){polygons.push(t);for(let e=0;e<t.length;e++)qtree.insert(t[e])}}for(let t=0;t<polygons.length;t++)s.push(drawLine(polygons[t]));world.joinBodies(...s),s=[];for(let t=0;t<u32.buffer.byteLength;t++)u32[t]=e},mmove=t=>{let e=C.getBoundingClientRect();mouseX=map(t.clientX-e.left,0,C.width,0,drawCan.width),mouseY=map(t.clientY-e.top,0,C.height,0,drawCan.height)},grab=t=>{grabbing=!0},stop=t=>{grabbing=!1};function generatePolygon(){let t=random(0,drawCan.width),e=random(0,drawCan.height),i=Math.floor(random(3,LEN)),s=[t,e],r=random(0,2*Math.PI),n=[];n.push([t,e]);for(let e=0;e<i;e++){let o;o=FLOW>.3?snapAngle(fbm(32,s[0],s[1],.5,.002,0,1)*Math.PI*18*N,THETA):FLOW<.2?snapAngle(r,DELTA):snapAngle(r*(e/i*2)+t,1);let a=[-Math.cos(o),-Math.sin(o)];a[0]*=5,a[1]*=5;let h=s;h[0]+=a[0],h[1]+=a[1],n.push([h[0],h[1]]),s=[h[0],h[1]]}return n}function canPutPoly(t){if(polygonIsOut(t))return!1;for(let e=0;e<t.length;e++){let i=new Rectangle(t[e][0],t[e][1],4,4),s=qtree.query(i);for(let i=0;i<s.length;i++)if(dist(s[i][0],s[i][1],t[e][0],t[e][1])<2)return!1}return!0}function canPlace(t){if(polygonIsOut(t))return!1;for(let e of polygons)if(polygonsIntersect(t,e))return!1;return!0}function polygonIsOut(t){for(let e of t)if(e[0]<MARGIN||e[0]>drawCan.width-MARGIN||e[1]<MARGIN||e[1]>drawCan.height-MARGIN)return!0;return!1}function snapAngle(t,e){let i=radians(e);return Math.round(t/i)*i}const verts="\nattribute vec2 aVertexPosition;\nvoid main() {\ngl_Position = vec4(aVertexPosition, 0.0, 1.0);\n}",frags="\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D t0;\nuniform vec2 ur;\nuniform vec3 p[10];\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}\nvec3 closestColor(vec3 color) {\n vec3 targetHSV = rgb2hsv(color);\n vec3 closest = p[0];\n float minDist = 999.0;\n\n for (int i = 0; i < 10; i++) {\n vec3 col = p[i];\n vec3 colHSV = rgb2hsv(col);\n float dr = abs(color.r - col.r);\n float dg = abs(color.g - col.g);\n float db = abs(color.b - col.b);\n float dist = sqrt(dr * dr + dg * dg + db * db);\n if (dist < minDist) {\n closest = col;\n minDist = dist;\n }\n }\n return closest;\n}\nfloat I(vec2 pixel) {\n const float a1 = 0.75487766624669276;\n const float a2 = 0.569840290998;\n return fract(a1 * pixel.x + a2 * pixel.y);\n}\nfloat D(vec2 coords, float color, float grey) {\n float noised = (2.0/grey) * (I(coords)) + color - (1.0/grey);\n float levels = clamp(floor(grey * noised) / (grey-1.0), 0.0, 1.0);\n return levels;\n}\nvoid main(void) {\nfloat gm = 2.2;\nvec2 uv = gl_FragCoord.xy / ur.xy;\nfloat h = 0.0;\nif (ur.y < 1024.) {\n h = floor(ur.y / ur.y);\n} else {\n h = floor(ur.y / 1024.);\n}\nvec2 pb = gl_FragCoord.xy / h;\nvec2 tl = ur.xy / h;\nvec2 vuv = floor(pb) / tl;\nfloat gr = 2.0;\nvec3 c = pow(texture2D(t0, vuv).rgb, vec3(gm));\nc += vec3((texture2D(t0, vuv).rgb - texture2D(t0, vuv+(vec2(cos(radians(30.)),sin(radians(30.))) * 0.001)).rgb) * 9.);\nc += vec3((texture2D(t0, vuv).rgb - texture2D(t0, vuv-(vec2(cos(radians(30.)),sin(radians(30.))) * 0.001)).rgb) * -9.);\nvec2 xp = floor(pb);\nvec3 col = vec3(D(xp, c.r, gr), D(xp, c.g, gr), D(xp, c.b, gr));\ncol.rgb = pow(col, vec3(1.0/gm));\ngl_FragColor = vec4(closestColor(col), 1.0);\n}",initGL=()=>{gl.blendFunc(gl.ONE,gl.ONE_MINUS_SRC_ALPHA),gl.disable(gl.BLEND),gl.disable(gl.DEPTH_TEST),gl.clearColor(1,1,1,1),gl.viewport(0,0,C.width,C.height)},initShaders=()=>{const t=gl.createShader(gl.VERTEX_SHADER);gl.shaderSource(t,verts),gl.compileShader(t);const e=gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(e,frags),gl.compileShader(e),program=gl.createProgram(),gl.attachShader(program,t),gl.attachShader(program,e),gl.linkProgram(program);const i=new Float32Array([-1,1,1,1,1,-1,-1,1,1,-1,-1,-1]),s=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,s),gl.bufferData(gl.ARRAY_BUFFER,i,gl.STATIC_DRAW);numVtx=i.length/2,program.aVertexPosition=gl.getAttribLocation(program,"aVertexPosition"),gl.enableVertexAttribArray(program.aVertexPosition),gl.vertexAttribPointer(program.aVertexPosition,2,gl.FLOAT,!1,0,0),gl.useProgram(program),gl.bindBuffer(gl.ARRAY_BUFFER,s)},img=gl.createTexture(),initDrawCtx=()=>{ctx.clearRect(0,0,drawCan.width,drawCan.height),img.image=drawCan,gl.bindTexture(gl.TEXTURE_2D,img),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.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!0),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,drawCan),render(),console.log("SKEUOMORPHS by galo canizares (b. 1989)")},render=()=>{gl.viewport(0,0,C.width,C.height),gl.clearColor(0,0,0,0),gl.clear(gl.COLOR_BUFFER_BIT),program.uResolution=gl.getUniformLocation(program,"ur"),gl.uniform2fv(program.uResolution,[C.width,C.height]),gl.uniform3fv(gl.getUniformLocation(program,"p"),palette),gl.uniform1i(gl.getUniformLocation(program,"t0"),0),gl.activeTexture(gl.TEXTURE0),gl.bindTexture(gl.TEXTURE_2D,img),gl.activeTexture(gl.TEXTURE1),gl.drawArrays(gl.TRIANGLES,0,numVtx),gl.bindTexture(gl.TEXTURE_2D,img),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,drawCan),world.update(u32,drawCan,mouseX,mouseY,grabbing),ctx.putImageData(idata,0,0,0,0,drawCan.width,drawCan.height),requestAnimationFrame(render)},screenshot=t=>{"s"===t.key&&saveAsImage()},saveAsImage=()=>{let t;try{let e="image/png";t=C.toDataURL(e,1),saveFile(t.replace(e,"image/octet-stream"),"SKEUOMORPHS-"+tokenData.hash+".png")}catch(t){return void console.log(t)}},saveFile=function(t,e){let i=document.createElement("a");"string"==typeof i.download?(document.body.appendChild(i),i.download=e,i.href=t,i.click(),document.body.removeChild(i)):location.replace(uri)};document.addEventListener("keydown",screenshot),window.addEventListener("mousedown",grab),window.addEventListener("mousemove",mmove),window.addEventListener("mouseup",stop),window.addEventListener("touchstart",(t=>{t.preventDefault(),grab(t.touches[0])}),{passive:!1}),window.addEventListener("touchmove",(t=>{t.preventDefault(),mmove(t.touches[0])}),{passive:!1}),window.addEventListener("touchend",(t=>{t.preventDefault(),stop(t.touches[0])}),{passive:!1}),start(),gl.blendFunc(gl.ONE,gl.ONE_MINUS_SRC_ALPHA),gl.disable(gl.BLEND),gl.disable(gl.DEPTH_TEST),gl.clearColor(1,1,1,1),gl.viewport(0,0,C.width,C.height),initShaders(),ctx.clearRect(0,0,drawCan.width,drawCan.height),img.image=drawCan,gl.bindTexture(gl.TEXTURE_2D,img),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.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!0),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,drawCan),render(),console.log("SKEUOMORPHS by galo canizares (b. 1989)");
``` ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ___ _ _____ _ _ ___ __ __ ___ ___ ___ _ _ ___ / __| |/ / __| | | |/ _ \| \/ |/ _ \| _ \ _ \ || / __| \__ \ ' <| _|| |_| | (_) | |\/| | (_) | / _/ __ \__ \ |___/_|\_\___|\___/ \___/|_| |_|\___/|_|_\_| |_||_|___/ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ``` A skeuomorph is a derivative object that retains ornamental design cues from structures that were necessary in the original. They are used widely in architecture, product design, and perhaps most familiarly in user interfaces. Think: desktop icons like trash cans or notepads. SKEUOMORPHS is a meditation on this digital tradition. SKEUOMORPHS picks up where RASTER left off as an another exploration of the materiality of pixels and rasterized imagery. Here the study of pixels narrows in on the shallow depth of on-screen interfaces and the play of low-res figure-ground effects. Moments of skeuomorphism where the 2-dimensional plane of the screen becomes slightly 3-dimensional through beveling or drop-shadows are extracted and used as abstract painterly details. These elements that are typically used to make computation and interfaces more familiar become unfamiliar on the canvas, suggesting the possibility of an aesthetic between abstraction and realism. SKEUOMORPHS employs recurring themes and techniques from my art practice: limited color palettes, low-res chunky pixels, dithering, and physics simulation. It uses a specific kind of dithering called R-sequence dither developed by Martin Roberts. Like traditional Bayer matrix-based dithering, this technique produces a patterned image akin to retro video games and early computer screens. In this project, the R-dither pattern results in a woven textile-like texture, which recalls the long relationship between computing and weaving. The canvas negotiates two scales simultaneously: that of the dithered pixel (rendered at 1/1024th of the canvas height) and the simulated particle that acts as a brush stroke (rendered at 1/256th of the canvas height). The two resolutions work together to produce a cohesive texture that is neither pretending to be a retrograde screen nor an analog material but something in between. Similar to RASTER, the goal is to investigate new avenues for digital aesthetics that rely on a combination of historical techniques and innovative practices. Use mouse or touch controls to interact. Press 's' to grab a still frame. Collectors will be eligible to receive a signed archival giclée print of their mint.
0xedc8a720…fea4·#16,298,456·0x99d001f6…bd1a7c
Sketches by itsgaloAddress: call to non-contractAddress: call to non-contractAddress: low-level delegate call failedAddress: low-level delegate call failed
0xedc8a720…fea4·#16,298,423·0xb4eba24b…406c8b
RoLoops by itsgalo`Address: call to non-contractAddress: call to non-contractAddress: low-level delegate call failedAddress: low-level delegate call failed
0xedc8a720…fea4·#16,298,367·0x33d056c5…b7d4b5
Editions by itsgaloAddress: call to non-contractAddress: call to non-contractAddress: low-level delegate call failedAddress: low-level delegate call failed
const vs="attribute vec3 aPosition;attribute vec2 aTexCoord;varying vec2 vTexCoord;void main() {vTexCoord = aTexCoord;vec4 positionVec4 = vec4(aPosition, 1.0);positionVec4.xy = positionVec4.xy * 2.0 - 1.0;gl_Position = positionVec4;}",fsn="precision highp float;precision highp sampler2D;uniform sampler2D l;uniform vec2 i;uniform float j;float e(vec2 a){return fract(1e+4*sin(17.*a.x+a.y*.1)*(.1+abs(sin(a.y*13.+a.x))));}float m(vec2 d){vec2 a=floor(d),b=fract(d);float f=e(a),h=e(a+vec2(1.,0.)),k=e(a+vec2(0.,1.)),n=e(a+vec2(1.,1.));vec2 c=b*b*(3.-2.*b);return mix(f,h,c.x)+(k-f)*c.y*(1.-c.x)+(n-h)*c.x*c.y;}float g(vec2 b,float c,float a){float d=2./a*m(b)+c-1./a,f=clamp(floor(a*d)/(a-1.),0.,1.);return f;}void main(){vec2 h=gl_FragCoord.xy/i.xy;h.y=1.-h.y;vec2 c=gl_FragCoord.xy/j,k=i.xy/j,d=floor(c)/k;d.y=1.-d.y;vec3 a=pow(texture2D(l,d).rgb,vec3(2.2));vec2 b=floor(c.xy+.5);vec3 f=vec3(g(b,a.r,3.),g(b,a.g,3.),g(b,a.b,3.));f.rgb=pow(f,vec3(.454545)),gl_FragColor=vec4(f,1.);}",fs="precision highp float;precision highp sampler2D;uniform sampler2D G,h;uniform float i,w,x,j,H,I,J,K;uniform vec2 m,L;const vec2 y=vec2(37.,17.),z=vec2(59.,83.);vec4 A(vec2 a){float b=texture2D(h,(a+.5)/m).r,c=texture2D(h,(a+.5+y)/m).r,d=texture2D(h,(a+.5+z)/m).r,e=texture2D(h,(a+.5+y+z)/m).r;return vec4(b,c,d,e);}vec4 M(vec4 a){return 1.792843-.853735*a;}float R(float a){return 1.792843-.853735*a;}vec4 g(float d,vec4 c){const vec4 e=vec4(1.,1.,1.,-1.);vec4 a,b;a.xyz=floor(fract(vec3(d)*c.xyz)*7.)*c.z-1.,a.w=1.5-dot(abs(a.xyz),e.xyz),b=vec4(lessThan(a,vec4(0.))),a.xyz=a.xyz+(b.xyz*2.-1.)*b.www;return a;}float B(vec4 c){const vec4 d=vec4(.138197,.276393,.41459,-.447214);vec4 C=floor(c+dot(c,vec4(.309017))),a=c-C+dot(C,d.xxxx),b;vec3 D=step(a.yzw,a.xxx),p=step(a.zww,a.yyz);b.x=D.x+D.y+D.z,b.yzw=1.-D,b.y+=p.x+p.y,b.zw+=1.-p.xy,b.z+=p.z,b.w+=1.-p.z;vec4 N=clamp(b,0.,1.),O=clamp(b-1.,0.,1.),P=clamp(b-2.,0.,1.),q=a-P+d.xxxx,r=a-O+d.yyyy,s=a-N+d.zzzz,t=a+d.wwww;float Q=A(c.zx).z;vec4 f=A(c.xy),e=vec4(.003401,.020408,.142857,0.),k=g(Q,e),l=g(f.x,e),n=g(f.y,e),o=g(f.z,e),E=g(f.w,e),F=M(vec4(dot(k,k),dot(l,l),dot(n,n),dot(o,o)));k*=F.x,l*=F.y,n*=F.z,o*=F.w,E*=R(dot(E,E));vec3 u=max(.6-vec3(dot(a,a),dot(q,q),dot(r,r)),0.);vec2 v=max(.6-vec2(dot(s,s),dot(t,t)),0.);u=u*u,v=v*v;return 49.*(dot(u*u,vec3(dot(k,a),dot(l,q),dot(n,r)))-dot(v*v,vec2(dot(o,s),dot(E,t))));}void main(){vec2 c=gl_FragCoord.xy/m.xy;c.y=1.-c.y;float k=m.x/m.y;vec2 b=L;b.x*=k;vec2 a=(floor(c*L)+0.5)/L;vec3 d=texture2D(G,a).rgb;float e=B(vec4(H+a.x*w,a.y*K,j*cos(i),j*sin(i))),f=B(vec4(a.x*J,I+a.y*w,j*sin(i),j*cos(i)));vec2 l=vec2(e*x,f*x);d=texture2D(G,(a+l)*0.986).rgb,gl_FragColor=vec4(d,.4);}";let R,can,buffA,buffB,buffC,shA,shB,palette,brush,brushes,grid,bkg,bord,bc,bt,xoff,yoff,w,h,cols,nx,ny,npg,projectNumber=Math.floor(parseInt(tokenData.tokenId)/1e6),mintNumber=parseInt(tokenData.tokenId)%1e6,DW=750,DH=1e3,M=window.innerWidth>=window.innerHeight?window.innerHeight/DH:window.innerWidth/DW,gestures=[],pts=[],t=0,id=0,totalFrames=90,dot=Math.round(1*M*4)/4>0?Math.round(1*M*4)/4:.25,tdot=dot,pause=!1;const colorPalettes={library:["BB6100","ffba08","3f88c5","f5dfbb","F1A644","F7EDE2","F0CB94"],beach:["005C8E","d62828","eae2b7","fcbf49","D5CC9D","E4F9FF","B6E1F0"],airport:["0081a7","00afb9","fdfcdc","fed9b7","f07167","E7FDFF","E1E1E1"],museum:["2b2d42","8d99ae","edf2f4","ef233c","d90429","F3F3F3","D1CCC1"],desert:["FCC223","92140c","FFE5C7","FFCF99","BA6F2E","FFF2E6","FFE3A8"],gallery:["FAC021","B00000","7D67E7","FFE3C3","A0B2D5","F0F0F0","D5D5D5"],lounge:["83289C","7577BD","B6D6CC","F1FEC6","FF553E","F7F5E1","FDD474"],garden:["DE8E43","E8DAB2","4F6D7A","DCDF7A","6AB846","EBF7E1","BBFFB7"],party:["072ac8","1e96fc","a2d6f9","fcf300","ffc600","FFF7FB","FFBED7"]},palettes=Object.keys(colorPalettes);function col(t){return"#"+t[floor(R.random_int(0,4))]}function setup(){window.innerHeight<=window.innerWidth?(w=.75*max(window.innerHeight,1),h=max(window.innerHeight,1)):(w=max(window.innerWidth,1),h=max(window.innerWidth,1)/.75),can=createCanvas(w,h,WEBGL),buffB=createGraphics(w,h,WEBGL),buffA=createGraphics(w,h,WEBGL),buffA.setAttributes({alpha:!0}),buffC=createGraphics(w,h,WEBGL),buffC.setAttributes({alpha:!0}),console.log(dot),pixelDensity(1),buffA.pixelDensity(1),buffB.pixelDensity(1),buffC.pixelDensity(1),setAttributes({alpha:!0}),buffB.setAttributes({alpha:!0}),npg=createGraphics(512,512),npg.pixelDensity(1),frameRate(30),shA=createShader(vs,fsn),shB=buffB.createShader(vs,fs),brush=createGraphics(50,50),brush.pixelDensity(1),R=new Random,cols=palettes[int(9*R.random_dec())],palette=colorPalettes[cols],grid=R.random_choice([1,2,3,4,6,8]),pixl=R.random_choice([64,128,256,256,512,640]),nx=R.random_choice([3,3,6,9,9,12]),ny=R.random_choice([2,4,8,16,16,32]),bord=R.random_dec()>.1,bt=R.random_dec()>.3,brushes=R.random_choice([12,18,18,24,24,24]),xoff=R.random_int(0,9e3),yoff=R.random_int(0,9e3),randomSeed(xoff*yoff),drawNoise(npg),bc="#"+palette[6],bkg="#"+palette[5],buffC.noStroke(),buffC.background(bkg),buffA.noStroke(),buffA.clear(),buffA.background(bkg),initPts(brushes);let t=document.getElementById("defaultCanvas0");t.style.imageRendering="pixelated",t.imageSmoothingEnabled=!1,console.log({Hash:tokenData.hash,Palette:cols,"Warped Subdivisions":grid,"Feedback Resolution":pixl,Margin:bord||1==grid?"yes":"no","Saturated Border?":1==grid||bt||!bord?"no":"yes","Chaos X":nx,"Chaos Y":ny,"No. of Brushes":brushes},"RASTER by Galo Canizares (b. 1989)")}function draw(){t=1*frameCount/totalFrames*TWO_PI,shader(shA),shA.setUniform("i",[w,h]),shA.setUniform("l",buffC),shA.setUniform("j",dot),rect(-width/2,-height/2,width,height),buffB.shader(shB),shB.setUniform("m",[w,h]),shB.setUniform("L",[pixl,DH/abs(10-grid)]),shB.setUniform("G",buffC),shB.setUniform("h",npg),shB.setUniform("i",t),shB.setUniform("K",nx),shB.setUniform("J",ny),shB.setUniform("w",grid),shB.setUniform("x",.2),shB.setUniform("j",.005),shB.setUniform("H",xoff),shB.setUniform("I",yoff),buffB.rect(-width/2,-height/2,width,height),buffC.image(buffB,-width/2,-height/2,width,height),buffC.image(buffA,-width/2,-height/2,width,height),buffC.noFill(),buffC.stroke(1==grid||bt||!bord?bkg:bc),buffC.strokeWeight(bord||1==grid?width/18:0),buffC.rect(-width/2,-height/2,width,height),image(buffC,-width/2,-height/2,width,height);for(let t=0;t<gestures.length;t++)gestures[t].animGesture(),gestures[t].drawGesture(buffA);frameCount%30==0&&gestures.length<pts.length&&addGesture(),frameCount%15==0&&buffA.clear()}function addGesture(){let t=new Gesture(.1,R.random_int(50*M,150*M),col(palette));id<pts.length-1&&(t.initGesture(18,pts[id],pts[id+1]),gestures.push(t),id++)}function drawNoise(t){t.loadPixels();for(let e=0;e<t.width;e++)for(let s=0;s<t.height;s++){const i=4*(t.width*e+s);t.pixels[i]=255*random(),t.pixels[i+3]=255}t.updatePixels()}function drawBrush(t,e,s,i,r){t.pixelDensity(1),t.clear(),t.loadPixels();for(let o=0;o<t.width;o++)for(let n=0;n<t.height;n++){const a=4*(t.width*o+n);let h=dist(n,o,t.width/2,t.height/2),d=map(h,0,t.width/2,0,255);t.pixels[a]=e,t.pixels[a+1]=s,t.pixels[a+2]=i,t.pixels[a+3]=r/255*(255-d)}t.updatePixels()}function shuff(t){let e,s,i=t.length;for(;i;)s=Math.floor(random()*i--),e=t[i],t[i]=t[s],t[s]=e;return t}function initPts(t){for(let t=DH/10*M;t<DH*M;t+=DH/5*M)for(let e=DW/10*M;e<DW*M;e+=DW/5*M){let s=new Point(e-width/2,t-height/2);pts.push(s)}pts=shuff(pts).slice(0,t)}function keyPressed(){switch(key){case"1":dot=1*tdot;break;case"2":dot=4*tdot;break;case"4":dot=16*tdot;break;case"8":dot=32*tdot;break;case"s":save("RASTER-"+tokenData.hash+".png");break;case"p":pause=!pause,pause?noLoop():loop();break;case"r":buffC.background(bkg)}}function mousePressed(){pause=!pause,pause?noLoop():loop()}class Point{constructor(t,e){this.x=t,this.y=e}}class Gesture{constructor(t,e,s){this.pts=[],this.curr=[0,0],this.dist=[0,0],this.temp={beginX:0,beginY:0,endX:0,endY:0},this.col=s,this.radi=e,this.step=t,this.traveled=0,this.next=0}initGesture(t,e,s){let i,r=[e.x,e.y];i=12==brushes?[0,0]:[R.random_int(0,DW*M)-width/2,R.random_int(0,DH*M)-height/2];let o=[s.x,s.y];this.pts=this.drawBezier(r,i,o,t),this.pts.length>0&&(this.temp.beginX=this.pts[0].x,this.temp.beginY=this.pts[0].y,this.temp.endX=this.pts[1].x,this.temp.endY=this.pts[1].y,this.dist[0]=this.temp.endX-this.temp.beginX,this.dist[1]=this.temp.endY-this.temp.beginY,this.curr[0]=this.temp.beginX,this.curr[1]=this.temp.beginY)}animGesture(){this.traveled+=this.step,this.traveled<1?(this.curr[0]=this.temp.beginX+this.traveled*this.dist[0],this.curr[1]=this.temp.beginY+this.traveled*this.dist[1]):this.traveled>=1&&(this.nextPt(),this.traveled=0)}drawGesture(t){t.fill(this.col),t.noStroke(),drawBrush(brush,red(this.col),green(this.col),blue(this.col),15),t.blendMode(REPLACE),t.push(),t.texture(brush),t.translate(this.curr[0],this.curr[1]),t.plane(this.radi,this.radi),t.pop()}nextPt(){this.next<this.pts.length-1?this.next+=1:this.next>=this.pts.length-1&&(this.next=0),this.next<this.pts.length-1?(this.temp.beginX=this.pts[this.next].x,this.temp.beginY=this.pts[this.next].y,this.temp.endX=this.pts[this.next+1].x,this.temp.endY=this.pts[this.next+1].y,this.dist[0]=this.temp.endX-this.temp.beginX,this.dist[1]=this.temp.endY-this.temp.beginY):this.next===this.pts.length-1&&(this.temp.beginX=this.pts[this.next].x,this.temp.beginY=this.pts[this.next].y,this.temp.endX=this.pts[0].x,this.temp.endY=this.pts[0].y)}drawBezier(t,e,s,i){let r=[];for(let o=0;o<i;o++){let n=o/Math.max(1,i-1),a=this.qCurve(t,e,s,n);r.push(a)}return r}qCurve(t,e,s,i){let r=t[0],o=t[1],n=e[0],a=e[1],h=s[0],d=s[1],c=1-i,f=c*c,l=i*i,u=[];return u[0]=f*r+2*c*i*n+l*h,u[1]=f*o+2*c*i*a+l*d,u[0]+=R.random_int(-10*M,10*M),u[1]+=R.random_int(-10*M,10*M),createVector(u[0],u[1])}}class Random{constructor(){this.useA=!1;let t=function(t){let e=parseInt(t.substr(0,8),16),s=parseInt(t.substr(8,8),16),i=parseInt(t.substr(16,8),16),r=parseInt(t.substr(24,8),16);return function(){e|=0,s|=0,i|=0,r|=0;let t=(e+s|0)+r|0;return r=r+1|0,e=s^s>>>9,s=i+(i<<3)|0,i=i<<21|i>>>11,i=i+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()}random_num(t,e){return t+(e-t)*this.random_dec()}random_int(t,e){return Math.floor(this.random_num(t,e+1))}random_bool(t){return this.random_dec()<t}random_choice(t){return t[this.random_int(0,t.length-1)]}}
const vs="attribute vec3 aPosition;attribute vec2 aTexCoord;varying vec2 vTexCoord;void main() {vTexCoord = aTexCoord;vec4 positionVec4 = vec4(aPosition, 1.0);positionVec4.xy = positionVec4.xy * 2.0 - 1.0;gl_Position = positionVec4;}",fsn="precision highp float;precision highp sampler2D;uniform sampler2D l;uniform vec2 i;uniform float j;float e(vec2 a){return fract(1e+4*sin(17.*a.x+a.y*.1)*(.1+abs(sin(a.y*13.+a.x))));}float m(vec2 d){vec2 a=floor(d),b=fract(d);float f=e(a),h=e(a+vec2(1.,0.)),k=e(a+vec2(0.,1.)),n=e(a+vec2(1.,1.));vec2 c=b*b*(3.-2.*b);return mix(f,h,c.x)+(k-f)*c.y*(1.-c.x)+(n-h)*c.x*c.y;}float g(vec2 b,float c,float a){float d=2./a*m(b)+c-1./a,f=clamp(floor(a*d)/(a-1.),0.,1.);return f;}void main(){vec2 h=gl_FragCoord.xy/i.xy;h.y=1.-h.y;vec2 c=gl_FragCoord.xy/j,k=i.xy/j,d=floor(c)/k;d.y=1.-d.y;vec3 a=pow(texture2D(l,d).rgb,vec3(2.2));vec2 b=floor(c.xy+.5);vec3 f=vec3(g(b,a.r,3.),g(b,a.g,3.),g(b,a.b,3.));f.rgb=pow(f,vec3(.454545)),gl_FragColor=vec4(f,1.);}",fs="precision highp float;precision highp sampler2D;uniform sampler2D G,h;uniform float i,w,x,j,H,I,J,K;uniform vec2 m,L;const vec2 y=vec2(37.,17.),z=vec2(59.,83.);vec4 A(vec2 a){float b=texture2D(h,(a+.5)/m).r,c=texture2D(h,(a+.5+y)/m).r,d=texture2D(h,(a+.5+z)/m).r,e=texture2D(h,(a+.5+y+z)/m).r;return vec4(b,c,d,e);}vec4 M(vec4 a){return 1.792843-.853735*a;}float R(float a){return 1.792843-.853735*a;}vec4 g(float d,vec4 c){const vec4 e=vec4(1.,1.,1.,-1.);vec4 a,b;a.xyz=floor(fract(vec3(d)*c.xyz)*7.)*c.z-1.,a.w=1.5-dot(abs(a.xyz),e.xyz),b=vec4(lessThan(a,vec4(0.))),a.xyz=a.xyz+(b.xyz*2.-1.)*b.www;return a;}float B(vec4 c){const vec4 d=vec4(.138197,.276393,.41459,-.447214);vec4 C=floor(c+dot(c,vec4(.309017))),a=c-C+dot(C,d.xxxx),b;vec3 D=step(a.yzw,a.xxx),p=step(a.zww,a.yyz);b.x=D.x+D.y+D.z,b.yzw=1.-D,b.y+=p.x+p.y,b.zw+=1.-p.xy,b.z+=p.z,b.w+=1.-p.z;vec4 N=clamp(b,0.,1.),O=clamp(b-1.,0.,1.),P=clamp(b-2.,0.,1.),q=a-P+d.xxxx,r=a-O+d.yyyy,s=a-N+d.zzzz,t=a+d.wwww;float Q=A(c.zx).z;vec4 f=A(c.xy),e=vec4(.003401,.020408,.142857,0.),k=g(Q,e),l=g(f.x,e),n=g(f.y,e),o=g(f.z,e),E=g(f.w,e),F=M(vec4(dot(k,k),dot(l,l),dot(n,n),dot(o,o)));k*=F.x,l*=F.y,n*=F.z,o*=F.w,E*=R(dot(E,E));vec3 u=max(.6-vec3(dot(a,a),dot(q,q),dot(r,r)),0.);vec2 v=max(.6-vec2(dot(s,s),dot(t,t)),0.);u=u*u,v=v*v;return 49.*(dot(u*u,vec3(dot(k,a),dot(l,q),dot(n,r)))-dot(v*v,vec2(dot(o,s),dot(E,t))));}void main(){vec2 c=gl_FragCoord.xy/m.xy;c.y=1.-c.y;float k=m.x/m.y;vec2 b=L;b.x*=k;vec2 a=(floor(c*L)+0.5)/L;vec3 d=texture2D(G,a).rgb;float e=B(vec4(H+a.x*w,a.y*K,j*cos(i),j*sin(i))),f=B(vec4(a.x*J,I+a.y*w,j*sin(i),j*cos(i)));vec2 l=vec2(e*x,f*x);d=texture2D(G,(a+l)*0.986).rgb,gl_FragColor=vec4(d,.4);}";let R,can,buffA,buffB,buffC,shA,shB,palette,brush,brushes,grid,bkg,bord,bc,bt,xoff,yoff,w,h,cols,nx,ny,npg,projectNumber=Math.floor(parseInt(tokenData.tokenId)/1e6),mintNumber=parseInt(tokenData.tokenId)%1e6,DW=750,DH=1e3,M=window.innerWidth>=window.innerHeight?window.innerHeight/DH:window.innerWidth/DW,gestures=[],pts=[],t=0,id=0,totalFrames=90,dot=Math.round(1*M*4)/4>0?Math.round(1*M*4)/4:.25,tdot=dot,pause=!1;const colorPalettes={library:["BB6100","ffba08","3f88c5","f5dfbb","F1A644","F7EDE2","F0CB94"],beach:["005C8E","d62828","eae2b7","fcbf49","D5CC9D","E4F9FF","B6E1F0"],airport:["0081a7","00afb9","fdfcdc","fed9b7","f07167","E7FDFF","E1E1E1"],museum:["2b2d42","8d99ae","edf2f4","ef233c","d90429","F3F3F3","D1CCC1"],desert:["FCC223","92140c","FFE5C7","FFCF99","BA6F2E","FFF2E6","FFE3A8"],gallery:["FAC021","B00000","7D67E7","FFE3C3","A0B2D5","F0F0F0","D5D5D5"],lounge:["83289C","7577BD","B6D6CC","F1FEC6","FF553E","F7F5E1","FDD474"],garden:["DE8E43","E8DAB2","4F6D7A","DCDF7A","6AB846","EBF7E1","BBFFB7"],party:["072ac8","1e96fc","a2d6f9","fcf300","ffc600","FFF7FB","FFBED7"]},palettes=Object.keys(colorPalettes);function col(t){return"#"+t[floor(R.random_int(0,4))]}function setup(){window.innerHeight<=window.innerWidth?(w=.75*max(window.innerHeight,1),h=max(window.innerHeight,1)):(w=max(window.innerWidth,1),h=max(window.innerWidth,1)/.75),can=createCanvas(w,h,WEBGL),buffB=createGraphics(w,h,WEBGL),buffA=createGraphics(w,h,WEBGL),buffA.setAttributes({alpha:!0}),buffC=createGraphics(w,h,WEBGL),buffC.setAttributes({alpha:!0}),console.log(dot),pixelDensity(1),buffA.pixelDensity(1),buffB.pixelDensity(1),buffC.pixelDensity(1),setAttributes({alpha:!0}),buffB.setAttributes({alpha:!0}),npg=createGraphics(512,512),npg.pixelDensity(1),frameRate(30),shA=createShader(vs,fsn),shB=buffB.createShader(vs,fs),brush=createGraphics(50,50),brush.pixelDensity(1),R=new Random,cols=palettes[int(9*R.random_dec())],palette=colorPalettes[cols],grid=R.random_choice([1,2,3,4,6,8]),pixl=R.random_choice([64,128,256,256,512,640]),nx=R.random_choice([3,3,6,9,9,12]),ny=R.random_choice([2,4,8,16,16,32]),bord=R.random_dec()>.1,bt=R.random_dec()>.3,brushes=R.random_choice([12,18,18,24,24,24]),xoff=R.random_int(0,9e3),yoff=R.random_int(0,9e3),randomSeed(xoff*yoff),drawNoise(npg),bc="#"+palette[6],bkg="#"+palette[5],buffC.noStroke(),buffC.background(bkg),buffA.noStroke(),buffA.clear(),buffA.background(bkg),initPts(brushes);let t=document.getElementById("defaultCanvas0");t.style.imageRendering="pixelated",t.imageSmoothingEnabled=!1,console.log({Hash:tokenData.hash,Palette:cols,"Warped Subdivisions":grid,"Secondary Resolution":pixl,Margin:bord||1==grid?"yes":"no","Saturated Border?":1==grid||bt||!bord?"no":"yes","Chaos X":nx,"Chaos Y":ny,"No. of Brushes":brushes},"RASTER by Galo Canizares (b. 1989)")}function draw(){t=1*frameCount/totalFrames*TWO_PI,shader(shA),shA.setUniform("i",[w,h]),shA.setUniform("l",buffC),shA.setUniform("j",dot),rect(-width/2,-height/2,width,height),buffB.shader(shB),shB.setUniform("m",[w,h]),shB.setUniform("L",[pixl,DH/abs(10-grid)]),shB.setUniform("G",buffC),shB.setUniform("h",npg),shB.setUniform("i",t),shB.setUniform("K",nx),shB.setUniform("J",ny),shB.setUniform("w",grid),shB.setUniform("x",.2),shB.setUniform("j",.005),shB.setUniform("H",xoff),shB.setUniform("I",yoff),buffB.rect(-width/2,-height/2,width,height),buffC.image(buffB,-width/2,-height/2,width,height),buffC.image(buffA,-width/2,-height/2,width,height),buffC.noFill(),buffC.stroke(1==grid||bt||!bord?bkg:bc),buffC.strokeWeight(bord||1==grid?width/18:0),buffC.rect(-width/2,-height/2,width,height),image(buffC,-width/2,-height/2,width,height);for(let t=0;t<gestures.length;t++)gestures[t].animGesture(),gestures[t].drawGesture(buffA);frameCount%30==0&&gestures.length<pts.length&&addGesture(),frameCount%15==0&&buffA.clear()}function addGesture(){let t=new Gesture(.1,R.random_int(50*M,150*M),col(palette));id<pts.length-1&&(t.initGesture(18,pts[id],pts[id+1]),gestures.push(t),id++)}function drawNoise(t){t.loadPixels();for(let e=0;e<t.width;e++)for(let s=0;s<t.height;s++){const i=4*(t.width*e+s);t.pixels[i]=255*random(),t.pixels[i+3]=255}t.updatePixels()}function drawBrush(t,e,s,i,r){t.pixelDensity(1),t.clear(),t.loadPixels();for(let o=0;o<t.width;o++)for(let n=0;n<t.height;n++){const a=4*(t.width*o+n);let h=dist(n,o,t.width/2,t.height/2),d=map(h,0,t.width/2,0,255);t.pixels[a]=e,t.pixels[a+1]=s,t.pixels[a+2]=i,t.pixels[a+3]=r/255*(255-d)}t.updatePixels()}function shuff(t){let e,s,i=t.length;for(;i;)s=Math.floor(random()*i--),e=t[i],t[i]=t[s],t[s]=e;return t}function initPts(t){for(let t=DH/10*M;t<DH*M;t+=DH/5*M)for(let e=DW/10*M;e<DW*M;e+=DW/5*M){let s=new Point(e-width/2,t-height/2);pts.push(s)}pts=shuff(pts).slice(0,t)}function keyPressed(){switch(key){case"1":dot=1*tdot;break;case"2":dot=4*tdot;break;case"4":dot=16*tdot;break;case"8":dot=32*tdot;break;case"s":save("RASTER-"+tokenData.hash+".png");break;case"p":pause=!pause,pause?noLoop():loop();break;case"r":buffC.background(bkg)}}function mousePressed(){pause=!pause,pause?noLoop():loop()}class Point{constructor(t,e){this.x=t,this.y=e}}class Gesture{constructor(t,e,s){this.pts=[],this.curr=[0,0],this.dist=[0,0],this.temp={beginX:0,beginY:0,endX:0,endY:0},this.col=s,this.radi=e,this.step=t,this.traveled=0,this.next=0}initGesture(t,e,s){let i,r=[e.x,e.y];i=12==brushes?[0,0]:[R.random_int(0,DW*M)-width/2,R.random_int(0,DH*M)-height/2];let o=[s.x,s.y];this.pts=this.drawBezier(r,i,o,t),this.pts.length>0&&(this.temp.beginX=this.pts[0].x,this.temp.beginY=this.pts[0].y,this.temp.endX=this.pts[1].x,this.temp.endY=this.pts[1].y,this.dist[0]=this.temp.endX-this.temp.beginX,this.dist[1]=this.temp.endY-this.temp.beginY,this.curr[0]=this.temp.beginX,this.curr[1]=this.temp.beginY)}animGesture(){this.traveled+=this.step,this.traveled<1?(this.curr[0]=this.temp.beginX+this.traveled*this.dist[0],this.curr[1]=this.temp.beginY+this.traveled*this.dist[1]):this.traveled>=1&&(this.nextPt(),this.traveled=0)}drawGesture(t){t.fill(this.col),t.noStroke(),drawBrush(brush,red(this.col),green(this.col),blue(this.col),15),t.blendMode(REPLACE),t.push(),t.texture(brush),t.translate(this.curr[0],this.curr[1]),t.plane(this.radi,this.radi),t.pop()}nextPt(){this.next<this.pts.length-1?this.next+=1:this.next>=this.pts.length-1&&(this.next=0),this.next<this.pts.length-1?(this.temp.beginX=this.pts[this.next].x,this.temp.beginY=this.pts[this.next].y,this.temp.endX=this.pts[this.next+1].x,this.temp.endY=this.pts[this.next+1].y,this.dist[0]=this.temp.endX-this.temp.beginX,this.dist[1]=this.temp.endY-this.temp.beginY):this.next===this.pts.length-1&&(this.temp.beginX=this.pts[this.next].x,this.temp.beginY=this.pts[this.next].y,this.temp.endX=this.pts[0].x,this.temp.endY=this.pts[0].y)}drawBezier(t,e,s,i){let r=[];for(let o=0;o<i;o++){let n=o/Math.max(1,i-1),a=this.qCurve(t,e,s,n);r.push(a)}return r}qCurve(t,e,s,i){let r=t[0],o=t[1],n=e[0],a=e[1],h=s[0],d=s[1],c=1-i,f=c*c,l=i*i,u=[];return u[0]=f*r+2*c*i*n+l*h,u[1]=f*o+2*c*i*a+l*d,u[0]+=R.random_int(-10*M,10*M),u[1]+=R.random_int(-10*M,10*M),createVector(u[0],u[1])}}class Random{constructor(){this.useA=!1;let t=function(t){let e=parseInt(t.substr(0,8),16),s=parseInt(t.substr(8,8),16),i=parseInt(t.substr(16,8),16),r=parseInt(t.substr(24,8),16);return function(){e|=0,s|=0,i|=0,r|=0;let t=(e+s|0)+r|0;return r=r+1|0,e=s^s>>>9,s=i+(i<<3)|0,i=i<<21|i>>>11,i=i+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()}random_num(t,e){return t+(e-t)*this.random_dec()}random_int(t,e){return Math.floor(this.random_num(t,e+1))}random_bool(t){return this.random_dec()<t}random_choice(t){return t[this.random_int(0,t.length-1)]}}
``` ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ██▀███ ▄▄▄ ██████ ▄▄▄█████▓▓█████ ██▀███ ▓██ ▒ ██▒▒████▄ ▒██ ▒ ▓ ██▒ ▓▒▓█ ▀ ▓██ ▒ ██▒ ▓██ ░▄█ ▒▒██ ▀█▄ ░ ▓██▄ ▒ ▓██░ ▒░▒███ ▓██ ░▄█ ▒ ▒██▀▀█▄ ░██▄▄▄▄██ ▒ ██▒░ ▓██▓ ░ ▒▓█ ▄ ▒██▀▀█▄ ░██▓ ▒██▒ ▓█ ▓██▒▒██████▒▒ ▒██▒ ░ ░▒████▒░██▓ ▒██▒ ░ ▒▓ ░▒▓░ ▒▒ ▓▒█░▒ ▒▓▒ ▒ ░ ▒ ░░ ░░ ▒░ ░░ ▒▓ ░▒▓░ ░▒ ░ ▒░ ▒ ▒▒ ░░ ░▒ ░ ░ ░ ░ ░ ░ ░▒ ░ ▒░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ``` *Screens no longer only frame and display virtual spacetime. Connected together and surrounding us on all sides, their framings and displays have also opened, activated, and added another spatiotemporal dimension to the four in which all of us live.* —Vivian Sobchack, *From Screen-Scape to Screen-Sphere: A Meditation in Medias Res* An exploration of a technical concept I call "pixel overpainting." Rasterized procedural brush strokes with low transparency slowly layer themselves over each other in a rhythmic loop until they achieve colorful equilibrium. They continue to overpaint themselves endlessly. The resulting color mixtures are then quantized and dithered to separate them into patches of pixels that recall the discrete materiality of the screen: a strictly digital variation on color field painting. The resulting texture is not a skeuomorphic grain but an overt reference to the universe of screens that surround us every day. Electric light arranged in a grid, fluttering and flickering everywhere all the time. Please allow a few minutes for the colors to reach equilibrium. For best results use Chrome browser with enabled webGL and hardware acceleration. Though it is encouraged to explore the subtleties in viewing the same pixels on different hardware and software to reflect on the subjectivity of contemporary computer graphics and the materiality of CPUs, GPUs, resolutions, pixel densities, browser APIs, and other medium-specific entropy. Press '1', '2', '4', '8' to change pixel sizes. Press 'p' or click canvas to pause/resume. Press 's' to grab a still frame. Press 'r' to re-paint. Collectors will be eligible to receive a signed giclée print of a still frame of their mint as well as high-resolution looping media in GIF or lossless video format. ``` ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ```
const vs="attribute vec3 aPosition;attribute vec2 aTexCoord;varying vec2 vTexCoord;void main() {vTexCoord = aTexCoord;vec4 positionVec4 = vec4(aPosition, 1.0);positionVec4.xy = positionVec4.xy * 2.0 - 1.0;gl_Position = positionVec4;}",fsn="precision highp float;precision highp sampler2D;uniform sampler2D l;uniform vec2 i;uniform float j;float e(vec2 a){return fract(1e+4*sin(17.*a.x+a.y*.1)*(.1+abs(sin(a.y*13.+a.x))));}float m(vec2 d){vec2 a=floor(d),b=fract(d);float f=e(a),h=e(a+vec2(1.,0.)),k=e(a+vec2(0.,1.)),n=e(a+vec2(1.,1.));vec2 c=b*b*(3.-2.*b);return mix(f,h,c.x)+(k-f)*c.y*(1.-c.x)+(n-h)*c.x*c.y;}float g(vec2 b,float c,float a){float d=2./a*m(b)+c-1./a,f=clamp(floor(a*d)/(a-1.),0.,1.);return f;}void main(){vec2 h=gl_FragCoord.xy/i.xy;h.y=1.-h.y;vec2 c=gl_FragCoord.xy/j,k=i.xy/j,d=floor(c)/k;d.y=1.-d.y;vec3 a=pow(texture2D(l,d).rgb,vec3(2.2));vec2 b=floor(c.xy+.5);vec3 f=vec3(g(b,a.r,3.),g(b,a.g,3.),g(b,a.b,3.));f.rgb=pow(f,vec3(.454545)),gl_FragColor=vec4(f,1.);}",fs="precision highp float;precision highp sampler2D;uniform sampler2D G,h;uniform float i,w,x,j,H,I,J,K;uniform vec2 m,L;const vec2 y=vec2(37.,17.),z=vec2(59.,83.);vec4 A(vec2 a){float b=texture2D(h,(a+.5)/m).r,c=texture2D(h,(a+.5+y)/m).r,d=texture2D(h,(a+.5+z)/m).r,e=texture2D(h,(a+.5+y+z)/m).r;return vec4(b,c,d,e);}vec4 M(vec4 a){return 1.792843-.853735*a;}float R(float a){return 1.792843-.853735*a;}vec4 g(float d,vec4 c){const vec4 e=vec4(1.,1.,1.,-1.);vec4 a,b;a.xyz=floor(fract(vec3(d)*c.xyz)*7.)*c.z-1.,a.w=1.5-dot(abs(a.xyz),e.xyz),b=vec4(lessThan(a,vec4(0.))),a.xyz=a.xyz+(b.xyz*2.-1.)*b.www;return a;}float B(vec4 c){const vec4 d=vec4(.138197,.276393,.41459,-.447214);vec4 C=floor(c+dot(c,vec4(.309017))),a=c-C+dot(C,d.xxxx),b;vec3 D=step(a.yzw,a.xxx),p=step(a.zww,a.yyz);b.x=D.x+D.y+D.z,b.yzw=1.-D,b.y+=p.x+p.y,b.zw+=1.-p.xy,b.z+=p.z,b.w+=1.-p.z;vec4 N=clamp(b,0.,1.),O=clamp(b-1.,0.,1.),P=clamp(b-2.,0.,1.),q=a-P+d.xxxx,r=a-O+d.yyyy,s=a-N+d.zzzz,t=a+d.wwww;float Q=A(c.zx).z;vec4 f=A(c.xy),e=vec4(.003401,.020408,.142857,0.),k=g(Q,e),l=g(f.x,e),n=g(f.y,e),o=g(f.z,e),E=g(f.w,e),F=M(vec4(dot(k,k),dot(l,l),dot(n,n),dot(o,o)));k*=F.x,l*=F.y,n*=F.z,o*=F.w,E*=R(dot(E,E));vec3 u=max(.6-vec3(dot(a,a),dot(q,q),dot(r,r)),0.);vec2 v=max(.6-vec2(dot(s,s),dot(t,t)),0.);u=u*u,v=v*v;return 49.*(dot(u*u,vec3(dot(k,a),dot(l,q),dot(n,r)))-dot(v*v,vec2(dot(o,s),dot(E,t))));}void main(){vec2 c=gl_FragCoord.xy/m.xy;c.y=1.-c.y;float k=m.x/m.y;vec2 b=L;b.x*=k;vec2 a=(floor(c*L)+0.5)/L;vec3 d=texture2D(G,a).rgb;float e=B(vec4(H+a.x*w,a.y*K,j*cos(i),j*sin(i))),f=B(vec4(a.x*J,I+a.y*w,j*sin(i),j*cos(i)));vec2 l=vec2(e*x,f*x);d=texture2D(G,(a+l)*0.986).rgb,gl_FragColor=vec4(d,.4);}";let R,can,buffA,buffB,buffC,shA,shB,palette,brush,brushes,grid,bkg,bord,bc,bt,xoff,yoff,w,h,cols,nx,ny,npg,projectNumber=Math.floor(parseInt(tokenData.tokenId)/1e6),mintNumber=parseInt(tokenData.tokenId)%1e6,DW=750,DH=1e3,M=window.innerWidth>=window.innerHeight?window.innerHeight/DH:window.innerWidth/DW,gestures=[],pts=[],t=0,id=0,totalFrames=90,dot=Math.round(1*M*4)/4>0?Math.round(1*M*4)/4:.25,tdot=dot,pause=!1;const colorPalettes={library:["BB6100","ffba08","3f88c5","f5dfbb","F1A644","F7EDE2","F0CB94"],beach:["005C8E","d62828","eae2b7","fcbf49","D5CC9D","E4F9FF","B6E1F0"],airport:["0081a7","00afb9","fdfcdc","fed9b7","f07167","E7FDFF","E1E1E1"],museum:["2b2d42","8d99ae","edf2f4","ef233c","d90429","F3F3F3","D1CCC1"],desert:["FCC223","92140c","FFE5C7","FFCF99","BA6F2E","FFF2E6","FFE3A8"],gallery:["FAC021","B00000","7D67E7","FFE3C3","A0B2D5","F0F0F0","D5D5D5"],lounge:["83289C","7577BD","B6D6CC","F1FEC6","FF553E","F7F5E1","FDD474"],garden:["DE8E43","E8DAB2","4F6D7A","DCDF7A","6AB846","EBF7E1","BBFFB7"],party:["072ac8","1e96fc","a2d6f9","fcf300","ffc600","FFF7FB","FFBED7"]},palettes=Object.keys(colorPalettes);function col(t){return"#"+t[floor(R.random_int(0,4))]}function setup(){window.innerHeight<=window.innerWidth?(w=.75*max(window.innerHeight,1),h=max(window.innerHeight,1)):(w=max(window.innerWidth,1),h=max(window.innerWidth,1)/.75),can=createCanvas(w,h,WEBGL),buffB=createGraphics(w,h,WEBGL),buffA=createGraphics(w,h,WEBGL),buffA.setAttributes({alpha:!0}),buffC=createGraphics(w,h,WEBGL),buffC.setAttributes({alpha:!0}),console.log(dot),pixelDensity(1),buffA.pixelDensity(1),buffB.pixelDensity(1),buffC.pixelDensity(1),setAttributes({alpha:!0}),buffB.setAttributes({alpha:!0}),npg=createGraphics(512,512),npg.pixelDensity(1),frameRate(30),shA=createShader(vs,fsn),shB=buffB.createShader(vs,fs),brush=createGraphics(50,50),brush.pixelDensity(1),R=new Random,cols=palettes[int(9*R.random_dec())],palette=colorPalettes[cols],grid=R.random_choice([1,2,3,4,6,8]),pixl=R.random_choice([64,128,256,256,512,640]),nx=R.random_choice([3,3,6,9,9,12]),ny=R.random_choice([2,4,8,16,16,32]),bord=R.random_dec()>.1,bt=R.random_dec()>.3,brushes=R.random_choice([12,18,18,24,24,24]),xoff=R.random_int(0,9e3),yoff=R.random_int(0,9e3),randomSeed(xoff*yoff),drawNoise(npg),bc="#"+palette[6],bkg="#"+palette[5],buffC.noStroke(),buffC.background(bkg),buffA.noStroke(),buffA.clear(),buffA.background(bkg),initPts(brushes);let t=document.getElementById("defaultCanvas0");t.style.imageRendering="pixelated",t.imageSmoothingEnabled=!1,console.log({Hash:tokenData.hash,Palette:cols,"Warped Subdivisions":grid,"Secondary Resolution":pixl,Margin:bord||1==grid?"yes":"no","Saturated Border?":1==grid||bt||!bord?"no":"yes","Chaos X":nx,"Chaos Y":ny,"No. of Brushes":brushes},"RASTER by Galo Canizares (b. 1989)")}function draw(){t=1*frameCount/totalFrames*TWO_PI,shader(shA),shA.setUniform("i",[w,h]),shA.setUniform("l",buffC),shA.setUniform("j",dot),rect(-width/2,-height/2,width,height),buffB.shader(shB),shB.setUniform("m",[w,h]),shB.setUniform("L",[pixl,DH/abs(10-grid)]),shB.setUniform("G",buffC),shB.setUniform("h",npg),shB.setUniform("i",t),shB.setUniform("K",nx),shB.setUniform("J",ny),shB.setUniform("w",grid),shB.setUniform("x",.2),shB.setUniform("j",.005),shB.setUniform("H",xoff),shB.setUniform("I",yoff),buffB.rect(-width/2,-height/2,width,height),buffC.image(buffB,-width/2,-height/2,width,height),buffC.image(buffA,-width/2,-height/2,width,height),buffC.noFill(),buffC.stroke(1==grid||bt||!bord?bkg:bc),buffC.strokeWeight(bord||1==grid?width/18:0),buffC.rect(-width/2,-height/2,width,height),image(buffC,-width/2,-height/2,width,height);for(let t=0;t<gestures.length;t++)gestures[t].animGesture(),gestures[t].drawGesture(buffA);frameCount%30==0&&gestures.length<pts.length&&addGesture(),frameCount%15==0&&buffA.clear()}function addGesture(){let t=new Gesture(.1,R.random_int(50*M,150*M),col(palette));id<pts.length-1&&(t.initGesture(18,pts[id],pts[id+1]),gestures.push(t),id++)}function drawNoise(t){t.loadPixels();for(let e=0;e<t.width;e++)for(let s=0;s<t.height;s++){const i=4*(t.width*e+s);t.pixels[i]=255*random(),t.pixels[i+3]=255}t.updatePixels()}function drawBrush(t,e,s,i,r){t.pixelDensity(1),t.clear(),t.loadPixels();for(let o=0;o<t.width;o++)for(let n=0;n<t.height;n++){const a=4*(t.width*o+n);let h=dist(n,o,t.width/2,t.height/2),d=map(h,0,t.width/2,0,255);t.pixels[a]=e,t.pixels[a+1]=s,t.pixels[a+2]=i,t.pixels[a+3]=r/255*(255-d)}t.updatePixels()}function shuff(t){let e,s,i=t.length;for(;i;)s=Math.floor(random()*i--),e=t[i],t[i]=t[s],t[s]=e;return t}function initPts(t){for(let t=DH/10*M;t<DH*M;t+=DH/5*M)for(let e=DW/10*M;e<DW*M;e+=DW/5*M){let s=new Point(e-width/2,t-height/2);pts.push(s)}pts=shuff(pts).slice(0,t)}function keyPressed(){switch(key){case"1":dot=1*tdot;break;case"2":dot=4*tdot;break;case"4":dot=16*tdot;break;case"8":dot=32*tdot;break;case"s":save("RASTER-"+tokenData.hash+".png");break;case"p":pause=!pause,pause?noLoop():loop();break;case"r":buffC.background(bkg)}}function mousePressed(){pause=!pause,pause?noLoop():loop()}class Point{constructor(t,e){this.x=t,this.y=e}}class Gesture{constructor(t,e,s){this.pts=[],this.curr=[0,0],this.dist=[0,0],this.temp={beginX:0,beginY:0,endX:0,endY:0},this.col=s,this.radi=e,this.step=t,this.traveled=0,this.next=0}initGesture(t,e,s){let i,r=[e.x,e.y];i=12==brushes?[0,0]:[R.random_int(0,DW*M)-width/2,R.random_int(0,DH*M)-height/2];let o=[s.x,s.y];this.pts=this.drawBezier(r,i,o,t),this.pts.length>0&&(this.temp.beginX=this.pts[0].x,this.temp.beginY=this.pts[0].y,this.temp.endX=this.pts[1].x,this.temp.endY=this.pts[1].y,this.dist[0]=this.temp.endX-this.temp.beginX,this.dist[1]=this.temp.endY-this.temp.beginY,this.curr[0]=this.temp.beginX,this.curr[1]=this.temp.beginY)}animGesture(){this.traveled+=this.step,this.traveled<1?(this.curr[0]=this.temp.beginX+this.traveled*this.dist[0],this.curr[1]=this.temp.beginY+this.traveled*this.dist[1]):this.traveled>1&&(this.nextPt(),this.traveled=0)}drawGesture(t){t.fill(this.col),t.noStroke(),drawBrush(brush,red(this.col),green(this.col),blue(this.col),15),t.blendMode(REPLACE),t.push(),t.texture(brush),t.translate(this.curr[0],this.curr[1]),t.plane(this.radi,this.radi),t.pop()}nextPt(){this.next<this.pts.length-1?this.next+=1:this.next>=this.pts.length-1&&(this.next=0),this.next<this.pts.length-1?(this.temp.beginX=this.pts[this.next].x,this.temp.beginY=this.pts[this.next].y,this.temp.endX=this.pts[this.next+1].x,this.temp.endY=this.pts[this.next+1].y,this.dist[0]=this.temp.endX-this.temp.beginX,this.dist[1]=this.temp.endY-this.temp.beginY):this.next===this.pts.length-1&&(this.temp.beginX=this.pts[this.next].x,this.temp.beginY=this.pts[this.next].y,this.temp.endX=this.pts[0].x,this.temp.endY=this.pts[0].y)}drawBezier(t,e,s,i){let r=[];for(let o=0;o<i;o++){let n=o/Math.max(1,i-1),a=this.qCurve(t,e,s,n);r.push(a)}return r}qCurve(t,e,s,i){let r=t[0],o=t[1],n=e[0],a=e[1],h=s[0],d=s[1],c=1-i,f=c*c,l=i*i,u=[];return u[0]=f*r+2*c*i*n+l*h,u[1]=f*o+2*c*i*a+l*d,u[0]+=R.random_int(-10*M,10*M),u[1]+=R.random_int(-10*M,10*M),createVector(u[0],u[1])}}class Random{constructor(){this.useA=!1;let t=function(t){let e=parseInt(t.substr(0,8),16),s=parseInt(t.substr(8,8),16),i=parseInt(t.substr(16,8),16),r=parseInt(t.substr(24,8),16);return function(){e|=0,s|=0,i|=0,r|=0;let t=(e+s|0)+r|0;return r=r+1|0,e=s^s>>>9,s=i+(i<<3)|0,i=i<<21|i>>>11,i=i+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()}random_num(t,e){return t+(e-t)*this.random_dec()}random_int(t,e){return Math.floor(this.random_num(t,e+1))}random_bool(t){return this.random_dec()<t}random_choice(t){return t[this.random_int(0,t.length-1)]}}
``` ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ██▀███ ▄▄▄ ██████ ▄▄▄█████▓▓█████ ██▀███ ▓██ ▒ ██▒▒████▄ ▒██ ▒ ▓ ██▒ ▓▒▓█ ▀ ▓██ ▒ ██▒ ▓██ ░▄█ ▒▒██ ▀█▄ ░ ▓██▄ ▒ ▓██░ ▒░▒███ ▓██ ░▄█ ▒ ▒██▀▀█▄ ░██▄▄▄▄██ ▒ ██▒░ ▓██▓ ░ ▒▓█ ▄ ▒██▀▀█▄ ░██▓ ▒██▒ ▓█ ▓██▒▒██████▒▒ ▒██▒ ░ ░▒████▒░██▓ ▒██▒ ░ ▒▓ ░▒▓░ ▒▒ ▓▒█░▒ ▒▓▒ ▒ ░ ▒ ░░ ░░ ▒░ ░░ ▒▓ ░▒▓░ ░▒ ░ ▒░ ▒ ▒▒ ░░ ░▒ ░ ░ ░ ░ ░ ░ ░▒ ░ ▒░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ``` *Screens no longer only frame and display virtual spacetime. Connected together and surrounding us on all sides, their framings and displays have also opened, activated, and added another spatiotemporal dimension to the four in which all of us live.* —Vivian Sobchack, *From Screen-Scape to Screen-Sphere: A Meditation in Medias Res* An exploration of a technical concept I call "pixel overpainting." Rasterized procedural brush strokes with low transparency slowly layer themselves over each other in a rhythmic loop until they achieve colorful equilibrium. They continue to overpaint themselves endlessly. The resulting color mixtures are then quantized and dithered to separate them into patches of pixels that recall the discrete materiality of the screen: a strictly digital variation on color field painting. The resulting texture is not a skeuomorphic grain but an overt reference to the universe of screens that surround us every day. Electric light arranged in a grid, fluttering and flickering everywhere all the time. Please allow a few minutes for the colors to reach equilibrium. For best results use Chrome browser with enabled webGL and hardware acceleration. Though it is encouraged to explore the differences in viewing the same pixels on different hardware and software to reflect on the subjectivity of contemporary computer graphics and the materiality of CPUs, GPUs, resolutions, pixel densities, browser APIs, and other medium-specific entropy. Press '1', '2', '4', '8' to change pixel sizes. Press 'p' or click canvas to pause/resume. Press 's' to grab a still frame. Press 'r' to re-paint. Collectors will be eligible to receive a signed giclée print of a still frame of their mint as well as high-resolution looping media in GIF or lossless video format. ``` ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ```