memoscan
← all memos

Memo 0xbad0efe0…7319d7 on Ethereum

///3 function execProgAddBlbs(){if(StSh.bProgAddLpsWhls){let e=StSh.addStrcFrmCyc,t=StSh.addStrcFrmDur;if(myFrmCnt>0&&myFrmCnt<t&&myFrmCnt%e==0){let e=0;for(let t=0;t<mySs.length;t++)mySs[t].type==StSh.progAddType&&e++;if(e<StSh.maxNProgressivelyAddedBlobs){resetRnd(CHASH);let e=31*mySs.length+myFrmCnt;for(let t=0;t<e;t++){myR01()}let t=-1;if(myR01()<StSh.blbIntExtRatio&&mySs.length>1){let e=[];for(let t=0;t<mySs.length;t++)mySs[t].type==StSh.progAddType&&e.push([t,0]);for(let t=0;t<e.length;t++){let S=int(100*pow((e.length-t)/e.length,1.5));e[t][1]=S}if(e.length>0){let S=0,l=getWop(e);for(;S<10&&mySs[l].STID>=10;)l=getWop(e),S++;t=l}}let S=getDT(F,t),l=S.dtx,r=S.dty;if(l>0&&r>0){let e=S.occupancy,o=S.minDist/REST_L;if(-1==S.minDist||o>StSh.minDistInRestLengths){let S=T;if(StSh.progAddType==ST4&&(-1==t?e<StSh.minOccupancyForProgressivelyAddedBlobs&&(S=F):mySs[t].STID>=10&&(S=F)),S){let e=StSh.blbTgtLenPoke;StSh.progAddType==ST4&&(e*=StSh.whlTgtLenPoke,-1!=t&&(e*=StSh.intWhlTgtLenPoke));let S=int(o*PI2*e),d=0;if(StSh.progAddType==ST1){let e=StSh.progressivelyAddedBlobStylePair;d=myR01()<.5?e[0]:e[1],4==d&&S>16&&(d=e[0])}else if(StSh.progAddType==ST4){let e=StSh.progressivelyAddedBlobStylePair;if(StSh.whlStyPrMode==WHEEL_MODE_MONOCULTURE)if(-1==t)d=e[0];else{if(-1==mySs[t].getEnclosingStructureId())d=e[1];else{let S=mySs[t].STID;e=getWSP(S),d=e[1]}}else if(StSh.whlStyPrMode==WHEEL_MODE_HALFMONOCULTURE)if(-1==t)d=e[0];else{let S=mySs[t].STID;e=getWSP(S),d=e[1]}else if(StSh.whlStyPrMode==WHEEL_MODE_PARTY)if(-1==t)e=getWop(wheelStylePairs),d=e[0];else{let S=mySs[t].STID;e=getWSP(S),d=e[1]}}let i={style:d,initSz:5,tgtSz:S};if(addStrc(StSh.progAddType,l,r,i),mySs[mySs.length-1].setEnclosingStructureId(t),StSh.progAddType==ST4||StSh.progAddType==ST1){let e=StSh.proportionOfParticlesToAddToBlobs;if(myR01()<.6){let t=int(PI*o*o*e);addDeferPs(mySs.length-1,t,myFrmCnt+13)}if(myR01()<.5){if(S/PI2>4){let e=int(S/5);addDeferDecos([mySs.length-1],myFrmCnt+21,e,-1)}}}}}}}}}} function putSiteLs(){if(SHMA>=200&&SHMA<=300&&207!=SHMA){let t=0;for(let e=0;e<mySs.length;e++)mySs[e].type==ST12&&t++;for(let e=0;e<niceSiteIds.length;e++)if(t<MAX_N_LETTERS&&myR01()<StSh.probabilityOfLetterOnSite){let i=niceSiteIds[e],r=sitePs[i].p,n=getDT(F,-1),S=n.dtx,l=n.dty;if(S>0&&l>0){if(getDTAtLoc(r.x,r.y)>0){let e={letter:nxtL,labelsStructureID:-1};addStrc(ST12,r.x,r.y,e).siteAttachId=i,nxtL=String.fromCharCode(nxtL.charCodeAt()+1),t++}}}}} function putCellLs(){let t=0;for(let e=0;e<mySs.length;e++)mySs[e].type==ST12&&t++;let e=1;t<3&&(e=2);for(let t=0;t<e;t++){let t=getDT(F,-1);if(t.occupancy>.27){let e=t.dtx,l=t.dty;if(e>0&&l>0){let t={letter:nxtL,labelsStructureID:-1};addStrc(ST12,e,l,t),nxtL=String.fromCharCode(nxtL.charCodeAt()+1)}}}} function putCellPs(){if(109!=SHMA&&209!=SHMA&&StSh.bDrawPs){let t=0;for(let e=0;e<myPs.length;e++)myPs[e].isFree&&t++;if(t<10){let t=getDT(F,-1);if(t.occupancy>.45){let e=t.dtx,i=t.dty;if(e>0&&i>0){let l=int(map(t.occupancy,.45,.75,0,100,T));for(let t=0;t<l;t++)addParticleAt(e+myR01(),i+myR01())}}}}} function putStrcLs(){let t=0;for(let e=0;e<mySs.length;e++)mySs[e].type==ST12&&t++;for(let e=0;e<mySs.length;e++)if((mySs[e].type==ST1&&mySs[e].groSzLm>14||mySs[e].type==ST4&&mySs[e].groSzLm>20||mySs[e].type==ST7&&mySs[e].groSzLm>12)&&t<MAX_N_LETTERS){let S=map(mySs[e].groSzLm,25,200,0,1-StSh.probabilityOfLetterOnStructure,T),y=StSh.probabilityOfLetterOnStructure+S;if(myR01()<y){let S=mySs[e].getCentroid(),y=F;for(let t=0;t<mySs.length;t++)if(mySs[t].type==ST12){let e=mySs[t].pIs[0],r=myPs[e].p;dist(r.x,r.y,S.x,S.y)/REST_L<4&&(y=T)}if(!y){let y=0;for(let t=0;t<mySs.length;t++)if(t!=e){let e=mySs[t].getCentroid();dist(e.x,e.y,S.x,S.y)/REST_L<.5&&y++}if(y<2){if(1==y){let t=R20K[e]*PI2;S.x+=REST_L*cos(t),S.y+=REST_L*sin(t)}let r=F;for(let t=0;t<mySs.length;t++){let e=F;if(mySs[t].type==ST4){12==mySs[t].STID&&(e=T)}else if(mySs[t].type==ST1){let S=mySs[t].STID;1!=S&&3!=S&&4!=S||(e=T)}e&&mySs[t].pointInside(S.x,S.y)&&(r=T)}let i={letter:nxtL,labelsStructureID:e,bInverse:r};addStrc(ST12,S.x,S.y,i).purgeInteriorParticles(),nxtL=String.fromCharCode(nxtL.charCodeAt()+1),t++}}}}} function addDvdr(t,e){let s=F;if(StSh.bUseAmoCnt&&1==StSh.amoNoiCat&&StSh.amoAR<1.2){let n=mySs[t].pIs;if(n.length>=nMaskPoints){let t=getWop([[2,15],[3,30],[4,35],[5,20]]);e&&(t=e);let o=n.length-1*~~(nMaskPoints/4),i=n.length-3*~~(nMaskPoints/4),S=myPs[n[o]],r=myPs[n[i]],l=S.p.x-r.p.x,p=S.p.y-r.p.y,g=~~(.7*sqrt(l*l+p*p)/REST_L);StSh.bHpo&&(g=~~(.65*sqrt(l*l+p*p)/REST_L));let a={style:getWop([[0,50],[3,30],[5,20]]),initSz:g,tgtSz:g,initAng:1.5*PI};for(let e=0;e<t;e++){let S=e-int(t/2),r=BDM/2+S*REST_L,l=BDM/2;s=T,addStrc(ST3,r,l,a);let p,g,h,m,y,P,d=mySs.length-1,f=mySs[d].pIs;y=[0,1,1,0],m=[0,-1,0,-1];for(let t=0;t<4;t++)h=f[y[t]],p=o+S+m[t],g=n[p],P=new Spring(myPs),P.setParticleIndicesAndRestLength(h,g,REST_L,SPR_K),mySs[d].springs.push(P);y=[-2,-1,-2,-1],m=[-1,0,0,-1];for(let t=0;t<4;t++)h=f[f.length+y[t]],p=i-S+m[t],g=n[p],P=new Spring(myPs),P.setParticleIndicesAndRestLength(h,g,REST_L,SPR_K),mySs[d].springs.push(P)}}}return s} function getWSP(e){let t=[0,0];if(e<10){let l=0,i=getWop(wheelStylePairs);for(;i[0]!=e&&l<1e3;)i=getWop(wheelStylePairs),l++;t=i}return t} function doesStrcTE(t){let e=F;for(let r=0;r<mySs.length;r++)mySs[r].type==t&&(e=T);return e} function addStrcOfTp(t,e){if(e>0){if(!doesStrcTE(t))for(let d=0;d<e;d++){let e=getDT(F,-1),d=e.dtx,f=e.dty;d>0&&f>0&&addStrc(t,d,f)}}} function addDeferDecos(e,S,t,r){let T=getWop([[0,10],[2,10],[3,40],[4,10],[5,20],[8,10]]),a=108==SHMA||208==SHMA?getWop([[0,5],[1,8],[2,25],[3,25],[4,20],[5,10],[6,7]]):getWop([[1,25],[2,10],[3,30],[4,28],[5,7]]);a=4;let i=getWop([[0,5],[1,50],[2,10],[3,30],[4,1],[5,2],[6,2]]),d=getWop([[0,5],[1,20],[2,10],[3,35],[5,25],[6,5]]),l=getWop([[0,15],[1,20],[2,25],[3,25],[5,15]]),s=getWop([[3,15],[4,40],[5,25],[6,5],[7,15]]),g=-1;-1!=r?g=r:StSh.progAddType==ST4?g=getWop([[-1,0],[ST5,10],[ST3,30],[ST9,30],[ST0,25],[ST8,5]]):(StSh.progAddType=ST1)&&(g=getWop([[-1,0],[ST5,30],[ST3,20],[ST9,0],[ST0,30],[ST8,20]]));for(let r=0;r<e.length;r++){let a=e[r],o=1e5;if(a>-1&&mySs[a]&&(o=mySs[a].groSzLm),-1==g)addDeferPs(a,100,20);else for(let e=0;e<t;e++)switch(g){case ST2:addDeferStr(a,ST2,1,S+3*e+r,null);break;case ST1:addDeferStr(a,ST1,1,S+13+5*e+r,null);break;case ST8:let t=s+myRI(-1,1);o<40&&(t=min(t,5)),addDeferStr(a,ST8,1,S+26+4*e+r,{style:l,initSz:t,tgtSz:t});break;case ST5:let g=getWop([[0,75],[1,20],[2,5]]);o<40&&(g=min(g,1)),addDeferStr(a,ST5,1,S+17+9*e+r,{style:i,initSz:0,tgtSz:g});break;case ST6:addDeferStr(a,ST6,1,S+15+11*e+r,null);break;case ST3:let n=getWop([[2,70],[3,24],[4,5],[5,1]]);o<40&&(n=min(n,4)),addDeferStr(a,ST3,1,S+23+4*e+r,{style:d,initSz:1,tgtSz:n});break;case ST9:addDeferStr(a,ST9,1,S+19+13*e+r,{style:T});break;case ST0:let p=myRI(5,9);208==SHMA&&R20K[5]<.05&&(p=myRI(9,14)),o<40&&(p=min(p,7)),addDeferStr(a,ST0,1,S+16+7*e+r,{style:4,initSz:1,tgtSz:p}),StSh.lineStrcGreedy=F}}} function addStrcTops(){let e=0,t=getMbrIntCont();if(t&&t.length>0){let t=StSh.nToppings,r=450/t,S=[];for(let e=0;e<t;e++){let t=StSh.toppings[e],n=10;switch(t){case ST0:StSh.lineStrcGreedy=F,StSh.linSty<=2&&(r*=2),n=StSh.lineLenTgt;break;case ST1:n=StSh.loopSzTgt;break;case ST2:n=3;break;case ST3:n=2+2*StSh.trsMinLen;break;case ST5:n=1+6*(1+StSh.starSzTgt);break;case ST6:n=StSh.treeGrowthSizeLimit;break;case ST8:n=2*StSh.centiStructureLength;break;case ST9:n=4+StSh.nSpokesPerBall}let a={type:t,nToGenerate:int(r/n)};S.push(a)}S.sort(((e,t)=>e.nToGenerate-t.nToGenerate));for(let t=0;t<S.length;t++){let r=S[t].nToGenerate,n=S[t].type;for(let t=0;t<r;t++){let t=getDT(F,-1),r=t.dtx,S=t.dty;if(!(t.occupancy>StSh.schemaOccupancyThreshold))break;addStrc(n,r,S),e++}}}return e} function addDeferStr(e,r,t,d,h){let n={id:e,type:r,when:d,how:h,howMany:t};deferredStructures.push(n)} function addDeferPs(e,r,t){let d={id:e,size:r,when:t};deferredParticleTargetStructures.push(d)} function execDeferredSs(){if(!bBlankCell){30==myFrmCnt&&putSiteLs(),300==myFrmCnt&&(putStrcLs(),putCellLs()),600==myFrmCnt&&putCellPs();for(let e=0;e<deferredStructures.length;e++){let t=deferredStructures[e].when;if(myFrmCnt==t){let t=deferredStructures[e].id;if(t>=-1&&t<mySs.length&&!mySs[t].getFull()){let r=getDT(F,t),l=r.minDist/REST_L;if(l>StSh.defdStrcMinDstThr){let l=r.dtx,u=r.dty;if(l>0&&u>0){let r=deferredStructures[e].type,d=deferredStructures[e].how,n=deferredStructures[e].howMany;for(let e=0;e<n;e++){let e=l+.5*myRAB(-1,1),n=u+.5*myRAB(-1,1);addStrc(r,e,n,d),mySs[mySs.length-1].setEnclosingStructureId(t)}if(null!=d&&null!=d.bAddDeferredParticleGroup){let e=50;null!=d.howManyDeferredParticles&&(e=d.howManyDeferredParticles);let t=myFrmCnt+100;null!=d.delayToAddParticles&&(t=myFrmCnt+d.delayToAddParticles),addDeferPs(mySs.length-1,e,t)}}}else l<.5&&mySs[t].setFull(T)}}}}} function execDeferredPs(){for(let e=0;e<deferredParticleTargetStructures.length;e++){let t=deferredParticleTargetStructures[e].when;if(myFrmCnt==t){let t=deferredParticleTargetStructures[e].id;if(t>=0&&t<mySs.length){let r=getDT(F,t),d=r.dtx,l=r.dty,a=deferredParticleTargetStructures[e].size;for(let e=0;e<a;e++)addParticleAt(d,l)}}}} function addBigWhls(e,l){let t=F;e>1&&e<=4&&(t=T);let s=[],i=[];for(let S=0;S<e;S++){let o=getDT(F,-1),n=o.dtx,y=o.dty,d=l;if(!d){d=(e-S)*int(360/e)}let r=getWop([[0,5],[16,8],[2,15],[3,13],[4,10],[6,5],[7,13],[8,19],[10,1],[11,10],[15,1]]);if(0==S)s[0]=r;else if(t){let e=0;for(;s.includes(r)&&e<100;)r=getWop([[0,5],[16,5],[2,15],[3,15],[4,10],[6,5],[7,15],[8,18],[11,10],[12,2]]),e++;s[S]=r}16==r&&d%4!=0&&(d+=4-d%4),addStrc(ST4,n,y,{style:r,initSz:8,tgtSz:d});let g=mySs.length-1;i.push(g),g=mySs.length-1,1!=e&&12!=mySs[g].STID||(mySs[g].bShowEnclBl=T)}let S=F;for(let e=0;e<i.length;e++){let l=i[e];(mySs[l].bShowEnclBl||mySs[l].bShoVorCls)&&(S=T)}if(!S){let e=myRI(0,i.length-1);mySs[e].bShowEnclBl=T}} function progAddSs(){millis()-initFreezeT<1e3*nSecsToFreeze||(execDeferredPs(),execDeferredSs(),execProgAddBlbs())} function initFreePs(){updateSimulation(),updateParticles();for(let e=0;e<80;e++)advanceFreeParticles();clearForces()} function togPause(){let e=millis();e-initFreezeT<1e3*nSecsToFreeze?(TMP=1,initFreezeT=-1e5,bTemperatureCooling=F):(initFreezeT=e,bTemperatureCooling=T)} function keyPressed(){ if(keyCode==UP_ARROW){bZoom=T;}else if(keyCode==DOWN_ARROW){bZoom=F;}else if(keyCode==RETURN){nRetries=0;myABFeatures=undefined;getUnofficialNewCell(F);} if((key>='0')&&(key<='9')){let whichType=~~(key);addSAtM(whichType);} switch (key){ case' ':togPause();break; case'h':case'H':case'?':togDbug();break; case'i':case'I':printSysInfo();break; case'o':case'O':getUnofficialNewCell(T);break; case'R':makeCell(PHASH);break; case'r':reset();break; case'z':case'Z':renderMode=(renderMode+1)%2;break; case'x':case'X':StSh.bImplementBorders=!(StSh.bImplementBorders);StSh.bEnableRingsOrHairs=!(StSh.bEnableRingsOrHairs);break; case'c':case'C':StSh.bDrawPs=!(StSh.bDrawPs);break; case'v':case'V':StSh.bDrawVs=!(StSh.bDrawVs);break; case'b':case'B':StSh.bDrawBs=!(StSh.bDrawBs);break; case'l':case'L':StSh.bUseVSh=!(StSh.bUseVSh);break; case'g':case'G':if(mySs.length>0){let lastStructure=mySs.length-1;mySs[lastStructure].growStructureOnRequest();}break; case'S':makeSVG();break; case'P':bSaveScreencapture=T;bShoDbg=F;let cDim=int(round(EXPSZ/pixelDensity())); myDesignCanvas=createCanvas(cDim,cDim);ogI=CG(cDim,cDim);myStyPolyl.offBuf.resizeCanvas(cDim,cDim);break; case '.':addPsAtMouseLoc();break;}} //====== function togDbug(){bShoDbg=!bShoDbg,bShoDbg&&(debugAskTime=millis())} function addSAtM(t,e){let d=getMbrIntCont();if(d&&d.length>0){let r=d.length,u=((mouseX/width-.5)/zScale+.5)*BDM,o=((mouseY/height-.5)/zScale+.5)*BDM;if(pointInsideVerts(u,o,d,r))addStrc(t,u,o,e);else{let d=getDT(F,-1),r=d.dtx,u=d.dty;u>0&&r>0&&addStrc(t,r,u,e)}}} function addStrc(u,e,n,t=null){if([ST14,ST15,ST16,ST17].includes(u))return addNewCompoundStructure(u,e,n,t),null;{let r=mySs.length,l=new Structure(u,e,n,r,t);return l&&(mySs.push(l),l.bFlocking&&myFlocks[u].push(l.id)),l}} function addNewCompoundStructure(t,e,s,S=null){switch(t){case ST17:S||(S={starStyle:StSh.S17S,trussStyle:StSh.S17T,initSz:myRI(0,StSh.S17SL),nSpokes:StSh.S17nS});let t={style:S.starStyle,initSz:1+S.initSz,tgtSz:0,nSpokes:S.nSpokes};addStrc(ST5,e,s,t);let y=mySs.length-1,r=S.nSpokes,l=r>2&&r%2==0?3:1;for(let t=0;t<r;t+=l){let e=1+(1+S.initSz)*r+t,s=mySs[y].pIs[e],l=myPs[s].p.x,m=myPs[s].p.y,n={style:S.trussStyle,initSz:1,tgtSz:1};addStrc(ST3,l,m,n);let i=mySs.length-1,a=mySs[i].pIs[0];mySs[y].pIs[e]=a;let p=mySs[y].springs.length-r+t;mySs[y].springs[p].setIQ(a),myPs[s].setIsPartOfStructure(-1)}break;case ST16:if(!S){let t=StSh.S16N+myRI(0,1);S={style:StSh.S16St,initSz:t,tgtSz:1,initAng:.01}}addStrc(ST3,e,s+0*REST_L,S);let m=mySs.length-1;addStrc(ST3,e,s+1*REST_L,S);let n=mySs.length-1;for(let t=0;t<S.initSz;t++){let e=mySs[n].pIs[2*t],s=mySs[m].pIs[2*t+1];if(mySs[n].pIs[2*t]=s,mySs[n].springs[5*t+0].setIP(s),t<S.initSz-1){let e=mySs[m].pIs[2*(t+1)+1];mySs[n].springs[5*t+3].setIP(s),mySs[n].springs[5*t+4].setIP(e),t>0?(mySs[n].springs[5*t+1].setIP(s-1),mySs[n].springs[5*t+1].setIQ(mySs[n].pIs[2*t+1])):(mySs[n].springs[5*t+1].setIP(0),mySs[n].springs[5*t+1].setIQ(1))}myPs[e].setIsPartOfStructure(-1)}break;case ST15:let i=5,a=T;if(S)i=S.nSegments,a=S.bBallHead;else{i=StSh.S15NS+myRI(0,1),a=StSh.S15B,S={style:StSh.S15St,nSegments:i,initSz:1,tgtSz:1,initAng:.25*PI,bBallHead:a}}let p=e,g=s,I=0,u=0;if(a){let t=(StSh.ballStructureStyle+3)%6;addStrc(ST9,p,g,{style:t}),u=mySs.length-1,I=mySs[u].pIs[1]}else{addStrc(ST3,p,g,S),u=mySs.length-1;let t=mySs[u].pIs.length;I=mySs[u].pIs[t-1]}for(let t=1;t<i;t++){p+=REST_L*sqrt(2),addStrc(ST3,p,g,S);let t=mySs.length-1,e=mySs[t].pIs[0];mySs[t].springs[0].setIP(I),mySs[t].springs[1].setIP(I),mySs[t].springs[3].setIP(I),mySs[t].pIs[0]=I,myPs[e].setIsPartOfStructure(-1),u=t;let s=mySs[u].pIs.length;I=mySs[u].pIs[s-1]}break;case ST14:let d=getWop([[6,55],[2,40],[5,5]]),h=5==d?getWop([[2,75],[4,25]]):myRI(4,5),P=getWop([[0,80],[1,20]]);S&&(d=S.antennaStyle,h=S.nAntennae,P=S.targLenSet),addStrc(ST9,e,s);let c=mySs.length-1,o=mySs[c].pIs[0],w=mySs[c].pIs[1],z=myPs[o].p.x,f=myPs[o].p.y,N=myPs[w].p.x,b=myPs[w].p.y,k=atan2(b-f,N-z);for(let t=0;t<h;t++){let t=0==P?myRI(4,5):3;addStrc(ST0,N,b,{style:d,initSz:2,tgtSz:t,initAng:k});let e=mySs.length-1;mySs[e].bGreedy=F;let s=mySs[e].pIs[0];mySs[e].springs[0].setIP(w),mySs[e].pIs[0]=w,myPs[s].setIsPartOfStructure(-1)}}} function addParticleAt(t,a){let e=t+.1*myRAB(-1,1),c=a+.1*myRAB(-1,1),i=new Particle;i.set(e,c),myPs.push(i),nInteriorPoints++,copyParticlesToD3Data(1),copyParticlesToD3Data(2)} function addPsAtMouseLoc(){if(myPs.length<MaxNPs-50){let t=getMbrIntCont();if(t&&t.length>0){let e=t.length,i=((mouseX/width-.5)/zScale+.5)*BDM,l=((mouseY/height-.5)/zScale+.5)*BDM;if(!pointInsideVerts(i,l,t,e)){let t=getDT(F,-1),e=t.dtx,o=t.dty;o>0&&e>0&&(i=e,l=o)}for(let t=0;t<50;t++)addParticleAt(i,l)}}} function draw(){ updateZoom();updateDbug(); ogI.clear(); ogI.background(255,255,255); ogI.blendMode(BLEND); myStyPolyl.beginDraw(); drawDesign(ogI); ogI.blendMode(MULTIPLY); ogI.image(myStyPolyl.offBuf,0,0,width,height); ogI.blendMode(BLEND); drawMouseInfluenceCircle(); if(renderMode==RENDER_MODE_CANVAS){ blendMode(BLEND);image(ogI,0,0); }else if(renderMode==RENDER_MODE_PAPER){ blendMode(BLEND);imageMode(CENTER);image(ogS,width/2,height/2,width*zScale,width*zScale); blendMode(MULTIPLY);imageMode(CORNER);image(ogI,0,0); } doScrCap();} function doScrCap(){if(bSaveScreencapture){let e="cytographia_"+CHASH+"_"+myFrmCnt;print("Rendering "+EXPSZ+"x"+EXPSZ+"px image...");let n=millis();saveCanvas(myDesignCanvas,e,"png"),myDesignCanvas=createCanvas(SHW,SHH),ogI.resizeCanvas(SHW,SHH),myStyPolyl.offBuf.resizeCanvas(SHW,SHH),bSaveScreencapture=F,windowResized();let a=(millis()-n)/1e3,i="Rendered output file in "+nf(a,1,3)+"s. :\n";i+=e+".png",print(i)}} function makePapBg(){compIllus(),ogS.image(ogC,0,0,SHW,SHH),ogS.loadPixels();let e=ogS.pixels.length,l=0,o=0,p=0,r=0,a=0,i=0,g=0,m=0;for(let t=0;t<e;t+=4){let e=ogS.pixels[t],P=ogS.pixels[t+1],S=ogS.pixels[t+2];o+=e,p+=P,r+=S;let s=e+P+S;s>m&&(a=e,i=P,g=S,m=s),l++}o/=l,p/=l,r/=l,meanPaperColor=color(o,p,r),avgPapCol=color((3*o+a)/4,(3*p+i)/4,(3*r+g)/4)} function compIllus(){ogC.shader(shComp),shComp.setUniform("texPap",ogP),shComp.setUniform("texRevTxt",ogB),shComp.setUniform("uIllLit",StSh.uIllLit),shComp.setUniform("uIllG",StSh.uIllG),shComp.setUniform("uBiasC",StSh.uBiasC),shComp.setUniform("uBiasL",StSh.uBiasL),shComp.setUniform("uReverseTextAmount",StSh.uReverseTextAmount),shComp.setUniform("uZoomScale",zScale),ogC.rect(0,0,SHW,SHH)} function updateZoom(){let e=bZoom?2.1:1;zScale=.95*zScale+.05*e,abs(zScale-e)<5e-4&&(zScale=e)} function updateDbug(){if(bShoDbg){millis()-debugAskTime>3e4&&togDbug()}} //====== function drawDesign(graphicsTargetP5){ GFXP5=graphicsTargetP5; if(GFXP5){updateSimulation();updateParticles();manageCursor(); switch (renderMode){ case RENDER_MODE_CANVAS:designBgCol=avgPapCol;break; case RENDER_MODE_PAPER:designBgCol='white';break; } GFXP5C=GFXP5.canvas.getContext("2d"); GFXP5C.lineCap="round"; GFXP5C.lineJoin="round"; GFXP5.background(designBgCol); GFXP5.push(); GFXP5.scale(width/BDM); GFXP5.translate(BDM/2,BDM/2); GFXP5.scale(zScale,zScale); GFXP5.translate(0-BDM/2,0-BDM/2); drawParticles(); progAddSs(); renderStructures(); determineWhichBlobsToDraw(); renderEncircledSiteBlobs(); renderSelectVoronoiCells(); renderLetters(); drawDebugInformation(); drawStamp(GFXP5); GFXP5.pop(); }} function getContoursForHatchedShapes(){let e=[],t=CG(width,height,P2D);t.pixelDensity(1);let l=t.height,s=t.width,i=t.width/2,o=t.height/2,r=StSh.HATCH_ANGLE;t.background(0,0,0),t.noStroke(),t.push(),t.translate(i,o),t.rotate(r),t.translate(-i,-o);let h=mySs.length;for(let e=0;e<h;e++){let l=mySs[e],s=l.getContours();for(let e=0;e<s.length;e++){let i=s[e];if(i.bClosed){let e=i.fillStyle;if(e!=FIL_NO){switch(e){case FIL_BK:t.fill(255);break;case FIL_WH:t.fill(0)}let s=i.verts,o=s.length;if(o>0){let e=1/3,i=l.getVxP(s,0,0,e);if(i){t.beginShape(),t.vertex(i.x,i.y);for(let i=0;i<o;i++){let o=l.getVxP(s,i,1,e),r=l.getVxP(s,i+1,-1,e),h=l.getVxP(s,i+1,0,e);t.bezierVertex(o.x,o.y,r.x,r.y,h.x,h.y)}t.endShape(CLOSE)}}}}}}if(StSh.bDrawBs){let e=d3Voronoi.cellPolygons(),l=e.next(),s=0;for(t.stroke(0),t.strokeWeight(1),StSh.bDoFillSiteBlobs&&t.fill(255-StSh.siteBlbFCol);!l.done;){if(myPs[s].bDrawSiteBlob&&!myPs[s].bNoShoAsBlb){if(!!(-1==myPs[s].isOfStrc)){let e=l.value,i=e.length-1,o=myPs[s].c.x,r=myPs[s].c.y;drawSiteBlob(t,T,e,i,o,r)}}l=e.next(),s++}}t.pop();let n=[];t.loadPixels();let S,f,y=int(StSh.HATCH_DENSITY);for(let e=0;e<l;e+=y){let l=e*s,i=F,o=0;for(let r=0;r<s;r++){let h=4*(l+r),S=t.pixels[h];r==s-1?i&&(n.push(CV(r,e)),i=F):S>=128&&o<128?(n.push(CV(r+0,e)),i=T):S<128&&o>=128&&i&&(n.push(CV(r-0,e)),i=F),o=S}}for(let e=0;e<n.length;e+=2){let t=n[e],l=n[e+1],s=t.x-i,h=t.y-o,S=s*cos(-r)-h*sin(-r)+i,f=h*cos(-r)+s*sin(-r)+o,y=l.x-i,a=l.y-o,g=y*cos(-r)-a*sin(-r)+i,x=a*cos(-r)+y*sin(-r)+o;n[e].set(S,f),n[e+1].set(g,x)}for(let t=0;t<n.length;t+=2){let l=n[t],s=n[t+1];f=[],f.push(CV(l.x,l.y)),f.push(CV(s.x,s.y)),S=new StyPl(f,F,F,F,F,STR_BK,FIL_NO,W0,0,0),e.push(S)}if(F&&e.length>0)for(let t=0;t<e.length;t++){let l=e[t].verts,s=F,i=STR_BK,o=FIL_NO,r=W0;mySs[0].drawVsPolyl(l,s,i,o,r)}return S=null,f=null,t=null,n=[],e} function updateSimulation(){if(updateClockAndTemp(),TMP>0){fadeInPhysics=min(1,myFrmCnt/fadeInPhysicsNFrames);let e=F;generateMask(e);let s=mySs.length;if(!(TMP<1))for(let e=0;e<s;e++)mySs[e].bGrowing&&mySs[e].growStructureIfGrowing();const o=2;for(let e=1;e<=o;e++){applyLloydForces(e),applyMouseForces(e),applyFlockingForces(e);for(let o=0;o<s;o++)mySs[o].applySpringForces(e),mySs[o].applySmoothingForces(e),mySs[o].applyScrunchingForces(e),mySs[o].applyLetterForces(e),mySs[o].applySiteForce(e);let o=8;(mouseIsPressed||mousePressedTime<mouseReleasedTime&&millis()-mouseReleasedTime<3e3)&&(o=1);const r=myFrmCnt%o;for(let s=0;s<myPs.length;s++)if(s%o==r){if(myPs[s].updateAndConstrainToMask(e)){let o=myPs[s].isOfStrc;o>0&&mySs[o].applyForceTowardsTarget(CX,CY,e,.25)}}else myPs[s].update(e);copyParticlesToD3Data(e)}}} function clearForces(){let e=mySs.length;for(let l=0;l<e;l++)mySs[l].clearForces()} function advanceFreeParticles(){for(let e=1;e<=2;e++){applyLloydForces(e);for(let l=0;l<myPs.length;l++)myPs[l].isFree&&myPs[l].update(e);copyParticlesToD3Data(e)}} function updateClockAndTemp(){let e=millis();FPS=.98*FPS+1e3/(e-lastFrameTime)*.02,lastFrameTime=e;if(myMillis+=32*pow(TMP,2),TMP>0)myFrmCnt++;else{millis()-initFreezeT>1e3*nSecsToFreeze&&(bTemperatureCooling=F,TMP=1)}bDoMF=T,bTemperatureCooling&&(TMP*=StSh.tempCoolRate,TMP<1/16384&&(TMP=0,bTemperatureCooling=F,bDoMF=F));for(let e=0;e<myPs.length;e++)myPs[e].setTemperatureOverMass()} function drawDebugInformation(){if((bSaveScreencapture&&(bShoDbg=F),bShoDbg)){GFXP5.noStroke();GFXP5.fill(0);GFXP5.textSize(10);GFXP5.textLeading(10); GFXP5.textFont("Courier");GFXP5.text(printKeys(),20,25); GFXP5.textFont("Georgia");GFXP5.text(printTitles(),20,25);GFXP5.text(printHelp(),40,25);}} function applyLloydForces(o){d3Delaunay=null,d3Voronoi=null,d3Delaunay=new d3.Delaunay(d3Data),d3Voronoi=d3Delaunay.voronoi([0,0,BDM,BDM]);let e,n,a,t,l,s,y,d=0;const r=1e-5/LLSP;let i=d3Voronoi.cellPolygons(),P=i.next();if(1==o)for(;!P.done;){if(!myPs[d].bIsABoundarySite){const e=P.value;s=getCentroidOfConvexPolygonAreaFast(e),y=myPs[d].p0,a=s[0]-y.x,t=s[1]-y.y,l=Math.sqrt(a*a+t*t)/LLSP,l>r&&myPs[d].addF(a/l,t/l,o)}P=i.next(),d++}else for(;!P.done;){if(!myPs[d].bIsABoundarySite){const i=P.value;s=getCentroidOfConvexPolygonAreaFast(i),e=s[0],n=s[1],myPs[d].c.set(e,n),y=myPs[d].pE,a=e-y.x,t=n-y.y,l=Math.sqrt(a*a+t*t)/LLSP,l>r&&myPs[d].addF(a/l,t/l,o)}P=i.next(),d++}} function clearGrabbedItems(){GrabStrcId>=0&&GrabStrcId<mySs.length&&(mySs[GrabStrcId].whichParticleIsGrabbed=-1),GrabPid>=0&&(myPs[GrabPid].bFixed=F),GrabStrcId=-1,GrabPid=-1} function mouseReleased(){clearGrabbedItems(),mouseReleasedTime=millis()} function mousePressed(){clearGrabbedItems(),mousePressedTime=millis(),mouseReleasedTime=mousePressedTime-1,mySs.length>1&&null!=HOVER_ITEMS&&HOVER_ITEMS.closestStructureId>-1&&HOVER_ITEMS.closestPGlobalId>-1&&(GrabStrcId=HOVER_ITEMS.closestStructureId,GrabPid=HOVER_ITEMS.closestPGlobalId,mySs[GrabStrcId].whichParticleIsGrabbed=HOVER_ITEMS.closestPLocalIndex)} function manageCursor(){const e=((mouseX/width-.5)/zScale+.5)*BDM,r=((mouseY/height-.5)/zScale+.5)*BDM;HOVER_ITEMS=determineClosestStructureAndParticle(e,r,REST_L,F),bDoMF?mouseIsPressed?HOVER_ITEMS.closestStructureId>-1&&HOVER_ITEMS.closestPGlobalId>-1?cursor("grabbing"):cursor("pointer"):HOVER_ITEMS.closestStructureId>-1&&HOVER_ITEMS.closestPGlobalId>-1?cursor("grab"):cursor("default"):cursor("default")}