function openSimplexNoise(e){"use strict";let t=e=>e.split(",").map(e=>new Uint8Array(e.split("").map(e=>Number(e)))),_=(e,t,_)=>new Int8Array(_.split("").map(_=>parseInt(_,t)+e)),$=e=>e.split(",").map(e=>parseInt(e,32)),i=1/47,n=1/103,a=1/30,r=.7320508075688772/2,s=1/3,l=1.2360679774997898/4,o=(.5773502691896258-1)/2,h=-.5/3,p=(.4472135954999579-1)/4;var f=t("110101000,110101211"),u=t("0000110010101001,2110210120113111,110010101001211021012011"),d=t("0000011000101001001010001,3111031101310113011141111,11000101001001010001211002101021001201102010120011,31110311013101130111211002101021001201102010120011");let c=_(-5,11,"a77a073aa3700330"),g=_(-11,23,"0ff7mf7fmmfffmfffm07f70f77mm7ff0ff7m0f77m77f0mf7fm7ff0077707770m77f07f70"),m=_(-3,7,"6444464444644446044426442464244662444044426442460244204422642246642446244404442604242624240424266224402442044226022420242204222664424642446244400442264224622440624240424262424002422042226222406422462244024420042226222402242062224022420242200222202222022220");var v=()=>new Uint8Array([0,1,1,0,4,1,17,0,20,2,21,2,22,5,23,5,26,4,39,3,42,4,43,3]),x=()=>new Uint16Array($("0,2,1,1,2,2,5,1,6,0,7,0,10,2,12,2,41,1,45,1,50,5,51,5,g6,0,g7,0,h2,4,h6,4,k5,3,k7,3,l0,5,l1,5,l2,4,l5,3,l6,4,l7,3,l8,d,l9,d,la,c,ld,e,le,c,lf,e,m8,k,ma,i,p9,l,pd,n,q8,k,q9,l,15e,j,15f,m,16a,i,16e,j,19d,n,19f,m,1a8,f,1a9,h,1aa,f,1ad,h,1ae,g,1af,g,1ag,b,1ah,a,1ai,b,1al,a,1am,9,1an,9,1bg,b,1bi,b,1eh,a,1el,a,1fg,8,1fh,8,1qm,9,1qn,9,1ri,7,1rm,7,1ul,6,1un,6,1vg,8,1vh,8,1vi,7,1vl,6,1vm,7,1vn,6")),b=()=>new Uint32Array($("0,3,1,2,2,3,5,2,6,1,7,1,8,3,9,2,a,3,d,2,g,3,i,3,m,1,n,1,o,3,q,3,11,2,15,2,16,1,17,1,19,2,1d,2,1m,1,1n,1,1o,0,1p,0,1q,0,1r,0,1s,0,1t,0,1u,0,1v,0,80,3,82,3,88,3,8a,3,8g,3,8i,3,8o,3,8q,3,201,2,205,2,209,2,20d,2,211,2,215,2,219,2,21d,2,280,9,281,9,288,9,289,9,g06,1,g07,1,g0m,1,g0n,1,g16,1,g17,1,g1m,1,g1n,1,g82,8,g86,8,g8i,8,g8m,8,i05,6,i07,6,i15,6,i17,6,i80,9,i81,9,i82,8,i85,6,i86,8,i87,6,i88,9,i89,9,i8i,8,i8m,8,i95,6,i97,6,401o,0,401p,0,401q,0,401r,0,401s,0,401t,0,401u,0,401v,0,408o,7,408q,7,409o,7,409q,7,4219,5,421d,5,421p,5,421t,5,4280,9,4281,9,4288,9,4289,9,428o,7,428q,7,4299,5,429d,5,429o,7,429p,5,429q,7,429t,5,4g1m,4,4g1n,4,4g1u,4,4g1v,4,4g82,8,4g86,8,4g8i,8,4g8m,8,4g8o,7,4g8q,7,4g9m,4,4g9n,4,4g9o,7,4g9q,7,4g9u,4,4g9v,4,4i05,6,4i07,6,4i15,6,4i17,6,4i19,5,4i1d,5,4i1m,4,4i1n,4,4i1p,5,4i1t,5,4i1u,4,4i1v,4,4i80,9,4i81,9,4i82,8,4i85,6,4i86,8,4i87,6,4i88,9,4i89,9,4i8i,8,4i8m,8,4i8o,7,4i8q,7,4i95,6,4i97,6,4i99,5,4i9d,5,4i9m,4,4i9n,4,4i9o,7,4i9p,5,4i9q,7,4i9t,5,4i9u,4,4i9v,4,4ia0,15,4ia1,15,4ia2,14,4ia5,12,4ia6,14,4ia7,12,4ia8,15,4ia9,15,4iai,14,4iam,14,4iao,13,4iaq,13,4ib5,12,4ib7,12,4ib9,11,4ibd,11,4ibm,10,4ibn,10,4ibo,13,4ibp,11,4ibq,13,4ibt,11,4ibu,10,4ibv,10,4ii0,1h,4ii2,1g,4ii8,1h,4iii,1g,4iio,1f,4iiq,1f,4ka1,1e,4ka5,1d,4ka9,1e,4kb5,1d,4kb9,1c,4kbd,1c,4ki0,1h,4ki1,1e,4ki8,1h,4ki9,1e,52a6,1b,52a7,1a,52am,1b,52b7,1a,52bm,19,52bn,19,52i2,1g,52i6,1b,52ii,1g,52im,1b,54a5,1d,54a7,1a,54b5,1d,54b7,1a,54i0,v,54i1,s,54i2,v,54i5,s,54i6,p,54i7,p,8ibo,18,8ibp,17,8ibq,18,8ibt,17,8ibu,16,8ibv,16,8iio,1f,8iiq,1f,8ijo,18,8ijq,18,8kb9,1c,8kbd,1c,8kbp,17,8kbt,17,8ki8,u,8ki9,r,8kio,u,8kj9,r,8kjo,m,8kjp,m,92bm,19,92bn,19,92bu,16,92bv,16,92ii,t,92im,o,92iq,t,92jm,o,92jq,l,92ju,l,94b5,q,94b7,n,94bd,q,94bn,n,94bt,k,94bv,k,94i0,v,94i1,s,94i2,v,94i5,s,94i6,p,94i7,p,94i8,u,94i9,r,94ii,t,94im,o,94io,u,94iq,t,94j5,q,94j7,n,94j9,r,94jd,q,94jm,o,94jn,n,94jo,m,94jp,m,94jq,l,94jt,k,94ju,l,94jv,k,94k0,1t,94k1,1s,94k2,1t,94k5,1s,94k6,1r,94k7,1r,94k8,1q,94k9,1p,94ki,1n,94km,1m,94ko,1q,94kq,1n,94l5,1k,94l7,1j,94l9,1p,94ld,1k,94lm,1m,94ln,1j,94lo,1o,94lp,1o,94lq,1l,94lt,1i,94lu,1l,94lv,1i,94s0,1t,94s2,1t,94s8,1q,94si,1n,94so,1q,94sq,1n,96k1,1s,96k5,1s,96k9,1p,96l5,1k,96l9,1p,96ld,1k,96s0,2f,96s1,2f,96s8,2c,96s9,2c,9kk6,1r,9kk7,1r,9kkm,1m,9kl7,1j,9klm,1m,9kln,1j,9ks2,2e,9ks6,2e,9ksi,29,9ksm,29,9mk5,2d,9mk7,2d,9ml5,26,9ml7,26,9ms0,2f,9ms1,2f,9ms2,2e,9ms5,2d,9ms6,2e,9ms7,2d,d4lo,1o,d4lp,1o,d4lq,1l,d4lt,1i,d4lu,1l,d4lv,1i,d4so,2b,d4sq,28,d4to,2b,d4tq,28,d6l9,2a,d6ld,25,d6lp,2a,d6lt,25,d6s8,2c,d6s9,2c,d6so,2b,d6t9,2a,d6to,2b,d6tp,2a,dklm,27,dkln,24,dklu,27,dklv,24,dksi,29,dksm,29,dksq,28,dktm,27,dktq,28,dktu,27,dml5,26,dml7,26,dmld,25,dmln,24,dmlt,25,dmlv,24,dms0,23,dms1,23,dms2,22,dms5,20,dms6,22,dms7,20,dms8,23,dms9,23,dmsi,22,dmsm,22,dmso,21,dmsq,21,dmt5,20,dmt7,20,dmt9,1v,dmtd,1v,dmtm,1u,dmtn,1u,dmto,21,dmtp,1v,dmtq,21,dmtt,1v,dmtu,1u,dmtv,1u,dmu0,j,dmu1,j,dmu2,i,dmu5,g,dmu6,i,dmu7,g,dmu8,j,dmu9,j,dmui,i,dmum,i,dmuo,h,dmuq,h,dmv5,g,dmv7,g,dmv9,f,dmvd,f,dmvm,e,dmvn,e,dmvo,h,dmvp,f,dmvq,h,dmvt,f,dmvu,e,dmvv,e,dn60,j,dn61,j,dn62,i,dn66,i,dn68,j,dn69,j,dn6i,i,dn6m,i,dn6o,h,dn6q,h,dn7o,h,dn7q,h,dou0,j,dou1,j,dou5,g,dou7,g,dou8,j,dou9,j,dov5,g,dov7,g,dov9,f,dovd,f,dovp,f,dovt,f,dp60,j,dp61,j,dp68,j,dp69,j,e6u2,i,e6u5,g,e6u6,i,e6u7,g,e6ui,i,e6um,i,e6v5,g,e6v7,g,e6vm,e,e6vn,e,e6vu,e,e6vv,e,e762,i,e766,i,e76i,i,e76m,i,e8u5,g,e8u7,g,e8v5,g,e8v7,g,e960,d,e961,d,e962,d,e963,d,e964,d,e965,d,e966,d,e967,d,hmuo,h,hmuq,h,hmv9,f,hmvd,f,hmvm,e,hmvn,e,hmvo,h,hmvp,f,hmvq,h,hmvt,f,hmvu,e,hmvv,e,hn6o,h,hn6q,h,hn7o,h,hn7q,h,hov9,f,hovd,f,hovp,f,hovt,f,hp68,c,hp69,c,hp6o,c,hp6p,c,hp78,c,hp79,c,hp7o,c,hp7p,c,i6vm,e,i6vn,e,i6vu,e,i6vv,e,i76i,b,i76m,b,i76q,b,i76u,b,i77i,b,i77m,b,i77q,b,i77u,b,i8v5,a,i8v7,a,i8vd,a,i8vf,a,i8vl,a,i8vn,a,i8vt,a,i8vv,a,i960,d,i961,d,i962,d,i963,d,i964,d,i965,d,i966,d,i967,d,i968,c,i969,c,i96i,b,i96m,b,i96o,c,i96p,c,i96q,b,i96u,b,i975,a,i977,a,i978,c,i979,c,i97d,a,i97f,a,i97i,b,i97l,a,i97m,b,i97n,a,i97o,c,i97p,c,i97q,b,i97t,a,i97u,b,i97v,a")),S=_(-1,4,"112011021322233123132111"),y=_(-1,5,"112011210110211120110121102132212220132122202131222022243214231243124213241324123222113311221213131221123113311112202311112022311112220342223113342223311342223131322023113322023311320223113320223131322203311322203131"),w=_(-1,6,"11201112101121101102111120111210110121110211112011011211012111021322112220122210132121220212212013122120221212201321122201222102131212202122120213112220122210222532215232152231253212523125221325312252132521232513225123251223232211432114231123212143121421312312214132141231232112431124211323121241312412132311224113241123342221322203311134221232202331113421223202233111342221322203131134221232202313113412223022231311342221322203113134212232022311313412223022231131342212322023111334212232022311133412223022231113322201222101111132202122120111113202212122011111322012221021111132021221202111113201222102211111322201222103311132202122120331113220122210233111322201222103131132022121220313113202122120231311322021221203113132022121220311313201222102231131322012221023111332021221202311133201222102231113422111331113222042121131311322204211213113132220422111331113220242121131311322024211123111332202422111331113202242112131131320224211123111332022421211313113022242112131131302224211123111330222443211423115222244312142131522224413214123152222443112421135222244131241213522224411324112352222443211423113222044312142131322204413214123132220443211423113220244311242113322024413124121332202443121421313202244311242113320224411324112332022441321412313022244131241213302224411324112330222");let z=(e,t=e=>e)=>{for(var _=[],$=0;$<e;)_.push(t($++));return _};function k(e,t=1){return e=1664525*e+1013904223|0,(t-=1)>0?k(e,t):e}let P={_2D:{base:f,squish:r,dimensions:2,pD:S,lookup:v},_3D:{base:u,squish:s,dimensions:3,pD:y,lookup:x},_4D:{base:d,squish:l,dimensions:4,pD:w,lookup:b}};function B(e,t,_){var $=0;let i=t[_++],n={next:void 0};for(;$<e.dimensions;){let a="xyzw"[$];n[a+"sb"]=t[_+$],n["d"+a]=-t[_+$++]-i*e.squish}return n}function V(e){let t=[],_=e.dimensions,$=_*_;for(var i,n=0;n<e.pD.length;){let a=e.base[e.pD[n]],r,s;i=0;do s=B(e,a,i),r?r.next=s:t[n/$]=s,r=s,i+=_+1;while(i<a.length);s.next=B(e,e.pD,n+1),_>=3&&(s.next.next=B(e,e.pD,n+_+2)),4===_&&(s.next.next.next=B(e,e.pD,n+11)),n+=$}let l=[t,function e(t,_){var $;let i=t(),n=new Map;for($=0;$<i.length;$+=2)n.set(i[$],_[i[$+1]]);return n}(e.lookup,t)];return e.base=void 0,e.lookup=void 0,l}let[M,T]=V(P._2D),[W,A]=V(P._3D),[q,j]=V(P._4D),H=new Uint8Array(256),X=new Uint8Array(256),D=new Uint8Array(256),Y=new Uint8Array(256),F=new Uint8Array(z(256,e=>e));var I=k(e,3);return((e,t)=>{for(var _=0;_<256&&!0!==t(_++););})(256,e=>{e=255-e;var t=((I=k(I))+31)%(e+1);t+=t<0?e+1:0,H[e]=F[t],X[e]=14&H[e],D[e]=H[e]%24*3,Y[e]=252&H[e],F[t]=F[e]}),f=u=d=void 0,v=x=b=void 0,S=y=w=void 0,{noise2D(e,t){let _=X,$=H,n=c,a=(e+t)*o,s=e+a,l=t+a,h=Math.floor(s),p=Math.floor(l),f=(h+p)*r,u=e-(h+f),d=t-(p+f);for(var g,m=(()=>{let e=s-h,t=l-p,_=e+t;return T.get(e-t+1|_<<1|_+t<<2|_+e<<4)})(),v=0;void 0!==m;){let x=u+m.dx,b=d+m.dy,S=2-x*x-b*b;S>0&&(g=_[$[h+m.xsb&255]+(p+m.ysb)&255],S*=S,v+=S*S*(n[g++]*x+n[g]*b)),m=m.next}return v*i},noise3D(e,t,_){let $=D,i=H,a=g,r=(e+t+_)*h,l=e+r,o=t+r,p=_+r,f=Math.floor(l),u=Math.floor(o),d=Math.floor(p),c=(f+u+d)*s,m=e-(f+c),v=t-(u+c),x=_-(d+c);for(var b,S=(()=>{let e=l-f,t=o-u,_=p-d,$=e+t+_;return A.get(t-_+1|e-t+1<<1|e-_+1<<2|$<<3|$+_<<5|$+t<<7|$+e<<9)})(),y=0;void 0!==S;){let w=m+S.dx,z=v+S.dy,k=x+S.dz,P=2-w*w-z*z-k*k;P>0&&(b=$[(i[f+S.xsb&255]+(u+S.ysb)&255)+(d+S.zsb)&255],P*=P,y+=P*P*(a[b++]*w+a[b++]*z+a[b]*k)),S=S.next}return y*n},noise4D(e,t,_,$){let i=Y,n=H,r=m,s=(e+t+_+$)*p,o=e+s,h=t+s,f=_+s,u=$+s,d=Math.floor(o),c=Math.floor(h),g=Math.floor(f),v=Math.floor(u),x=(d+c+g+v)*l,b=e-(d+x),S=t-(c+x),y=_-(g+x),w=$-(v+x);for(var z,k=(()=>{let e=o-d,t=h-c,_=f-g,$=u-v,i=e+t+_+$;return j.get(_-$+1|t-_+1<<1|t-$+1<<2|e-t+1<<3|e-_+1<<4|e-$+1<<5|i<<6|i+$<<8|i+_<<11|i+t<<14|i+e<<17)})(),P=0;void 0!==k;){let B=b+k.dx,V=S+k.dy,M=y+k.dz,T=w+k.dw,W=2-B*B-V*V-M*M-T*T;W>0&&(z=i[((n[d+k.xsb&255]+(c+k.ysb)&255)+(g+k.zsb)&255)+(v+k.wsb)&255],W*=W,P+=W*W*(r[z++]*B+r[z++]*V+r[z++]*M+r[z]*T)),k=k.next}return P*a}}}function _createV(e,t,_){let $=_;void 0==$&&($=0);let i=t;void 0==i&&(i=0);let n=e;return void 0==n&&(n=0),{x:n,y:i,z:$}}function _copyV(e){return _createV(e.x,e.y,e.z)}function _normalize(e){let t=_mag(e);return 0==t?e:_scalarMult(e,1/t)}function _setMag(e,t){return _scalarMult(_normalize(e),t)}function _add(e,t){return _createV(e.x+t.x,e.y+t.y,e.z+t.z)}function _sub(e,t){return _createV(e.x-t.x,e.y-t.y,e.z-t.z)}function _mult(e,t){return _createV(e.x*t.x,e.y*t.y,e.z*t.z)}function _scalarMult(e,t){return _createV(e.x*t,e.y*t,e.z*t)}function _mag(e){return sqrt(sq(e.x)+sq(e.y)+sq(e.z))}function _dot(e,t){return e.x*t.x+e.y*t.y+e.z*t.z}function _cross(e,t){return _createV(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x)}function _lerp(e,t,_){return _createV(lerp(e.x,t.x,_),lerp(e.y,t.y,_),lerp(e.z,t.z,_))}function _rotate(e,t,_,$){let i=cos($),n=cos(_),a=cos(t),r=sin($),s=sin(_),l=sin(t),o=_createV(e.x,e.y,e.z),h=i,p=r,f=0,u=-r,d=i,c=0,g=0,m=0,v=1;return o=_createV(o.x*h+o.y*u+o.z*g,o.x*p+o.y*d+o.z*m,o.x*f+o.y*c+o.z*v),h=n,p=0,f=s,u=0,d=1,c=0,g=-s,m=0,v=n,o=_createV(o.x*h+o.y*u+o.z*g,o.x*p+o.y*d+o.z*m,o.x*f+o.y*c+o.z*v),h=1,p=0,f=0,u=0,d=a,c=l,g=0,m=-l,v=a,o=_createV(o.x*h+o.y*u+o.z*g,o.x*p+o.y*d+o.z*m,o.x*f+o.y*c+o.z*v)}function fractalNoise(e){let t=e.x,_=e.y,$=e.z,i=e.nOctaves,n=e.scaleFallout,a=e.weightFallout,r=0,s=1,l=0,o=1;for(let h=0;h<i;h++)l+=s,r+=norm(sNoise.noise3D(t*o,_*o,$*o),-1,1)*s,o*=n,s*=a;return map(r,0,l,0,1)}function triNorm(e,t,_){let $=_sub(t,e),i=_sub(_,e);return _cross($,i)}let perspectiveType="perspective",perspectivePower=2,perspectiveShift=0,lowPerspective=!1;function _3dTo2d(e){let t;t=lowPerspective?_rotate(_add(e,_createV(0,0,0)),PI/8,0,0):_rotate(_add(e,_createV(0,0,0)),PI/4,0,0);let _;_="perspective"==perspectiveType?1.5*map(pow(constrain(map(t.z,-maxZ,maxZ,0,1),0,1),perspectivePower),0,1,lowPerspective?.25:.7,lowPerspective?1.5:1):1;let $=_createV(t.x/_,(t.y-0)/_+450+0);return(isNaN($.x)||isNaN($.y)||isNaN($.z))&&print("NAN!",$.x,$.y,$.z,perspectivePower,t.z),$}function intersectPoint(e,t,_,$){let i=e.x,n=e.y,a=t.x,r=t.y,s=_.x,l=_.y,o=$.x,h=$.y;if(i===a&&n===r||s===o&&l===h||0==(denominator=(h-l)*(a-i)-(o-s)*(r-n)))return!1;let p=((o-s)*(n-l)-(h-l)*(i-s))/denominator,f=((a-i)*(n-l)-(r-n)*(i-s))/denominator;return!(p<0)&&!(p>1)&&!(f<0)&&!(f>1)&&{x:i+p*(a-i),y:n+p*(r-n)}}function linesIntersect(e,t,_,$){let i=e.x,n=e.y,a=t.x,r=t.y,s=_.x,l=_.y,o=$.x,h=$.y;if(i==a&&n==r||s==o&&l==h)return!1;let p=a-i,f=r-n,u=s-o,d=l-h,c=i-s,g=n-l,m=d*c-u*g,v=f*u-p*d;if(v>0){if(m<0||m>v)return!1}else if(v<0&&(m>0||m<v))return!1;let x=p*g-f*c;if(v>0){if(x<0||x>v)return!1}else if(v<0&&(x>0||x<v))return!1;return 0!=v||0==i*(r-l)+a*(l-n)+s*(n-r)&&(!!(i>=s)&&!!(i<=o)||!!(i<=s)&&!!(i>=o)||!!(a>=s)&&!!(a<=o)||!!(a<=s)&&!!(a>=o)||!!(s>=i)&&!!(s<=a)||!!(s<=i)&&!!(s>=a))&&(!!(n>=l)&&!!(n<=h)||!!(n<=l)&&!!(n>=h)||!!(r>=l)&&!!(r<=h)||!!(r<=l)&&!!(r>=h)||!!(l>=n)&&!!(l<=r)||!!(l<=n)&&!!(l>=r))}function sign(e,t,_){return(e.x-_.x)*(t.y-_.y)-(t.x-_.x)*(e.y-_.y)}function pointInTriangle(e,t,_,$){let i,n,a,r,s;return i=sign(e,t,_),n=sign(e,_,$),a=sign(e,$,t),r=i<0||n<0||a<0,s=i>0||n>0||a>0,!(r&&s)}function drawTriangleToBuffer(e,t,_,$){let i=_createV(map(e.x,-targetSzX/2,targetSzX/2,0,unionBufferW),map(e.y,-targetSzY/2,targetSzY/2,0,unionBufferH)),n=_createV(map(t.x,-targetSzX/2,targetSzX/2,0,unionBufferW),map(t.y,-targetSzY/2,targetSzY/2,0,unionBufferH)),a=_createV(map(_.x,-targetSzX/2,targetSzX/2,0,unionBufferW),map(_.y,-targetSzY/2,targetSzY/2,0,unionBufferH)),r=min(e.x,min(t.x,_.x)),s=max(e.x,max(t.x,_.x)),l=min(e.y,min(t.y,_.y)),o=max(e.y,max(t.y,_.y));for(let h=r;h<=s;h++)for(let p=l;p<=o;p++){let f=_createV(h,p);pointInTriangle(f,i,n,a)&&setBufferIJ(h,p,!0,$)}}function setBufferIJ(e,t,_,$){e>=0&&e<unionBufferW&&t>=0&&t<unionBufferH&&($[e+t*unionBufferW]=_)}function getBufferIJ(e,t,_){return e>=0&&e<unionBufferW&&t>=0&&t<unionBufferH?_[e+t*unionBufferW]:null}function setBufferPoint(e,t,_){let $=_xyToij(e.x,e.y);setBufferIJ($.i,$.j,t,_)}function getBufferPoint(e,t){let _=_xyToij(e.x,e.y);return null==_||getBufferIJ(_.i,_.j,t)}function _xyToij(e,t){let _=floor(map(e,-targetSzX/2,targetSzX/2,0,unionBufferW)),$=floor(map(t,-targetSzY/2,targetSzY/2,0,unionBufferH));return _>=0&&_<unionBufferW&&$>=0&&$<unionBufferH?{i:_,j:$}:null}function lerpAngle(e,t,_){let $=t-e;return $>PI?$-=TAU:$<-PI&&($+=TAU),$*_}function doubleExponentialSigmoid(e,t){t=1-(t=min(.99999,max(1e-5,t)));let _=0;return e<=.5?pow(2*e,1/t)/2:1-pow(2*(1-e),1/t)/2}function drawStroke(e,t,_){let $=[],i=!1;for(let n=0;n<e.points.length;n++)!0==e.lineSegVis[n]?i?$[$.length-1].push(e.points[n]):($.push([e.points[n]]),i=!0):(i&&$[$.length-1].push(e.points[n]),i=!1);if(e.closed&&e.lineSegVis[e.lineSegVis.length-1]&&$[$.length-1].push(e.points[0]),$.length>0)for(let a of $){let r=1,s=[],l=[];for(let o=0;o<a.length-1;o++){r=map(abs(a.length/2-o),0,a.length-1,1,1)*t*.6;let h=_rotate(_scalarMult(_normalize(_sub(a[o+1],a[o])),r),0,0,PI/2);s.push(_add(a[o],h)),h=_rotate(_scalarMult(_normalize(_sub(a[o+1],a[o])),r),0,0,-PI/2),l.push(_add(a[o],h))}r=map(abs(a.length/2-a.length-1),0,a.length-1,1,1)*t*.6;let p=_rotate(_scalarMult(_normalize(_sub(a[0],a[a.length-1])),r),0,0,-PI/2);s.push(_add(a[a.length-1],p)),p=_rotate(_scalarMult(_normalize(_sub(a[0],a[a.length-1])),r),0,0,PI/2),l.push(_add(a[a.length-1],p)),_.noStroke(),_.beginShape();for(let f=0;f<s.length;f++)_.vertex(s[f].x,s[f].y);for(let u=l.length-1;u>=0;u--)_.vertex(l[u].x,l[u].y);_.endShape(CLOSE),s=null,l=null}$=null}function prepareCanvas(e){targetSzY=floor((targetSzX=e)*heightToWidth),print(targetSzX,targetSzY),windowHeight/windowWidth>heightToWidth?(canvSzX=windowWidth*mag,canvSzY=round(windowWidth*heightToWidth*mag)):(canvSzY=windowHeight*mag,canvSzX=round(windowHeight/heightToWidth*mag)),sizeAdjust=canvSzX/targetSzX,print(canvSzX,canvSzY),createCanvas(canvSzX,canvSzY)}function addHashes(){print("adding hashes");let e=round(targetSzY/2);for(let t=0;t<15;t++){for(let _=0;_<e;_++){let $=map(_,0,e-1,-targetSzY/2,targetSzY/2),i=_createV(-targetSzX/2,$),n=_createV(targetSzX/2,$),a=new _Line(i.x,i.y,n.x,n.y,2);a.zIndex=booleanShapes[0].zIndex+1e4,a.fill=bgColor,a.hashWeight=2,a.bg=!0,bgHashes.push(a)}for(let r=0;r<e;r++){let s=map(r,0,e-1,-targetSzX/2,targetSzX/2),l=_createV(s,-targetSzY/2),o=_createV(s,targetSzY/2),h=new _Line(l.x,l.y,o.x,o.y,2);h.zIndex=booleanShapes[0].zIndex+1e4,h.fill=bgColor,h.hashWeight=2,h.bg=!0,bgHashes.push(h)}}bgHashes.sort(function(e,t){return random(1)})}function occlude(){print("occluding");for(let e=booleanShapes.length-1;e>=0;e--)if(booleanShapes[e].checkOnScreen()&&!booleanShapes[e].hidden){if(booleanShapes[e].subtractBuffer(unionBuffer,!0),void 0!=booleanShapes[e].fill&&booleanShapes[e].closed){let t=[],_=max(booleanShapes[e].maxY-booleanShapes[e].minY,booleanShapes[e].maxX-booleanShapes[e].minX),$=ceil(_*(void 0==booleanShapes[e].nHashesMult?.9:booleanShapes[e].nHashesMult)),i=booleanShapes[e].points[floor(booleanShapes[e].points.length/2)],n=void 0==booleanShapes[e].hashAngle?atan2(booleanShapes[e].center.y-i.y,booleanShapes[e].center.x-i.x):booleanShapes[e].hashAngle;for(let a=0;a<$;a++){let r=_rotate(_createV(2*_/1.7,0),0,0,n),s=_rotate(r,0,0,PI/2),l=.5*map(a,0,$,-1,1),o=_add(_add(booleanShapes[e].center,r),_scalarMult(s,l)),h=_add(_sub(booleanShapes[e].center,r),_scalarMult(s,l)),p,f=(p=new _Line(o.x,o.y,h.x,h.y,2)).intersectShape(booleanShapes[e]);for(let u=0;u<f.length;u++)if(booleanShapes[e].occlude){let d=f[u].subtractBuffer(unionBuffer);for(let c=0;c<d.length;c++){let g=d[c];g.drawLastSegment=!0,g.fill=booleanShapes[e].fill,g.strokeWeight=void 0==booleanShapes[e].hashWeight?1.5:booleanShapes[e].hashWeight,g.hidden||t.push(g)}}else f[u].drawLastSegment=!0,f[u].fill=booleanShapes[e].fill,f[u].strokeWeight=void 0==booleanShapes[e].hashWeight?1.5:booleanShapes[e].hashWeight,f[u].hidden||t.push(f[u])}t.zIndex=booleanShapes[e].zIndex,t.scaleAmt=void 0==booleanShapes[e].scaleAmt?1:booleanShapes[e].scaleAmt,t.wobbleAmt=void 0==booleanShapes[e].wobbleAmt?0:booleanShapes[e].wobbleAmt,hashes.push(t)}booleanShapes[e].drawToBuffer(unionBuffer)}}function expSkewRandom(e,t,_){return map(pow(random(1),_),0,1,e,t)}function expSkewNorm(e,t,_,$){return pow(norm(e,t,_),$)}function expSkewMap(e,t,_,$,i,n){return map(expSkewNorm(e,t,_,n),0,1,$,i)}let firstFalse=0,firstTrue=0;class _Shape{constructor(e){this.points=[],this.lineSegVis=[],this.closed=e,this.perimeter=0,this.hidden=!1}setPoints(e){this.points=[];let t=null;for(let _=0;_<e.length;_++)this.points.push(_copyV(e[_])),null!=t&&(this.perimeter+=dist(t.x,t.y,e[_].x,e[_].y)),t=this.points[_];this.setSegVis(),this.calculateBoundingBox()}checkOnScreen(){return!(this.maxX<-targetSzX/2||this.minX>targetSzX/2||this.maxY<-targetSzY/2||this.minY>targetSzY/2)}setSegVis(){for(let e=0;e<this.points.length;e++)this.lineSegVis[e]=!0}calculateBoundingBox(){if(this.points.length>0){if(this.minX=this.points[0].x,this.minY=this.points[0].y,this.maxX=this.points[0].x,this.maxY=this.points[0].y,this.points.length>1)for(let e=1;e<this.points.length;e++)this.minX=min(this.minX,this.points[e].x),this.minY=min(this.minY,this.points[e].y),this.maxX=max(this.maxX,this.points[e].x),this.maxY=max(this.maxY,this.points[e].y);this.center=_createV((this.minX+this.maxX)/2,(this.minY+this.maxY)/2)}}intersectShape(e){let t=0,_;!(_=this.points[0].x>=e.minX&&this.points[0].x<=e.maxX&&this.points[0].y>=e.minY&&this.points[0].y<=e.maxY&&e.pointInside(this.points[0]))&&(this.lineSegVis[0]=!1,t++);for(let $=1;$<this.points.length;$+=1){let i;i=this.points[$].x>=e.minX&&this.points[$].x<=e.maxX&&this.points[$].y>=e.minY&&this.points[$].y<=e.maxY&&e.pointInside(this.points[$]),(!_||!i)&&(this.lineSegVis[$]=!1,t++),_=i}1>abs(t-this.points.length)&&(this.hidden=!0)}subtractBuffer(e){let t=0,_=getBufferPoint(this.points[0],e);this.closed?this.lineSegVis[0]=!_:this.lineSegVis[0]=!!this.drawLastSegment&&!_;for(let $=1;$<this.points.length;$++){let i=getBufferPoint(this.points[$],e);(_||i)&&(this.lineSegVis[$]=!1,t++),_=i}t==this.points.length&&(this.hidden=!0)}pointInside(e){if(!this.closed||!(e.x>this.minX)||!(e.x<this.maxX)||!(e.y>this.minY)||!(e.y<this.maxY))return!1;{let t=_createV(e.x-1e3*random(1,10),e.y-1e3*random(1,10)),_=0;for(let $=0;$<this.points.length;$+=1)linesIntersect(t,e,this.points[$],this.points[($+1)%this.points.length])&&_++;return _%2==1}}draw(){let e=!1;push(),beginShape();for(let t=0;t<this.points.length;t++)!0==this.lineSegVis[t]||(e=!0,endShape(),beginShape()),vertex(this.points[t].x,this.points[t].y);this.closed?e?(this.lineSegVis[this.lineSegVis.length-1]&&vertex(this.points[0].x,this.points[0].y),endShape()):endShape(CLOSE):(noFill(),endShape()),pop()}drawToBuffer(e){for(let t=this.minX;t<=this.maxX;t++)for(let _=this.minY;_<=this.maxY;_++)if(this.pointInside(_createV(t,_))){let $=_xyToij(t,_);null!=$&&setBufferIJ($.i,$.j,!0,e)}}}class _Line extends _Shape{constructor(e,t,_,$,i){super(!1),this._x1=e,this._y1=t,this._x2=_,this._y2=$,this.x1=this._x1,this.y1=this._y1,this.x2=this._x2,this.y2=this._y2,this.axis=_normalize(_createV(this._x2-this._x1,this._y2-this._y1)),this.nPoints=i;for(let n=0;n<this.nPoints;n++){let a=map(n,0,this.nPoints-1,0,1);this.points.push(_createV(lerp(this.x1,this.x2,a),lerp(this.y1,this.y2,a))),this.lineSegVis.push(!0)}i<=1&&print("not enought points",i),this.setSegVis(),this.calculateBoundingBox()}wobbleAndScale(e,t){let _=_scalarMult(this.axis,t),$=_scalarMult(_rotate(this.axis,0,0,PI/2),random(-1,1)*e);this.x1=this._x1+$.x-_.x,this.y1=this._y1+$.y-_.y,$=_scalarMult(_rotate(this.axis,0,0,-PI/2),random(-1,1)*e),this.x2=this._x2+$.x+_.x,this.y2=this._y2+$.y+_.y,this.updatePoints()}updatePoints(){for(let e=0;e<this.nPoints;e++){let t=map(e,0,this.nPoints-1,0,1);this.points[e].x=lerp(this.x1,this.x2,t),this.points[e].y=lerp(this.y1,this.y2,t)}}subtractBuffer(e,t){if(t)super.subtractBuffer(e);else{let _=max(60,round(.1*dist(this._x1,this._y1,this._x2,this._y2))),$=null,i=null,n=null,a=null,r=[];for(let s=0;s<_;s++){let l=map(s,0,_-1,0,1),o=_lerp(_createV(this._x1,this._y1),_createV(this._x2,this._y2),l);if(i=$,$=getBufferPoint(o,e),null==n)$||(n=o);else if(i)$||($?print("check is null 1"):n=o);else if(i)print("_check is null");else if($){if(a){let h=new _Line(n.x,n.y,a.x,a.y,2);h.stroke=this.stroke,h.fill=this.fill,h.strokeWeight=this.strokeWeight,h.scaleAmt=this.scaleAmt,h.wobbleAmt=this.wobbleAmt,r.push(h)}n=null,a=null}else $?print("check is null 2"):a=o}if(n&&a){let p=new _Line(n.x,n.y,a.x,a.y,2);p.stroke=this.stroke,p.fill=this.fill,p.strokeWeight=this.strokeWeight,p.scaleAmt=this.scaleAmt,p.wobbleAmt=this.wobbleAmt,r.push(p)}return r}}intersectShape(e){let t=this.points[0],_=this.points[this.points.length-1],$=[];for(let i=0;i<e.points.length;i++){let n=e.points[i],a=e.points[(i+1)%e.points.length],r=intersectPoint(t,_,n,a);r&&(r.outside=_dot(_createV(t,_),_createV(n,a))>0,$.push(r))}if($.length%2!=0)return[];{let s=[];for(let l=0;l<$.length;l+=2){let o=$[l],h=$[l+1],p=new _Line(o.x,o.y,h.x,h.y,2);p.stroke=this.stroke,p.fill=this.fill,p.strokeWeight=this.strokeWeight,p.scaleAmt=this.scaleAmt,p.wobbleAmt=this.wobbleAmt,s.push(p)}return s}}}class _FlowLine extends _Shape{constructor(e,t,_,$,i){super(!1);let n=_createV(e,t),a=_createV(_,0);this.points.push(_copyV(n));let r=.01,s=7,l=random([-1,1]);for(let o=0;o<$;o++){let h=round(map(noise(n.x*r,n.y*r,i),0,1,-s,s))/s*PI/2;a=_rotate(_createV(l*_,0),0,0,h),n=_add(n,a),this.points.push(_copyV(n)),this.lineSegVis.push(!0)}}}class _Rect extends _Shape{constructor(e,t,_,$,i,n){super(!0),this.x=e,this.y=t,this.w=_,this.h=$,this.nPoints=i,this.w>this.h?(this.wPoints=this.nPoints,this.hPoints=this.h/this.w*this.nPoints):(this.wPoints=this.w/this.h*this.nPoints,this.hPoints=this.nPoints);for(let a=0;a<this.wPoints;a++){let r=_rotate(_createV(map(a,0,this.wPoints,0,this.w),0),0,0,n);r.x+=this.x,r.y+=this.y,this.points.push(r),this.lineSegVis.push(!0)}for(let s=0;s<this.hPoints;s++){let l=_rotate(_createV(this.w,map(s,0,this.hPoints,0,this.h)),0,0,n);l.x+=this.x,l.y+=this.y,this.points.push(l),this.lineSegVis.push(!0)}for(let o=0;o<this.wPoints;o++){let h=_rotate(_createV(map(o,0,this.wPoints,this.w,0),this.h),0,0,n);h.x+=this.x,h.y+=this.y,this.points.push(h),this.lineSegVis.push(!0)}for(let p=0;p<this.hPoints;p++){
↓ show full (24,000 bytes)