0x0279…2b4a

All memos sent from and to 0x0279…2b4a.

function fisherYatesShuffle(seed, array) { let currentIndex = array.length; let temporaryValue, randomIndex; while (currentIndex !== 0) { randomIndex = (seed + currentIndex) % currentIndex; currentIndex -= 1; temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } function generateIndices(seed, totalImages) { const array = Array.from({ length: totalImages }, (_, i) => i + 1); return fisherYatesShuffle(seed, array); } function selectImage(tokenId, totalImages = 100) { const seed = 582036; const indices = generateIndices(seed, totalImages); console.log(`tokenId: ${tokenId}`) console.log(`Selection: ${indices[tokenId % totalImages]}`) return indices[tokenId % totalImages]; } const selectedImage = selectImage(tokenData.tokenId); let CID = "QmaPUSHdSYYQonhEZsZYdQUbKBpMsTAtRcNfQdJstskjed" function setup() { createCanvas(img.width, img.height); } function initVideoPlayer() { const videoElement = document.createElement('video'); videoElement.style.display = 'none'; videoElement.style.position = 'fixed'; videoElement.style.top = '50%'; videoElement.style.left = '50%'; videoElement.style.transform = 'translate(-50%, -50%)'; videoElement.style.objectFit = 'cover'; function blobToBase64(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(blob); }); } function loadVideo() { const videoURL = `https://pinata.brightmoments.io/ipfs/${CID}/${selectedImage}.mp4`; videoElement.src = videoURL; } async function loadVideoHeadless() { const videoURL = `https://pinata.brightmoments.io/ipfs/${CID}/${selectedImage}.mp4`; const res = await fetch(videoURL); const videoBlob = await res.blob(); const base64Data = await blobToBase64(videoBlob); videoElement.src = base64Data; } videoElement.oncanplaythrough = function() { videoElement.style.display = 'block'; }; if (!/\bHeadlessChrome/.test(navigator.userAgent)) { videoElement.setAttribute('preload', 'auto'); loadVideo(); document.body.appendChild(videoElement); document.onclick = function() { videoElement.setAttribute('loop', ''); videoElement.play(); document.onclick = null; }; } else { console.log("in headless context"); document.body.appendChild(videoElement); loadVideoHeadless(); document.onclick = function() { videoElement.setAttribute('loop', ''); videoElement.play(); document.onclick = null; }; } function adjustVideoSize() { if (window.innerWidth > window.innerHeight) { videoElement.style.width = 'auto'; videoElement.style.height = '100vh'; } else { videoElement.style.width = '100vw'; videoElement.style.height = 'auto'; } } adjustVideoSize(); window.addEventListener('resize', adjustVideoSize); } document.addEventListener('DOMContentLoaded', initVideoPlayer);
const _0x887e8a=_0x111b;(function($,x){let e=_0x111b,a=$();for(;;)try{let o=-parseInt(e(287))/1+-parseInt(e(309))/2+parseInt(e(168))/3*(parseInt(e(310))/4)+-parseInt(e(251))/5*(-parseInt(e(220))/6)+-parseInt(e(197))/7+-parseInt(e(312))/8*(-parseInt(e(325))/9)+-parseInt(e(333))/10;if(866592===o)break;a.push(a.shift())}catch(r){a.push(a.shift())}})(_0x5f48,866592),THREE[_0x887e8a(300)]=function($,x,e){let a=_0x887e8a;this[a(181)]=[],this[a(246)]=0;var o=new THREE[a(262)],r=new THREE[a(245)];r.position.z=1;var t={passThruTexture:{value:null}},n=d(a(183),t),c=new THREE[a(285)](new THREE[a(177)](2,2),n);function l(e){let o=a;e.defines[o(324)]=o(271)+$[o(192)](1)+", "+x[o(192)](1)+" )"}function d($,x){x=x||{};var e=new THREE[a(344)]({uniforms:x,vertexShader:"void main() {\n\n gl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:$});return l(e),e}o[a(261)](c),this[a(179)]=function($,x,e){let o=a;var r={name:$,initialValueTexture:e,material:this[o(297)](x),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:THREE[o(206)],magFilter:THREE[o(206)]};return this[o(181)][o(301)](r),r},this.setVariableDependencies=function($,x){let e=a;$[e(352)]=x},this[a(274)]=function(){let o=a;if(!e[o(233)][o(343)](o(336))&&!e.capabilities[o(348)])return o(318);if(0===e.capabilities[o(341)])return o(288);for(var r=0;r<this[o(181)][o(166)];r++){var t=this.variables[r];t[o(277)][0]=this[o(342)]($,x,t[o(191)],t[o(229)],t[o(205)],t.magFilter),t[o(277)][1]=this[o(342)]($,x,t[o(191)],t[o(229)],t[o(205)],t[o(280)]),this[o(275)](t.initialValueTexture,t[o(277)][0]),this[o(275)](t[o(260)],t[o(277)][1]);var n=t[o(326)],c=n[o(185)];if(null!==t[o(352)])for(var l=0;l<t[o(352)].length;l++){var d=t[o(352)][l];if(d[o(316)]!==t.name){for(var s=!1,f=0;f<this[o(181)].length;f++)if(d[o(316)]===this[o(181)][f].name){s=!0;break}if(!s)return"Variable dependency not found. Variable="+t.name+o(236)+d[o(316)]}c[d.name]={value:null},n.fragmentShader="\nuniform sampler2D "+d[o(316)]+";\n"+n[o(331)]}}return this[o(246)]=0,null},this[a(167)]=function(){let $=a;for(var x=this.currentTextureIndex,e=0===this.currentTextureIndex?1:0,o=0,r=this[$(181)][$(166)];o<r;o++){var t=this[$(181)][o];if(null!==t.dependencies)for(var n=t[$(326)][$(185)],c=0,l=t.dependencies[$(166)];c<l;c++){var d=t[$(352)][c];n[d[$(316)]][$(294)]=d[$(277)][x][$(228)]}this[$(171)](t.material,t[$(277)][e])}this[$(246)]=e},this.getCurrentRenderTarget=function($){let x=a;return $[x(277)][this[x(246)]]},this.getAlternateRenderTarget=function($){return $[a(277)][0===this.currentTextureIndex?1:0]},this[a(176)]=l,this[a(297)]=d,this[a(342)]=function(e,o,r,t,n,c){let l=a;return e=e||$,o=o||x,r=r||THREE.ClampToEdgeWrapping,t=t||THREE[l(198)],n=n||THREE.NearestFilter,c=c||THREE.NearestFilter,new THREE[l(323)](e,o,{wrapS:r,wrapT:t,minFilter:n,magFilter:c,format:THREE.RGBAFormat,type:/(iPad|iPhone|iPod)/g[l(270)](navigator.userAgent)?THREE.HalfFloatType:THREE[l(328)],stencilBuffer:!1,depthBuffer:!1})},this.createTexture=function(){let e=a;var o=new Float32Array($*x*4);return new THREE[e(248)](o,$,x,THREE[e(320)],THREE.FloatType)},this[a(275)]=function($,x){let e=a;t[e(202)][e(294)]=$,this.doRenderTarget(n,x),t.passThruTexture[e(294)]=null},this.doRenderTarget=function($,x){let t=a;var l=e[t(250)]();c[t(326)]=$,e[t(289)](x),e[t(258)](o,r),c[t(326)]=n,e[t(289)](l)}};let render_vertex="\n varying vec2 vUv;\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n\n",render_fragment=_0x887e8a(351),reaction_diffusion_fragment=_0x887e8a(175);function isMobileDevice(){let $=_0x887e8a;return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i[$(270)](navigator[$(256)])}const width=window[_0x887e8a(296)],height=window[_0x887e8a(242)],actual_width=Math[_0x887e8a(212)](width*window[_0x887e8a(214)]),actual_height=Math[_0x887e8a(212)](height*window[_0x887e8a(214)]),mobileFactor=isMobileDevice()?2.5:1.75,simulation_width=Math[_0x887e8a(212)](actual_width/mobileFactor),simulation_height=Math[_0x887e8a(212)](actual_height/mobileFactor),aspectRatio=window[_0x887e8a(296)]/window[_0x887e8a(242)];class Random{constructor(){let $=_0x887e8a;this[$(227)]=!1;let x=function(x){let e=$,a=parseInt(x[e(172)](0,8),16),o=parseInt(x[e(172)](8,16),16),r=parseInt(x.substring(16,24),16),t=parseInt(x.substring(24,32),16);return function(){a|=0,o|=0,r|=0;let $=(a+o|0)+(t|=0)|0;return t=t+1|0,a=o^o>>>9,o=r+(r<<3)|0,r=(r=r<<21|r>>>11)+$|0,($>>>0)/4294967296}};this[$(226)]=new x(tokenData[$(293)].substring(2,34)),this.prngB=new x(tokenData[$(293)][$(172)](34,66));for(let e=0;e<1e6;e+=2)this.prngA(),this.prngB()}[_0x887e8a(308)](){let $=_0x887e8a;return this[$(227)]=!this[$(227)],this.useA?this[$(226)]():this.prngB()}[_0x887e8a(303)]($,x){return $+(x-$)*this[_0x887e8a(308)]()}random_int($,x){return Math[_0x887e8a(290)](this.random_num($,x+1))}[_0x887e8a(252)]($){return this.random_dec()<$}[_0x887e8a(329)]($){return $[this.random_int(0,$.length-1)]}}class SimplexNoise{constructor($){let x=_0x887e8a;this[x(235)]=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let e=0;e<256;e++)this.p[e]=Math.floor(256*$.random_dec());this[x(322)]=Array(512);for(let a=0;a<512;a++)this[x(322)][a]=this.p[255&a]}[_0x887e8a(278)]($,x,e,a){return $[0]*x+$[1]*e+$[2]*a}[_0x887e8a(215)]($,x,e){let a=_0x887e8a,o=1/6,r,t,n,c,l=($+x+e)*(1/3),d=Math[a(290)]($+l),s=Math[a(290)](x+l),f=Math.floor(e+l),u=(d+s+f)*o,_=$-(d-u),m=x-(s-u),g=e-(f-u),v,h,b,p,C,T;_>=m?m>=g?(v=1,h=0,b=0,p=1,C=1,T=0):_>=g?(v=1,h=0,b=0,p=1,C=0,T=1):(v=0,h=0,b=1,p=1,C=0,T=1):m<g?(v=0,h=0,b=1,p=0,C=1,T=1):_<g?(v=0,h=1,b=0,p=0,C=1,T=1):(v=0,h=1,b=0,p=1,C=1,T=0);let F=_-v+o,w=m-h+o,y=g-b+o,S=_-p+2*o,k=m-C+2*o,D=g-T+2*o,P=_-1+3*o,A=m-1+3*o,E=g-1+3*o,B=255&d,V=255&s,z=255&f,W=this[a(322)][B+this[a(322)][V+this[a(322)][z]]]%12,M=this[a(322)][B+v+this[a(322)][V+h+this[a(322)][z+b]]]%12,K=this[a(322)][B+p+this[a(322)][V+C+this[a(322)][z+T]]]%12,I=this[a(322)][B+1+this.perm[V+1+this.perm[z+1]]]%12,U=.6-_*_-m*m-g*g;U<0?r=0:(U*=U,r=U*U*this[a(278)](this.grad3[W],_,m,g));let G=.6-F*F-w*w-y*y;G<0?t=0:(G*=G,t=G*G*this[a(278)](this[a(235)][M],F,w,y));let H=.6-S*S-k*k-D*D;H<0?n=0:(H*=H,n=H*H*this[a(278)](this[a(235)][K],S,k,D));let N=.6-P*P-A*A-E*E;return N<0?c=0:(N*=N,c=N*N*this[a(278)](this[a(235)][I],P,A,E)),32*(r+t+n+c)}}let R=new Random;function getRandomArbitrary($,x){return R[_0x887e8a(308)]()*(x-$)+$}let diffScaleArray=[.25,.375,.5],diffScale=selectFromArray(diffScaleArray),diffScaleVar=selectFromArray([diffScale-.125,diffScale-.125]),diffScaleArrayWide=[.5,.625,.75,.875,1],diffScaleWide=selectFromArray(diffScaleArrayWide),diffScaleVarWide=selectFromArray([0,diffScale-.125]),feedVar=getRandomArbitrary(0,.01),killVar=getRandomArbitrary(0,.01),randomRect,randomCirc;function selectFromArray($){let x=_0x887e8a;return $[Math.floor(R[x(308)]()*$[x(166)])]}function selectNumberFromArray($){let x=_0x887e8a;return Math[x(290)](R.random_dec()*$[x(166)])}function getRandomBool($){return R[_0x887e8a(308)]()<$}function hexToRgb($){let x=parseInt($[_0x887e8a(345)](1),16),e=parseInt(x>>16&255),a=parseInt(x>>8&255),o=parseInt(255&x);return[e,a,o]}function getRandomBoolean(){return R.random_dec()>=.5}let palettes={Candy:{background:_0x887e8a(178),accent:"#E23DB3",substance:_0x887e8a(209),c4:_0x887e8a(347),c5:_0x887e8a(234)},Color2:{background:_0x887e8a(162),accent:_0x887e8a(162),substance:"#98D82D",c4:_0x887e8a(237),c5:_0x887e8a(237)},Color3:{background:"#F17401",accent:_0x887e8a(315),substance:_0x887e8a(210),c4:_0x887e8a(210),c5:_0x887e8a(210)},Color4:{background:_0x887e8a(173),accent:"#FF3C75",substance:_0x887e8a(201),c4:_0x887e8a(201),c5:_0x887e8a(201)},Color5:{background:"#000000",accent:"#000000",substance:_0x887e8a(234),c4:_0x887e8a(234),c5:_0x887e8a(234)},Color6:{background:_0x887e8a(315),accent:_0x887e8a(315),substance:_0x887e8a(210),c4:_0x887e8a(210),c5:_0x887e8a(210)},Yayoi:{background:_0x887e8a(219),accent:_0x887e8a(219),substance:_0x887e8a(234),c4:_0x887e8a(234),c5:"#FFFFFF"},Gabee:{background:"#ffffff",accent:_0x887e8a(190),substance:_0x887e8a(286),c4:_0x887e8a(286),c5:"#ffffff"},CMKY:{background:_0x887e8a(196),accent:(getRandomBoolean(),_0x887e8a(244)),substance:_0x887e8a(224),c4:_0x887e8a(194),c5:"#ffffff"},RGB:{background:_0x887e8a(218),accent:(getRandomBoolean(),_0x887e8a(165)),substance:_0x887e8a(204),c4:_0x887e8a(231),c5:_0x887e8a(234)},"30Rack":{background:_0x887e8a(163),accent:getRandomBoolean()?_0x887e8a(163):_0x887e8a(218),substance:_0x887e8a(163),c4:_0x887e8a(330),c5:_0x887e8a(330)},Mohun:{background:_0x887e8a(263),accent:(getRandomBoolean(),_0x887e8a(339)),substance:_0x887e8a(334),c4:"#5BC2AC",c5:_0x887e8a(346)},Q:{background:_0x887e8a(196),accent:_0x887e8a(196),substance:_0x887e8a(213),c4:_0x887e8a(196),c5:_0x887e8a(196)},Skeleton:{background:_0x887e8a(218),accent:_0x887e8a(196),substance:_0x887e8a(218),c4:"#000000",c5:_0x887e8a(218)}};const defaultPallette={background:"#FF0000",accent:_0x887e8a(165),substance:_0x887e8a(231)},traitColorKeys=Object[_0x887e8a(232)](palettes),randomColorIndex=R.random_int(0,traitColorKeys.length-1),randomColorKey=traitColorKeys[randomColorIndex],randomColorTrait=palettes[randomColorKey],selectedColor={...defaultPallette,...randomColorTrait};console[_0x887e8a(193)](_0x887e8a(216),randomColorKey,"Colors:",selectedColor);let main_trait={Zebra:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.05,feed_variation:0,warped:getRandomBool(.2),kill:.061,kill_variation:0,feed_modifier:-.015,kill_modifier:-.001,anisotropy:selectFromArray([.25,.75]),environment_noise_scale:750,field:!0,substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Fingerprint:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.037,feed_variation:0,warped:getRandomBool(.2),kill:.06,feed_modifier:.009,kill_modifier:.003,kill_modifier:0,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Dots and Dashes":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.034,feed_variation:0,warped:getRandomBool(.2),kill:.0618,kill_variation:0,feed_modifier:-.004,kill_modifier:.0012,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Yayoi:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.062,kill_variation:0,feed_modifier:0,kill_modifier:-.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Spillage:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.035,feed_variation:.006,kill:.06,kill_variation:.006,feed_modifier:-.005,kill_modifier:-.0035,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Coral:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.046,feed_variation:0,warped:getRandomBool(.2),kill:.063,kill_variation:0,feed_modifier:-.009,kill_modifier:-.003,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Squiggle Maze":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.0565,kill_variation:0,feed_modifier:0,kill_modifier:.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64}};const defaultSettings={anisotropy:.8,simfrRate:64,environment_noise_scale:250,substance_color:[0,0,0],middle_color:[0,255,255],background_color:[255,255,255],c4_color:[0,255,255],background_color:[255,255,255],feed_modifier:0,kill_modifier:0,specular_color:[0,0,0],field:!1,warped:!1,diffusion_scale:.625,diffusion_scale_variation:.375,feed:.042,feed_variation:.001,kill:.06,kill_variation:.001},traitKeys=Object[_0x887e8a(232)](main_trait),randomIndex=Math.floor(R.random_dec()*traitKeys[_0x887e8a(166)]),randomKey=traitKeys[randomIndex],randomTrait=main_trait[randomKey],settings={...defaultSettings,...randomTrait};console.log(_0x887e8a(238),randomKey,_0x887e8a(187),settings);const scene=new THREE[_0x887e8a(262)],camera=new THREE.Camera;camera.position.z=1;const renderer=new THREE.WebGLRenderer;renderer[_0x887e8a(273)](window[_0x887e8a(214)]),renderer.setSize(width,height),document[_0x887e8a(299)][_0x887e8a(169)](renderer[_0x887e8a(279)]);let rendererSize=new THREE[_0x887e8a(259)];renderer.getSize(rendererSize);const getRandomInt=($,x)=>Math[_0x887e8a(290)](R.random_dec()*($-x+1)+x),getRandomColor=()=>(16777215*R.random_dec()<<0)[_0x887e8a(276)](16).padStart(6,"0");let elapsedTime=0,frameCounter=0;const updateFrequency=1;function getRandomFloat($,x){return R.random_dec()*(x-$)+$}let isRect=R.random_choice([1,2,3,4]);switch(isRect){case 1:randomRect=new THREE.Vector4(.5*R.random_dec(),0,.2,1),randomCirc=new THREE[_0x887e8a(189)](0,0,0,0);break;case 2:randomRect=new THREE.Vector4(0,0,0,0),randomCirc=new THREE[_0x887e8a(189)](.5,.5,.4,.4);break;case 3:randomRect=new THREE[_0x887e8a(189)](0,0,0,0),randomCirc=new THREE[_0x887e8a(189)](0,0,0,0);break;case 4:randomRect=new THREE[_0x887e8a(189)](.5*R.random_dec(),0,.2,1),randomCirc=new THREE[_0x887e8a(189)](.5,.5,.4,.4);break;default:randomRect=new THREE[_0x887e8a(189)](.5*R.random_dec(),0,.2,1),randomCirc=new THREE.Vector4(0,0,0,0)}const borderSizes=[.01,.03],borderSize=R[_0x887e8a(329)](borderSizes);let borderProportion=borderSize,responsiveBorderSize=borderProportion*Math[_0x887e8a(349)](rendererSize.x,rendererSize.y),caEnabled=!!R.random_bool(.05);console[_0x887e8a(193)](_0x887e8a(225)+caEnabled);const ca_factor=!0===caEnabled?.8:0,caWidth=Math[_0x887e8a(290)](simulation_width/15),caHeight=Math[_0x887e8a(290)](simulation_height/15),caData=new Uint8Array(caWidth*caHeight*3);function _0x111b($,x){let e=_0x5f48();return(_0x111b=function($,x){return e[$-=161]})($,x)}for(let i=0;i<caData[_0x887e8a(166)];i+=3){let $=.8>R[_0x887e8a(308)]()?0:255;caData[i]=$,caData[i+1]=$,caData[i+2]=$}const caTexture=new THREE.DataTexture(caData,caWidth,caHeight,THREE[_0x887e8a(266)]);caTexture[_0x887e8a(280)]=THREE.NearestFilter,caTexture[_0x887e8a(205)]=THREE.NearestFilter,caTexture[_0x887e8a(191)]=THREE.ClampToEdgeWrapping,caTexture[_0x887e8a(229)]=THREE[_0x887e8a(198)],caTexture.needsUpdate=!0;const material=new THREE[_0x887e8a(344)]({vertexShader:render_vertex,fragmentShader:render_fragment,uniforms:{reaction_diffusion:{value:null},substance_color:{value:new THREE[_0x887e8a(254)]()[_0x887e8a(203)](settings[_0x887e8a(272)])[_0x887e8a(161)](255)},middle_color:{value:new THREE.Vector3()[_0x887e8a(203)](settings[_0x887e8a(338)])[_0x887e8a(161)](255)},background_color:{value:new THREE.Vector3()[_0x887e8a(203)](settings[_0x887e8a(302)])[_0x887e8a(161)](255)},c4_color:{value:new THREE[_0x887e8a(254)]()[_0x887e8a(203)](settings.c4_color)[_0x887e8a(161)](255)},c5_color:{value:new THREE[_0x887e8a(254)]()[_0x887e8a(203)](settings[_0x887e8a(307)])[_0x887e8a(161)](255)},time:{value:0},noise_texture:{value:null},isRect:{value:isRect},randomRect:{value:randomRect},randomCirc:{value:randomCirc},ca_state:{value:caTexture}},defines:{frag2sim:_0x887e8a(340)+simulation_width/actual_width+", "+simulation_height/actual_height+")",simulation_resolution:"vec2("+simulation_width+", "+simulation_height+")"}});scene[_0x887e8a(261)](new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2),material));const gpu_compute=new THREE[_0x887e8a(300)](simulation_width,simulation_height,renderer),reaction_diffusion=gpu_compute[_0x887e8a(313)](),reaction_diffusion_variable=gpu_compute[_0x887e8a(179)]("reaction_diffusion",reaction_diffusion_fragment,reaction_diffusion);reaction_diffusion_variable[_0x887e8a(191)]=THREE[_0x887e8a(198)],reaction_diffusion_variable.wrapT=THREE[_0x887e8a(198)],gpu_compute[_0x887e8a(211)](reaction_diffusion_variable,[reaction_diffusion_variable]);const rdu=reaction_diffusion_variable.material.uniforms;rdu[_0x887e8a(230)]={value:new THREE.Vector2(-100,-100)};for(let i=0;i<10;i++)rdu[_0x887e8a(295)+i]={value:new THREE[_0x887e8a(259)](getRandomInt(50,simulation_width-50),getRandomInt(50,simulation_height-50))};function updateCA(){let $=_0x887e8a,x=new Uint8Array(caWidth*caHeight*3),e=[1],a=[2,3];for(let o=0;o<caHeight;o++)for(let r=0;r<caWidth;r++){let t=(o*caWidth+r)*3,n=0;for(let c=-1;c<=1;c++)for(let l=-1;l<=1;l++){if(0===l&&0===c)continue;let d=(r+l+caWidth)%caWidth;255===caData[((o+c+caHeight)%caHeight*caWidth+d)*3]&&n++}let s=caData[t],f=n==e[0]||1==s&&a[$(353)](n)?1:0;f=255===s&&(2===n||3===n)?255:0===s&&3===n?255:0,x[t]=f,x[t+1]=f,x[t+2]=f}caData[$(249)](x),caTexture.needsUpdate=!0}rdu.mouse_down={value:!1},rdu[_0x887e8a(337)]={value:settings[_0x887e8a(337)]},rdu[_0x887e8a(317)]={value:settings.kill},rdu.diffusion_scale={value:settings.diffusion_scale},rdu.feed_variation={value:settings[_0x887e8a(241)]},rdu[_0x887e8a(350)]={value:settings.kill_variation},rdu.feed_modifier={value:settings[_0x887e8a(282)]},rdu.kill_modifier={value:settings[_0x887e8a(195)]},rdu[_0x887e8a(292)]={value:settings.diffusion_scale_variation},rdu[_0x887e8a(283)]={value:settings[_0x887e8a(283)]},rdu[_0x887e8a(164)]={value:!1},rdu[_0x887e8a(261)]={value:!1},rdu.field={value:settings.field},rdu[_0x887e8a(321)]={value:settings[_0x887e8a(321)]},rdu[_0x887e8a(174)]={value:ca_factor},rdu[_0x887e8a(284)]={value:caTexture},rdu[_0x887e8a(243)]={value:.6},rdu[_0x887e8a(217)]={value:responsiveBorderSize},rdu.randomRectPos={value:new THREE[_0x887e8a(259)](randomRect.x,randomRect.y)},rdu[_0x887e8a(264)]={value:new THREE[_0x887e8a(259)](randomRect.z,randomRect.w)},rdu.randomCircPos={value:new THREE[_0x887e8a(259)](randomCirc.x,randomCirc.y)},rdu.randomCircSize={value:new THREE[_0x887e8a(259)](randomCirc.z,randomCirc.w)};const caDuration=3e4,maxUpdateFrequency=10;let startTime=Date.now();function animate(){let $=_0x887e8a;if(requestAnimationFrame(animate),frameCounter++,caEnabled){let x=Date[$(335)]()-startTime;if(x<3e4){var e,a=0,o=3e4,r=1,t=10;let n=Math[$(290)]((e=x,r+(e-a)*(10-r)/(3e4-a)));frameCounter%n==0&&updateCA()}else caEnabled=!1}render()}function _0x5f48(){let $=["uniforms","save_image","Settings:","toDataURL","Vector4","#f5f5f0","wrapS","toFixed","log","#ffff00","kill_modifier","#ffffff","861357hvHjWA","ClampToEdgeWrapping","mouse_down","clientY","#FD97C4","passThruTexture","fromArray","#FF0000","minFilter","LinearFilter","forEach","onmouseleave","#FFC234","#EBFF32","setVariableDependencies","round","#e00000","devicePixelRatio","noise3d","palette:","borderSize","#000000","#D03A20","7048974PffXsp","touchstart","reaction_diffusion","click","#ff00ff","Aggressor: ","prngA","useA","texture","wrapT","mouse_pos","#0000FF","keys","extensions","#FFFFFF","grad3",", dependency=","#98D82D","Growth:","frame","prev_scale","feed_variation","innerHeight","caThreshold","#00ffff","Camera","currentTextureIndex","environment","DataTexture","set","getRenderTarget","5MUdLMR","random_bool","onmouseup","Vector3","href","userAgent","sqrt","render","Vector2","initialValueTexture","add","Scene","#FFFFF1","randomRectSize","resize","RGBFormat","touchend","time","download","test","vec2( ","substance_color","setPixelRatio","init","renderTexture","toString","renderTargets","dot","domElement","magFilter","touchcancel","feed_modifier","anisotropy","ca_state","Mesh","#f2f2f2","225841eSKEwX","No support for vertex shader textures.","setRenderTarget","floor","clientX","diffusion_scale_variation","hash","value","point_pos","innerWidth","createShaderMaterial","background","body","GPUComputationRenderer","push","background_color","random_num","save-link","substance","changedTouches","c5_color","random_dec","1021968ztitef","455892dEMzIN","accent","424LVnvvK","createTexture","touches","#F17401","name","kill","No OES_texture_float support for float textures.","environment_noise_scale","RGBAFormat","warped","perm","WebGLRenderTarget","resolution","274860HSTjyJ","material","type","FloatType","random_choice","#df2126","fragmentShader","info","11809540idlVZs","#AFCDF0","now","OES_texture_float","feed","middle_color","#C7AFF0","vec2(","maxVertexTextures","createRenderTarget","get","ShaderMaterial","slice","#DE87B7","#FFFF99","isWebGL2","min","kill_variation","\n\n varying vec2 vUv;\n\n uniform sampler2D reaction_diffusion;\n uniform vec3 substance_color;\n uniform vec3 background_color;\n uniform vec3 middle_color;\n uniform vec3 c4_color;\n uniform vec3 c5_color;\n uniform vec4 randomRect;\n uniform vec3 circle;\n uniform sampler2D noiseTexture;\n\n void main() {\n vec4 texColor = texture2D(reaction_diffusion, vUv);\n float h = texColor.g;\n\n vec3 colorA = background_color;\n vec3 colorB = middle_color;\n vec3 colorC = substance_color;\n vec3 colorD = c4_color;\n vec3 colorE = c5_color;\n\n float baseEdge0 = 0.0;\n float baseEdge1 = 0.075;\n float baseEdge2 = 0.175;\n float baseEdge3 = 0.275;\n float baseEdge4 = 0.375;\n\n float noiseValue = texture2D(noiseTexture, vUv).r;\n float edgeVariation = noiseValue * 0.1;\n\n float edge0 = baseEdge0 + edgeVariation;\n float edge1 = baseEdge1 + edgeVariation;\n float edge2 = baseEdge2 + edgeVariation;\n float edge3 = baseEdge3 + edgeVariation;\n float edge4 = baseEdge4 + edgeVariation;\n\n vec3 finalColor;\n\n if (h < edge1) {\n float t = clamp((h - edge0) / (edge1 - edge0), 0.0, 1.0);\n finalColor = mix(colorA, colorB, t);\n } else if (h < edge2) {\n float t = clamp((h - edge1) / (edge2 - edge1), 0.0, 1.0);\n finalColor = mix(colorB, colorC, t);\n } else if (h < edge3) {\n float t = clamp((h - edge2) / (edge3 - edge2), 0.0, 1.0);\n finalColor = mix(colorC, colorD, t);\n } else if (h < edge4) {\n float t = clamp((h - edge3) / (edge4 - edge3), 0.0, 1.0);\n finalColor = mix(colorD, colorE, t);\n } else {\n finalColor = colorE;\n }\n\n gl_FragColor = vec4(finalColor, 1.0);\n }\n\n","dependencies","includes","divideScalar","#AE2029","#b42024","reset","#00FF00","length","compute","3cywfoa","appendChild","touchmove","doRenderTarget","substring","#FF3C75","ca_factor","\n\n uniform sampler2D environment;\n\n uniform float feed;\n uniform float kill;\n uniform float diffusion_scale;\n\n uniform float feed_variation;\n uniform float kill_variation;\n uniform bool isRect;\n uniform float diffusion_scale_variation;\n\n uniform float anisotropy;\n uniform bool field;\n\n uniform float feed_modifier;\n uniform float kill_modifier;\n\n uniform vec2 mouse_pos;\n uniform vec2 point_pos0;\n uniform vec2 point_pos1;\n uniform vec2 point_pos2;\n uniform vec2 point_pos3;\n uniform vec2 point_pos4;\n uniform vec2 point_pos5;\n uniform vec2 point_pos6;\n uniform vec2 point_pos7;\n uniform vec2 point_pos8;\n uniform vec2 point_pos9;\n uniform vec2 point_posR;\n uniform bool mouse_down;\n\n uniform bool reset;\n uniform bool add;\n\n uniform vec4 randomRect;\n uniform vec4 randomCirc;\n\n uniform vec2 randomRectPos;\n uniform vec2 randomRectSize;\n uniform vec2 randomCircPos;\n uniform vec2 randomCircSize;\n uniform float borderSize;\n\n uniform vec2 rect_top_left;\n uniform vec2 rect_bottom_right;\n\n uniform sampler2D ca_state;\n uniform float caThreshold;\n uniform float ca_factor;\n \n\n #define p2(v) v * v\n #define PI 3.14159265358979323846\n\n \n #define R 10.0\n #define borderWidth 20.0\n #define rectBorderWidth 2.0\n\n #define s(x, y) texture2D(reaction_diffusion, (gl_FragCoord.xy + vec2(x, y)) / resolution).xy\n\n vec2 anisotropicDiffusion(vec2 angles, float a1, vec2 center)\n {\n vec2\n v00 = s(-1, 1), v10 = s(0, 1), v20 = s(1, 1),\n v01 = s(-1, 0), v21 = s(1, 0),\n v02 = s(-1,-1), v12 = s(0,-1), v22 = s(1,-1);\n\n vec2 cos_t = cos(angles);\n vec2 sin_t = sin(angles);\n\n vec2 cos2_t = p2(cos_t);\n vec2 sin2_t = p2(sin_t);\n\n float a2 = 1.0 - a1;\n\n vec2 d = 4.0 * (a2 - a1) * p2(cos_t * sin_t);\n vec2 h = 8.0 * (a1 * cos2_t + a2 * sin2_t);\n vec2 v = 8.0 * (a2 * cos2_t + a1 * sin2_t);\n\n return ((1.0 - d) * (v00 + v22) + (1.0 + d) * (v20 + v02) + h * (v01 + v21) + v * (v10 + v12) - 20.0 * center) / 6.0;\n }\n\n float random (vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n }\n bool insideCircle(vec2 point, vec2 center, float radius) {\n return distance(point, center) <= radius;\n }\n\n\n void main() {\n vec4 env = texture2D(environment, (gl_FragCoord.xy / resolution).xy);\n vec2 st = gl_FragCoord.xy/resolution;\n vec3 ca_color = texture2D(ca_state, st).rgb;\n float ca_intensity = dot(ca_color, vec3(0.299, 0.587, 0.114));\n float caValue = texture2D(ca_state, (gl_FragCoord.xy / resolution)).r;\n\n\n float rnd = random( st );\n float pct = 0.0;\n\n vec2 randomRectPosA = randomRectPos * resolution;\n vec2 randomRectSizeA = randomRectSize * resolution;\n\n vec2 randomCircPosA = randomCircPos * resolution;\n vec2 randomCircSizeA = randomCircSize * resolution;\n\n pct = distance(st,vec2(0.5));\n\n float DS = diffusion_scale + env[2] * diffusion_scale_variation;\n vec2 angles = (1.0 + vec2(env[3], field ? env[0] : env[3])) * PI;\n float caInfluence = float(caValue > caThreshold);\n float F = feed + env[0] * feed_variation;\n float K = kill + env[1] * kill_variation;\n\n \n bool insideRectangle = (gl_FragCoord.x > randomRectPosA.x && gl_FragCoord.x < randomRectPosA.x + randomRectSizeA.x) &&\n (gl_FragCoord.y > randomRectPosA.y && gl_FragCoord.y < randomRectPosA.y + randomRectSizeA.y);\n\n bool insideCircle = insideCircle(gl_FragCoord.xy, randomCircPosA, randomCircSizeA.x); \n\n if (insideRectangle) {\n K += 0.003;\n }\n\n if (insideCircle) {\n K += 0.0025;\n }\n\n vec2 old = s(0, 0);\n\n vec2 reaction = vec2(-1.0, 1.0) * old[0] * old[1] * old[1] * (1.0 + caInfluence * ca_factor);\n vec2 dissipation = vec2(F * (1.0 - old[0]), -old[1] * (K + F));\n vec2 diffusion = anisotropicDiffusion(angles, anisotropy, old) * DS * vec2(1.0, 0.5);\n float dt = 1.0 / (4.0 * DS);\n gl_FragColor.xy = old + (reaction + dissipation + diffusion) * dt;\n float edgeDistX = min(gl_FragCoord.x, resolution.x - gl_FragCoord.x);\n float edgeDistY = min(gl_FragCoord.y, resolution.y - gl_FragCoord.y);\n float edgeDist = min(edgeDistX, edgeDistY);\n if (edgeDist <= borderSize) {\n gl_FragColor.x = 0.0;\n gl_FragColor.y = 0.0;\n }\n\n if (mouse_down) {\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, mouse_pos), 0.0) / R;\n }\n\n if (reset) {\n gl_FragColor = vec4(0.0);\n }\n\n if(add)\n {\n vec2 pointPositions[10];\n pointPositions[0] = point_pos1;\n pointPositions[1] = point_pos2;\n pointPositions[2] = point_pos3;\n pointPositions[3] = point_pos4;\n pointPositions[4] = point_pos5;\n pointPositions[5] = point_pos6;\n pointPositions[6] = point_pos7;\n pointPositions[7] = point_pos8;\n pointPositions[8] = point_pos9;\n pointPositions[9] = point_pos0;\n\n for (int i = 0; i < 10; i++) {\n vec2 pointPos = pointPositions[i];\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, pointPos), 0.0) / R;\n }\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, point_posR), 0.0) / R;\n\n }\n }\n\n","addResolutionDefine","PlaneBufferGeometry","#E23DB3","addVariable","u_time","variables","onmousedown","uniform sampler2D passThruTexture;\n\nvoid main() {\n\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n\n gl_FragColor = texture2D( passThruTexture, uv );\n\n}\n","addEventListener"];return(_0x5f48=function(){return $})()}function render($){let x=_0x887e8a;if(simulateReactionDiffusion(settings.simfrRate),material[x(185)][x(222)][x(294)]=gpu_compute.getCurrentRenderTarget(reaction_diffusion_variable)[x(228)],elapsedTime+=.01,material[x(185)][x(268)].value=elapsedTime,rdu[x(180)]={value:.001*$},renderer[x(258)](scene,camera),!0===render[x(186)]){render.save_image=!1;let e=document.getElementById(x(304));e[x(269)]=render.savename,e[x(255)]=renderer.domElement[x(188)](),e[x(223)]()}renderer[x(332)][x(258)][x(239)]>=2e3&&renderer[x(332)][x(258)].frame<5e3?rdu[x(261)]={value:!0}:rdu.add={value:!1}}function simulateReactionDiffusion($){let x=_0x887e8a;for(let e=0;e<$;e++)gpu_compute[x(167)]()}function createEnvironment($=!0){let x=_0x887e8a;if(!$&&void 0!==createEnvironment.prev_scale&&createEnvironment[x(240)]===Settings[x(319)])return;createEnvironment[x(240)]=settings.environment_noise_scale;let e=new SimplexNoise(R),a=Array.from({length:4},()=>1e3*R.random_dec()),o=1/settings[x(319)],r={x:simulation_width/2,y:simulation_height/2},t=(r.x,r.y,new Float32Array(simulation_width*simulation_height*4));for(let n=0;n<simulation_height;n++)for(let c=0;c<simulation_width;c++)for(let l=0;l<4;l++)t[(n*simulation_width+c)*4+l]=e.noise3d((c+.5)*o,(n+.5)*(!0===settings[x(321)]?1:o),a[l]);rdu[x(247)]={value:new THREE.DataTexture(t,simulation_width,simulation_height,THREE[x(320)],THREE.FloatType)},rdu[x(247)][x(294)][x(280)]=THREE[x(206)],rdu[x(247)][x(294)][x(205)]=THREE[x(206)];let d=new THREE[x(248)](t,simulation_width,simulation_height,THREE[x(320)],THREE.FloatType);d.magFilter=THREE.LinearFilter,d[x(205)]=THREE[x(206)],material[x(185)].noise_texture[x(294)]=d}function updateMousePos($){let x=_0x887e8a,e=$[x(291)]*(simulation_width/width),a=simulation_height-$[x(200)]*(simulation_height/height);rdu[x(230)][x(294)][x(203)]([e,a])}function onMove($){let x=_0x887e8a;updateMousePos($),rdu[x(199)].value=mouse_down&&(brush_move=!0)}function onUp(){let $=_0x887e8a;mouse_down=!1,brush_move=!1,rdu[$(199)].value=!1}function onDown(){mouse_down=!0}function handleTouchEvent($,x){let e=_0x887e8a,a="touchend"===$[e(327)]||$[e(327)]===e(281)?$[e(306)]:$[e(314)];1===a[e(166)]&&($.preventDefault(),x(a[0]))}createEnvironment(),gpu_compute[_0x887e8a(274)](),animate(),renderer[_0x887e8a(279)][_0x887e8a(182)]=onDown,renderer[_0x887e8a(279)][_0x887e8a(253)]=renderer[_0x887e8a(279)][_0x887e8a(208)]=onUp,renderer[_0x887e8a(279)].onmousemove=onMove,[_0x887e8a(221),_0x887e8a(267),_0x887e8a(281),_0x887e8a(170)][_0x887e8a(207)]($=>{let x=_0x887e8a;renderer.domElement[x(184)]($,e=>{let a=x;$===a(221)?handleTouchEvent(e,onDown):$===a(170)?handleTouchEvent(e,onMove):handleTouchEvent(e,onUp)},!1)}),window[_0x887e8a(184)](_0x887e8a(265),function(){let $=_0x887e8a;renderer.getSize(rendererSize),responsiveBorderSize=borderProportion*Math.min(rendererSize.x,rendererSize.y),material.uniforms[$(217)][$(294)]=responsiveBorderSize},!1);
const _0x887e8a=_0x111b;(function($,x){let e=_0x111b,a=$();for(;;)try{let o=-parseInt(e(287))/1+-parseInt(e(309))/2+parseInt(e(168))/3*(parseInt(e(310))/4)+-parseInt(e(251))/5*(-parseInt(e(220))/6)+-parseInt(e(197))/7+-parseInt(e(312))/8*(-parseInt(e(325))/9)+-parseInt(e(333))/10;if(866592===o)break;a.push(a.shift())}catch(r){a.push(a.shift())}})(_0x5f48,866592),THREE[_0x887e8a(300)]=function($,x,e){let a=_0x887e8a;this[a(181)]=[],this[a(246)]=0;var o=new THREE[a(262)],r=new THREE[a(245)];r.position.z=1;var t={passThruTexture:{value:null}},n=d(a(183),t),c=new THREE[a(285)](new THREE[a(177)](2,2),n);function l(e){let o=a;e.defines[o(324)]=o(271)+$[o(192)](1)+", "+x[o(192)](1)+" )"}function d($,x){x=x||{};var e=new THREE[a(344)]({uniforms:x,vertexShader:"void main() {\n\n gl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:$});return l(e),e}o[a(261)](c),this[a(179)]=function($,x,e){let o=a;var r={name:$,initialValueTexture:e,material:this[o(297)](x),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:THREE[o(206)],magFilter:THREE[o(206)]};return this[o(181)][o(301)](r),r},this.setVariableDependencies=function($,x){let e=a;$[e(352)]=x},this[a(274)]=function(){let o=a;if(!e[o(233)][o(343)](o(336))&&!e.capabilities[o(348)])return o(318);if(0===e.capabilities[o(341)])return o(288);for(var r=0;r<this[o(181)][o(166)];r++){var t=this.variables[r];t[o(277)][0]=this[o(342)]($,x,t[o(191)],t[o(229)],t[o(205)],t.magFilter),t[o(277)][1]=this[o(342)]($,x,t[o(191)],t[o(229)],t[o(205)],t[o(280)]),this[o(275)](t.initialValueTexture,t[o(277)][0]),this[o(275)](t[o(260)],t[o(277)][1]);var n=t[o(326)],c=n[o(185)];if(null!==t[o(352)])for(var l=0;l<t[o(352)].length;l++){var d=t[o(352)][l];if(d[o(316)]!==t.name){for(var s=!1,f=0;f<this[o(181)].length;f++)if(d[o(316)]===this[o(181)][f].name){s=!0;break}if(!s)return"Variable dependency not found. Variable="+t.name+o(236)+d[o(316)]}c[d.name]={value:null},n.fragmentShader="\nuniform sampler2D "+d[o(316)]+";\n"+n[o(331)]}}return this[o(246)]=0,null},this[a(167)]=function(){let $=a;for(var x=this.currentTextureIndex,e=0===this.currentTextureIndex?1:0,o=0,r=this[$(181)][$(166)];o<r;o++){var t=this[$(181)][o];if(null!==t.dependencies)for(var n=t[$(326)][$(185)],c=0,l=t.dependencies[$(166)];c<l;c++){var d=t[$(352)][c];n[d[$(316)]][$(294)]=d[$(277)][x][$(228)]}this[$(171)](t.material,t[$(277)][e])}this[$(246)]=e},this.getCurrentRenderTarget=function($){let x=a;return $[x(277)][this[x(246)]]},this.getAlternateRenderTarget=function($){return $[a(277)][0===this.currentTextureIndex?1:0]},this[a(176)]=l,this[a(297)]=d,this[a(342)]=function(e,o,r,t,n,c){let l=a;return e=e||$,o=o||x,r=r||THREE.ClampToEdgeWrapping,t=t||THREE[l(198)],n=n||THREE.NearestFilter,c=c||THREE.NearestFilter,new THREE[l(323)](e,o,{wrapS:r,wrapT:t,minFilter:n,magFilter:c,format:THREE.RGBAFormat,type:/(iPad|iPhone|iPod)/g[l(270)](navigator.userAgent)?THREE.HalfFloatType:THREE[l(328)],stencilBuffer:!1,depthBuffer:!1})},this.createTexture=function(){let e=a;var o=new Float32Array($*x*4);return new THREE[e(248)](o,$,x,THREE[e(320)],THREE.FloatType)},this[a(275)]=function($,x){let e=a;t[e(202)][e(294)]=$,this.doRenderTarget(n,x),t.passThruTexture[e(294)]=null},this.doRenderTarget=function($,x){let t=a;var l=e[t(250)]();c[t(326)]=$,e[t(289)](x),e[t(258)](o,r),c[t(326)]=n,e[t(289)](l)}};let render_vertex="\n varying vec2 vUv;\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n\n",render_fragment=_0x887e8a(351),reaction_diffusion_fragment=_0x887e8a(175);function isMobileDevice(){let $=_0x887e8a;return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i[$(270)](navigator[$(256)])}const width=window[_0x887e8a(296)],height=window[_0x887e8a(242)],actual_width=Math[_0x887e8a(212)](width*window[_0x887e8a(214)]),actual_height=Math[_0x887e8a(212)](height*window[_0x887e8a(214)]),mobileFactor=isMobileDevice()?2.5:1.5,simulation_width=Math[_0x887e8a(212)](actual_width/mobileFactor),simulation_height=Math[_0x887e8a(212)](actual_height/mobileFactor),aspectRatio=window[_0x887e8a(296)]/window[_0x887e8a(242)];class Random{constructor(){let $=_0x887e8a;this[$(227)]=!1;let x=function(x){let e=$,a=parseInt(x[e(172)](0,8),16),o=parseInt(x[e(172)](8,16),16),r=parseInt(x.substring(16,24),16),t=parseInt(x.substring(24,32),16);return function(){a|=0,o|=0,r|=0;let $=(a+o|0)+(t|=0)|0;return t=t+1|0,a=o^o>>>9,o=r+(r<<3)|0,r=(r=r<<21|r>>>11)+$|0,($>>>0)/4294967296}};this[$(226)]=new x(tokenData[$(293)].substring(2,34)),this.prngB=new x(tokenData[$(293)][$(172)](34,66));for(let e=0;e<1e6;e+=2)this.prngA(),this.prngB()}[_0x887e8a(308)](){let $=_0x887e8a;return this[$(227)]=!this[$(227)],this.useA?this[$(226)]():this.prngB()}[_0x887e8a(303)]($,x){return $+(x-$)*this[_0x887e8a(308)]()}random_int($,x){return Math[_0x887e8a(290)](this.random_num($,x+1))}[_0x887e8a(252)]($){return this.random_dec()<$}[_0x887e8a(329)]($){return $[this.random_int(0,$.length-1)]}}class SimplexNoise{constructor($){let x=_0x887e8a;this[x(235)]=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let e=0;e<256;e++)this.p[e]=Math.floor(256*$.random_dec());this[x(322)]=Array(512);for(let a=0;a<512;a++)this[x(322)][a]=this.p[255&a]}[_0x887e8a(278)]($,x,e,a){return $[0]*x+$[1]*e+$[2]*a}[_0x887e8a(215)]($,x,e){let a=_0x887e8a,o=1/6,r,t,n,c,l=($+x+e)*(1/3),d=Math[a(290)]($+l),s=Math[a(290)](x+l),f=Math.floor(e+l),u=(d+s+f)*o,_=$-(d-u),m=x-(s-u),g=e-(f-u),v,h,b,p,C,T;_>=m?m>=g?(v=1,h=0,b=0,p=1,C=1,T=0):_>=g?(v=1,h=0,b=0,p=1,C=0,T=1):(v=0,h=0,b=1,p=1,C=0,T=1):m<g?(v=0,h=0,b=1,p=0,C=1,T=1):_<g?(v=0,h=1,b=0,p=0,C=1,T=1):(v=0,h=1,b=0,p=1,C=1,T=0);let F=_-v+o,w=m-h+o,y=g-b+o,S=_-p+2*o,k=m-C+2*o,D=g-T+2*o,P=_-1+3*o,A=m-1+3*o,E=g-1+3*o,B=255&d,V=255&s,z=255&f,W=this[a(322)][B+this[a(322)][V+this[a(322)][z]]]%12,M=this[a(322)][B+v+this[a(322)][V+h+this[a(322)][z+b]]]%12,K=this[a(322)][B+p+this[a(322)][V+C+this[a(322)][z+T]]]%12,I=this[a(322)][B+1+this.perm[V+1+this.perm[z+1]]]%12,U=.6-_*_-m*m-g*g;U<0?r=0:(U*=U,r=U*U*this[a(278)](this.grad3[W],_,m,g));let G=.6-F*F-w*w-y*y;G<0?t=0:(G*=G,t=G*G*this[a(278)](this[a(235)][M],F,w,y));let H=.6-S*S-k*k-D*D;H<0?n=0:(H*=H,n=H*H*this[a(278)](this[a(235)][K],S,k,D));let N=.6-P*P-A*A-E*E;return N<0?c=0:(N*=N,c=N*N*this[a(278)](this[a(235)][I],P,A,E)),32*(r+t+n+c)}}let R=new Random;function getRandomArbitrary($,x){return R[_0x887e8a(308)]()*(x-$)+$}let diffScaleArray=[.25,.375,.5],diffScale=selectFromArray(diffScaleArray),diffScaleVar=selectFromArray([diffScale-.125,diffScale-.125]),diffScaleArrayWide=[.5,.625,.75,.875,1],diffScaleWide=selectFromArray(diffScaleArrayWide),diffScaleVarWide=selectFromArray([0,diffScale-.125]),feedVar=getRandomArbitrary(0,.01),killVar=getRandomArbitrary(0,.01),randomRect,randomCirc;function selectFromArray($){let x=_0x887e8a;return $[Math.floor(R[x(308)]()*$[x(166)])]}function selectNumberFromArray($){let x=_0x887e8a;return Math[x(290)](R.random_dec()*$[x(166)])}function getRandomBool($){return R[_0x887e8a(308)]()<$}function hexToRgb($){let x=parseInt($[_0x887e8a(345)](1),16),e=parseInt(x>>16&255),a=parseInt(x>>8&255),o=parseInt(255&x);return[e,a,o]}function getRandomBoolean(){return R.random_dec()>=.5}let palettes={Candy:{background:_0x887e8a(178),accent:"#E23DB3",substance:_0x887e8a(209),c4:_0x887e8a(347),c5:_0x887e8a(234)},Color2:{background:_0x887e8a(162),accent:_0x887e8a(162),substance:"#98D82D",c4:_0x887e8a(237),c5:_0x887e8a(237)},Color3:{background:"#F17401",accent:_0x887e8a(315),substance:_0x887e8a(210),c4:_0x887e8a(210),c5:_0x887e8a(210)},Color4:{background:_0x887e8a(173),accent:"#FF3C75",substance:_0x887e8a(201),c4:_0x887e8a(201),c5:_0x887e8a(201)},Color5:{background:"#000000",accent:"#000000",substance:_0x887e8a(234),c4:_0x887e8a(234),c5:_0x887e8a(234)},Color6:{background:_0x887e8a(315),accent:_0x887e8a(315),substance:_0x887e8a(210),c4:_0x887e8a(210),c5:_0x887e8a(210)},Yayoi:{background:_0x887e8a(219),accent:_0x887e8a(219),substance:_0x887e8a(234),c4:_0x887e8a(234),c5:"#FFFFFF"},Gabee:{background:"#ffffff",accent:_0x887e8a(190),substance:_0x887e8a(286),c4:_0x887e8a(286),c5:"#ffffff"},CMKY:{background:_0x887e8a(196),accent:(getRandomBoolean(),_0x887e8a(244)),substance:_0x887e8a(224),c4:_0x887e8a(194),c5:"#ffffff"},RGB:{background:_0x887e8a(218),accent:(getRandomBoolean(),_0x887e8a(165)),substance:_0x887e8a(204),c4:_0x887e8a(231),c5:_0x887e8a(234)},"30Rack":{background:_0x887e8a(163),accent:getRandomBoolean()?_0x887e8a(163):_0x887e8a(218),substance:_0x887e8a(163),c4:_0x887e8a(330),c5:_0x887e8a(330)},Mohun:{background:_0x887e8a(263),accent:(getRandomBoolean(),_0x887e8a(339)),substance:_0x887e8a(334),c4:"#5BC2AC",c5:_0x887e8a(346)},Q:{background:_0x887e8a(196),accent:_0x887e8a(196),substance:_0x887e8a(213),c4:_0x887e8a(196),c5:_0x887e8a(196)},Skeleton:{background:_0x887e8a(218),accent:_0x887e8a(196),substance:_0x887e8a(218),c4:"#000000",c5:_0x887e8a(218)}};const defaultPallette={background:"#FF0000",accent:_0x887e8a(165),substance:_0x887e8a(231)},traitColorKeys=Object[_0x887e8a(232)](palettes),randomColorIndex=R.random_int(0,traitColorKeys.length-1),randomColorKey=traitColorKeys[randomColorIndex],randomColorTrait=palettes[randomColorKey],selectedColor={...defaultPallette,...randomColorTrait};console[_0x887e8a(193)](_0x887e8a(216),randomColorKey,"Colors:",selectedColor);let main_trait={Zebra:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.05,feed_variation:0,warped:getRandomBool(.2),kill:.061,kill_variation:0,feed_modifier:-.015,kill_modifier:-.001,anisotropy:selectFromArray([.25,.75]),environment_noise_scale:750,field:!0,substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Fingerprint:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.037,feed_variation:0,warped:getRandomBool(.2),kill:.06,feed_modifier:.009,kill_modifier:.003,kill_modifier:0,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Dots and Dashes":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.034,feed_variation:0,warped:getRandomBool(.2),kill:.0618,kill_variation:0,feed_modifier:-.004,kill_modifier:.0012,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Yayoi:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.062,kill_variation:0,feed_modifier:0,kill_modifier:-.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Spillage:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.035,feed_variation:.006,kill:.06,kill_variation:.006,feed_modifier:-.005,kill_modifier:-.0035,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Coral:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.046,feed_variation:0,warped:getRandomBool(.2),kill:.063,kill_variation:0,feed_modifier:-.009,kill_modifier:-.003,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Squiggle Maze":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.0565,kill_variation:0,feed_modifier:0,kill_modifier:.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x887e8a(305)]),middle_color:hexToRgb(selectedColor[_0x887e8a(311)]),background_color:hexToRgb(selectedColor[_0x887e8a(298)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64}};const defaultSettings={anisotropy:.8,simfrRate:64,environment_noise_scale:250,substance_color:[0,0,0],middle_color:[0,255,255],background_color:[255,255,255],c4_color:[0,255,255],background_color:[255,255,255],feed_modifier:0,kill_modifier:0,specular_color:[0,0,0],field:!1,warped:!1,diffusion_scale:.625,diffusion_scale_variation:.375,feed:.042,feed_variation:.001,kill:.06,kill_variation:.001},traitKeys=Object[_0x887e8a(232)](main_trait),randomIndex=Math.floor(R.random_dec()*traitKeys[_0x887e8a(166)]),randomKey=traitKeys[randomIndex],randomTrait=main_trait[randomKey],settings={...defaultSettings,...randomTrait};console.log(_0x887e8a(238),randomKey,_0x887e8a(187),settings);const scene=new THREE[_0x887e8a(262)],camera=new THREE.Camera;camera.position.z=1;const renderer=new THREE.WebGLRenderer;renderer[_0x887e8a(273)](window[_0x887e8a(214)]),renderer.setSize(width,height),document[_0x887e8a(299)][_0x887e8a(169)](renderer[_0x887e8a(279)]);let rendererSize=new THREE[_0x887e8a(259)];renderer.getSize(rendererSize);const getRandomInt=($,x)=>Math[_0x887e8a(290)](R.random_dec()*($-x+1)+x),getRandomColor=()=>(16777215*R.random_dec()<<0)[_0x887e8a(276)](16).padStart(6,"0");let elapsedTime=0,frameCounter=0;const updateFrequency=1;function getRandomFloat($,x){return R.random_dec()*(x-$)+$}let isRect=R.random_choice([1,2,3,4]);switch(isRect){case 1:randomRect=new THREE.Vector4(.5*R.random_dec(),0,.2,1),randomCirc=new THREE[_0x887e8a(189)](0,0,0,0);break;case 2:randomRect=new THREE.Vector4(0,0,0,0),randomCirc=new THREE[_0x887e8a(189)](.5,.5,.4,.4);break;case 3:randomRect=new THREE[_0x887e8a(189)](0,0,0,0),randomCirc=new THREE[_0x887e8a(189)](0,0,0,0);break;case 4:randomRect=new THREE[_0x887e8a(189)](.5*R.random_dec(),0,.2,1),randomCirc=new THREE[_0x887e8a(189)](.5,.5,.4,.4);break;default:randomRect=new THREE[_0x887e8a(189)](.5*R.random_dec(),0,.2,1),randomCirc=new THREE.Vector4(0,0,0,0)}const borderSizes=[.01,.03],borderSize=R[_0x887e8a(329)](borderSizes);let borderProportion=borderSize,responsiveBorderSize=borderProportion*Math[_0x887e8a(349)](rendererSize.x,rendererSize.y),caEnabled=!!R.random_bool(.05);console[_0x887e8a(193)](_0x887e8a(225)+caEnabled);const ca_factor=!0===caEnabled?.8:0,caWidth=Math[_0x887e8a(290)](simulation_width/15),caHeight=Math[_0x887e8a(290)](simulation_height/15),caData=new Uint8Array(caWidth*caHeight*3);function _0x111b($,x){let e=_0x5f48();return(_0x111b=function($,x){return e[$-=161]})($,x)}for(let i=0;i<caData[_0x887e8a(166)];i+=3){let $=.8>R[_0x887e8a(308)]()?0:255;caData[i]=$,caData[i+1]=$,caData[i+2]=$}const caTexture=new THREE.DataTexture(caData,caWidth,caHeight,THREE[_0x887e8a(266)]);caTexture[_0x887e8a(280)]=THREE.NearestFilter,caTexture[_0x887e8a(205)]=THREE.NearestFilter,caTexture[_0x887e8a(191)]=THREE.ClampToEdgeWrapping,caTexture[_0x887e8a(229)]=THREE[_0x887e8a(198)],caTexture.needsUpdate=!0;const material=new THREE[_0x887e8a(344)]({vertexShader:render_vertex,fragmentShader:render_fragment,uniforms:{reaction_diffusion:{value:null},substance_color:{value:new THREE[_0x887e8a(254)]()[_0x887e8a(203)](settings[_0x887e8a(272)])[_0x887e8a(161)](255)},middle_color:{value:new THREE.Vector3()[_0x887e8a(203)](settings[_0x887e8a(338)])[_0x887e8a(161)](255)},background_color:{value:new THREE.Vector3()[_0x887e8a(203)](settings[_0x887e8a(302)])[_0x887e8a(161)](255)},c4_color:{value:new THREE[_0x887e8a(254)]()[_0x887e8a(203)](settings.c4_color)[_0x887e8a(161)](255)},c5_color:{value:new THREE[_0x887e8a(254)]()[_0x887e8a(203)](settings[_0x887e8a(307)])[_0x887e8a(161)](255)},time:{value:0},noise_texture:{value:null},isRect:{value:isRect},randomRect:{value:randomRect},randomCirc:{value:randomCirc},ca_state:{value:caTexture}},defines:{frag2sim:_0x887e8a(340)+simulation_width/actual_width+", "+simulation_height/actual_height+")",simulation_resolution:"vec2("+simulation_width+", "+simulation_height+")"}});scene[_0x887e8a(261)](new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2),material));const gpu_compute=new THREE[_0x887e8a(300)](simulation_width,simulation_height,renderer),reaction_diffusion=gpu_compute[_0x887e8a(313)](),reaction_diffusion_variable=gpu_compute[_0x887e8a(179)]("reaction_diffusion",reaction_diffusion_fragment,reaction_diffusion);reaction_diffusion_variable[_0x887e8a(191)]=THREE[_0x887e8a(198)],reaction_diffusion_variable.wrapT=THREE[_0x887e8a(198)],gpu_compute[_0x887e8a(211)](reaction_diffusion_variable,[reaction_diffusion_variable]);const rdu=reaction_diffusion_variable.material.uniforms;rdu[_0x887e8a(230)]={value:new THREE.Vector2(-100,-100)};for(let i=0;i<10;i++)rdu[_0x887e8a(295)+i]={value:new THREE[_0x887e8a(259)](getRandomInt(50,simulation_width-50),getRandomInt(50,simulation_height-50))};function updateCA(){let $=_0x887e8a,x=new Uint8Array(caWidth*caHeight*3),e=[1],a=[2,3];for(let o=0;o<caHeight;o++)for(let r=0;r<caWidth;r++){let t=(o*caWidth+r)*3,n=0;for(let c=-1;c<=1;c++)for(let l=-1;l<=1;l++){if(0===l&&0===c)continue;let d=(r+l+caWidth)%caWidth;255===caData[((o+c+caHeight)%caHeight*caWidth+d)*3]&&n++}let s=caData[t],f=n==e[0]||1==s&&a[$(353)](n)?1:0;f=255===s&&(2===n||3===n)?255:0===s&&3===n?255:0,x[t]=f,x[t+1]=f,x[t+2]=f}caData[$(249)](x),caTexture.needsUpdate=!0}rdu.mouse_down={value:!1},rdu[_0x887e8a(337)]={value:settings[_0x887e8a(337)]},rdu[_0x887e8a(317)]={value:settings.kill},rdu.diffusion_scale={value:settings.diffusion_scale},rdu.feed_variation={value:settings[_0x887e8a(241)]},rdu[_0x887e8a(350)]={value:settings.kill_variation},rdu.feed_modifier={value:settings[_0x887e8a(282)]},rdu.kill_modifier={value:settings[_0x887e8a(195)]},rdu[_0x887e8a(292)]={value:settings.diffusion_scale_variation},rdu[_0x887e8a(283)]={value:settings[_0x887e8a(283)]},rdu[_0x887e8a(164)]={value:!1},rdu[_0x887e8a(261)]={value:!1},rdu.field={value:settings.field},rdu[_0x887e8a(321)]={value:settings[_0x887e8a(321)]},rdu[_0x887e8a(174)]={value:ca_factor},rdu[_0x887e8a(284)]={value:caTexture},rdu[_0x887e8a(243)]={value:.6},rdu[_0x887e8a(217)]={value:responsiveBorderSize},rdu.randomRectPos={value:new THREE[_0x887e8a(259)](randomRect.x,randomRect.y)},rdu[_0x887e8a(264)]={value:new THREE[_0x887e8a(259)](randomRect.z,randomRect.w)},rdu.randomCircPos={value:new THREE[_0x887e8a(259)](randomCirc.x,randomCirc.y)},rdu.randomCircSize={value:new THREE[_0x887e8a(259)](randomCirc.z,randomCirc.w)};const caDuration=3e4,maxUpdateFrequency=10;let startTime=Date.now();function animate(){let $=_0x887e8a;if(requestAnimationFrame(animate),frameCounter++,caEnabled){let x=Date[$(335)]()-startTime;if(x<3e4){var e,a=0,o=3e4,r=1,t=10;let n=Math[$(290)]((e=x,r+(e-a)*(10-r)/(3e4-a)));frameCounter%n==0&&updateCA()}else caEnabled=!1}render()}function _0x5f48(){let $=["uniforms","save_image","Settings:","toDataURL","Vector4","#f5f5f0","wrapS","toFixed","log","#ffff00","kill_modifier","#ffffff","861357hvHjWA","ClampToEdgeWrapping","mouse_down","clientY","#FD97C4","passThruTexture","fromArray","#FF0000","minFilter","LinearFilter","forEach","onmouseleave","#FFC234","#EBFF32","setVariableDependencies","round","#e00000","devicePixelRatio","noise3d","palette:","borderSize","#000000","#D03A20","7048974PffXsp","touchstart","reaction_diffusion","click","#ff00ff","Aggressor: ","prngA","useA","texture","wrapT","mouse_pos","#0000FF","keys","extensions","#FFFFFF","grad3",", dependency=","#98D82D","Growth:","frame","prev_scale","feed_variation","innerHeight","caThreshold","#00ffff","Camera","currentTextureIndex","environment","DataTexture","set","getRenderTarget","5MUdLMR","random_bool","onmouseup","Vector3","href","userAgent","sqrt","render","Vector2","initialValueTexture","add","Scene","#FFFFF1","randomRectSize","resize","RGBFormat","touchend","time","download","test","vec2( ","substance_color","setPixelRatio","init","renderTexture","toString","renderTargets","dot","domElement","magFilter","touchcancel","feed_modifier","anisotropy","ca_state","Mesh","#f2f2f2","225841eSKEwX","No support for vertex shader textures.","setRenderTarget","floor","clientX","diffusion_scale_variation","hash","value","point_pos","innerWidth","createShaderMaterial","background","body","GPUComputationRenderer","push","background_color","random_num","save-link","substance","changedTouches","c5_color","random_dec","1021968ztitef","455892dEMzIN","accent","424LVnvvK","createTexture","touches","#F17401","name","kill","No OES_texture_float support for float textures.","environment_noise_scale","RGBAFormat","warped","perm","WebGLRenderTarget","resolution","274860HSTjyJ","material","type","FloatType","random_choice","#df2126","fragmentShader","info","11809540idlVZs","#AFCDF0","now","OES_texture_float","feed","middle_color","#C7AFF0","vec2(","maxVertexTextures","createRenderTarget","get","ShaderMaterial","slice","#DE87B7","#FFFF99","isWebGL2","min","kill_variation","\n\n varying vec2 vUv;\n\n uniform sampler2D reaction_diffusion;\n uniform vec3 substance_color;\n uniform vec3 background_color;\n uniform vec3 middle_color;\n uniform vec3 c4_color;\n uniform vec3 c5_color;\n uniform vec4 randomRect;\n uniform vec3 circle;\n uniform sampler2D noiseTexture;\n\n void main() {\n vec4 texColor = texture2D(reaction_diffusion, vUv);\n float h = texColor.g;\n\n vec3 colorA = background_color;\n vec3 colorB = middle_color;\n vec3 colorC = substance_color;\n vec3 colorD = c4_color;\n vec3 colorE = c5_color;\n\n float baseEdge0 = 0.0;\n float baseEdge1 = 0.075;\n float baseEdge2 = 0.175;\n float baseEdge3 = 0.275;\n float baseEdge4 = 0.375;\n\n float noiseValue = texture2D(noiseTexture, vUv).r;\n float edgeVariation = noiseValue * 0.1;\n\n float edge0 = baseEdge0 + edgeVariation;\n float edge1 = baseEdge1 + edgeVariation;\n float edge2 = baseEdge2 + edgeVariation;\n float edge3 = baseEdge3 + edgeVariation;\n float edge4 = baseEdge4 + edgeVariation;\n\n vec3 finalColor;\n\n if (h < edge1) {\n float t = clamp((h - edge0) / (edge1 - edge0), 0.0, 1.0);\n finalColor = mix(colorA, colorB, t);\n } else if (h < edge2) {\n float t = clamp((h - edge1) / (edge2 - edge1), 0.0, 1.0);\n finalColor = mix(colorB, colorC, t);\n } else if (h < edge3) {\n float t = clamp((h - edge2) / (edge3 - edge2), 0.0, 1.0);\n finalColor = mix(colorC, colorD, t);\n } else if (h < edge4) {\n float t = clamp((h - edge3) / (edge4 - edge3), 0.0, 1.0);\n finalColor = mix(colorD, colorE, t);\n } else {\n finalColor = colorE;\n }\n\n gl_FragColor = vec4(finalColor, 1.0);\n }\n\n","dependencies","includes","divideScalar","#AE2029","#b42024","reset","#00FF00","length","compute","3cywfoa","appendChild","touchmove","doRenderTarget","substring","#FF3C75","ca_factor","\n\n uniform sampler2D environment;\n\n uniform float feed;\n uniform float kill;\n uniform float diffusion_scale;\n\n uniform float feed_variation;\n uniform float kill_variation;\n uniform bool isRect;\n uniform float diffusion_scale_variation;\n\n uniform float anisotropy;\n uniform bool field;\n\n uniform float feed_modifier;\n uniform float kill_modifier;\n\n uniform vec2 mouse_pos;\n uniform vec2 point_pos0;\n uniform vec2 point_pos1;\n uniform vec2 point_pos2;\n uniform vec2 point_pos3;\n uniform vec2 point_pos4;\n uniform vec2 point_pos5;\n uniform vec2 point_pos6;\n uniform vec2 point_pos7;\n uniform vec2 point_pos8;\n uniform vec2 point_pos9;\n uniform vec2 point_posR;\n uniform bool mouse_down;\n\n uniform bool reset;\n uniform bool add;\n\n uniform vec4 randomRect;\n uniform vec4 randomCirc;\n\n uniform vec2 randomRectPos;\n uniform vec2 randomRectSize;\n uniform vec2 randomCircPos;\n uniform vec2 randomCircSize;\n uniform float borderSize;\n\n uniform vec2 rect_top_left;\n uniform vec2 rect_bottom_right;\n\n uniform sampler2D ca_state;\n uniform float caThreshold;\n uniform float ca_factor;\n \n\n #define p2(v) v * v\n #define PI 3.14159265358979323846\n\n \n #define R 10.0\n #define borderWidth 20.0\n #define rectBorderWidth 2.0\n\n #define s(x, y) texture2D(reaction_diffusion, (gl_FragCoord.xy + vec2(x, y)) / resolution).xy\n\n vec2 anisotropicDiffusion(vec2 angles, float a1, vec2 center)\n {\n vec2\n v00 = s(-1, 1), v10 = s(0, 1), v20 = s(1, 1),\n v01 = s(-1, 0), v21 = s(1, 0),\n v02 = s(-1,-1), v12 = s(0,-1), v22 = s(1,-1);\n\n vec2 cos_t = cos(angles);\n vec2 sin_t = sin(angles);\n\n vec2 cos2_t = p2(cos_t);\n vec2 sin2_t = p2(sin_t);\n\n float a2 = 1.0 - a1;\n\n vec2 d = 4.0 * (a2 - a1) * p2(cos_t * sin_t);\n vec2 h = 8.0 * (a1 * cos2_t + a2 * sin2_t);\n vec2 v = 8.0 * (a2 * cos2_t + a1 * sin2_t);\n\n return ((1.0 - d) * (v00 + v22) + (1.0 + d) * (v20 + v02) + h * (v01 + v21) + v * (v10 + v12) - 20.0 * center) / 6.0;\n }\n\n float random (vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n }\n bool insideCircle(vec2 point, vec2 center, float radius) {\n return distance(point, center) <= radius;\n }\n\n\n void main() {\n vec4 env = texture2D(environment, (gl_FragCoord.xy / resolution).xy);\n vec2 st = gl_FragCoord.xy/resolution;\n vec3 ca_color = texture2D(ca_state, st).rgb;\n float ca_intensity = dot(ca_color, vec3(0.299, 0.587, 0.114));\n float caValue = texture2D(ca_state, (gl_FragCoord.xy / resolution)).r;\n\n\n float rnd = random( st );\n float pct = 0.0;\n\n vec2 randomRectPosA = randomRectPos * resolution;\n vec2 randomRectSizeA = randomRectSize * resolution;\n\n vec2 randomCircPosA = randomCircPos * resolution;\n vec2 randomCircSizeA = randomCircSize * resolution;\n\n pct = distance(st,vec2(0.5));\n\n float DS = diffusion_scale + env[2] * diffusion_scale_variation;\n vec2 angles = (1.0 + vec2(env[3], field ? env[0] : env[3])) * PI;\n float caInfluence = float(caValue > caThreshold);\n float F = feed + env[0] * feed_variation;\n float K = kill + env[1] * kill_variation;\n\n \n bool insideRectangle = (gl_FragCoord.x > randomRectPosA.x && gl_FragCoord.x < randomRectPosA.x + randomRectSizeA.x) &&\n (gl_FragCoord.y > randomRectPosA.y && gl_FragCoord.y < randomRectPosA.y + randomRectSizeA.y);\n\n bool insideCircle = insideCircle(gl_FragCoord.xy, randomCircPosA, randomCircSizeA.x); \n\n if (insideRectangle) {\n K += 0.003;\n }\n\n if (insideCircle) {\n K += 0.0025;\n }\n\n vec2 old = s(0, 0);\n\n vec2 reaction = vec2(-1.0, 1.0) * old[0] * old[1] * old[1] * (1.0 + caInfluence * ca_factor);\n vec2 dissipation = vec2(F * (1.0 - old[0]), -old[1] * (K + F));\n vec2 diffusion = anisotropicDiffusion(angles, anisotropy, old) * DS * vec2(1.0, 0.5);\n float dt = 1.0 / (4.0 * DS);\n gl_FragColor.xy = old + (reaction + dissipation + diffusion) * dt;\n float edgeDistX = min(gl_FragCoord.x, resolution.x - gl_FragCoord.x);\n float edgeDistY = min(gl_FragCoord.y, resolution.y - gl_FragCoord.y);\n float edgeDist = min(edgeDistX, edgeDistY);\n if (edgeDist <= borderSize) {\n gl_FragColor.x = 0.0;\n gl_FragColor.y = 0.0;\n }\n\n if (mouse_down) {\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, mouse_pos), 0.0) / R;\n }\n\n if (reset) {\n gl_FragColor = vec4(0.0);\n }\n\n if(add)\n {\n vec2 pointPositions[10];\n pointPositions[0] = point_pos1;\n pointPositions[1] = point_pos2;\n pointPositions[2] = point_pos3;\n pointPositions[3] = point_pos4;\n pointPositions[4] = point_pos5;\n pointPositions[5] = point_pos6;\n pointPositions[6] = point_pos7;\n pointPositions[7] = point_pos8;\n pointPositions[8] = point_pos9;\n pointPositions[9] = point_pos0;\n\n for (int i = 0; i < 10; i++) {\n vec2 pointPos = pointPositions[i];\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, pointPos), 0.0) / R;\n }\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, point_posR), 0.0) / R;\n\n }\n }\n\n","addResolutionDefine","PlaneBufferGeometry","#E23DB3","addVariable","u_time","variables","onmousedown","uniform sampler2D passThruTexture;\n\nvoid main() {\n\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n\n gl_FragColor = texture2D( passThruTexture, uv );\n\n}\n","addEventListener"];return(_0x5f48=function(){return $})()}function render($){let x=_0x887e8a;if(simulateReactionDiffusion(settings.simfrRate),material[x(185)][x(222)][x(294)]=gpu_compute.getCurrentRenderTarget(reaction_diffusion_variable)[x(228)],elapsedTime+=.01,material[x(185)][x(268)].value=elapsedTime,rdu[x(180)]={value:.001*$},renderer[x(258)](scene,camera),!0===render[x(186)]){render.save_image=!1;let e=document.getElementById(x(304));e[x(269)]=render.savename,e[x(255)]=renderer.domElement[x(188)](),e[x(223)]()}renderer[x(332)][x(258)][x(239)]>=2e3&&renderer[x(332)][x(258)].frame<5e3?rdu[x(261)]={value:!0}:rdu.add={value:!1}}function simulateReactionDiffusion($){let x=_0x887e8a;for(let e=0;e<$;e++)gpu_compute[x(167)]()}function createEnvironment($=!0){let x=_0x887e8a;if(!$&&void 0!==createEnvironment.prev_scale&&createEnvironment[x(240)]===Settings[x(319)])return;createEnvironment[x(240)]=settings.environment_noise_scale;let e=new SimplexNoise(R),a=Array.from({length:4},()=>1e3*R.random_dec()),o=1/settings[x(319)],r={x:simulation_width/2,y:simulation_height/2},t=(r.x,r.y,new Float32Array(simulation_width*simulation_height*4));for(let n=0;n<simulation_height;n++)for(let c=0;c<simulation_width;c++)for(let l=0;l<4;l++)t[(n*simulation_width+c)*4+l]=e.noise3d((c+.5)*o,(n+.5)*(!0===settings[x(321)]?1:o),a[l]);rdu[x(247)]={value:new THREE.DataTexture(t,simulation_width,simulation_height,THREE[x(320)],THREE.FloatType)},rdu[x(247)][x(294)][x(280)]=THREE[x(206)],rdu[x(247)][x(294)][x(205)]=THREE[x(206)];let d=new THREE[x(248)](t,simulation_width,simulation_height,THREE[x(320)],THREE.FloatType);d.magFilter=THREE.LinearFilter,d[x(205)]=THREE[x(206)],material[x(185)].noise_texture[x(294)]=d}function updateMousePos($){let x=_0x887e8a,e=$[x(291)]*(simulation_width/width),a=simulation_height-$[x(200)]*(simulation_height/height);rdu[x(230)][x(294)][x(203)]([e,a])}function onMove($){let x=_0x887e8a;updateMousePos($),rdu[x(199)].value=mouse_down&&(brush_move=!0)}function onUp(){let $=_0x887e8a;mouse_down=!1,brush_move=!1,rdu[$(199)].value=!1}function onDown(){mouse_down=!0}function handleTouchEvent($,x){let e=_0x887e8a,a="touchend"===$[e(327)]||$[e(327)]===e(281)?$[e(306)]:$[e(314)];1===a[e(166)]&&($.preventDefault(),x(a[0]))}createEnvironment(),gpu_compute[_0x887e8a(274)](),animate(),renderer[_0x887e8a(279)][_0x887e8a(182)]=onDown,renderer[_0x887e8a(279)][_0x887e8a(253)]=renderer[_0x887e8a(279)][_0x887e8a(208)]=onUp,renderer[_0x887e8a(279)].onmousemove=onMove,[_0x887e8a(221),_0x887e8a(267),_0x887e8a(281),_0x887e8a(170)][_0x887e8a(207)]($=>{let x=_0x887e8a;renderer.domElement[x(184)]($,e=>{let a=x;$===a(221)?handleTouchEvent(e,onDown):$===a(170)?handleTouchEvent(e,onMove):handleTouchEvent(e,onUp)},!1)}),window[_0x887e8a(184)](_0x887e8a(265),function(){let $=_0x887e8a;renderer.getSize(rendererSize),responsiveBorderSize=borderProportion*Math.min(rendererSize.x,rendererSize.y),material.uniforms[$(217)][$(294)]=responsiveBorderSize},!1);
const _0x5ca5b5=_0x51d1;(function($,x){let e=_0x51d1,a=$();for(;;)try{let o=parseInt(e(281))/1*(-parseInt(e(223))/2)+parseInt(e(221))/3*(-parseInt(e(282))/4)+parseInt(e(270))/5+parseInt(e(275))/6+parseInt(e(294))/7+-parseInt(e(220))/8+parseInt(e(271))/9;if(274020===o)break;a.push(a.shift())}catch(t){a.push(a.shift())}})(_0x282e,274020),THREE.GPUComputationRenderer=function($,x,e){let a=_0x51d1;this[a(194)]=[],this[a(203)]=0;var o=new THREE[a(249)],t=new THREE[a(273)];t[a(329)].z=1;var r={passThruTexture:{value:null}},c=d(a(187),r),n=new THREE[a(254)](new THREE[a(322)](2,2),c);function l(e){let o=a;e[o(261)].resolution=o(345)+$[o(332)](1)+", "+x[o(332)](1)+" )"}function d($,x){x=x||{};var e=new THREE[a(247)]({uniforms:x,vertexShader:"void main() {\n\n gl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:$});return l(e),e}o[a(337)](n),this[a(181)]=function($,x,e){let o=a;var t={name:$,initialValueTexture:e,material:this[o(208)](x),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:THREE[o(165)],magFilter:THREE[o(165)]};return this[o(194)].push(t),t},this[a(244)]=function($,x){let e=a;$[e(295)]=x},this[a(265)]=function(){let o=a;if(!e[o(307)].get(o(225))&&!e.capabilities.isWebGL2)return"No OES_texture_float support for float textures.";if(0===e[o(308)].maxVertexTextures)return o(320);for(var t=0;t<this.variables[o(257)];t++){var r=this[o(194)][t];r[o(236)][0]=this.createRenderTarget($,x,r[o(302)],r[o(287)],r[o(297)],r[o(328)]),r[o(236)][1]=this.createRenderTarget($,x,r[o(302)],r[o(287)],r[o(297)],r.magFilter),this[o(182)](r.initialValueTexture,r[o(236)][0]),this.renderTexture(r[o(178)],r[o(236)][1]);var c=r[o(173)],n=c[o(248)];if(null!==r.dependencies)for(var l=0;l<r[o(295)][o(257)];l++){var d=r[o(295)][l];if(d.name!==r[o(186)]){for(var s=!1,f=0;f<this.variables[o(257)];f++)if(d[o(186)]===this.variables[f].name){s=!0;break}if(!s)return o(276)+r[o(186)]+o(279)+d.name}n[d[o(186)]]={value:null},c[o(197)]=o(291)+d[o(186)]+";\n"+c[o(197)]}}return this.currentTextureIndex=0,null},this[a(193)]=function(){let $=a;for(var x=this.currentTextureIndex,e=0===this.currentTextureIndex?1:0,o=0,t=this[$(194)][$(257)];o<t;o++){var r=this[$(194)][o];if(null!==r[$(295)])for(var c=r[$(173)][$(248)],n=0,l=r[$(295)][$(257)];n<l;n++){var d=r.dependencies[n];c[d[$(186)]].value=d.renderTargets[x].texture}this.doRenderTarget(r[$(173)],r[$(236)][e])}this[$(203)]=e},this[a(267)]=function($){let x=a;return $[x(236)][this[x(203)]]},this[a(347)]=function($){let x=a;return $[x(236)][0===this[x(203)]?1:0]},this[a(331)]=l,this[a(208)]=d,this[a(196)]=function(e,o,t,r,c,n){let l=a;return e=e||$,o=o||x,t=t||THREE[l(336)],r=r||THREE[l(336)],c=c||THREE[l(179)],n=n||THREE.NearestFilter,new THREE.WebGLRenderTarget(e,o,{wrapS:t,wrapT:r,minFilter:c,magFilter:n,format:THREE[l(204)],type:/(iPad|iPhone|iPod)/g[l(169)](navigator[l(183)])?THREE[l(313)]:THREE[l(238)],stencilBuffer:!1,depthBuffer:!1})},this[a(213)]=function(){let e=a;var o=new Float32Array($*x*4);return new THREE[e(298)](o,$,x,THREE[e(204)],THREE[e(238)])},this[a(182)]=function($,x){let e=a;r[e(233)][e(164)]=$,this[e(243)](c,x),r[e(233)].value=null},this[a(243)]=function($,x){let r=a;var l=e[r(167)]();n[r(173)]=$,e[r(189)](x),e[r(176)](o,t),n[r(173)]=c,e[r(189)](l)}};let render_vertex=_0x5ca5b5(226),render_fragment=_0x5ca5b5(171),reaction_diffusion_fragment=_0x5ca5b5(188);const width=window[_0x5ca5b5(200)],height=window[_0x5ca5b5(210)],actual_width=Math[_0x5ca5b5(222)](width),actual_height=Math[_0x5ca5b5(222)](height),simulation_width=Math[_0x5ca5b5(222)](actual_width/1.75),simulation_height=Math.round(actual_height/1.75),aspectRatio=window.innerWidth/window[_0x5ca5b5(210)];class Random{constructor(){let $=_0x5ca5b5;this[$(190)]=!1;let x=function(x){let e=$,a=parseInt(x[e(309)](0,8),16),o=parseInt(x.substring(8,16),16),t=parseInt(x[e(309)](16,24),16),r=parseInt(x.substring(24,32),16);return function(){a|=0,o|=0,t|=0;let $=(a+o|0)+(r|=0)|0;return r=r+1|0,a=o^o>>>9,o=t+(t<<3)|0,t=(t=t<<21|t>>>11)+$|0,($>>>0)/4294967296}};this[$(321)]=new x(tokenData[$(215)].substring(2,34)),this[$(201)]=new x(tokenData.hash.substring(34,66));for(let e=0;e<1e6;e+=2)this[$(321)](),this[$(201)]()}[_0x5ca5b5(168)](){let $=_0x5ca5b5;return this[$(190)]=!this[$(190)],this[$(190)]?this[$(321)]():this[$(201)]()}[_0x5ca5b5(206)]($,x){return $+(x-$)*this[_0x5ca5b5(168)]()}[_0x5ca5b5(258)]($,x){return Math.floor(this[_0x5ca5b5(206)]($,x+1))}[_0x5ca5b5(237)]($){return this[_0x5ca5b5(168)]()<$}[_0x5ca5b5(177)]($){let x=_0x5ca5b5;return $[this[x(258)](0,$[x(257)]-1)]}}class SimplexNoise{constructor($){let x=_0x5ca5b5;this[x(239)]=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let e=0;e<256;e++)this.p[e]=Math[x(246)](256*$[x(168)]());this[x(219)]=Array(512);for(let a=0;a<512;a++)this[x(219)][a]=this.p[255&a]}[_0x5ca5b5(274)]($,x,e,a){return $[0]*x+$[1]*e+$[2]*a}[_0x5ca5b5(310)]($,x,e){let a=_0x5ca5b5,o=1/6,t,r,c,n,l=($+x+e)*(1/3),d=Math[a(246)]($+l),s=Math.floor(x+l),f=Math[a(246)](e+l),u=(d+s+f)*o,_=$-(d-u),b=x-(s-u),m=e-(f-u),g,v,h,p,C,F;_>=b?b>=m?(g=1,v=0,h=0,p=1,C=1,F=0):_>=m?(g=1,v=0,h=0,p=1,C=0,F=1):(g=0,v=0,h=1,p=1,C=0,F=1):b<m?(g=0,v=0,h=1,p=0,C=1,F=1):_<m?(g=0,v=1,h=0,p=0,C=1,F=1):(g=0,v=1,h=0,p=1,C=1,F=0);let T=_-g+o,w=b-v+o,y=m-h+o,k=_-p+2*o,S=b-C+2*o,D=m-F+2*o,A=_-1+3*o,P=b-1+3*o,V=m-1+3*o,E=255&d,B=255&s,z=255&f,W=this[a(219)][E+this[a(219)][B+this[a(219)][z]]]%12,K=this[a(219)][E+g+this[a(219)][B+v+this[a(219)][z+h]]]%12,I=this[a(219)][E+p+this[a(219)][B+C+this[a(219)][z+F]]]%12,U=this[a(219)][E+1+this[a(219)][B+1+this.perm[z+1]]]%12,M=.6-_*_-b*b-m*m;M<0?t=0:(M*=M,t=M*M*this[a(274)](this.grad3[W],_,b,m));let G=.6-T*T-w*w-y*y;G<0?r=0:(G*=G,r=G*G*this[a(274)](this.grad3[K],T,w,y));let H=.6-k*k-S*S-D*D;H<0?c=0:(H*=H,c=H*H*this[a(274)](this[a(239)][I],k,S,D));let L=.6-A*A-P*P-V*V;return L<0?n=0:(L*=L,n=L*L*this[a(274)](this.grad3[U],A,P,V)),32*(t+r+c+n)}}let R=new Random;function getRandomArbitrary($,x){return R.random_dec()*(x-$)+$}function _0x51d1($,x){let e=_0x282e();return(_0x51d1=function($,x){return e[$-=160]})($,x)}let diffScaleArray=[.25,.375,.5],diffScale=selectFromArray(diffScaleArray),diffScaleVar=selectFromArray([diffScale-.125,diffScale-.125]),diffScaleArrayWide=[.5,.625,.75,.875,1],diffScaleWide=selectFromArray(diffScaleArrayWide),diffScaleVarWide=selectFromArray([0,diffScale-.125]),feedVar=getRandomArbitrary(0,.01),killVar=getRandomArbitrary(0,.01),randomRect,randomCirc;function selectFromArray($){let x=_0x5ca5b5;return $[Math[x(246)](R[x(168)]()*$[x(257)])]}function selectNumberFromArray($){let x=_0x5ca5b5;return Math[x(246)](R[x(168)]()*$.length)}function _0x282e(){let $=["#f5f5f0","minFilter","DataTexture","RGBFormat","background","reaction_diffusion","wrapS","kill_variation","preventDefault","getElementById","info","extensions","capabilities","substring","noise3d","reset","texture","HalfFloatType","keys","from","kill_modifier","GPUComputationRenderer","save-link","u_time","No support for vertex shader textures.","prngA","PlaneBufferGeometry","Growth:","#0000FF","fromArray","Vector3","c4_color","magFilter","position","setSize","addResolutionDefine","toFixed","divideScalar","environment","#FFFFFF","ClampToEdgeWrapping","add","Vector2","#C7AFF0","now","#ffff00","appendChild","substance_color","frame","vec2( ","field","getAlternateRenderTarget","time","#AE2029","#DE87B7","substance","value","LinearFilter","mouse_pos","getRenderTarget","random_dec","test","#f2f2f2","\n\n varying vec2 vUv;\n\n uniform sampler2D reaction_diffusion;\n uniform vec3 substance_color;\n uniform vec3 background_color;\n uniform vec3 middle_color;\n uniform vec3 c4_color;\n uniform vec3 c5_color;\n uniform vec4 randomRect;\n uniform vec3 circle;\n uniform sampler2D noiseTexture;\n\n void main() {\n vec4 texColor = texture2D(reaction_diffusion, vUv);\n float h = texColor.g;\n\n vec3 colorA = background_color;\n vec3 colorB = middle_color;\n vec3 colorC = substance_color;\n vec3 colorD = c4_color;\n vec3 colorE = c5_color;\n\n float baseEdge0 = 0.0;\n float baseEdge1 = 0.075;\n float baseEdge2 = 0.175;\n float baseEdge3 = 0.275;\n float baseEdge4 = 0.375;\n\n float noiseValue = texture2D(noiseTexture, vUv).r;\n float edgeVariation = noiseValue * 0.1;\n\n float edge0 = baseEdge0 + edgeVariation;\n float edge1 = baseEdge1 + edgeVariation;\n float edge2 = baseEdge2 + edgeVariation;\n float edge3 = baseEdge3 + edgeVariation;\n float edge4 = baseEdge4 + edgeVariation;\n\n vec3 finalColor;\n\n if (h < edge1) {\n float t = clamp((h - edge0) / (edge1 - edge0), 0.0, 1.0);\n finalColor = mix(colorA, colorB, t);\n } else if (h < edge2) {\n float t = clamp((h - edge1) / (edge2 - edge1), 0.0, 1.0);\n finalColor = mix(colorB, colorC, t);\n } else if (h < edge3) {\n float t = clamp((h - edge2) / (edge3 - edge2), 0.0, 1.0);\n finalColor = mix(colorC, colorD, t);\n } else if (h < edge4) {\n float t = clamp((h - edge3) / (edge4 - edge3), 0.0, 1.0);\n finalColor = mix(colorD, colorE, t);\n } else {\n finalColor = colorE;\n }\n\n gl_FragColor = vec4(finalColor, 1.0);\n }\n\n","#D03A20","material","sqrt","randomRectPos","render","random_choice","initialValueTexture","NearestFilter","#b42024","addVariable","renderTexture","userAgent","setPixelRatio","prev_scale","name","uniform sampler2D passThruTexture;\n\nvoid main() {\n\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n\n gl_FragColor = texture2D( passThruTexture, uv );\n\n}\n","\n\n uniform sampler2D environment;\n\n uniform float feed;\n uniform float kill;\n uniform float diffusion_scale;\n\n uniform float feed_variation;\n uniform float kill_variation;\n uniform bool isRect;\n uniform float diffusion_scale_variation;\n\n uniform float anisotropy;\n uniform bool field;\n\n uniform float feed_modifier;\n uniform float kill_modifier;\n\n uniform vec2 mouse_pos;\n uniform vec2 point_pos0;\n uniform vec2 point_pos1;\n uniform vec2 point_pos2;\n uniform vec2 point_pos3;\n uniform vec2 point_pos4;\n uniform vec2 point_pos5;\n uniform vec2 point_pos6;\n uniform vec2 point_pos7;\n uniform vec2 point_pos8;\n uniform vec2 point_pos9;\n uniform vec2 point_posR;\n uniform bool mouse_down;\n\n uniform bool reset;\n uniform bool add;\n\n uniform vec4 randomRect;\n uniform vec4 randomCirc;\n\n uniform vec2 randomRectPos;\n uniform vec2 randomRectSize;\n uniform vec2 randomCircPos;\n uniform vec2 randomCircSize;\n uniform float borderSize;\n\n uniform vec2 rect_top_left;\n uniform vec2 rect_bottom_right;\n\n uniform sampler2D ca_state;\n uniform float caThreshold;\n uniform float ca_factor;\n \n\n #define p2(v) v * v\n #define PI 3.14159265358979323846\n\n \n #define R 10.0\n #define borderWidth 20.0\n #define rectBorderWidth 2.0\n\n #define s(x, y) texture2D(reaction_diffusion, (gl_FragCoord.xy + vec2(x, y)) / resolution).xy\n\n vec2 anisotropicDiffusion(vec2 angles, float a1, vec2 center)\n {\n vec2\n v00 = s(-1, 1), v10 = s(0, 1), v20 = s(1, 1),\n v01 = s(-1, 0), v21 = s(1, 0),\n v02 = s(-1,-1), v12 = s(0,-1), v22 = s(1,-1);\n\n vec2 cos_t = cos(angles);\n vec2 sin_t = sin(angles);\n\n vec2 cos2_t = p2(cos_t);\n vec2 sin2_t = p2(sin_t);\n\n float a2 = 1.0 - a1;\n\n vec2 d = 4.0 * (a2 - a1) * p2(cos_t * sin_t);\n vec2 h = 8.0 * (a1 * cos2_t + a2 * sin2_t);\n vec2 v = 8.0 * (a2 * cos2_t + a1 * sin2_t);\n\n return ((1.0 - d) * (v00 + v22) + (1.0 + d) * (v20 + v02) + h * (v01 + v21) + v * (v10 + v12) - 20.0 * center) / 6.0;\n }\n\n float random (vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n }\n bool insideCircle(vec2 point, vec2 center, float radius) {\n return distance(point, center) <= radius;\n }\n\n\n void main() {\n vec4 env = texture2D(environment, (gl_FragCoord.xy / resolution).xy);\n vec2 st = gl_FragCoord.xy/resolution;\n vec3 ca_color = texture2D(ca_state, st).rgb;\n float ca_intensity = dot(ca_color, vec3(0.299, 0.587, 0.114));\n float caValue = texture2D(ca_state, (gl_FragCoord.xy / resolution)).r;\n\n\n float rnd = random( st );\n float pct = 0.0;\n\n vec2 randomRectPosA = randomRectPos * resolution;\n vec2 randomRectSizeA = randomRectSize * resolution;\n\n vec2 randomCircPosA = randomCircPos * resolution;\n vec2 randomCircSizeA = randomCircSize * resolution;\n\n pct = distance(st,vec2(0.5));\n\n float DS = diffusion_scale + env[2] * diffusion_scale_variation;\n vec2 angles = (1.0 + vec2(env[3], field ? env[0] : env[3])) * PI;\n float caInfluence = float(caValue > caThreshold);\n float F = feed + env[0] * feed_variation;\n float K = kill + env[1] * kill_variation;\n\n \n bool insideRectangle = (gl_FragCoord.x > randomRectPosA.x && gl_FragCoord.x < randomRectPosA.x + randomRectSizeA.x) &&\n (gl_FragCoord.y > randomRectPosA.y && gl_FragCoord.y < randomRectPosA.y + randomRectSizeA.y);\n\n bool insideCircle = insideCircle(gl_FragCoord.xy, randomCircPosA, randomCircSizeA.x); \n\n if (insideRectangle) {\n K += 0.003;\n }\n\n if (insideCircle) {\n K += 0.0025;\n }\n\n vec2 old = s(0, 0);\n\n vec2 reaction = vec2(-1.0, 1.0) * old[0] * old[1] * old[1] * (1.0 + caInfluence * ca_factor);\n vec2 dissipation = vec2(F * (1.0 - old[0]), -old[1] * (K + F));\n vec2 diffusion = anisotropicDiffusion(angles, anisotropy, old) * DS * vec2(1.0, 0.5);\n float dt = 1.0 / (4.0 * DS);\n gl_FragColor.xy = old + (reaction + dissipation + diffusion) * dt;\n float edgeDistX = min(gl_FragCoord.x, resolution.x - gl_FragCoord.x);\n float edgeDistY = min(gl_FragCoord.y, resolution.y - gl_FragCoord.y);\n float edgeDist = min(edgeDistX, edgeDistY);\n if (edgeDist <= borderSize) {\n gl_FragColor.x = 0.0;\n gl_FragColor.y = 0.0;\n }\n\n if (mouse_down) {\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, mouse_pos), 0.0) / R;\n }\n\n if (reset) {\n gl_FragColor = vec4(0.0);\n }\n\n if(add)\n {\n vec2 pointPositions[10];\n pointPositions[0] = point_pos1;\n pointPositions[1] = point_pos2;\n pointPositions[2] = point_pos3;\n pointPositions[3] = point_pos4;\n pointPositions[4] = point_pos5;\n pointPositions[5] = point_pos6;\n pointPositions[6] = point_pos7;\n pointPositions[7] = point_pos8;\n pointPositions[8] = point_pos9;\n pointPositions[9] = point_pos0;\n\n for (int i = 0; i < 10; i++) {\n vec2 pointPos = pointPositions[i];\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, pointPos), 0.0) / R;\n }\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, point_posR), 0.0) / R;\n\n }\n }\n\n","setRenderTarget","useA","WebGLRenderer","toDataURL","compute","variables","anisotropy","createRenderTarget","fragmentShader","ca_state","environment_noise_scale","innerWidth","prngB","needsUpdate","currentTextureIndex","RGBAFormat","#df2126","random_num","randomRectSize","createShaderMaterial","diffusion_scale","innerHeight","kill","Settings:","createTexture","middle_color","hash","feed_modifier","feed_variation","set","perm","123168kECKPV","33yVfHuz","round","7662hRmPLq","includes","OES_texture_float","\n varying vec2 vUv;\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n\n","save_image","toString","diffusion_scale_variation","#000000","#00FF00","#98D82D","passThruTexture","padStart","randomCircSize","renderTargets","random_bool","FloatType","grad3","#FF0000","log","vec2(","doRenderTarget","setVariableDependencies","onmouseup","floor","ShaderMaterial","uniforms","Scene","#EBFF32","accent","noise_texture","ca_factor","Mesh","#ffffff","#FFC234","length","random_int","slice","touches","defines","warped","Vector4","devicePixelRatio","init","#FFFF99","getCurrentRenderTarget","clientY","borderSize","1068380DxziLC","3062466QqUSXW","#FFFFF1","Camera","dot","11724Evgkhm","Variable dependency not found. Variable=","#5BC2AC","savename",", dependency=","mouse_down","117cgzkYH","17676vkKtCU","#ff00ff","#F17401","palette:","background_color","wrapT","point_pos","#FF3C75","#e00000","\nuniform sampler2D ","domElement","download","1612436gppolJ","dependencies"];return(_0x282e=function(){return $})()}function getRandomBool($){return R[_0x5ca5b5(168)]()<$}function hexToRgb($){let x=parseInt($[_0x5ca5b5(259)](1),16),e=parseInt(x>>16&255),a=parseInt(x>>8&255),o=parseInt(255&x);return[e,a,o]}function getRandomBoolean(){return R[_0x5ca5b5(168)]()>=.5}let palettes={Candy:{background:"#E23DB3",accent:"#E23DB3",substance:_0x5ca5b5(256),c4:_0x5ca5b5(266),c5:_0x5ca5b5(335)},Color2:{background:_0x5ca5b5(161),accent:_0x5ca5b5(161),substance:_0x5ca5b5(232),c4:_0x5ca5b5(232),c5:_0x5ca5b5(232)},Color3:{background:_0x5ca5b5(284),accent:_0x5ca5b5(284),substance:"#EBFF32",c4:_0x5ca5b5(250),c5:_0x5ca5b5(250)},Color4:{background:_0x5ca5b5(289),accent:_0x5ca5b5(289),substance:"#FD97C4",c4:"#FD97C4",c5:"#FD97C4"},Color5:{background:_0x5ca5b5(230),accent:_0x5ca5b5(230),substance:_0x5ca5b5(335),c4:_0x5ca5b5(335),c5:"#FFFFFF"},Color6:{background:_0x5ca5b5(284),accent:_0x5ca5b5(284),substance:_0x5ca5b5(250),c4:"#EBFF32",c5:_0x5ca5b5(250)},Yayoi:{background:_0x5ca5b5(172),accent:"#D03A20",substance:_0x5ca5b5(335),c4:_0x5ca5b5(335),c5:_0x5ca5b5(335)},Gabee:{background:_0x5ca5b5(255),accent:_0x5ca5b5(296),substance:_0x5ca5b5(170),c4:"#f2f2f2",c5:_0x5ca5b5(255)},CMKY:{background:_0x5ca5b5(255),accent:(getRandomBoolean(),"#00ffff"),substance:_0x5ca5b5(283),c4:_0x5ca5b5(341),c5:_0x5ca5b5(255)},RGB:{background:_0x5ca5b5(230),accent:(getRandomBoolean(),_0x5ca5b5(231)),substance:_0x5ca5b5(240),c4:_0x5ca5b5(324),c5:_0x5ca5b5(335)},"30Rack":{background:_0x5ca5b5(180),accent:getRandomBoolean()?_0x5ca5b5(180):_0x5ca5b5(230),substance:"#b42024",c4:_0x5ca5b5(205),c5:"#df2126"},Mohun:{background:_0x5ca5b5(272),accent:(getRandomBoolean(),_0x5ca5b5(339)),substance:"#AFCDF0",c4:_0x5ca5b5(277),c5:_0x5ca5b5(162)},Q:{background:"#ffffff",accent:_0x5ca5b5(255),substance:_0x5ca5b5(290),c4:_0x5ca5b5(255),c5:"#ffffff"},Skeleton:{background:_0x5ca5b5(230),accent:_0x5ca5b5(255),substance:_0x5ca5b5(230),c4:_0x5ca5b5(230),c5:_0x5ca5b5(230)}};const defaultPallette={background:"#FF0000",accent:"#00FF00",substance:_0x5ca5b5(324)},traitColorKeys=Object[_0x5ca5b5(314)](palettes),randomColorIndex=R[_0x5ca5b5(258)](0,traitColorKeys[_0x5ca5b5(257)]-1),randomColorKey=traitColorKeys[randomColorIndex],randomColorTrait=palettes[randomColorKey],selectedColor={...defaultPallette,...randomColorTrait};console[_0x5ca5b5(241)](_0x5ca5b5(285),randomColorKey,"Colors:",selectedColor);let main_trait={Zebra:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.05,feed_variation:0,warped:getRandomBool(.2),kill:.061,kill_variation:0,feed_modifier:-.015,kill_modifier:-.001,anisotropy:selectFromArray([.25,.75]),environment_noise_scale:750,field:!0,substance_color:hexToRgb(selectedColor[_0x5ca5b5(163)]),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Fingerprint:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.037,feed_variation:0,warped:getRandomBool(.2),kill:.06,feed_modifier:.009,kill_modifier:.003,kill_modifier:0,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x5ca5b5(163)]),middle_color:hexToRgb(selectedColor[_0x5ca5b5(251)]),background_color:hexToRgb(selectedColor[_0x5ca5b5(300)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Dots and Dashes":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.034,feed_variation:0,warped:getRandomBool(.2),kill:.0618,kill_variation:0,feed_modifier:-.004,kill_modifier:.0012,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor[_0x5ca5b5(251)]),background_color:hexToRgb(selectedColor[_0x5ca5b5(300)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Yayoi:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.062,kill_variation:0,feed_modifier:0,kill_modifier:-.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor[_0x5ca5b5(251)]),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Spillage:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.035,feed_variation:.006,kill:.06,kill_variation:.006,feed_modifier:-.005,kill_modifier:-.0035,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor[_0x5ca5b5(251)]),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Coral:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.046,feed_variation:0,warped:getRandomBool(.2),kill:.063,kill_variation:0,feed_modifier:-.009,kill_modifier:-.003,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x5ca5b5(163)]),middle_color:hexToRgb(selectedColor[_0x5ca5b5(251)]),background_color:hexToRgb(selectedColor[_0x5ca5b5(300)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Squiggle Maze":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.0565,kill_variation:0,feed_modifier:0,kill_modifier:.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor[_0x5ca5b5(300)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64}};const defaultSettings={anisotropy:.8,simfrRate:64,environment_noise_scale:250,substance_color:[0,0,0],middle_color:[0,255,255],background_color:[255,255,255],c4_color:[0,255,255],background_color:[255,255,255],feed_modifier:0,kill_modifier:0,specular_color:[0,0,0],field:!1,warped:!1,diffusion_scale:.625,diffusion_scale_variation:.375,feed:.042,feed_variation:.001,kill:.06,kill_variation:.001},traitKeys=Object[_0x5ca5b5(314)](main_trait),randomIndex=Math.floor(R[_0x5ca5b5(168)]()*traitKeys[_0x5ca5b5(257)]),randomKey=traitKeys[randomIndex],randomTrait=main_trait[randomKey],settings={...defaultSettings,...randomTrait};console[_0x5ca5b5(241)](_0x5ca5b5(323),randomKey,_0x5ca5b5(212),settings);const scene=new THREE[_0x5ca5b5(249)],camera=new THREE[_0x5ca5b5(273)];camera.position.z=1;const renderer=new THREE[_0x5ca5b5(191)];renderer[_0x5ca5b5(184)](window[_0x5ca5b5(264)]),renderer[_0x5ca5b5(330)](width,height),document.body[_0x5ca5b5(342)](renderer.domElement);const getRandomInt=($,x)=>Math[_0x5ca5b5(246)](R[_0x5ca5b5(168)]()*($-x+1)+x),getRandomColor=()=>(16777215*R[_0x5ca5b5(168)]()<<0)[_0x5ca5b5(228)](16)[_0x5ca5b5(234)](6,"0");let elapsedTime=0,frameCounter=0;const updateFrequency=1;function getRandomFloat($,x){return R[_0x5ca5b5(168)]()*(x-$)+$}let isRect=R[_0x5ca5b5(177)]([1,2,3,4]);switch(isRect){case 1:randomRect=new THREE[_0x5ca5b5(263)](.5*R.random_dec(),0,.2,1),randomCirc=new THREE.Vector4(0,0,0,0);break;case 2:randomRect=new THREE[_0x5ca5b5(263)](0,0,0,0),randomCirc=new THREE[_0x5ca5b5(263)](.5,.5,.4,.4);break;case 3:randomRect=new THREE.Vector4(0,0,0,0),randomCirc=new THREE[_0x5ca5b5(263)](0,0,0,0);break;case 4:randomRect=new THREE.Vector4(.5*R.random_dec(),0,.2,1),randomCirc=new THREE[_0x5ca5b5(263)](.5,.5,.4,.4);break;default:randomRect=new THREE[_0x5ca5b5(263)](.5*R[_0x5ca5b5(168)](),0,.2,1),randomCirc=new THREE.Vector4(0,0,0,0)}const borderSizes=[10,30],borderSize=R.random_choice(borderSizes);let caEnabled=!!R[_0x5ca5b5(237)](.05);console.log("Aggressor: "+caEnabled);const ca_factor=!0===caEnabled?.8:0,caWidth=Math[_0x5ca5b5(246)](simulation_width/15),caHeight=Math[_0x5ca5b5(246)](simulation_height/15),caData=new Uint8Array(caWidth*caHeight*3);for(let i=0;i<caData[_0x5ca5b5(257)];i+=3){let $=.8>R.random_dec()?0:255;caData[i]=$,caData[i+1]=$,caData[i+2]=$}const caTexture=new THREE[_0x5ca5b5(298)](caData,caWidth,caHeight,THREE[_0x5ca5b5(299)]);caTexture[_0x5ca5b5(328)]=THREE[_0x5ca5b5(179)],caTexture.minFilter=THREE[_0x5ca5b5(179)],caTexture[_0x5ca5b5(302)]=THREE[_0x5ca5b5(336)],caTexture[_0x5ca5b5(287)]=THREE[_0x5ca5b5(336)],caTexture[_0x5ca5b5(202)]=!0;const material=new THREE[_0x5ca5b5(247)]({vertexShader:render_vertex,fragmentShader:render_fragment,uniforms:{reaction_diffusion:{value:null},substance_color:{value:new THREE[_0x5ca5b5(326)]()[_0x5ca5b5(325)](settings[_0x5ca5b5(343)])[_0x5ca5b5(333)](255)},middle_color:{value:new THREE[_0x5ca5b5(326)]().fromArray(settings[_0x5ca5b5(214)])[_0x5ca5b5(333)](255)},background_color:{value:new THREE[_0x5ca5b5(326)]()[_0x5ca5b5(325)](settings[_0x5ca5b5(286)])[_0x5ca5b5(333)](255)},c4_color:{value:new THREE[_0x5ca5b5(326)]()[_0x5ca5b5(325)](settings[_0x5ca5b5(327)])[_0x5ca5b5(333)](255)},c5_color:{value:new THREE.Vector3()[_0x5ca5b5(325)](settings.c5_color)[_0x5ca5b5(333)](255)},time:{value:0},noise_texture:{value:null},isRect:{value:isRect},randomRect:{value:randomRect},randomCirc:{value:randomCirc},ca_state:{value:caTexture}},defines:{frag2sim:"vec2("+simulation_width/actual_width+", "+simulation_height/actual_height+")",simulation_resolution:_0x5ca5b5(242)+simulation_width+", "+simulation_height+")"}});scene[_0x5ca5b5(337)](new THREE[_0x5ca5b5(254)](new THREE[_0x5ca5b5(322)](2,2),material));const gpu_compute=new THREE[_0x5ca5b5(317)](simulation_width,simulation_height,renderer),reaction_diffusion=gpu_compute.createTexture(),reaction_diffusion_variable=gpu_compute.addVariable(_0x5ca5b5(301),reaction_diffusion_fragment,reaction_diffusion);reaction_diffusion_variable[_0x5ca5b5(302)]=THREE[_0x5ca5b5(336)],reaction_diffusion_variable[_0x5ca5b5(287)]=THREE[_0x5ca5b5(336)],gpu_compute[_0x5ca5b5(244)](reaction_diffusion_variable,[reaction_diffusion_variable]);const rdu=reaction_diffusion_variable[_0x5ca5b5(173)][_0x5ca5b5(248)];rdu.mouse_pos={value:new THREE[_0x5ca5b5(338)](-100,-100)};for(let i=0;i<10;i++)rdu[_0x5ca5b5(288)+i]={value:new THREE[_0x5ca5b5(338)](getRandomInt(50,simulation_width-50),getRandomInt(50,simulation_height-50))};function updateCA(){let $=_0x5ca5b5,x=new Uint8Array(caWidth*caHeight*3),e=[1],a=[2,3];for(let o=0;o<caHeight;o++)for(let t=0;t<caWidth;t++){let r=(o*caWidth+t)*3,c=0;for(let n=-1;n<=1;n++)for(let l=-1;l<=1;l++){if(0===l&&0===n)continue;let d=(t+l+caWidth)%caWidth;255===caData[((o+n+caHeight)%caHeight*caWidth+d)*3]&&c++}let s=caData[r],f=c==e[0]||1==s&&a[$(224)](c)?1:0;f=255===s&&(2===c||3===c)?255:0===s&&3===c?255:0,x[r]=f,x[r+1]=f,x[r+2]=f}caData[$(218)](x),caTexture[$(202)]=!0}rdu[_0x5ca5b5(280)]={value:!1},rdu.feed={value:settings.feed},rdu[_0x5ca5b5(211)]={value:settings.kill},rdu[_0x5ca5b5(209)]={value:settings[_0x5ca5b5(209)]},rdu[_0x5ca5b5(217)]={value:settings[_0x5ca5b5(217)]},rdu[_0x5ca5b5(303)]={value:settings[_0x5ca5b5(303)]},rdu[_0x5ca5b5(216)]={value:settings[_0x5ca5b5(216)]},rdu.kill_modifier={value:settings[_0x5ca5b5(316)]},rdu[_0x5ca5b5(229)]={value:settings.diffusion_scale_variation},rdu.anisotropy={value:settings[_0x5ca5b5(195)]},rdu[_0x5ca5b5(311)]={value:!1},rdu[_0x5ca5b5(337)]={value:!1},rdu.field={value:settings[_0x5ca5b5(346)]},rdu.warped={value:settings[_0x5ca5b5(262)]},rdu[_0x5ca5b5(253)]={value:ca_factor},rdu[_0x5ca5b5(198)]={value:caTexture},rdu.caThreshold={value:.6},rdu[_0x5ca5b5(269)]={value:borderSize},rdu[_0x5ca5b5(175)]={value:new THREE.Vector2(randomRect.x,randomRect.y)},rdu[_0x5ca5b5(207)]={value:new THREE[_0x5ca5b5(338)](randomRect.z,randomRect.w)},rdu.randomCircPos={value:new THREE[_0x5ca5b5(338)](randomCirc.x,randomCirc.y)},rdu[_0x5ca5b5(235)]={value:new THREE[_0x5ca5b5(338)](randomCirc.z,randomCirc.w)};const caDuration=3e4,maxUpdateFrequency=10;let startTime=Date[_0x5ca5b5(340)]();function animate(){let $=_0x5ca5b5;if(requestAnimationFrame(animate),frameCounter++,caEnabled){let x=Date[$(340)]()-startTime;if(x<3e4){var e,a=0,o=3e4,t=1,r=10;let c=Math[$(246)]((e=x,t+(e-a)*(10-t)/(3e4-a)));frameCounter%c==0&&updateCA()}else caEnabled=!1}render()}function render($){let x=_0x5ca5b5;if(simulateReactionDiffusion(settings.simfrRate),material.uniforms[x(301)][x(164)]=gpu_compute[x(267)](reaction_diffusion_variable)[x(312)],elapsedTime+=.01,material[x(248)][x(160)][x(164)]=elapsedTime,rdu[x(319)]={value:.001*$},renderer[x(176)](scene,camera),!0===render[x(227)]){render[x(227)]=!1;let e=document[x(305)](x(318));e[x(293)]=render[x(278)],e.href=renderer[x(292)][x(192)](),e.click()}renderer[x(306)][x(176)].frame>=2e3&&renderer.info.render[x(344)]<5e3?rdu[x(337)]={value:!0}:rdu.add={value:!1}}function simulateReactionDiffusion($){for(let x=0;x<$;x++)gpu_compute.compute()}function createEnvironment($=!0){let x=_0x5ca5b5;if(!$&&void 0!==createEnvironment[x(185)]&&createEnvironment[x(185)]===Settings[x(199)])return;createEnvironment[x(185)]=settings[x(199)];let e=new SimplexNoise(R),a=Array[x(315)]({length:4},()=>1e3*R[x(168)]()),o=1/settings[x(199)],t={x:simulation_width/2,y:simulation_height/2},r=(t.x,t.y,new Float32Array(simulation_width*simulation_height*4));for(let c=0;c<simulation_height;c++)for(let n=0;n<simulation_width;n++)for(let l=0;l<4;l++)r[(c*simulation_width+n)*4+l]=e[x(310)]((n+.5)*o,(c+.5)*(!0===settings.warped?1:o),a[l]);rdu[x(334)]={value:new THREE[x(298)](r,simulation_width,simulation_height,THREE[x(204)],THREE[x(238)])},rdu.environment[x(164)][x(328)]=THREE[x(165)],rdu[x(334)][x(164)][x(297)]=THREE.LinearFilter;let d=new THREE[x(298)](r,simulation_width,simulation_height,THREE[x(204)],THREE[x(238)]);d[x(328)]=THREE[x(165)],d.minFilter=THREE[x(165)],material[x(248)][x(252)][x(164)]=d}function updateMousePos($){let x=_0x5ca5b5,e=$.clientX*(simulation_width/width),a=simulation_height-$[x(268)]*(simulation_height/height);rdu[x(166)][x(164)].fromArray([e,a])}function onMove($){let x=_0x5ca5b5;updateMousePos($),rdu[x(280)][x(164)]=mouse_down&&(brush_move=!0)}function onUp(){let $=_0x5ca5b5;mouse_down=brush_move=!1,rdu.mouse_down[$(164)]=!1}function onDown(){mouse_down=!0}function handleTouchEvent($,x){let e=_0x5ca5b5;1===$.touches[e(257)]&&($[e(304)](),x($[e(260)][0]))}createEnvironment(),gpu_compute[_0x5ca5b5(265)](),animate(),renderer[_0x5ca5b5(292)].onmousedown=onDown,renderer[_0x5ca5b5(292)][_0x5ca5b5(245)]=renderer[_0x5ca5b5(292)].onmouseleave=onUp,renderer[_0x5ca5b5(292)].onmousemove=onMove;
const _0x283a37=_0x3aa4;(function($,x){let e=_0x3aa4,a=$();for(;;)try{let o=-parseInt(e(632))/1*(parseInt(e(591))/2)+-parseInt(e(653))/3*(-parseInt(e(573))/4)+-parseInt(e(497))/5+-parseInt(e(677))/6+parseInt(e(583))/7*(-parseInt(e(498))/8)+parseInt(e(640))/9*(-parseInt(e(630))/10)+parseInt(e(683))/11*(parseInt(e(568))/12);if(510516===o)break;a.push(a.shift())}catch(t){a.push(a.shift())}})(_0x107a,510516),THREE[_0x283a37(681)]=function($,x,e){let a=_0x283a37;this[a(588)]=[],this[a(571)]=0;var o=new THREE[a(565)],t=new THREE[a(678)];t[a(684)].z=1;var r={passThruTexture:{value:null}},n=f(a(519),r),c=new THREE[a(579)](new THREE[a(641)](2,2),n);function l(e){let o=a;e[o(541)][o(547)]=o(566)+$[o(521)](1)+", "+x.toFixed(1)+" )"}function f($,x){let e=a;x=x||{};var o=new THREE[e(503)]({uniforms:x,vertexShader:e(624),fragmentShader:$});return l(o),o}o.add(c),this[a(525)]=function($,x,e){let o=a;var t={name:$,initialValueTexture:e,material:this[o(645)](x),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:THREE[o(589)],magFilter:THREE[o(589)]};return this[o(588)][o(673)](t),t},this[a(526)]=function($,x){$.dependencies=x},this[a(490)]=function(){let o=a;if(!e[o(543)][o(667)](o(687))&&!e.capabilities[o(516)])return o(586);if(0===e[o(575)][o(561)])return o(646);for(var t=0;t<this[o(588)][o(509)];t++){var r=this[o(588)][t];r[o(623)][0]=this[o(593)]($,x,r[o(686)],r.wrapT,r[o(619)],r.magFilter),r[o(623)][1]=this[o(593)]($,x,r.wrapS,r[o(680)],r[o(619)],r[o(597)]),this[o(661)](r.initialValueTexture,r[o(623)][0]),this[o(661)](r[o(524)],r[o(623)][1]);var n=r.material,c=n[o(607)];if(null!==r[o(533)])for(var l=0;l<r.dependencies[o(509)];l++){var f=r[o(533)][l];if(f[o(532)]!==r[o(532)]){for(var s=!1,d=0;d<this[o(588)][o(509)];d++)if(f[o(532)]===this[o(588)][d][o(532)]){s=!0;break}if(!s)return o(493)+r[o(532)]+o(659)+f.name}c[f[o(532)]]={value:null},n[o(633)]=o(495)+f.name+";\n"+n[o(633)]}}return this.currentTextureIndex=0,null},this[a(612)]=function(){let $=a;for(var x=this[$(571)],e=0===this.currentTextureIndex?1:0,o=0,t=this[$(588)][$(509)];o<t;o++){var r=this[$(588)][o];if(null!==r.dependencies)for(var n=r[$(656)][$(607)],c=0,l=r.dependencies[$(509)];c<l;c++){var f=r.dependencies[c];n[f[$(532)]][$(634)]=f[$(623)][x][$(578)]}this[$(643)](r.material,r[$(623)][e])}this[$(571)]=e},this[a(562)]=function($){return $.renderTargets[this[a(571)]]},this[a(601)]=function($){return $[a(623)][0===this.currentTextureIndex?1:0]},this[a(531)]=l,this[a(645)]=f,this[a(593)]=function(e,o,t,r,n,c){let l=a;return e=e||$,o=o||x,t=t||THREE.ClampToEdgeWrapping,r=r||THREE[l(536)],n=n||THREE[l(663)],c=c||THREE[l(663)],new THREE.WebGLRenderTarget(e,o,{wrapS:t,wrapT:r,minFilter:n,magFilter:c,format:THREE[l(528)],type:/(iPad|iPhone|iPod)/g.test(navigator.userAgent)?THREE[l(514)]:THREE[l(534)],stencilBuffer:!1,depthBuffer:!1})},this.createTexture=function(){var e=new Float32Array($*x*4);return new THREE[a(621)](e,$,x,THREE.RGBAFormat,THREE.FloatType)},this[a(661)]=function($,x){let e=a;r[e(636)].value=$,this.doRenderTarget(n,x),r[e(636)][e(634)]=null},this[a(643)]=function($,x){let r=a;var l=e[r(563)]();c[r(656)]=$,e[r(603)](x),e[r(655)](o,t),c.material=n,e[r(603)](l)}};let render_vertex=_0x283a37(522),render_fragment=_0x283a37(595),rdf=_0x283a37(559);const width=window[_0x283a37(560)],height=window[_0x283a37(606)],actual_width=Math[_0x283a37(638)](width),actual_height=Math.round(height),simulation_width=Math[_0x283a37(638)](actual_width/1.75),simulation_height=Math[_0x283a37(638)](actual_height/1.75),aspectRatio=window.innerWidth/window[_0x283a37(606)];class Random{constructor(){let $=_0x283a37;this[$(581)]=!1;let x=function(x){let e=$,a=parseInt(x[e(492)](0,8),16),o=parseInt(x.substring(8,16),16),t=parseInt(x[e(492)](16,24),16),r=parseInt(x[e(492)](24,32),16);return function(){a|=0,o|=0,t|=0;let $=(a+o|0)+(r|=0)|0;return r=r+1|0,a=o^o>>>9,o=t+(t<<3)|0,t=(t=t<<21|t>>>11)+$|0,($>>>0)/4294967296}};this[$(669)]=new x(tokenData[$(554)][$(492)](2,34)),this.prngB=new x(tokenData[$(554)][$(492)](34,66));for(let e=0;e<1e6;e+=2)this[$(669)](),this.prngB()}[_0x283a37(511)](){let $=_0x283a37;return this[$(581)]=!this.useA,this[$(581)]?this[$(669)]():this[$(527)]()}[_0x283a37(590)]($,x){return $+(x-$)*this[_0x283a37(511)]()}[_0x283a37(507)]($,x){return Math.floor(this[_0x283a37(590)]($,x+1))}random_bool($){return this[_0x283a37(511)]()<$}[_0x283a37(671)]($){let x=_0x283a37;return $[this[x(507)](0,$[x(509)]-1)]}}class SimplexNoise{constructor($){let x=_0x283a37;this[x(585)]=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let e=0;e<256;e++)this.p[e]=Math[x(631)](256*$[x(511)]());this[x(672)]=Array(512);for(let a=0;a<512;a++)this[x(672)][a]=this.p[255&a]}dot($,x,e,a){return $[0]*x+$[1]*e+$[2]*a}[_0x283a37(650)]($,x,e){let a=_0x283a37,o=1/6,t,r,n,c,l=($+x+e)*(1/3),f=Math[a(631)]($+l),s=Math[a(631)](x+l),d=Math[a(631)](e+l),u=(f+s+d)*o,m=$-(f-u),_=x-(s-u),g=e-(d-u),v,h,p,b,C,F;m>=_?_>=g?(v=1,h=0,p=0,b=1,C=1,F=0):m>=g?(v=1,h=0,p=0,b=1,C=0,F=1):(v=0,h=0,p=1,b=1,C=0,F=1):_<g?(v=0,h=0,p=1,b=0,C=1,F=1):m<g?(v=0,h=1,p=0,b=0,C=1,F=1):(v=0,h=1,p=0,b=1,C=1,F=0);let T=m-v+o,w=_-h+o,y=g-p+o,k=m-b+2*o,S=_-C+2*o,D=g-F+2*o,A=m-1+3*o,P=_-1+3*o,E=g-1+3*o,B=255&f,V=255&s,z=255&d,W=this[a(672)][B+this.perm[V+this.perm[z]]]%12,I=this[a(672)][B+v+this[a(672)][V+h+this[a(672)][z+p]]]%12,K=this[a(672)][B+b+this[a(672)][V+C+this[a(672)][z+F]]]%12,U=this.perm[B+1+this[a(672)][V+1+this.perm[z+1]]]%12,G=.6-m*m-_*_-g*g;G<0?t=0:(G*=G,t=G*G*this[a(610)](this[a(585)][W],m,_,g));let M=.6-T*T-w*w-y*y;M<0?r=0:(M*=M,r=M*M*this.dot(this[a(585)][I],T,w,y));let Y=.6-k*k-S*S-D*D;Y<0?n=0:(Y*=Y,n=Y*Y*this[a(610)](this[a(585)][K],k,S,D));let H=.6-A*A-P*P-E*E;return H<0?c=0:(H*=H,c=H*H*this[a(610)](this[a(585)][U],A,P,E)),32*(t+r+n+c)}}let R=new Random;function getRandomArbitrary($,x){return R[_0x283a37(511)]()*(x-$)+$}let diffScaleArray=[.25,.375,.5],diffScale=selectFromArray(diffScaleArray),diffScaleVar=selectFromArray([diffScale-.125,diffScale-.125]),diffScaleArrayWide=[.5,.625,.75,.875,1],diffScaleWide=selectFromArray(diffScaleArrayWide),diffScaleVarWide=selectFromArray([0,diffScale-.125]),feedVar=getRandomArbitrary(0,.01),killVar=getRandomArbitrary(0,.01),randomRect,randomCirc;function selectFromArray($){let x=_0x283a37;return $[Math[x(631)](R[x(511)]()*$[x(509)])]}function selectNumberFromArray($){let x=_0x283a37;return Math[x(631)](R[x(511)]()*$[x(509)])}function getRandomBool($){return R[_0x283a37(511)]()<$}function hexToRgb($){let x=parseInt($[_0x283a37(639)](1),16),e=parseInt(x>>16&255),a=parseInt(x>>8&255),o=parseInt(255&x);return[e,a,o]}function getRandomBoolean(){return R[_0x283a37(511)]()>=.5}let palettes={Candy:{background:_0x283a37(598),accent:_0x283a37(598),substance:_0x283a37(599),c4:"#FFFF99",c5:"#FFFFFF"},Color2:{background:"#AE2029",accent:_0x283a37(508),substance:"#98D82D",c4:_0x283a37(644),c5:_0x283a37(644)},Color3:{background:_0x283a37(674),accent:_0x283a37(674),substance:_0x283a37(609),c4:"#EBFF32",c5:_0x283a37(609)},Color4:{background:_0x283a37(605),accent:_0x283a37(605),substance:_0x283a37(567),c4:"#FD97C4",c5:"#FD97C4"},Color5:{background:_0x283a37(587),accent:_0x283a37(587),substance:_0x283a37(596),c4:_0x283a37(596),c5:_0x283a37(596)},Color6:{background:_0x283a37(674),accent:"#F17401",substance:"#EBFF32",c4:"#EBFF32",c5:_0x283a37(609)},Yayoi:{background:"#D03A20",accent:_0x283a37(550),substance:_0x283a37(596),c4:"#FFFFFF",c5:"#FFFFFF"},Gabee:{background:_0x283a37(505),accent:_0x283a37(506),substance:_0x283a37(649),c4:_0x283a37(649),c5:_0x283a37(505)},CMKY:{background:"#ffffff",accent:(getRandomBoolean(),_0x283a37(545)),substance:_0x283a37(551),c4:_0x283a37(594),c5:_0x283a37(505)},RGB:{background:_0x283a37(587),accent:getRandomBoolean()?_0x283a37(491):"#00FF00",substance:_0x283a37(529),c4:_0x283a37(670),c5:_0x283a37(596)},"30Rack":{background:_0x283a37(572),accent:getRandomBoolean()?_0x283a37(572):_0x283a37(587),substance:_0x283a37(572),c4:_0x283a37(488),c5:_0x283a37(488)},Mohun:{background:"#FFFFF1",accent:getRandomBoolean()?_0x283a37(499):"#C7AFF0",substance:_0x283a37(542),c4:_0x283a37(523),c5:_0x283a37(540)},Q:{background:"#ffffff",accent:_0x283a37(505),substance:_0x283a37(538),c4:"#ffffff",c5:"#ffffff"},Skeleton:{background:_0x283a37(587),accent:_0x283a37(505),substance:_0x283a37(587),c4:_0x283a37(587),c5:_0x283a37(587)}};const defaultPallette={background:_0x283a37(529),accent:_0x283a37(491),substance:_0x283a37(670)},traitColorKeys=Object[_0x283a37(546)](palettes),randomColorIndex=R[_0x283a37(507)](0,traitColorKeys[_0x283a37(509)]-1),randomColorKey=traitColorKeys[randomColorIndex],randomColorTrait=palettes[randomColorKey],selectedColor={...defaultPallette,...randomColorTrait};console.log(_0x283a37(615),randomColorKey,_0x283a37(652),selectedColor);let main_trait={Zebra:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.05,feed_variation:0,warped:getRandomBool(.2),kill:.061,kill_variation:0,feed_modifier:-.015,kill_modifier:-.001,anisotropy:selectFromArray([.25,.75]),environment_noise_scale:750,field:!0,substance_color:hexToRgb(selectedColor[_0x283a37(614)]),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Fingerprint:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.037,feed_variation:0,warped:getRandomBool(.2),kill:.06,feed_modifier:.009,kill_modifier:.003,kill_modifier:0,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x283a37(614)]),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor[_0x283a37(608)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Dots and Dashes":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.034,feed_variation:0,warped:getRandomBool(.2),kill:.0618,kill_variation:0,feed_modifier:-.004,kill_modifier:.0012,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x283a37(614)]),middle_color:hexToRgb(selectedColor[_0x283a37(660)]),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Yayoi:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.062,kill_variation:0,feed_modifier:0,kill_modifier:-.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x283a37(614)]),middle_color:hexToRgb(selectedColor[_0x283a37(660)]),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Spillage:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.035,feed_variation:.006,kill:.06,kill_variation:.006,feed_modifier:-.005,kill_modifier:-.0035,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x283a37(614)]),middle_color:hexToRgb(selectedColor[_0x283a37(660)]),background_color:hexToRgb(selectedColor[_0x283a37(608)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},Coral:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.046,feed_variation:0,warped:getRandomBool(.2),kill:.063,kill_variation:0,feed_modifier:-.009,kill_modifier:-.003,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x283a37(614)]),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor[_0x283a37(608)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64},"Squiggle Maze":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.0565,kill_variation:0,feed_modifier:0,kill_modifier:.0065,anisotropy:.5,environment_noise_scale:250,field:getRandomBool(.3),substance_color:hexToRgb(selectedColor[_0x283a37(614)]),middle_color:hexToRgb(selectedColor[_0x283a37(660)]),background_color:hexToRgb(selectedColor[_0x283a37(608)]),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),simfrRate:64}};const defaultSettings={anisotropy:.8,simfrRate:64,environment_noise_scale:250,substance_color:[0,0,0],middle_color:[0,255,255],background_color:[255,255,255],c4_color:[0,255,255],background_color:[255,255,255],feed_modifier:0,kill_modifier:0,specular_color:[0,0,0],field:!1,warped:!1,diffusion_scale:.625,diffusion_scale_variation:.375,feed:.042,feed_variation:.001,kill:.06,kill_variation:.001},traitKeys=Object.keys(main_trait),randomIndex=Math.floor(R[_0x283a37(511)]()*traitKeys[_0x283a37(509)]),randomKey=traitKeys[randomIndex],randomTrait=main_trait[randomKey],settings={...defaultSettings,...randomTrait};console[_0x283a37(556)](_0x283a37(489),randomKey,_0x283a37(500),settings);const scene=new THREE.Scene,camera=new THREE.Camera;camera[_0x283a37(684)].z=1;const renderer=new THREE[_0x283a37(666)];renderer[_0x283a37(515)](window.devicePixelRatio),renderer.setSize(width,height),document.body[_0x283a37(501)](renderer.domElement);const getRandomInt=($,x)=>Math.floor(R[_0x283a37(511)]()*($-x+1)+x),getRandomColor=()=>(16777215*R[_0x283a37(511)]()<<0)[_0x283a37(622)](16)[_0x283a37(553)](6,"0");let elapsedTime=0,frameCounter=0;const updateFrequency=1;function getRandomFloat($,x){return R[_0x283a37(511)]()*(x-$)+$}let isRect=R[_0x283a37(671)]([1,2,3,4]);function _0x107a(){let $=["maxVertexTextures","getCurrentRenderTarget","getRenderTarget","background_color","Scene","vec2( ","#FD97C4","12YhfjHn","from","domElement","currentTextureIndex","#b42024","64340ROYYzI","Vector4","capabilities","add","randomCircSize","texture","Mesh","c4_color","useA","c5_color","1168573SEFyzz","ca_state","grad3","No OES_texture_float support for float textures.","#000000","variables","LinearFilter","random_num","208018tyFDOl","environment","createRenderTarget","#ffff00","\n\n varying vec2 vUv;\n\n uniform sampler2D reaction_diffusion;\n uniform vec3 substance_color;\n uniform vec3 background_color;\n uniform vec3 middle_color;\n uniform vec3 c4_color;\n uniform vec3 c5_color;\n uniform vec4 randomRect;\n uniform vec3 circle;\n uniform sampler2D noiseTexture;\n\n void main() {\n vec4 texColor = texture2D(reaction_diffusion, vUv);\n float h = texColor.g;\n\n vec3 colorA = background_color;\n vec3 colorB = middle_color;\n vec3 colorC = substance_color;\n vec3 colorD = c4_color;\n vec3 colorE = c5_color;\n\n float baseEdge0 = 0.0;\n float baseEdge1 = 0.075;\n float baseEdge2 = 0.175;\n float baseEdge3 = 0.275;\n float baseEdge4 = 0.375;\n\n float noiseValue = texture2D(noiseTexture, vUv).r;\n float edgeVariation = noiseValue * 0.1;\n\n float edge0 = baseEdge0 + edgeVariation;\n float edge1 = baseEdge1 + edgeVariation;\n float edge2 = baseEdge2 + edgeVariation;\n float edge3 = baseEdge3 + edgeVariation;\n float edge4 = baseEdge4 + edgeVariation;\n\n vec3 finalColor;\n\n if (h < edge1) {\n float t = clamp((h - edge0) / (edge1 - edge0), 0.0, 1.0);\n finalColor = mix(colorA, colorB, t);\n } else if (h < edge2) {\n float t = clamp((h - edge1) / (edge2 - edge1), 0.0, 1.0);\n finalColor = mix(colorB, colorC, t);\n } else if (h < edge3) {\n float t = clamp((h - edge2) / (edge3 - edge2), 0.0, 1.0);\n finalColor = mix(colorC, colorD, t);\n } else if (h < edge4) {\n float t = clamp((h - edge3) / (edge4 - edge3), 0.0, 1.0);\n finalColor = mix(colorD, colorE, t);\n } else {\n finalColor = colorE;\n }\n\n gl_FragColor = vec4(finalColor, 1.0);\n }\n\n","#FFFFFF","magFilter","#E23DB3","#FFC234","click","getAlternateRenderTarget","warped","setRenderTarget","divideScalar","#FF3C75","innerHeight","uniforms","background","#EBFF32","dot","point_pos","compute","field","substance","palette:","fromArray","borderSize","RGBFormat","minFilter","kill","DataTexture","toString","renderTargets","void main() {\n\n gl_Position = vec4( position, 1.0 );\n\n}\n","vec2(","needsUpdate","u_time","clientY","randomRectSize","9067540EClGUS","floor","2siIRDb","fragmentShader","value","substance_color","passThruTexture","href","round","slice","9wvPYhr","PlaneBufferGeometry","Vector3","doRenderTarget","#98D82D","createShaderMaterial","No support for vertex shader textures.","reaction_diffusion","mouse_pos","#f2f2f2","noise3d","ca_factor","Colors:","147ycZXIO","save_image","render","material","kill_modifier","kill_variation",", dependency=","accent","renderTexture","random_bool","NearestFilter","clientX","onmouseup","WebGLRenderer","get","createTexture","prngA","#0000FF","random_choice","perm","push","#F17401","sqrt","info","492258plkCVJ","Camera","onmouseleave","wrapT","GPUComputationRenderer","getElementById","18645099UYLSiq","position","save-link","wrapS","OES_texture_float","randomRectPos","#df2126","Growth:","init","#00FF00","substring","Variable dependency not found. Variable=","mouse_down","\nuniform sampler2D ","now","1375130EXCtQO","24CUAOIY","#C7AFF0","Settings:","appendChild","savename","ShaderMaterial","preventDefault","#ffffff","#f5f5f0","random_int","#AE2029","length","feed_modifier","random_dec","touches","Vector2","HalfFloatType","setPixelRatio","isWebGL2","randomCircPos","environment_noise_scale","uniform sampler2D passThruTexture;\n\nvoid main() {\n\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n\n gl_FragColor = texture2D( passThruTexture, uv );\n\n}\n","noise_texture","toFixed","\n varying vec2 vUv;\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n\n","#5BC2AC","initialValueTexture","addVariable","setVariableDependencies","prngB","RGBAFormat","#FF0000","diffusion_scale_variation","addResolutionDefine","name","dependencies","FloatType","Aggressor: ","ClampToEdgeWrapping","anisotropy","#e00000","frame","#DE87B7","defines","#AFCDF0","extensions","middle_color","#00ffff","keys","resolution","simfrRate","reset","#D03A20","#ff00ff","caThreshold","padStart","hash","prev_scale","log","feed_variation","feed","\n\n uniform sampler2D environment;\n\n uniform float feed;\n uniform float kill;\n uniform float diffusion_scale;\n\n uniform float feed_variation;\n uniform float kill_variation;\n uniform bool isRect;\n uniform float diffusion_scale_variation;\n\n uniform float anisotropy;\n uniform bool field;\n\n uniform float feed_modifier;\n uniform float kill_modifier;\n\n uniform vec2 mouse_pos;\n uniform vec2 point_pos0;\n uniform vec2 point_pos1;\n uniform vec2 point_pos2;\n uniform vec2 point_pos3;\n uniform vec2 point_pos4;\n uniform vec2 point_pos5;\n uniform vec2 point_pos6;\n uniform vec2 point_pos7;\n uniform vec2 point_pos8;\n uniform vec2 point_pos9;\n uniform vec2 point_posR;\n uniform bool mouse_down;\n\n uniform bool reset;\n uniform bool add;\n\n uniform vec4 randomRect;\n uniform vec4 randomCirc;\n\n uniform vec2 randomRectPos;\n uniform vec2 randomRectSize;\n uniform vec2 randomCircPos;\n uniform vec2 randomCircSize;\n uniform float borderSize;\n\n uniform vec2 rect_top_left;\n uniform vec2 rect_bottom_right;\n\n uniform sampler2D ca_state;\n uniform float caThreshold;\n uniform float ca_factor;\n \n\n #define p2(v) v * v\n #define PI 3.14159265358979323846\n\n \n #define R 10.0\n #define borderWidth 20.0\n #define rectBorderWidth 2.0\n\n #define s(x, y) texture2D(reaction_diffusion, (gl_FragCoord.xy + vec2(x, y)) / resolution).xy\n\n vec2 anisotropicDiffusion(vec2 angles, float a1, vec2 center)\n {\n vec2\n v00 = s(-1, 1), v10 = s(0, 1), v20 = s(1, 1),\n v01 = s(-1, 0), v21 = s(1, 0),\n v02 = s(-1,-1), v12 = s(0,-1), v22 = s(1,-1);\n\n vec2 cos_t = cos(angles);\n vec2 sin_t = sin(angles);\n\n vec2 cos2_t = p2(cos_t);\n vec2 sin2_t = p2(sin_t);\n\n float a2 = 1.0 - a1;\n\n vec2 d = 4.0 * (a2 - a1) * p2(cos_t * sin_t);\n vec2 h = 8.0 * (a1 * cos2_t + a2 * sin2_t);\n vec2 v = 8.0 * (a2 * cos2_t + a1 * sin2_t);\n\n return ((1.0 - d) * (v00 + v22) + (1.0 + d) * (v20 + v02) + h * (v01 + v21) + v * (v10 + v12) - 20.0 * center) / 6.0;\n }\n\n float random (vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n }\n bool insideCircle(vec2 point, vec2 center, float radius) {\n return distance(point, center) <= radius;\n }\n\n\n void main() {\n vec4 env = texture2D(environment, (gl_FragCoord.xy / resolution).xy);\n vec2 st = gl_FragCoord.xy/resolution;\n vec3 ca_color = texture2D(ca_state, st).rgb;\n float ca_intensity = dot(ca_color, vec3(0.299, 0.587, 0.114));\n float caValue = texture2D(ca_state, (gl_FragCoord.xy / resolution)).r;\n\n\n float rnd = random( st );\n float pct = 0.0;\n\n vec2 randomRectPosA = randomRectPos * resolution;\n vec2 randomRectSizeA = randomRectSize * resolution;\n\n vec2 randomCircPosA = randomCircPos * resolution;\n vec2 randomCircSizeA = randomCircSize * resolution;\n\n pct = distance(st,vec2(0.5));\n\n float DS = diffusion_scale + env[2] * diffusion_scale_variation;\n vec2 angles = (1.0 + vec2(env[3], field ? env[0] : env[3])) * PI;\n float caInfluence = float(caValue > caThreshold);\n float F = feed + env[0] * feed_variation;\n float K = kill + env[1] * kill_variation;\n\n \n bool insideRectangle = (gl_FragCoord.x > randomRectPosA.x && gl_FragCoord.x < randomRectPosA.x + randomRectSizeA.x) &&\n (gl_FragCoord.y > randomRectPosA.y && gl_FragCoord.y < randomRectPosA.y + randomRectSizeA.y);\n\n bool insideCircle = insideCircle(gl_FragCoord.xy, randomCircPosA, randomCircSizeA.x); \n\n if (insideRectangle) {\n K += 0.003;\n }\n\n if (insideCircle) {\n K += 0.0025;\n }\n\n vec2 old = s(0, 0);\n\n vec2 reaction = vec2(-1.0, 1.0) * old[0] * old[1] * old[1] * (1.0 + caInfluence * ca_factor);\n vec2 dissipation = vec2(F * (1.0 - old[0]), -old[1] * (K + F));\n vec2 diffusion = anisotropicDiffusion(angles, anisotropy, old) * DS * vec2(1.0, 0.5);\n float dt = 1.0 / (4.0 * DS);\n gl_FragColor.xy = old + (reaction + dissipation + diffusion) * dt;\n float edgeDistX = min(gl_FragCoord.x, resolution.x - gl_FragCoord.x);\n float edgeDistY = min(gl_FragCoord.y, resolution.y - gl_FragCoord.y);\n float edgeDist = min(edgeDistX, edgeDistY);\n if (edgeDist <= borderSize) {\n gl_FragColor.x = 0.0;\n gl_FragColor.y = 0.0;\n }\n\n if (mouse_down) {\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, mouse_pos), 0.0) / R;\n }\n\n if (reset) {\n gl_FragColor = vec4(0.0);\n }\n\n if(add)\n {\n vec2 pointPositions[10];\n pointPositions[0] = point_pos1;\n pointPositions[1] = point_pos2;\n pointPositions[2] = point_pos3;\n pointPositions[3] = point_pos4;\n pointPositions[4] = point_pos5;\n pointPositions[5] = point_pos6;\n pointPositions[6] = point_pos7;\n pointPositions[7] = point_pos8;\n pointPositions[8] = point_pos9;\n pointPositions[9] = point_pos0;\n\n for (int i = 0; i < 10; i++) {\n vec2 pointPos = pointPositions[i];\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, pointPos), 0.0) / R;\n }\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, point_posR), 0.0) / R;\n\n }\n }\n\n","innerWidth"];return(_0x107a=function(){return $})()}switch(isRect){case 1:randomRect=new THREE.Vector4(.5*R[_0x283a37(511)](),0,.2,1),randomCirc=new THREE[_0x283a37(574)](0,0,0,0);break;case 2:randomRect=new THREE[_0x283a37(574)](0,0,0,0),randomCirc=new THREE[_0x283a37(574)](.5,.5,.4,.4);break;case 3:randomRect=new THREE[_0x283a37(574)](0,0,0,0),randomCirc=new THREE[_0x283a37(574)](0,0,0,0);break;case 4:randomRect=new THREE.Vector4(.5*R[_0x283a37(511)](),0,.2,1),randomCirc=new THREE[_0x283a37(574)](.5,.5,.4,.4);break;default:randomRect=new THREE[_0x283a37(574)](.5*R[_0x283a37(511)](),0,.2,1),randomCirc=new THREE.Vector4(0,0,0,0)}const borderSizes=[10,30],borderSize=R[_0x283a37(671)](borderSizes);let caEnabled=!!R[_0x283a37(662)](.05);console.log(_0x283a37(535)+caEnabled);const ca_factor=!0===caEnabled?.8:0,caWidth=Math[_0x283a37(631)](simulation_width/10),caHeight=Math[_0x283a37(631)](simulation_height/10),caData=new Uint8Array(caWidth*caHeight*3);for(let i=0;i<caData[_0x283a37(509)];i+=3){let $=.8>R.random_dec()?0:255;caData[i]=$,caData[i+1]=$,caData[i+2]=$}const caTexture=new THREE[_0x283a37(621)](caData,caWidth,caHeight,THREE[_0x283a37(618)]);caTexture[_0x283a37(597)]=THREE[_0x283a37(663)],caTexture.minFilter=THREE[_0x283a37(663)],caTexture[_0x283a37(686)]=THREE[_0x283a37(536)],caTexture[_0x283a37(680)]=THREE[_0x283a37(536)],caTexture.needsUpdate=!0;const material=new THREE[_0x283a37(503)]({vertexShader:render_vertex,fragmentShader:render_fragment,uniforms:{reaction_diffusion:{value:null},substance_color:{value:new THREE.Vector3().fromArray(settings[_0x283a37(635)]).divideScalar(255)},middle_color:{value:new THREE[_0x283a37(642)]().fromArray(settings[_0x283a37(544)])[_0x283a37(604)](255)},background_color:{value:new THREE[_0x283a37(642)]()[_0x283a37(616)](settings[_0x283a37(564)])[_0x283a37(604)](255)},c4_color:{value:new THREE[_0x283a37(642)]()[_0x283a37(616)](settings[_0x283a37(580)])[_0x283a37(604)](255)},c5_color:{value:new THREE[_0x283a37(642)]().fromArray(settings[_0x283a37(582)])[_0x283a37(604)](255)},time:{value:0},noise_texture:{value:null},isRect:{value:isRect},randomRect:{value:randomRect},randomCirc:{value:randomCirc},ca_state:{value:caTexture}},defines:{frag2sim:_0x283a37(625)+simulation_width/actual_width+", "+simulation_height/actual_height+")",simulation_resolution:"vec2("+simulation_width+", "+simulation_height+")"}});scene[_0x283a37(576)](new THREE[_0x283a37(579)](new THREE[_0x283a37(641)](2,2),material));const gpu_compute=new THREE.GPUComputationRenderer(simulation_width,simulation_height,renderer),reaction_diffusion=gpu_compute[_0x283a37(668)](),reaction_diffusion_variable=gpu_compute[_0x283a37(525)](_0x283a37(647),rdf,reaction_diffusion);reaction_diffusion_variable[_0x283a37(686)]=THREE[_0x283a37(536)],reaction_diffusion_variable.wrapT=THREE[_0x283a37(536)],gpu_compute[_0x283a37(526)](reaction_diffusion_variable,[reaction_diffusion_variable]);const rdu=reaction_diffusion_variable.material[_0x283a37(607)];rdu[_0x283a37(648)]={value:new THREE[_0x283a37(513)](-100,-100)};for(let i=0;i<10;i++)rdu[_0x283a37(611)+i]={value:new THREE[_0x283a37(513)](getRandomInt(50,simulation_width-50),getRandomInt(50,simulation_height-50))};function updateCA(){let $=_0x283a37,x=new Uint8Array(caWidth*caHeight*3),e=[1],a=[2,3];for(let o=0;o<caHeight;o++)for(let t=0;t<caWidth;t++){let r=(o*caWidth+t)*3,n=0;for(let c=-1;c<=1;c++)for(let l=-1;l<=1;l++){if(0===l&&0===c)continue;let f=(t+l+caWidth)%caWidth;255===caData[((o+c+caHeight)%caHeight*caWidth+f)*3]&&n++}let s=caData[r],d=n==e[0]||1==s&&a.includes(n)?1:0;d=255===s&&(2===n||3===n)?255:0===s&&3===n?255:0,x[r]=d,x[r+1]=d,x[r+2]=d}caData.set(x),caTexture[$(626)]=!0}rdu[_0x283a37(494)]={value:!1},rdu[_0x283a37(558)]={value:settings[_0x283a37(558)]},rdu[_0x283a37(620)]={value:settings[_0x283a37(620)]},rdu.diffusion_scale={value:settings.diffusion_scale},rdu[_0x283a37(557)]={value:settings[_0x283a37(557)]},rdu[_0x283a37(658)]={value:settings[_0x283a37(658)]},rdu[_0x283a37(510)]={value:settings[_0x283a37(510)]},rdu[_0x283a37(657)]={value:settings.kill_modifier},rdu[_0x283a37(530)]={value:settings[_0x283a37(530)]},rdu[_0x283a37(537)]={value:settings[_0x283a37(537)]},rdu[_0x283a37(549)]={value:!1},rdu[_0x283a37(576)]={value:!1},rdu[_0x283a37(613)]={value:settings[_0x283a37(613)]},rdu.warped={value:settings[_0x283a37(602)]},rdu[_0x283a37(651)]={value:ca_factor},rdu[_0x283a37(584)]={value:caTexture},rdu[_0x283a37(552)]={value:.6},rdu[_0x283a37(617)]={value:borderSize},rdu[_0x283a37(688)]={value:new THREE[_0x283a37(513)](randomRect.x,randomRect.y)},rdu[_0x283a37(629)]={value:new THREE[_0x283a37(513)](randomRect.z,randomRect.w)},rdu[_0x283a37(517)]={value:new THREE[_0x283a37(513)](randomCirc.x,randomCirc.y)},rdu[_0x283a37(577)]={value:new THREE[_0x283a37(513)](randomCirc.z,randomCirc.w)};const caDuration=3e4,maxUpdateFrequency=10;let startTime=Date[_0x283a37(496)]();function animate(){let $=_0x283a37;if(requestAnimationFrame(animate),frameCounter++,caEnabled){let x=Date[$(496)]()-startTime;if(x<3e4){var e,a=0,o=3e4,t=1,r=10;let n=Math[$(631)]((e=x,t+(e-a)*(10-t)/(3e4-a)));frameCounter%n==0&&updateCA()}else caEnabled=!1}render()}function _0x3aa4($,x){let e=_0x107a();return(_0x3aa4=function($,x){return e[$-=488]})($,x)}function render($){let x=_0x283a37;if(simulateReactionDiffusion(settings[x(548)]),material[x(607)][x(647)][x(634)]=gpu_compute[x(562)](reaction_diffusion_variable)[x(578)],elapsedTime+=.01,material.uniforms.time[x(634)]=elapsedTime,rdu[x(627)]={value:.001*$},renderer[x(655)](scene,camera),!0===render[x(654)]){render.save_image=!1;let e=document[x(682)](x(685));e.download=render[x(502)],e[x(637)]=renderer[x(570)].toDataURL(),e[x(600)]()}renderer[x(676)][x(655)][x(539)]>=2e3&&renderer[x(676)][x(655)][x(539)]<5e3?rdu[x(576)]={value:!0}:rdu[x(576)]={value:!1}}function simulateReactionDiffusion($){let x=_0x283a37;for(let e=0;e<$;e++)gpu_compute[x(612)]()}function createEnvironment($=!0){let x=_0x283a37;if(!$&&void 0!==createEnvironment.prev_scale&&createEnvironment[x(555)]===Settings[x(518)])return;createEnvironment[x(555)]=settings.environment_noise_scale;let e=new SimplexNoise(R),a=Array[x(569)]({length:4},()=>1e3*R[x(511)]()),o=1/settings.environment_noise_scale,t={x:simulation_width/2,y:simulation_height/2},r=(t.x,t.y,new Float32Array(simulation_width*simulation_height*4));for(let n=0;n<simulation_height;n++)for(let c=0;c<simulation_width;c++)for(let l=0;l<4;l++)r[(n*simulation_width+c)*4+l]=e.noise3d((c+.5)*o,(n+.5)*(!0===settings.warped?1:o),a[l]);rdu[x(592)]={value:new THREE.DataTexture(r,simulation_width,simulation_height,THREE[x(528)],THREE[x(534)])},rdu[x(592)][x(634)][x(597)]=THREE.LinearFilter,rdu[x(592)][x(634)][x(619)]=THREE[x(589)];let f=new THREE[x(621)](r,simulation_width,simulation_height,THREE[x(528)],THREE[x(534)]);f[x(597)]=THREE[x(589)],f.minFilter=THREE[x(589)],material[x(607)][x(520)][x(634)]=f}function updateMousePos($){let x=_0x283a37,e=$[x(664)]*(simulation_width/width),a=simulation_height-$[x(628)]*(simulation_height/height);rdu[x(648)][x(634)].fromArray([e,a])}function onMove($){let x=_0x283a37;updateMousePos($),rdu[x(494)][x(634)]=mouse_down&&(brush_move=!0)}function onUp(){let $=_0x283a37;mouse_down=brush_move=!1,rdu[$(494)][$(634)]=!1}function onDown(){mouse_down=!0}function handleTouchEvent($,x){let e=_0x283a37;1===$.touches[e(509)]&&($[e(504)](),x($[e(512)][0]))}createEnvironment(),gpu_compute[_0x283a37(490)](),animate(),renderer[_0x283a37(570)].onmousedown=onDown,renderer[_0x283a37(570)][_0x283a37(665)]=renderer[_0x283a37(570)][_0x283a37(679)]=onUp,renderer[_0x283a37(570)].onmousemove=onMove;
THREE.GPUComputationRenderer=function(e,o,n){this.variables=[],this.currentTextureIndex=0;var i=new THREE.Scene,r=new THREE.Camera;r.position.z=1;var t={passThruTexture:{value:null}},a=c("uniform sampler2D passThruTexture;\n\nvoid main() {\n\n\tvec2 uv = gl_FragCoord.xy / resolution.xy;\n\n\tgl_FragColor = texture2D( passThruTexture, uv );\n\n}\n",t),s=new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2),a);function l(n){n.defines.resolution="vec2( "+e.toFixed(1)+", "+o.toFixed(1)+" )"}function c(e,o){o=o||{};var n=new THREE.ShaderMaterial({uniforms:o,vertexShader:"void main()\t{\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:e});return l(n),n}i.add(s),this.addVariable=function(e,o,n){var i={name:e,initialValueTexture:n,material:this.createShaderMaterial(o),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter};return this.variables.push(i),i},this.setVariableDependencies=function(e,o){e.dependencies=o},this.init=function(){if(!n.extensions.get("OES_texture_float")&&!n.capabilities.isWebGL2)return"No OES_texture_float support for float textures.";if(0===n.capabilities.maxVertexTextures)return"No support for vertex shader textures.";for(var i=0;i<this.variables.length;i++){var r=this.variables[i];r.renderTargets[0]=this.createRenderTarget(e,o,r.wrapS,r.wrapT,r.minFilter,r.magFilter),r.renderTargets[1]=this.createRenderTarget(e,o,r.wrapS,r.wrapT,r.minFilter,r.magFilter),this.renderTexture(r.initialValueTexture,r.renderTargets[0]),this.renderTexture(r.initialValueTexture,r.renderTargets[1]);var t=r.material,a=t.uniforms;if(null!==r.dependencies)for(var s=0;s<r.dependencies.length;s++){var l=r.dependencies[s];if(l.name!==r.name){for(var c=!1,d=0;d<this.variables.length;d++)if(l.name===this.variables[d].name){c=!0;break}if(!c)return"Variable dependency not found. Variable="+r.name+", dependency="+l.name}a[l.name]={value:null},t.fragmentShader="\nuniform sampler2D "+l.name+";\n"+t.fragmentShader}}return this.currentTextureIndex=0,null},this.compute=function(){for(var e=this.currentTextureIndex,o=0===this.currentTextureIndex?1:0,n=0,i=this.variables.length;n<i;n++){var r=this.variables[n];if(null!==r.dependencies)for(var t=r.material.uniforms,a=0,s=r.dependencies.length;a<s;a++){var l=r.dependencies[a];t[l.name].value=l.renderTargets[e].texture}this.doRenderTarget(r.material,r.renderTargets[o])}this.currentTextureIndex=o},this.getCurrentRenderTarget=function(e){return e.renderTargets[this.currentTextureIndex]},this.getAlternateRenderTarget=function(e){return e.renderTargets[0===this.currentTextureIndex?1:0]},this.addResolutionDefine=l,this.createShaderMaterial=c,this.createRenderTarget=function(n,i,r,t,a,s){return n=n||e,i=i||o,r=r||THREE.ClampToEdgeWrapping,t=t||THREE.ClampToEdgeWrapping,a=a||THREE.NearestFilter,s=s||THREE.NearestFilter,new THREE.WebGLRenderTarget(n,i,{wrapS:r,wrapT:t,minFilter:a,magFilter:s,format:THREE.RGBAFormat,type:/(iPad|iPhone|iPod)/g.test(navigator.userAgent)?THREE.HalfFloatType:THREE.FloatType,stencilBuffer:!1,depthBuffer:!1})},this.createTexture=function(){var n=new Float32Array(e*o*4);return new THREE.DataTexture(n,e,o,THREE.RGBAFormat,THREE.FloatType)},this.renderTexture=function(e,o){t.passThruTexture.value=e,this.doRenderTarget(a,o),t.passThruTexture.value=null},this.doRenderTarget=function(e,o){var t=n.getRenderTarget();s.material=e,n.setRenderTarget(o),n.render(i,r),s.material=a,n.setRenderTarget(t)}};let render_vertex="\n varying vec2 vUv;\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n\n",render_fragment="\n\n varying vec2 vUv;\n\n uniform sampler2D reaction_diffusion;\n uniform vec3 substance_color;\n uniform vec3 background_color;\n uniform vec3 middle_color;\n uniform vec3 c4_color;\n uniform vec3 c5_color;\n uniform vec4 randomRect;\n uniform vec3 circle;\n uniform sampler2D noiseTexture;\n\n void main() {\n vec4 texColor = texture2D(reaction_diffusion, vUv);\n float h = texColor.g;\n\n vec3 colorA = background_color;\n vec3 colorB = middle_color;\n vec3 colorC = substance_color;\n vec3 colorD = c4_color;\n vec3 colorE = c5_color;\n\n float baseEdge0 = 0.0;\n float baseEdge1 = 0.075;\n float baseEdge2 = 0.175;\n float baseEdge3 = 0.275;\n float baseEdge4 = 0.375;\n\n float noiseValue = texture2D(noiseTexture, vUv).r;\n float edgeVariation = noiseValue * 0.1;\n\n float edge0 = baseEdge0 + edgeVariation;\n float edge1 = baseEdge1 + edgeVariation;\n float edge2 = baseEdge2 + edgeVariation;\n float edge3 = baseEdge3 + edgeVariation;\n float edge4 = baseEdge4 + edgeVariation;\n\n vec3 finalColor;\n\n if (h < edge1) {\n float t = clamp((h - edge0) / (edge1 - edge0), 0.0, 1.0);\n finalColor = mix(colorA, colorB, t);\n } else if (h < edge2) {\n float t = clamp((h - edge1) / (edge2 - edge1), 0.0, 1.0);\n finalColor = mix(colorB, colorC, t);\n } else if (h < edge3) {\n float t = clamp((h - edge2) / (edge3 - edge2), 0.0, 1.0);\n finalColor = mix(colorC, colorD, t);\n } else if (h < edge4) {\n float t = clamp((h - edge3) / (edge4 - edge3), 0.0, 1.0);\n finalColor = mix(colorD, colorE, t);\n } else {\n finalColor = colorE;\n }\n\n gl_FragColor = vec4(finalColor, 1.0);\n }\n\n",reaction_diffusion_fragment="\n\n uniform sampler2D environment;\n\n uniform float feed;\n uniform float kill;\n uniform float diffusion_scale;\n\n uniform float feed_variation;\n uniform float kill_variation;\n uniform bool isRect;\n uniform float diffusion_scale_variation;\n\n uniform float anisotropy;\n uniform bool separate_fields;\n\n uniform float feed_modifier;\n uniform float kill_modifier;\n\n uniform vec2 mouse_pos;\n uniform vec2 point_pos0;\n uniform vec2 point_pos1;\n uniform vec2 point_pos2;\n uniform vec2 point_pos3;\n uniform vec2 point_pos4;\n uniform vec2 point_pos5;\n uniform vec2 point_pos6;\n uniform vec2 point_pos7;\n uniform vec2 point_pos8;\n uniform vec2 point_pos9;\n uniform vec2 point_posR;\n uniform bool mouse_down;\n\n uniform bool reset;\n uniform bool add;\n\n uniform vec4 randomRect;\n uniform vec4 randomCirc;\n\n uniform vec2 randomRectPos;\n uniform vec2 randomRectSize;\n uniform vec2 randomCircPos;\n uniform vec2 randomCircSize;\n uniform float borderSize;\n\n uniform vec2 rect_top_left;\n uniform vec2 rect_bottom_right;\n\n uniform sampler2D ca_state;\n uniform float caThreshold;\n uniform float ca_factor;\n \n\n #define p2(v) v * v\n #define PI 3.14159265358979323846\n\n \n #define R 10.0\n #define borderWidth 20.0\n #define rectBorderWidth 2.0\n\n #define s(x, y) texture2D(reaction_diffusion, (gl_FragCoord.xy + vec2(x, y)) / resolution).xy\n\n vec2 anisotropicDiffusion(vec2 angles, float a1, vec2 center)\n {\n vec2\n v00 = s(-1, 1), v10 = s(0, 1), v20 = s(1, 1),\n v01 = s(-1, 0), v21 = s(1, 0),\n v02 = s(-1,-1), v12 = s(0,-1), v22 = s(1,-1);\n\n vec2 cos_t = cos(angles);\n vec2 sin_t = sin(angles);\n\n vec2 cos2_t = p2(cos_t);\n vec2 sin2_t = p2(sin_t);\n\n float a2 = 1.0 - a1;\n\n vec2 d = 4.0 * (a2 - a1) * p2(cos_t * sin_t);\n vec2 h = 8.0 * (a1 * cos2_t + a2 * sin2_t);\n vec2 v = 8.0 * (a2 * cos2_t + a1 * sin2_t);\n\n return ((1.0 - d) * (v00 + v22) + (1.0 + d) * (v20 + v02) + h * (v01 + v21) + v * (v10 + v12) - 20.0 * center) / 6.0;\n }\n\n float random (vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n }\n bool insideCircle(vec2 point, vec2 center, float radius) {\n return distance(point, center) <= radius;\n }\n\n\n void main() {\n vec4 env = texture2D(environment, (gl_FragCoord.xy / resolution).xy);\n vec2 st = gl_FragCoord.xy/resolution;\n vec3 ca_color = texture2D(ca_state, st).rgb;\n float ca_intensity = dot(ca_color, vec3(0.299, 0.587, 0.114));\n float caValue = texture2D(ca_state, (gl_FragCoord.xy / resolution)).r;\n\n\n float rnd = random( st );\n float pct = 0.0;\n\n vec2 randomRectPosA = randomRectPos * resolution;\n vec2 randomRectSizeA = randomRectSize * resolution;\n\n vec2 randomCircPosA = randomCircPos * resolution;\n vec2 randomCircSizeA = randomCircSize * resolution;\n\n pct = distance(st,vec2(0.5));\n\n float DS = diffusion_scale + env[2] * diffusion_scale_variation;\n vec2 angles = (1.0 + vec2(env[3], separate_fields ? env[0] : env[3])) * PI;\n float caInfluence = float(caValue > caThreshold);\n float F = feed + env[0] * feed_variation;\n float K = kill + env[1] * kill_variation;\n\n \n bool insideRectangle = (gl_FragCoord.x > randomRectPosA.x && gl_FragCoord.x < randomRectPosA.x + randomRectSizeA.x) &&\n (gl_FragCoord.y > randomRectPosA.y && gl_FragCoord.y < randomRectPosA.y + randomRectSizeA.y);\n\n bool insideCircle = insideCircle(gl_FragCoord.xy, randomCircPosA, randomCircSizeA.x); \n\n if (insideRectangle) {\n K += 0.003;\n }\n\n if (insideCircle) {\n K += 0.0025;\n }\n\n vec2 old = s(0, 0);\n\n vec2 reaction = vec2(-1.0, 1.0) * old[0] * old[1] * old[1] * (1.0 + caInfluence * ca_factor);\n vec2 dissipation = vec2(F * (1.0 - old[0]), -old[1] * (K + F));\n vec2 diffusion = anisotropicDiffusion(angles, anisotropy, old) * DS * vec2(1.0, 0.5);\n float dt = 1.0 / (4.0 * DS);\n gl_FragColor.xy = old + (reaction + dissipation + diffusion) * dt;\n float edgeDistX = min(gl_FragCoord.x, resolution.x - gl_FragCoord.x);\n float edgeDistY = min(gl_FragCoord.y, resolution.y - gl_FragCoord.y);\n float edgeDist = min(edgeDistX, edgeDistY);\n if (edgeDist <= borderSize) {\n gl_FragColor.x = 0.0;\n gl_FragColor.y = 0.0;\n }\n\n if (mouse_down) {\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, mouse_pos), 0.0) / R;\n }\n\n if (reset) {\n gl_FragColor = vec4(0.0);\n }\n\n if(add)\n {\n vec2 pointPositions[10];\n pointPositions[0] = point_pos1;\n pointPositions[1] = point_pos2;\n pointPositions[2] = point_pos3;\n pointPositions[3] = point_pos4;\n pointPositions[4] = point_pos5;\n pointPositions[5] = point_pos6;\n pointPositions[6] = point_pos7;\n pointPositions[7] = point_pos8;\n pointPositions[8] = point_pos9;\n pointPositions[9] = point_pos0;\n\n for (int i = 0; i < 10; i++) {\n vec2 pointPos = pointPositions[i];\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, pointPos), 0.0) / R;\n }\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, point_posR), 0.0) / R;\n\n }\n }\n\n";const width=window.innerWidth,height=window.innerHeight,actual_width=Math.round(width),actual_height=Math.round(height),simulation_width=Math.round(actual_width/1.5),simulation_height=Math.round(actual_height/1.5),aspectRatio=window.innerWidth/window.innerHeight;class Random{constructor(){this.useA=!1;let e=function(e){let o=parseInt(e.substring(0,8),16),n=parseInt(e.substring(8,16),16),i=parseInt(e.substring(16,24),16),r=parseInt(e.substring(24,32),16);return function(){o|=0,n|=0,i|=0,r|=0;let e=(o+n|0)+r|0;return r=r+1|0,o=n^n>>>9,n=i+(i<<3)|0,i=i<<21|i>>>11,i=i+e|0,(e>>>0)/4294967296}};this.prngA=new e(tokenData.hash.substring(2,34)),this.prngB=new e(tokenData.hash.substring(34,66));for(let e=0;e<1e6;e+=2)this.prngA(),this.prngB()}random_dec(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}random_num(e,o){return e+(o-e)*this.random_dec()}random_int(e,o){return Math.floor(this.random_num(e,o+1))}random_bool(e){return this.random_dec()<e}random_choice(e){return e[this.random_int(0,e.length-1)]}}class SimplexNoise{constructor(e){this.grad3=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let o=0;o<256;o++)this.p[o]=Math.floor(256*e.random_dec());this.perm=new Array(512);for(let e=0;e<512;e++)this.perm[e]=this.p[255&e]}dot(e,o,n,i){return e[0]*o+e[1]*n+e[2]*i}noise3d(e,o,n){const i=1/6;let r,t,a,s,l,c,d,f,u,m,_=(e+o+n)*(1/3),g=Math.floor(e+_),h=Math.floor(o+_),v=Math.floor(n+_),p=(g+h+v)*i,R=e-(g-p),b=o-(h-p),T=n-(v-p);R>=b?b>=T?(l=1,c=0,d=0,f=1,u=1,m=0):R>=T?(l=1,c=0,d=0,f=1,u=0,m=1):(l=0,c=0,d=1,f=1,u=0,m=1):b<T?(l=0,c=0,d=1,f=0,u=1,m=1):R<T?(l=0,c=1,d=0,f=0,u=1,m=1):(l=0,c=1,d=0,f=1,u=1,m=0);let F=R-l+i,E=b-c+i,x=T-d+i,C=R-f+2*i,w=b-u+2*i,y=T-m+2*i,S=R-1+.5,k=b-1+.5,H=T-1+.5,D=255&g,A=255&h,V=255&v,B=this.perm[D+this.perm[A+this.perm[V]]]%12,P=this.perm[D+l+this.perm[A+c+this.perm[V+d]]]%12,M=this.perm[D+f+this.perm[A+u+this.perm[V+m]]]%12,W=this.perm[D+1+this.perm[A+1+this.perm[V+1]]]%12,I=.6-R*R-b*b-T*T;I<0?r=0:(I*=I,r=I*I*this.dot(this.grad3[B],R,b,T));let z=.6-F*F-E*E-x*x;z<0?t=0:(z*=z,t=z*z*this.dot(this.grad3[P],F,E,x));let K=.6-C*C-w*w-y*y;K<0?a=0:(K*=K,a=K*K*this.dot(this.grad3[M],C,w,y));let U=.6-S*S-k*k-H*H;return U<0?s=0:(U*=U,s=U*U*this.dot(this.grad3[W],S,k,H)),32*(r+t+a+s)}}let R=new Random;function getRandomArbitrary(e,o){return R.random_dec()*(o-e)+e}let randomRect,randomCirc,diffScaleArray=[.25,.375,.5],diffScale=selectFromArray(diffScaleArray),diffScaleVar=selectFromArray([diffScale-.125,diffScale-.125]),diffScaleArrayWide=[.5,.625,.75,.875,1],diffScaleWide=selectFromArray(diffScaleArrayWide),diffScaleVarWide=selectFromArray([0,diffScale-.125]),feedVar=getRandomArbitrary(0,.01),killVar=getRandomArbitrary(0,.01);function selectFromArray(e){return e[Math.floor(R.random_dec()*e.length)]}function selectNumberFromArray(e){return Math.floor(R.random_dec()*e.length)}function getRandomBool(e){return R.random_dec()<e}function hexToRgb(e){const o=parseInt(e.slice(1),16);return[parseInt(o>>16&255),parseInt(o>>8&255),parseInt(255&o)]}function getRandomBoolean(){return R.random_dec()>=.5}let palettes={Candy:{background:"#E23DB3",accent:"#E23DB3",substance:"#FFC234",c4:"#FFFF99",c5:"#FFFFFF"},Color2:{background:"#AE2029",accent:"#AE2029",substance:"#98D82D",c4:"#98D82D",c5:"#98D82D"},Color3:{background:"#F17401",accent:"#F17401",substance:"#EBFF32",c4:"#EBFF32",c5:"#EBFF32"},Color4:{background:"#FF3C75",accent:"#FF3C75",substance:"#FD97C4",c4:"#FD97C4",c5:"#FD97C4"},Color5:{background:"#000000",accent:"#000000",substance:"#FFFFFF",c4:"#FFFFFF",c5:"#FFFFFF"},Color6:{background:"#F17401",accent:"#F17401",substance:"#EBFF32",c4:"#EBFF32",c5:"#EBFF32"},Yayoi:{background:"#D03A20",accent:"#D03A20",substance:"#FFFFFF",c4:"#FFFFFF",c5:"#FFFFFF"},Gabee:{background:"#ffffff",accent:"#f5f5f0",substance:"#f2f2f2",c4:"#f2f2f2",c5:"#ffffff"},CMKY:{background:"#ffffff",accent:(getRandomBoolean(),"#00ffff"),substance:"#ff00ff",c4:"#ffff00",c5:"#ffffff"},RGB:{background:"#000000",accent:(getRandomBoolean(),"#00FF00"),substance:"#FF0000",c4:"#0000FF",c5:"#FFFFFF"},"30Rack":{background:"#b42024",accent:getRandomBoolean()?"#b42024":"#000000",substance:"#b42024",c4:"#df2126",c5:"#df2126"},Mohun:{background:"#FFFFF1",accent:(getRandomBoolean(),"#C7AFF0"),substance:"#AFCDF0",c4:"#5BC2AC",c5:"#DE87B7"},Q:{background:"#ffffff",accent:"#ffffff",substance:"#e00000",c4:"#ffffff",c5:"#ffffff"},Skeleton:{background:"#000000",accent:"#ffffff",substance:"#000000",c4:"#000000",c5:"#000000"}};const defaultPallette={background:"#FF0000",accent:"#00FF00",substance:"#0000FF"},traitColorKeys=Object.keys(palettes),randomColorIndex=R.random_int(0,traitColorKeys.length-1),randomColorKey=traitColorKeys[randomColorIndex],randomColorTrait=palettes[randomColorKey],selectedColor={...defaultPallette,...randomColorTrait};console.log("palettes:",randomColorKey,"Settings object:",selectedColor),console.log(`Substance Color: ${selectedColor.substance}`),console.log(`Middle Color: ${selectedColor.accent}`),console.log(`Background Color:${selectedColor.background}`);let main_trait={Zebra:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.05,feed_variation:0,warped:getRandomBool(.2),kill:.061,kill_variation:0,feed_modifier:-.015,kill_modifier:-.001,anisotropy:selectFromArray([.25,.75]),environment_noise_scale:750,separate_fields:!0,substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},Fingerprint:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.037,feed_variation:0,warped:getRandomBool(.2),kill:.06,feed_modifier:.009,kill_modifier:.003,kill_modifier:0,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},"Dots and Dashes":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.034,feed_variation:0,warped:getRandomBool(.2),kill:.0618,kill_variation:0,feed_modifier:-.004,kill_modifier:.0012,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},Yayoi:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.062,kill_variation:0,feed_modifier:0,kill_modifier:-.0065,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:0,light_height:8e3,simulation_iterations_per_frame:64},Spillage:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.035,feed_variation:.006,kill:.06,kill_variation:.006,feed_modifier:-.005,kill_modifier:-.0035,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},Coral:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.046,feed_variation:0,warped:getRandomBool(.2),kill:.063,kill_variation:0,feed_modifier:-.009,kill_modifier:-.003,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:64,light_height:8e3,simulation_iterations_per_frame:64},"Squiggle Maze":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.0565,kill_variation:0,feed_modifier:0,kill_modifier:.0065,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64}};const defaultSettings={anisotropy:.8,simulation_iterations_per_frame:64,environment_noise_scale:250,substance_color:[0,0,0],middle_color:[0,255,255],background_color:[255,255,255],c4_color:[0,255,255],background_color:[255,255,255],feed_modifier:0,kill_modifier:0,specular_color:[0,0,0],separate_fields:!1,warped:!1,diffusion_scale:.625,diffusion_scale_variation:.375,feed:.042,feed_variation:.001,kill:.06,kill_variation:.001},traitKeys=Object.keys(main_trait),randomIndex=Math.floor(R.random_dec()*traitKeys.length),randomKey=traitKeys[randomIndex],randomTrait=main_trait[randomKey],settings={...defaultSettings,...randomTrait};console.log("Trait name:",randomKey,"Settings object:",settings);const scene=new THREE.Scene,camera=new THREE.Camera;camera.position.z=1;const renderer=new THREE.WebGLRenderer;renderer.setPixelRatio(window.devicePixelRatio),renderer.setSize(width,height),document.body.appendChild(renderer.domElement);let light_pos=new THREE.Vector2(simulation_width,simulation_height),light_enabled=!1,mouse_down=!1,light_move=!1,brush_move=!1;const getRandomInt=(e,o)=>Math.floor(R.random_dec()*(e-o+1)+o),getRandomColor=()=>(16777215*R.random_dec()<<0).toString(16).padStart(6,"0");let elapsedTime=0,frameCounter=0;const updateFrequency=1;function getRandomFloat(e,o){return R.random_dec()*(o-e)+e}let isRect=R.random_choice([1,2,3,4]);switch(isRect){case 1:default:randomRect=new THREE.Vector4(.5*R.random_dec(),0,.2,1),randomCirc=new THREE.Vector4(0,0,0,0);break;case 2:randomRect=new THREE.Vector4(0,0,0,0),randomCirc=new THREE.Vector4(.5,.5,.4,.4);break;case 3:randomRect=new THREE.Vector4(0,0,0,0),randomCirc=new THREE.Vector4(0,0,0,0);break;case 4:randomRect=new THREE.Vector4(.5*R.random_dec(),0,.2,1),randomCirc=new THREE.Vector4(.5,.5,.4,.4)}const borderSizes=[10,30],borderSize=R.random_choice(borderSizes);let caEnabled=R.random_dec>.95;const ca_factor=!0===caEnabled?.8:0,caWidth=Math.floor(simulation_width/20),caHeight=Math.floor(simulation_height/20),caData=new Uint8Array(caWidth*caHeight*3);for(let e=0;e<caData.length;e+=3){let o=R.random_dec()<.8?0:255;caData[e]=o,caData[e+1]=o,caData[e+2]=o}const caTexture=new THREE.DataTexture(caData,caWidth,caHeight,THREE.RGBFormat);caTexture.magFilter=THREE.NearestFilter,caTexture.minFilter=THREE.NearestFilter,caTexture.wrapS=THREE.ClampToEdgeWrapping,caTexture.wrapT=THREE.ClampToEdgeWrapping,caTexture.needsUpdate=!0;const material=new THREE.ShaderMaterial({vertexShader:render_vertex,fragmentShader:render_fragment,uniforms:{reaction_diffusion:{value:null},substance_color:{value:(new THREE.Vector3).fromArray(settings.substance_color).divideScalar(255)},middle_color:{value:(new THREE.Vector3).fromArray(settings.middle_color).divideScalar(255)},background_color:{value:(new THREE.Vector3).fromArray(settings.background_color).divideScalar(255)},c4_color:{value:(new THREE.Vector3).fromArray(settings.c4_color).divideScalar(255)},c5_color:{value:(new THREE.Vector3).fromArray(settings.c5_color).divideScalar(255)},time:{value:0},noise_texture:{value:null},isRect:{value:isRect},randomRect:{value:randomRect},randomCirc:{value:randomCirc},ca_state:{value:caTexture}},defines:{frag2sim:"vec2("+simulation_width/actual_width+", "+simulation_height/actual_height+")",simulation_resolution:"vec2("+simulation_width+", "+simulation_height+")"}});scene.add(new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2),material));const gpu_compute=new THREE.GPUComputationRenderer(simulation_width,simulation_height,renderer),reaction_diffusion=gpu_compute.createTexture(),reaction_diffusion_variable=gpu_compute.addVariable("reaction_diffusion",reaction_diffusion_fragment,reaction_diffusion);reaction_diffusion_variable.wrapS=THREE.ClampToEdgeWrapping,reaction_diffusion_variable.wrapT=THREE.ClampToEdgeWrapping,gpu_compute.setVariableDependencies(reaction_diffusion_variable,[reaction_diffusion_variable]);const reaction_diffusion_uniforms=reaction_diffusion_variable.material.uniforms;reaction_diffusion_uniforms.mouse_pos={value:new THREE.Vector2(-100,-100)};for(let e=0;e<10;e++)reaction_diffusion_uniforms[`point_pos${e}`]={value:new THREE.Vector2(getRandomInt(50,simulation_width-50),getRandomInt(50,simulation_height-50))};function updateCA(){const e=new Uint8Array(caWidth*caHeight*3),o=[1],n=[2,3];for(let i=0;i<caHeight;i++)for(let r=0;r<caWidth;r++){let t=3*(i*caWidth+r),a=0;for(let e=-1;e<=1;e++)for(let o=-1;o<=1;o++){if(0===o&&0===e)continue;255===caData[3*((i+e+caHeight)%caHeight*caWidth+(r+o+caWidth)%caWidth)]&&a++}let s=caData[t],l=a==o[0]||1==s&&n.includes(a)?1:0;l=255!==s||2!==a&&3!==a?0===s&&3===a?255:0:255,e[t]=l,e[t+1]=l,e[t+2]=l}caData.set(e),caTexture.needsUpdate=!0}reaction_diffusion_uniforms.mouse_down={value:!1},reaction_diffusion_uniforms.feed={value:settings.feed},reaction_diffusion_uniforms.kill={value:settings.kill},reaction_diffusion_uniforms.diffusion_scale={value:settings.diffusion_scale},reaction_diffusion_uniforms.feed_variation={value:settings.feed_variation},reaction_diffusion_uniforms.kill_variation={value:settings.kill_variation},reaction_diffusion_uniforms.feed_modifier={value:settings.feed_modifier},reaction_diffusion_uniforms.kill_modifier={value:settings.kill_modifier},reaction_diffusion_uniforms.diffusion_scale_variation={value:settings.diffusion_scale_variation},reaction_diffusion_uniforms.anisotropy={value:settings.anisotropy},reaction_diffusion_uniforms.reset={value:!1},reaction_diffusion_uniforms.add={value:!1},reaction_diffusion_uniforms.separate_fields={value:settings.separate_fields},reaction_diffusion_uniforms.warped={value:settings.warped},reaction_diffusion_uniforms.ca_factor={value:ca_factor},reaction_diffusion_uniforms.ca_state={value:caTexture},reaction_diffusion_uniforms.caThreshold={value:.6},reaction_diffusion_uniforms.borderSize={value:borderSize},reaction_diffusion_uniforms.randomRectPos={value:new THREE.Vector2(randomRect.x,randomRect.y)},reaction_diffusion_uniforms.randomRectSize={value:new THREE.Vector2(randomRect.z,randomRect.w)},reaction_diffusion_uniforms.randomCircPos={value:new THREE.Vector2(randomCirc.x,randomCirc.y)},reaction_diffusion_uniforms.randomCircSize={value:new THREE.Vector2(randomCirc.z,randomCirc.w)};const caDuration=3e4,maxUpdateFrequency=10;let startTime=Date.now();function animate(){if(requestAnimationFrame(animate),frameCounter++,caEnabled){let n=Date.now()-startTime;if(n<3e4){let i=Math.floor((o=1)+(n-(e=0))*(10-o)/(3e4-e));frameCounter%i==0&&updateCA()}else caEnabled=!1}var e,o;render()}function render(e){if(simulateReactionDiffusion(settings.simulation_iterations_per_frame),material.uniforms.reaction_diffusion.value=gpu_compute.getCurrentRenderTarget(reaction_diffusion_variable).texture,elapsedTime+=.01,material.uniforms.time.value=elapsedTime,reaction_diffusion_uniforms.u_time={value:.001*e},renderer.render(scene,camera),!0===render.save_image){render.save_image=!1;const e=document.getElementById("save-link");e.download=render.savename,e.href=renderer.domElement.toDataURL(),e.click()}renderer.info.render.frame>=2e3&&renderer.info.render.frame<5e3?reaction_diffusion_uniforms.add={value:!0}:reaction_diffusion_uniforms.add={value:!1}}function simulateReactionDiffusion(e){for(let o=0;o<e;o++)gpu_compute.compute()}function createEnvironment(e=!0){if(!e&&void 0!==createEnvironment.prev_scale&&createEnvironment.prev_scale===Settings.environment_noise_scale)return;createEnvironment.prev_scale=settings.environment_noise_scale;const o=new SimplexNoise(R),n=Array.from({length:4},(()=>1e3*R.random_dec())),i=1/settings.environment_noise_scale,r=simulation_width/2,t=simulation_height/2,a=(Math.sqrt(r**2+t**2),new Float32Array(simulation_width*simulation_height*4));for(let e=0;e<simulation_height;e++)for(let r=0;r<simulation_width;r++)for(let t=0;t<4;t++)a[4*(e*simulation_width+r)+t]=o.noise3d((r+.5)*i,(e+.5)*(!0===settings.warped?1:i),n[t]);reaction_diffusion_uniforms.environment={value:new THREE.DataTexture(a,simulation_width,simulation_height,THREE.RGBAFormat,THREE.FloatType)},reaction_diffusion_uniforms.environment.value.magFilter=THREE.LinearFilter,reaction_diffusion_uniforms.environment.value.minFilter=THREE.LinearFilter;const s=new THREE.DataTexture(a,simulation_width,simulation_height,THREE.RGBAFormat,THREE.FloatType);s.magFilter=THREE.LinearFilter,s.minFilter=THREE.LinearFilter,material.uniforms.noise_texture.value=s}function updateMousePos(e){let o=e.clientX*(simulation_width/width),n=simulation_height-e.clientY*(simulation_height/height);reaction_diffusion_uniforms.mouse_pos.value.fromArray([o,n])}function onMove(e){updateMousePos(e),reaction_diffusion_uniforms.mouse_down.value=mouse_down&&(brush_move=!0)}function onUp(){mouse_down=brush_move=!1,reaction_diffusion_uniforms.mouse_down.value=!1}function onDown(){mouse_down=!0}function handleTouchEvent(e,o){1===e.touches.length&&(e.preventDefault(),o(e.touches[0]))}createEnvironment(),gpu_compute.init(),animate(),console.log(`Diffusion Scale: ${settings.diffusion_scale}`),console.log(`Diffusion Scale Variation: ${settings.diffusion_scale_variation}`),console.log(`Feed Variation: ${settings.feed_variation}`),console.log(`Kill Variation: ${settings.kill_variation}`),console.log(`Separate Fields: ${settings.separate_fields}`),console.log(`Anisotropy: ${settings.anisotropy}`),console.log(`Warped: ${settings.warped}`),renderer.domElement.onmousedown=onDown,renderer.domElement.onmouseup=renderer.domElement.onmouseleave=onUp,renderer.domElement.onmousemove=onMove;
THREE.GPUComputationRenderer=function(e,o,n){this.variables=[],this.currentTextureIndex=0;var i=new THREE.Scene,r=new THREE.Camera;r.position.z=1;var t={passThruTexture:{value:null}},a=c("uniform sampler2D passThruTexture;\n\nvoid main() {\n\n\tvec2 uv = gl_FragCoord.xy / resolution.xy;\n\n\tgl_FragColor = texture2D( passThruTexture, uv );\n\n}\n",t),s=new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2),a);function l(n){n.defines.resolution="vec2( "+e.toFixed(1)+", "+o.toFixed(1)+" )"}function c(e,o){o=o||{};var n=new THREE.ShaderMaterial({uniforms:o,vertexShader:"void main()\t{\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:e});return l(n),n}i.add(s),this.addVariable=function(e,o,n){var i={name:e,initialValueTexture:n,material:this.createShaderMaterial(o),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter};return this.variables.push(i),i},this.setVariableDependencies=function(e,o){e.dependencies=o},this.init=function(){if(!n.extensions.get("OES_texture_float")&&!n.capabilities.isWebGL2)return"No OES_texture_float support for float textures.";if(0===n.capabilities.maxVertexTextures)return"No support for vertex shader textures.";for(var i=0;i<this.variables.length;i++){var r=this.variables[i];r.renderTargets[0]=this.createRenderTarget(e,o,r.wrapS,r.wrapT,r.minFilter,r.magFilter),r.renderTargets[1]=this.createRenderTarget(e,o,r.wrapS,r.wrapT,r.minFilter,r.magFilter),this.renderTexture(r.initialValueTexture,r.renderTargets[0]),this.renderTexture(r.initialValueTexture,r.renderTargets[1]);var t=r.material,a=t.uniforms;if(null!==r.dependencies)for(var s=0;s<r.dependencies.length;s++){var l=r.dependencies[s];if(l.name!==r.name){for(var c=!1,d=0;d<this.variables.length;d++)if(l.name===this.variables[d].name){c=!0;break}if(!c)return"Variable dependency not found. Variable="+r.name+", dependency="+l.name}a[l.name]={value:null},t.fragmentShader="\nuniform sampler2D "+l.name+";\n"+t.fragmentShader}}return this.currentTextureIndex=0,null},this.compute=function(){for(var e=this.currentTextureIndex,o=0===this.currentTextureIndex?1:0,n=0,i=this.variables.length;n<i;n++){var r=this.variables[n];if(null!==r.dependencies)for(var t=r.material.uniforms,a=0,s=r.dependencies.length;a<s;a++){var l=r.dependencies[a];t[l.name].value=l.renderTargets[e].texture}this.doRenderTarget(r.material,r.renderTargets[o])}this.currentTextureIndex=o},this.getCurrentRenderTarget=function(e){return e.renderTargets[this.currentTextureIndex]},this.getAlternateRenderTarget=function(e){return e.renderTargets[0===this.currentTextureIndex?1:0]},this.addResolutionDefine=l,this.createShaderMaterial=c,this.createRenderTarget=function(n,i,r,t,a,s){return n=n||e,i=i||o,r=r||THREE.ClampToEdgeWrapping,t=t||THREE.ClampToEdgeWrapping,a=a||THREE.NearestFilter,s=s||THREE.NearestFilter,new THREE.WebGLRenderTarget(n,i,{wrapS:r,wrapT:t,minFilter:a,magFilter:s,format:THREE.RGBAFormat,type:/(iPad|iPhone|iPod)/g.test(navigator.userAgent)?THREE.HalfFloatType:THREE.FloatType,stencilBuffer:!1,depthBuffer:!1})},this.createTexture=function(){var n=new Float32Array(e*o*4);return new THREE.DataTexture(n,e,o,THREE.RGBAFormat,THREE.FloatType)},this.renderTexture=function(e,o){t.passThruTexture.value=e,this.doRenderTarget(a,o),t.passThruTexture.value=null},this.doRenderTarget=function(e,o){var t=n.getRenderTarget();s.material=e,n.setRenderTarget(o),n.render(i,r),s.material=a,n.setRenderTarget(t)}};let render_vertex="\n varying vec2 vUv;\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n\n",render_fragment="\n\n varying vec2 vUv;\n\n uniform sampler2D reaction_diffusion;\n uniform vec3 substance_color;\n uniform vec3 background_color;\n uniform vec3 middle_color;\n uniform vec3 c4_color;\n uniform vec3 c5_color;\n uniform vec4 randomRect;\n uniform vec3 circle;\n uniform sampler2D noiseTexture;\n\n void main() {\n vec4 texColor = texture2D(reaction_diffusion, vUv);\n float h = texColor.g;\n\n vec3 colorA = background_color;\n vec3 colorB = middle_color;\n vec3 colorC = substance_color;\n vec3 colorD = c4_color;\n vec3 colorE = c5_color;\n\n float baseEdge0 = 0.0;\n float baseEdge1 = 0.075;\n float baseEdge2 = 0.175;\n float baseEdge3 = 0.275;\n float baseEdge4 = 0.375;\n\n float noiseValue = texture2D(noiseTexture, vUv).r;\n float edgeVariation = noiseValue * 0.1;\n\n float edge0 = baseEdge0 + edgeVariation;\n float edge1 = baseEdge1 + edgeVariation;\n float edge2 = baseEdge2 + edgeVariation;\n float edge3 = baseEdge3 + edgeVariation;\n float edge4 = baseEdge4 + edgeVariation;\n\n vec3 finalColor;\n\n if (h < edge1) {\n float t = clamp((h - edge0) / (edge1 - edge0), 0.0, 1.0);\n finalColor = mix(colorA, colorB, t);\n } else if (h < edge2) {\n float t = clamp((h - edge1) / (edge2 - edge1), 0.0, 1.0);\n finalColor = mix(colorB, colorC, t);\n } else if (h < edge3) {\n float t = clamp((h - edge2) / (edge3 - edge2), 0.0, 1.0);\n finalColor = mix(colorC, colorD, t);\n } else if (h < edge4) {\n float t = clamp((h - edge3) / (edge4 - edge3), 0.0, 1.0);\n finalColor = mix(colorD, colorE, t);\n } else {\n finalColor = colorE;\n }\n\n gl_FragColor = vec4(finalColor, 1.0);\n }\n\n",reaction_diffusion_fragment="\n\n uniform sampler2D environment;\n\n uniform float feed;\n uniform float kill;\n uniform float diffusion_scale;\n\n uniform float feed_variation;\n uniform float kill_variation;\n uniform bool isRect;\n uniform float diffusion_scale_variation;\n\n uniform float anisotropy;\n uniform bool separate_fields;\n\n uniform float feed_modifier;\n uniform float kill_modifier;\n\n uniform vec2 mouse_pos;\n uniform vec2 point_pos0;\n uniform vec2 point_pos1;\n uniform vec2 point_pos2;\n uniform vec2 point_pos3;\n uniform vec2 point_pos4;\n uniform vec2 point_pos5;\n uniform vec2 point_pos6;\n uniform vec2 point_pos7;\n uniform vec2 point_pos8;\n uniform vec2 point_pos9;\n uniform vec2 point_posR;\n uniform bool mouse_down;\n\n uniform bool reset;\n uniform bool add;\n\n uniform vec4 randomRect;\n uniform vec4 randomCirc;\n\n uniform vec2 randomRectPos;\n uniform vec2 randomRectSize;\n uniform vec2 randomCircPos;\n uniform vec2 randomCircSize;\n uniform float borderSize;\n\n uniform vec2 rect_top_left;\n uniform vec2 rect_bottom_right;\n\n uniform sampler2D ca_state;\n uniform float caThreshold;\n uniform float ca_factor;\n \n\n #define p2(v) v * v\n #define PI 3.14159265358979323846\n\n \n #define R 10.0\n #define borderWidth 20.0\n #define rectBorderWidth 2.0\n\n #define s(x, y) texture2D(reaction_diffusion, (gl_FragCoord.xy + vec2(x, y)) / resolution).xy\n\n vec2 anisotropicDiffusion(vec2 angles, float a1, vec2 center)\n {\n vec2\n v00 = s(-1, 1), v10 = s(0, 1), v20 = s(1, 1),\n v01 = s(-1, 0), v21 = s(1, 0),\n v02 = s(-1,-1), v12 = s(0,-1), v22 = s(1,-1);\n\n vec2 cos_t = cos(angles);\n vec2 sin_t = sin(angles);\n\n vec2 cos2_t = p2(cos_t);\n vec2 sin2_t = p2(sin_t);\n\n float a2 = 1.0 - a1;\n\n vec2 d = 4.0 * (a2 - a1) * p2(cos_t * sin_t);\n vec2 h = 8.0 * (a1 * cos2_t + a2 * sin2_t);\n vec2 v = 8.0 * (a2 * cos2_t + a1 * sin2_t);\n\n return ((1.0 - d) * (v00 + v22) + (1.0 + d) * (v20 + v02) + h * (v01 + v21) + v * (v10 + v12) - 20.0 * center) / 6.0;\n }\n\n float random (vec2 st) {\n return fract(sin(dot(st.xy,\n vec2(12.9898,78.233)))*\n 43758.5453123);\n }\n bool insideCircle(vec2 point, vec2 center, float radius) {\n return distance(point, center) <= radius;\n }\n\n\n void main() {\n vec4 env = texture2D(environment, (gl_FragCoord.xy / resolution).xy);\n vec2 st = gl_FragCoord.xy/resolution;\n vec3 ca_color = texture2D(ca_state, st).rgb;\n float ca_intensity = dot(ca_color, vec3(0.299, 0.587, 0.114));\n float caValue = texture2D(ca_state, (gl_FragCoord.xy / resolution)).r;\n\n\n float rnd = random( st );\n float pct = 0.0;\n\n vec2 randomRectPosA = randomRectPos * resolution;\n vec2 randomRectSizeA = randomRectSize * resolution;\n\n vec2 randomCircPosA = randomCircPos * resolution;\n vec2 randomCircSizeA = randomCircSize * resolution;\n\n pct = distance(st,vec2(0.5));\n\n float DS = diffusion_scale + env[2] * diffusion_scale_variation;\n vec2 angles = (1.0 + vec2(env[3], separate_fields ? env[0] : env[3])) * PI;\n float caInfluence = float(caValue > caThreshold);\n float F = feed + env[0] * feed_variation;\n float K = kill + env[1] * kill_variation;\n\n \n bool insideRectangle = (gl_FragCoord.x > randomRectPosA.x && gl_FragCoord.x < randomRectPosA.x + randomRectSizeA.x) &&\n (gl_FragCoord.y > randomRectPosA.y && gl_FragCoord.y < randomRectPosA.y + randomRectSizeA.y);\n\n bool insideCircle = insideCircle(gl_FragCoord.xy, randomCircPosA, randomCircSizeA.x); \n\n if (insideRectangle) {\n K += 0.003;\n }\n\n if (insideCircle) {\n K += 0.002;\n }\n\n vec2 old = s(0, 0);\n\n vec2 reaction = vec2(-1.0, 1.0) * old[0] * old[1] * old[1] * (1.0 + caInfluence * ca_factor);\n vec2 dissipation = vec2(F * (1.0 - old[0]), -old[1] * (K + F));\n vec2 diffusion = anisotropicDiffusion(angles, anisotropy, old) * DS * vec2(1.0, 0.5);\n float dt = 1.0 / (4.0 * DS);\n gl_FragColor.xy = old + (reaction + dissipation + diffusion) * dt;\n float edgeDistX = min(gl_FragCoord.x, resolution.x - gl_FragCoord.x);\n float edgeDistY = min(gl_FragCoord.y, resolution.y - gl_FragCoord.y);\n float edgeDist = min(edgeDistX, edgeDistY);\n if (edgeDist <= borderSize) {\n gl_FragColor.x = 0.0;\n gl_FragColor.y = 0.0;\n }\n\n if (mouse_down) {\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, mouse_pos), 0.0) / R;\n }\n\n if (reset) {\n gl_FragColor = vec4(0.0);\n }\n\n if(add)\n {\n vec2 pointPositions[10];\n pointPositions[0] = point_pos1;\n pointPositions[1] = point_pos2;\n pointPositions[2] = point_pos3;\n pointPositions[3] = point_pos4;\n pointPositions[4] = point_pos5;\n pointPositions[5] = point_pos6;\n pointPositions[6] = point_pos7;\n pointPositions[7] = point_pos8;\n pointPositions[8] = point_pos9;\n pointPositions[9] = point_pos0;\n\n for (int i = 0; i < 10; i++) {\n vec2 pointPos = pointPositions[i];\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, pointPos), 0.0) / R;\n }\n gl_FragColor[1] += max(0.25 - old[1], 0.0) * max(R - distance(gl_FragCoord.xy, point_posR), 0.0) / R;\n\n }\n }\n\n";const width=window.innerWidth,height=window.innerHeight,actual_width=Math.round(width),actual_height=Math.round(height),simulation_width=Math.round(actual_width/1.75),simulation_height=Math.round(actual_height/1.75),aspectRatio=window.innerWidth/window.innerHeight;class Random{constructor(){this.useA=!1;let e=function(e){let o=parseInt(e.substring(0,8),16),n=parseInt(e.substring(8,16),16),i=parseInt(e.substring(16,24),16),r=parseInt(e.substring(24,32),16);return function(){o|=0,n|=0,i|=0,r|=0;let e=(o+n|0)+r|0;return r=r+1|0,o=n^n>>>9,n=i+(i<<3)|0,i=i<<21|i>>>11,i=i+e|0,(e>>>0)/4294967296}};this.prngA=new e(tokenData.hash.substring(2,34)),this.prngB=new e(tokenData.hash.substring(34,66));for(let e=0;e<1e6;e+=2)this.prngA(),this.prngB()}random_dec(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}random_num(e,o){return e+(o-e)*this.random_dec()}random_int(e,o){return Math.floor(this.random_num(e,o+1))}random_bool(e){return this.random_dec()<e}random_choice(e){return e[this.random_int(0,e.length-1)]}}class SimplexNoise{constructor(e){this.grad3=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.p=[];for(let o=0;o<256;o++)this.p[o]=Math.floor(256*e.random_dec());this.perm=new Array(512);for(let e=0;e<512;e++)this.perm[e]=this.p[255&e]}dot(e,o,n,i){return e[0]*o+e[1]*n+e[2]*i}noise3d(e,o,n){const i=1/6;let r,t,a,s,l,c,d,f,u,m,_=(e+o+n)*(1/3),g=Math.floor(e+_),h=Math.floor(o+_),v=Math.floor(n+_),p=(g+h+v)*i,R=e-(g-p),b=o-(h-p),T=n-(v-p);R>=b?b>=T?(l=1,c=0,d=0,f=1,u=1,m=0):R>=T?(l=1,c=0,d=0,f=1,u=0,m=1):(l=0,c=0,d=1,f=1,u=0,m=1):b<T?(l=0,c=0,d=1,f=0,u=1,m=1):R<T?(l=0,c=1,d=0,f=0,u=1,m=1):(l=0,c=1,d=0,f=1,u=1,m=0);let F=R-l+i,E=b-c+i,x=T-d+i,C=R-f+2*i,w=b-u+2*i,y=T-m+2*i,S=R-1+.5,k=b-1+.5,H=T-1+.5,D=255&g,A=255&h,V=255&v,B=this.perm[D+this.perm[A+this.perm[V]]]%12,P=this.perm[D+l+this.perm[A+c+this.perm[V+d]]]%12,M=this.perm[D+f+this.perm[A+u+this.perm[V+m]]]%12,W=this.perm[D+1+this.perm[A+1+this.perm[V+1]]]%12,I=.6-R*R-b*b-T*T;I<0?r=0:(I*=I,r=I*I*this.dot(this.grad3[B],R,b,T));let z=.6-F*F-E*E-x*x;z<0?t=0:(z*=z,t=z*z*this.dot(this.grad3[P],F,E,x));let K=.6-C*C-w*w-y*y;K<0?a=0:(K*=K,a=K*K*this.dot(this.grad3[M],C,w,y));let U=.6-S*S-k*k-H*H;return U<0?s=0:(U*=U,s=U*U*this.dot(this.grad3[W],S,k,H)),32*(r+t+a+s)}}let R=new Random;function getRandomArbitrary(e,o){return R.random_dec()*(o-e)+e}let randomRect,randomCirc,diffScaleArray=[.25,.375,.5],diffScale=selectFromArray(diffScaleArray),diffScaleVar=selectFromArray([diffScale-.125,diffScale-.125]),diffScaleArrayWide=[.5,.625,.75,.875,1],diffScaleWide=selectFromArray(diffScaleArrayWide),diffScaleVarWide=selectFromArray([0,diffScale-.125]),feedVar=getRandomArbitrary(0,.01),killVar=getRandomArbitrary(0,.01);function selectFromArray(e){return e[Math.floor(R.random_dec()*e.length)]}function selectNumberFromArray(e){return Math.floor(R.random_dec()*e.length)}function getRandomBool(e){return R.random_dec()<e}function hexToRgb(e){const o=parseInt(e.slice(1),16);return[parseInt(o>>16&255),parseInt(o>>8&255),parseInt(255&o)]}function getRandomBoolean(){return R.random_dec()>=.5}let palettes={Candy:{background:"#E23DB3",accent:"#E23DB3",substance:"#FFC234",c4:"#FFFF99",c5:"#FFFFFF"},Color2:{background:"#AE2029",accent:"#AE2029",substance:"#98D82D",c4:"#98D82D",c5:"#98D82D"},Color3:{background:"#F17401",accent:"#F17401",substance:"#EBFF32",c4:"#EBFF32",c5:"#EBFF32"},Color4:{background:"#FF3C75",accent:"#FF3C75",substance:"#FD97C4",c4:"#FD97C4",c5:"#FD97C4"},Color5:{background:"#000000",accent:"#000000",substance:"#FFFFFF",c4:"#FFFFFF",c5:"#FFFFFF"},Color6:{background:"#F17401",accent:"#F17401",substance:"#EBFF32",c4:"#EBFF32",c5:"#EBFF32"},Yayoi:{background:"#D03A20",accent:"#D03A20",substance:"#FFFFFF",c4:"#FFFFFF",c5:"#FFFFFF"},Gabee:{background:"#ffffff",accent:"#f5f5f0",substance:"#f2f2f2",c4:"#f2f2f2",c5:"#ffffff"},CMKY:{background:"#ffffff",accent:(getRandomBoolean(),"#00ffff"),substance:"#ff00ff",c4:"#ffff00",c5:"#ffffff"},RGB:{background:"#000000",accent:(getRandomBoolean(),"#00FF00"),substance:"#FF0000",c4:"#0000FF",c5:"#FFFFFF"},"30Rack":{background:"#b42024",accent:getRandomBoolean()?"#b42024":"#000000",substance:"#b42024",c4:"#df2126",c5:"#df2126"},Mohun:{background:"#FFFFF1",accent:(getRandomBoolean(),"#C7AFF0"),substance:"#AFCDF0",c4:"#5BC2AC",c5:"#DE87B7"},Q:{background:"#ffffff",accent:"#ffffff",substance:"#e00000",c4:"#ffffff",c5:"#ffffff"},Skeleton:{background:"#000000",accent:"#ffffff",substance:"#000000",c4:"#000000",c5:"#000000"}};const defaultPallette={background:"#FF0000",accent:"#00FF00",substance:"#0000FF"},traitColorKeys=Object.keys(palettes),randomColorIndex=R.random_int(0,traitColorKeys.length-1),randomColorKey=traitColorKeys[randomColorIndex],randomColorTrait=palettes[randomColorKey],selectedColor={...defaultPallette,...randomColorTrait};console.log("palettes:",randomColorKey,"Settings object:",selectedColor),console.log(`Substance Color: ${selectedColor.substance}`),console.log(`Middle Color: ${selectedColor.accent}`),console.log(`Background Color:${selectedColor.background}`);let main_trait={Zebra:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.05,feed_variation:0,warped:getRandomBool(.2),kill:.061,kill_variation:0,feed_modifier:-.015,kill_modifier:-.001,anisotropy:selectFromArray([.25,.75]),environment_noise_scale:750,separate_fields:!0,substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},Fingerprint:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.037,feed_variation:0,warped:getRandomBool(.2),kill:.06,feed_modifier:.009,kill_modifier:.003,kill_modifier:0,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},"Dots and Dashes":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.034,feed_variation:0,warped:getRandomBool(.2),kill:.0618,kill_variation:0,feed_modifier:-.004,kill_modifier:.0012,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},Yayoi:{diffusion_scale:diffScaleWide,diffusion_scale_variation:diffScaleVarWide,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.063,kill_variation:0,feed_modifier:0,kill_modifier:-.0065,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:0,light_height:8e3,simulation_iterations_per_frame:64},Spillage:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.035,feed_variation:.006,kill:.06,kill_variation:.006,feed_modifier:-.005,kill_modifier:-.0035,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64},Coral:{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.046,feed_variation:0,warped:getRandomBool(.2),kill:.063,kill_variation:0,feed_modifier:-.009,kill_modifier:-.003,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:64,light_height:8e3,simulation_iterations_per_frame:64},"Squiggle Maze":{diffusion_scale:diffScale,diffusion_scale_variation:diffScaleVar,feed:.03,feed_variation:0,warped:getRandomBool(.2),kill:.0565,kill_variation:0,feed_modifier:0,kill_modifier:.0065,anisotropy:.5,environment_noise_scale:250,separate_fields:getRandomBool(.3),substance_color:hexToRgb(selectedColor.substance),middle_color:hexToRgb(selectedColor.accent),background_color:hexToRgb(selectedColor.background),c4_color:hexToRgb(selectedColor.c4),c5_color:hexToRgb(selectedColor.c5),specular_color:[0,0,0],bump:0,shininess:8,light_height:8e3,simulation_iterations_per_frame:64}};const defaultSettings={anisotropy:.8,simulation_iterations_per_frame:64,environment_noise_scale:250,substance_color:[0,0,0],middle_color:[0,255,255],background_color:[255,255,255],c4_color:[0,255,255],background_color:[255,255,255],feed_modifier:0,kill_modifier:0,specular_color:[0,0,0],separate_fields:!1,warped:!1,diffusion_scale:.625,diffusion_scale_variation:.375,feed:.042,feed_variation:.001,kill:.06,kill_variation:.001},traitKeys=Object.keys(main_trait),randomIndex=Math.floor(R.random_dec()*traitKeys.length),randomKey=traitKeys[randomIndex],randomTrait=main_trait[randomKey],settings={...defaultSettings,...randomTrait};console.log("Trait name:",randomKey,"Settings object:",settings);const scene=new THREE.Scene,camera=new THREE.Camera;camera.position.z=1;const renderer=new THREE.WebGLRenderer;renderer.setPixelRatio(window.devicePixelRatio),renderer.setSize(width,height),document.body.appendChild(renderer.domElement);let light_pos=new THREE.Vector2(simulation_width,simulation_height),light_enabled=!1,mouse_down=!1,light_move=!1,brush_move=!1;const getRandomInt=(e,o)=>Math.floor(R.random_dec()*(e-o+1)+o),getRandomColor=()=>(16777215*R.random_dec()<<0).toString(16).padStart(6,"0");let elapsedTime=0,frameCounter=0;const updateFrequency=1;function getRandomFloat(e,o){return R.random_dec()*(o-e)+e}let isRect=R.random_choice([1,2,3,4]);switch(isRect){case 1:default:randomRect=new THREE.Vector4(.5*R.random_dec(),0,.2,1),randomCirc=new THREE.Vector4(0,0,0,0);break;case 2:randomRect=new THREE.Vector4(0,0,0,0),randomCirc=new THREE.Vector4(.5,.5,.4,.4);break;case 3:randomRect=new THREE.Vector4(0,0,0,0),randomCirc=new THREE.Vector4(0,0,0,0);break;case 4:randomRect=new THREE.Vector4(.5*R.random_dec(),0,.2,1),randomCirc=new THREE.Vector4(.5,.5,.4,.4)}const borderSizes=[10,50],borderSize=R.random_choice(borderSizes);let caEnabled=R.random_dec>.95;const ca_factor=!0===caEnabled?.8:0,caWidth=Math.floor(simulation_width/20),caHeight=Math.floor(simulation_height/20),caData=new Uint8Array(caWidth*caHeight*3);for(let e=0;e<caData.length;e+=3){let o=R.random_dec()<.8?0:255;caData[e]=o,caData[e+1]=o,caData[e+2]=o}const caTexture=new THREE.DataTexture(caData,caWidth,caHeight,THREE.RGBFormat);caTexture.magFilter=THREE.NearestFilter,caTexture.minFilter=THREE.NearestFilter,caTexture.wrapS=THREE.ClampToEdgeWrapping,caTexture.wrapT=THREE.ClampToEdgeWrapping,caTexture.needsUpdate=!0;const material=new THREE.ShaderMaterial({vertexShader:render_vertex,fragmentShader:render_fragment,uniforms:{reaction_diffusion:{value:null},substance_color:{value:(new THREE.Vector3).fromArray(settings.substance_color).divideScalar(255)},middle_color:{value:(new THREE.Vector3).fromArray(settings.middle_color).divideScalar(255)},background_color:{value:(new THREE.Vector3).fromArray(settings.background_color).divideScalar(255)},c4_color:{value:(new THREE.Vector3).fromArray(settings.c4_color).divideScalar(255)},c5_color:{value:(new THREE.Vector3).fromArray(settings.c5_color).divideScalar(255)},time:{value:0},noise_texture:{value:null},isRect:{value:isRect},randomRect:{value:randomRect},randomCirc:{value:randomCirc},ca_state:{value:caTexture}},defines:{frag2sim:"vec2("+simulation_width/actual_width+", "+simulation_height/actual_height+")",simulation_resolution:"vec2("+simulation_width+", "+simulation_height+")"}});scene.add(new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2),material));const gpu_compute=new THREE.GPUComputationRenderer(simulation_width,simulation_height,renderer),reaction_diffusion=gpu_compute.createTexture(),reaction_diffusion_variable=gpu_compute.addVariable("reaction_diffusion",reaction_diffusion_fragment,reaction_diffusion);reaction_diffusion_variable.wrapS=THREE.ClampToEdgeWrapping,reaction_diffusion_variable.wrapT=THREE.ClampToEdgeWrapping,gpu_compute.setVariableDependencies(reaction_diffusion_variable,[reaction_diffusion_variable]);const reaction_diffusion_uniforms=reaction_diffusion_variable.material.uniforms;reaction_diffusion_uniforms.mouse_pos={value:new THREE.Vector2(-100,-100)};for(let e=0;e<10;e++)reaction_diffusion_uniforms[`point_pos${e}`]={value:new THREE.Vector2(getRandomInt(50,simulation_width-50),getRandomInt(50,simulation_height-50))};function updateCA(){const e=new Uint8Array(caWidth*caHeight*3),o=[1],n=[2,3];for(let i=0;i<caHeight;i++)for(let r=0;r<caWidth;r++){let t=3*(i*caWidth+r),a=0;for(let e=-1;e<=1;e++)for(let o=-1;o<=1;o++){if(0===o&&0===e)continue;255===caData[3*((i+e+caHeight)%caHeight*caWidth+(r+o+caWidth)%caWidth)]&&a++}let s=caData[t],l=a==o[0]||1==s&&n.includes(a)?1:0;l=255!==s||2!==a&&3!==a?0===s&&3===a?255:0:255,e[t]=l,e[t+1]=l,e[t+2]=l}caData.set(e),caTexture.needsUpdate=!0}reaction_diffusion_uniforms.mouse_down={value:!1},reaction_diffusion_uniforms.feed={value:settings.feed},reaction_diffusion_uniforms.kill={value:settings.kill},reaction_diffusion_uniforms.diffusion_scale={value:settings.diffusion_scale},reaction_diffusion_uniforms.feed_variation={value:settings.feed_variation},reaction_diffusion_uniforms.kill_variation={value:settings.kill_variation},reaction_diffusion_uniforms.feed_modifier={value:settings.feed_modifier},reaction_diffusion_uniforms.kill_modifier={value:settings.kill_modifier},reaction_diffusion_uniforms.diffusion_scale_variation={value:settings.diffusion_scale_variation},reaction_diffusion_uniforms.anisotropy={value:settings.anisotropy},reaction_diffusion_uniforms.reset={value:!1},reaction_diffusion_uniforms.add={value:!1},reaction_diffusion_uniforms.separate_fields={value:settings.separate_fields},reaction_diffusion_uniforms.warped={value:settings.warped},reaction_diffusion_uniforms.ca_factor={value:ca_factor},reaction_diffusion_uniforms.ca_state={value:caTexture},reaction_diffusion_uniforms.caThreshold={value:.6},reaction_diffusion_uniforms.borderSize={value:borderSize},reaction_diffusion_uniforms.randomRectPos={value:new THREE.Vector2(randomRect.x,randomRect.y)},reaction_diffusion_uniforms.randomRectSize={value:new THREE.Vector2(randomRect.z,randomRect.w)},reaction_diffusion_uniforms.randomCircPos={value:new THREE.Vector2(randomCirc.x,randomCirc.y)},reaction_diffusion_uniforms.randomCircSize={value:new THREE.Vector2(randomCirc.z,randomCirc.w)};const caDuration=3e4,maxUpdateFrequency=10;let startTime=Date.now();function animate(){if(requestAnimationFrame(animate),frameCounter++,caEnabled){let n=Date.now()-startTime;if(n<3e4){let i=Math.floor((o=1)+(n-(e=0))*(10-o)/(3e4-e));frameCounter%i==0&&updateCA()}else caEnabled=!1}var e,o;render()}function render(e){if(simulateReactionDiffusion(settings.simulation_iterations_per_frame),material.uniforms.reaction_diffusion.value=gpu_compute.getCurrentRenderTarget(reaction_diffusion_variable).texture,elapsedTime+=.01,material.uniforms.time.value=elapsedTime,reaction_diffusion_uniforms.u_time={value:.001*e},renderer.render(scene,camera),!0===render.save_image){render.save_image=!1;const e=document.getElementById("save-link");e.download=render.savename,e.href=renderer.domElement.toDataURL(),e.click()}renderer.info.render.frame>=2e3&&renderer.info.render.frame<5e3?reaction_diffusion_uniforms.add={value:!0}:reaction_diffusion_uniforms.add={value:!1}}function simulateReactionDiffusion(e){for(let o=0;o<e;o++)gpu_compute.compute()}function createEnvironment(e=!0){if(!e&&void 0!==createEnvironment.prev_scale&&createEnvironment.prev_scale===Settings.environment_noise_scale)return;createEnvironment.prev_scale=settings.environment_noise_scale;const o=new SimplexNoise(R),n=Array.from({length:4},(()=>1e3*R.random_dec())),i=1/settings.environment_noise_scale,r=simulation_width/2,t=simulation_height/2,a=(Math.sqrt(r**2+t**2),new Float32Array(simulation_width*simulation_height*4));for(let e=0;e<simulation_height;e++)for(let r=0;r<simulation_width;r++)for(let t=0;t<4;t++)a[4*(e*simulation_width+r)+t]=o.noise3d((r+.5)*i,(e+.5)*(!0===settings.warped?1:i),n[t]);reaction_diffusion_uniforms.environment={value:new THREE.DataTexture(a,simulation_width,simulation_height,THREE.RGBAFormat,THREE.FloatType)},reaction_diffusion_uniforms.environment.value.magFilter=THREE.LinearFilter,reaction_diffusion_uniforms.environment.value.minFilter=THREE.LinearFilter;const s=new THREE.DataTexture(a,simulation_width,simulation_height,THREE.RGBAFormat,THREE.FloatType);s.magFilter=THREE.LinearFilter,s.minFilter=THREE.LinearFilter,material.uniforms.noise_texture.value=s}function updateMousePos(e){let o=e.clientX*(simulation_width/width),n=simulation_height-e.clientY*(simulation_height/height);reaction_diffusion_uniforms.mouse_pos.value.fromArray([o,n])}function onMove(e){updateMousePos(e),reaction_diffusion_uniforms.mouse_down.value=mouse_down&&(brush_move=!0)}function onUp(){mouse_down=brush_move=!1,reaction_diffusion_uniforms.mouse_down.value=!1}function onDown(){mouse_down=!0}function handleTouchEvent(e,o){1===e.touches.length&&(e.preventDefault(),o(e.touches[0]))}createEnvironment(),gpu_compute.init(),animate(),console.log(`Diffusion Scale: ${settings.diffusion_scale}`),console.log(`Diffusion Scale Variation: ${settings.diffusion_scale_variation}`),console.log(`Feed Variation: ${settings.feed_variation}`),console.log(`Kill Variation: ${settings.kill_variation}`),console.log(`Separate Fields: ${settings.separate_fields}`),console.log(`Anisotropy: ${settings.anisotropy}`),console.log(`Warped: ${settings.warped}`),renderer.domElement.onmousedown=onDown,renderer.domElement.onmouseup=renderer.domElement.onmouseleave=onUp,renderer.domElement.onmousemove=onMove;
fsZaJzh/aus0X4EWbVNEx36BJPNsPg==50FTernA34uUzj7o+PYaPQ==YqSWZzGBnqfmSrmY3L77DHGtGPn14Q==Akx9meKPVAYOEOtBhCkXbQ==PlHoB+2ASzSDJTfpDG7lJL7KwL8IBg==JjlASdNlSpdUp0/LCN6Ajw==OWv7J/V5lhu4dDJiVJcqhd6gvc2UKQ==j1UneCYMm0k6Ck/5oxH+bw==uXvBMGc7nTb+WpMWXnI8Pbuc+McFpg==8YuXlnkFBWXiv5uj9p70vg==SvW9JZLzG6pZv+P1kH3mT00oTVw0Bw==pyPims9LZzRz7kCe6WX6iQ==prFPGbVvXAZxg3t3IVzla/G0C/3DOA==j2Tt62LgJ1CrnAjgy2rmNg==nTGwzqAJy0da0qXmXYhqFIbf2CWpUg==RgUeAHN3IYWdKK74wkE/Cg==0KOUwFlCQymiQ4sy07uQJhxA4zcvQQ==nW9Q+hABb+CLhorlCsh//w==RY/R2X9sfoEnk+GVHt8JYP0PlsaXHA==nwy1hKa+C+vU58WsrWjc4w==
const loadScript = (url, callback) => { var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.onreadystatechange = callback; script.onload = callback; head.appendChild(script); } const spongenuityScript = function() { let svg, path; let x = 0; let i = 500; let pause = false var prevX; var prevY; var embCode = []; var half_w; var half_h; var sel_width; var sel_height; var currentX; var currentY; var stitch_point = 0; var color_change = 0; var DEFAULT_WIDTH = 1122 var DEFAULT_HEIGHT = 1587 var WIDTH = window.innerWidth var HEIGHT = window.innerHeight var DIM = Math.min(WIDTH, HEIGHT) var M = DIM / DEFAULT_WIDTH var M2 = DIM / DEFAULT_HEIGHT let tokenId = tokenData.tokenId; let fullTokenID = parseInt(tokenId); console.log(fullTokenID) preload = () => { svg = loadSVG(`https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/${fullTokenID}.svg`); } setup = () => { createCanvas(WIDTH, HEIGHT, SVG); imageMode(CORNER); background(0); stroke(255); image(svg,0, 0, WIDTH, HEIGHT); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var svgRect = path0.getBoundingClientRect(); var svgRectB = path0.getBBox(); var scaling = WIDTH/HEIGHT; var screenMidPointX = WIDTH/2; var rectMidPointX = svgRect.width/2; var centerX = screenMidPointX - rectMidPointX - svgRect.left var screenMidPointY = HEIGHT/2; var rectMidPointY = svgRect.height/2; var centerY = screenMidPointY - rectMidPointY - svgRect.top console.log('M', M) console.log('scaling', scaling) console.log('svgRect.top', svgRect.top) if(scaling === 1){ console.log('scaling = 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } if(scaling === 0.7){ console.log('scaling = 0.7') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } else if( scaling > 1){ console.log('scaling > 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling*M2)}, ${centerY*(scaling*M2)}), scale(${scaling*M2})`); } else if(0.5 > scaling < 1) { console.log('0.5 > scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling*0.75)}, ${centerY*(scaling*0.75)}), scale(${scaling*0.75})`); } else if(scaling < 0.5) { console.log('scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M2)- svgRect.left/2}, ${centerY*(M2)- svgRect.left/2}), scale(${scaling})`); } } draw = () => { noFill(); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var length = path0.getTotalLength(); let size = 0.27; path.attribute('stroke', 'white'); path.attribute('stroke-width', size); // path.attribute('stroke-dasharray', length); // path.attribute('stroke-dashoffset', length - x); x = x + i; if (x >= length && pause == false) { x = length; i = 0; pause = true; setTimeout(function () { cont(); }, 5000); } if (x >= length * 2) { x = 0; i = 0; pause = false; setTimeout(function () { beginning(); }, 5000); } function beginning() { if (x >= 0 && pause == false) { i = 500; } } function cont() { if (x >= length && pause == true) { i = 500; } } } keyPressed = function () { if (keyCode === 49) { path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".png"); } if (keyCode === 50) { // console.log('key 2 pressed') path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".svg"); } if (keyCode === 51) { confirmation(); } } const confirmDialog = (msg) => { return new Promise(function (resolve, reject) { let confirmed = window.confirm(msg); return confirmed ? resolve(true) : reject(false); }); } function delay(milliseconds) { return new Promise(resolve => { setTimeout(resolve, milliseconds); }); } const confirmation = async () => { var pathLength = document.querySelector('path').getTotalLength(); try { await confirmDialog("You have selected to create an embroidery file. This may take a few minutes. Are you sure you want to continue?"); console.time("timer"); console.timeLog("timer"); x = pathLength; i = 0; pause = true; await delay(1000); const polygonPoints = await createPolyline(); console.log(polygonPoints); await convertToDST(polygonPoints); pause = false; console.timeEnd("timer"); } catch (err) { console.log('cancelled', err); } } function createPolyline() { return new Promise((resolve, reject) => { var fullPath = document.querySelector('path'); var pathLength = fullPath.getTotalLength(); var polygonPoints = []; var numPoints = Math.floor(pathLength/50); for (var i = 0; i < numPoints; i++) { var p = fullPath.getPointAtLength(i * pathLength / numPoints); polygonPoints.push(p.x,p.y); } console.log('polygonPoints', polygonPoints); console.log('pathLength', pathLength); resolve(polygonPoints); }); } const convertToDST = (array) => { return new Promise((resolve, reject) => { try { embCode = []; stitch_point = 0; var target_array; prevX = prevY = 0; for (var i = 0; i < array.length; i++) { target_array = array; for (var i = 0; i < target_array.length; i += 2) { currentX = target_array[i]; currentY = target_array[i + 1]; writeBinary(prevX - currentX, -(prevY - currentY)); prevX = currentX; prevY = currentY; stitch_point++; } } saveFile(); resolve(embCode); } catch (error) { reject(error); } }); } function writeBinary(moveX, moveY) { var b1 = 0x0; var b2 = 0x0; var b3 = 0x0; var mx = moveX; var my = moveY; var over_mx = 0; var over_my = 0; if (Math.abs(mx) > 121 || Math.abs(my) > 121) { over_mx = mx > 121 ? mx - 121 : mx < -121 ? mx + 121 : 0; over_my = my > 121 ? my - 121 : my < -121 ? my + 121 : 0; mx = mx > 121 ? 121 : mx < -121 ? -121 : mx; my = my > 121 ? 121 : my < -121 ? -121 : my; b3 |= 0x80; } if (mx >= 41) { b3 |= 0x8; mx -= 81; } if (mx <= -41) { b3 |= 0x4; mx += 81; } if (my >= 41) { b3 |= 0x10; my -= 81; } if (my <= -41) { b3 |= 0x20; my += 81; } if (mx >= 14) { b2 |= 0x8; mx -= 27; } if (mx <= -14) { b2 |= 0x4; mx += 27; } if (my >= 14) { b2 |= 0x10; my -= 27; } if (my <= -14) { b2 |= 0x20; my += 27; } if (mx >= 5) { b1 |= 0x8; mx -= 9; } if (mx <= -5) { b1 |= 0x4; mx += 9; } if (my >= 5) { b1 |= 0x10; my -= 9; } if (my <= -5) { b1 |= 0x20; my += 9; } if (mx >= 2) { b2 |= 0x2; mx -= 3; } if (mx <= -2) { b2 |= 0x1; mx += 3; } if (my >= 2) { b2 |= 0x40; my -= 3; } if (my <= -2) { b2 |= 0x80; my += 3; } if (mx >= 1) { b1 |= 0x2; mx -= 1; } if (mx <= -1) { b1 |= 0x1; mx += 1; } if (my >= 1) { b1 |= 0x40; my -= 1; } if (my <= -1) { b1 |= 0x80; my += 1; } b3 |= 0x3; embCode.push(b1, b2, b3); if (over_mx || over_my) { writeBinary(over_mx, over_my); } } function saveFile() { const fileName = "embroidery.dst"; loading = false; sel_width = 1000; sel_height = 1000; half_w = Math.round(sel_width / 2); half_h = Math.round(sel_height / 2); let str = ""; str += "LA: " + fileName; str += "\rST: " + stitch_point; str += "\rCO: " + color_change; str += "\r+X: " + half_w; str += "\r-X: " + half_w; str += "\r+Y: " + half_h; str += "\r-Y: " + half_h; str += "\rAX:+ " + 0; str += "\rAY:+ " + 0; str += "\rMX:+ " + 0; str += "\rMY:+ " + 0; str += "\rPD:" + "******" str += "\r"; const blank_num = 512 - str.length; for (let k = 0; k < blank_num; k++) { str += " "; } embCode.unshift(0x00, 0x00, 0x83); embCode.push(0x00, 0x00, 0xF3); const u8_embCode = new Uint8Array(embCode); const blob = new Blob([str, u8_embCode], { type: "application/octet-binary" }); const a = document.createElement('a'); a.download = fileName; a.target = '_blank'; if (window.navigator.msSaveBlob) { window.navigator.msSaveBlob(blob, fileName); } else if (window.URL && window.URL.createObjectURL) { a.href = window.URL.createObjectURL(blob); document.body.appendChild(a); a.click(); document.body.removeChild(a); } else if (window.webkitURL && window.webkitURL.createObject) { a.href = window.webkitURL.createObjectURL(blob); a.click(); } else { window.open('data:' + mimeType + ';base64,' + window.Base64.encode(content), '_blank'); } } } loadScript('https://lavender-advanced-hummingbird-947.mypinata.cloud/ipfs/QmU28NZxGoJ7dTWdJPj2Y52aBVpDcCt12AWiRBZDGkPbem', spongenuityScript);
const loadScript = (url, callback) => { var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.onreadystatechange = callback; script.onload = callback; head.appendChild(script); } const spongenuityScript = function() { let svg, path; let x = 0; let i = 500; let pause = false var prevX; var prevY; var embCode = []; var half_w; var half_h; var sel_width; var sel_height; var currentX; var currentY; var stitch_point = 0; var color_change = 0; var DEFAULT_WIDTH = 1122 var DEFAULT_HEIGHT = 1587 var WIDTH = window.innerWidth var HEIGHT = window.innerHeight var DIM = Math.min(WIDTH, HEIGHT) var M = DIM / DEFAULT_WIDTH var M2 = DIM / DEFAULT_HEIGHT let tokenId = tokenData.tokenId; let fullTokenID = parseInt(tokenId); console.log(fullTokenID) preload = () => { svg = loadSVG(`https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/${fullTokenID}.svg`); } setup = () => { createCanvas(WIDTH, HEIGHT, SVG); imageMode(CORNER); background(0); stroke(255); image(svg,0, 0, WIDTH, HEIGHT); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var svgRect = path0.getBoundingClientRect(); var svgRectB = path0.getBBox(); var scaling = WIDTH/HEIGHT; var screenMidPointX = WIDTH/2; var rectMidPointX = svgRect.width/2; var centerX = screenMidPointX - rectMidPointX - svgRect.left var screenMidPointY = HEIGHT/2; var rectMidPointY = svgRect.height/2; var centerY = screenMidPointY - rectMidPointY - svgRect.top console.log('M', M) console.log('scaling', scaling) console.log('svgRect.top', svgRect.top) if(scaling === 1){ console.log('scaling = 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } if(scaling === 0.7){ console.log('scaling = 0.7') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } else if( scaling > 1){ console.log('scaling > 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling*M2)}, ${centerY*(scaling*M2)}), scale(${scaling*M2})`); } else if(0.5 > scaling < 1) { console.log('0.5 > scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling*0.75)}, ${centerY*(scaling*0.75)}), scale(${scaling*0.75})`); } else if(scaling < 0.5) { console.log('scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M2)- svgRect.left/2}, ${centerY*(M2)- svgRect.left/2}), scale(${scaling})`); } } draw = () => { noFill(); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var length = path0.getTotalLength(); let size = 0.27; path.attribute('stroke', 'white'); path.attribute('stroke-width', size); path.attribute('stroke-dasharray', length); path.attribute('stroke-dashoffset', length - x); x = x + i; if (x >= length && pause == false) { x = length; i = 0; pause = true; setTimeout(function () { cont(); }, 5000); } if (x >= length * 2) { x = 0; i = 0; pause = false; setTimeout(function () { beginning(); }, 5000); } function beginning() { if (x >= 0 && pause == false) { i = 500; } } function cont() { if (x >= length && pause == true) { i = 500; } } } keyPressed = function () { if (keyCode === 49) { path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".png"); } if (keyCode === 50) { // console.log('key 2 pressed') path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".svg"); } if (keyCode === 51) { confirmation(); } } const confirmDialog = (msg) => { return new Promise(function (resolve, reject) { let confirmed = window.confirm(msg); return confirmed ? resolve(true) : reject(false); }); } function delay(milliseconds) { return new Promise(resolve => { setTimeout(resolve, milliseconds); }); } const confirmation = async () => { var pathLength = document.querySelector('path').getTotalLength(); try { await confirmDialog("You have selected to create an embroidery file. This may take a few minutes. Are you sure you want to continue?"); console.time("timer"); console.timeLog("timer"); x = pathLength; i = 0; pause = true; await delay(1000); const polygonPoints = await createPolyline(); console.log(polygonPoints); await convertToDST(polygonPoints); pause = false; console.timeEnd("timer"); } catch (err) { console.log('cancelled', err); } } function createPolyline() { return new Promise((resolve, reject) => { var fullPath = document.querySelector('path'); var pathLength = fullPath.getTotalLength(); var polygonPoints = []; var numPoints = Math.floor(pathLength/50); for (var i = 0; i < numPoints; i++) { var p = fullPath.getPointAtLength(i * pathLength / numPoints); polygonPoints.push(p.x,p.y); } console.log('polygonPoints', polygonPoints); console.log('pathLength', pathLength); resolve(polygonPoints); }); } const convertToDST = (array) => { return new Promise((resolve, reject) => { try { embCode = []; stitch_point = 0; var target_array; prevX = prevY = 0; for (var i = 0; i < array.length; i++) { target_array = array; for (var i = 0; i < target_array.length; i += 2) { currentX = target_array[i]; currentY = target_array[i + 1]; writeBinary(prevX - currentX, -(prevY - currentY)); prevX = currentX; prevY = currentY; stitch_point++; } } saveFile(); resolve(embCode); } catch (error) { reject(error); } }); } function writeBinary(moveX, moveY) { var b1 = 0x0; var b2 = 0x0; var b3 = 0x0; var mx = moveX; var my = moveY; var over_mx = 0; var over_my = 0; if (Math.abs(mx) > 121 || Math.abs(my) > 121) { over_mx = mx > 121 ? mx - 121 : mx < -121 ? mx + 121 : 0; over_my = my > 121 ? my - 121 : my < -121 ? my + 121 : 0; mx = mx > 121 ? 121 : mx < -121 ? -121 : mx; my = my > 121 ? 121 : my < -121 ? -121 : my; b3 |= 0x80; } if (mx >= 41) { b3 |= 0x8; mx -= 81; } if (mx <= -41) { b3 |= 0x4; mx += 81; } if (my >= 41) { b3 |= 0x10; my -= 81; } if (my <= -41) { b3 |= 0x20; my += 81; } if (mx >= 14) { b2 |= 0x8; mx -= 27; } if (mx <= -14) { b2 |= 0x4; mx += 27; } if (my >= 14) { b2 |= 0x10; my -= 27; } if (my <= -14) { b2 |= 0x20; my += 27; } if (mx >= 5) { b1 |= 0x8; mx -= 9; } if (mx <= -5) { b1 |= 0x4; mx += 9; } if (my >= 5) { b1 |= 0x10; my -= 9; } if (my <= -5) { b1 |= 0x20; my += 9; } if (mx >= 2) { b2 |= 0x2; mx -= 3; } if (mx <= -2) { b2 |= 0x1; mx += 3; } if (my >= 2) { b2 |= 0x40; my -= 3; } if (my <= -2) { b2 |= 0x80; my += 3; } if (mx >= 1) { b1 |= 0x2; mx -= 1; } if (mx <= -1) { b1 |= 0x1; mx += 1; } if (my >= 1) { b1 |= 0x40; my -= 1; } if (my <= -1) { b1 |= 0x80; my += 1; } b3 |= 0x3; embCode.push(b1, b2, b3); if (over_mx || over_my) { writeBinary(over_mx, over_my); } } function saveFile() { const fileName = "embroidery.dst"; loading = false; sel_width = 1000; sel_height = 1000; half_w = Math.round(sel_width / 2); half_h = Math.round(sel_height / 2); let str = ""; str += "LA: " + fileName; str += "\rST: " + stitch_point; str += "\rCO: " + color_change; str += "\r+X: " + half_w; str += "\r-X: " + half_w; str += "\r+Y: " + half_h; str += "\r-Y: " + half_h; str += "\rAX:+ " + 0; str += "\rAY:+ " + 0; str += "\rMX:+ " + 0; str += "\rMY:+ " + 0; str += "\rPD:" + "******" str += "\r"; const blank_num = 512 - str.length; for (let k = 0; k < blank_num; k++) { str += " "; } embCode.unshift(0x00, 0x00, 0x83); embCode.push(0x00, 0x00, 0xF3); const u8_embCode = new Uint8Array(embCode); const blob = new Blob([str, u8_embCode], { type: "application/octet-binary" }); const a = document.createElement('a'); a.download = fileName; a.target = '_blank'; if (window.navigator.msSaveBlob) { window.navigator.msSaveBlob(blob, fileName); } else if (window.URL && window.URL.createObjectURL) { a.href = window.URL.createObjectURL(blob); document.body.appendChild(a); a.click(); document.body.removeChild(a); } else if (window.webkitURL && window.webkitURL.createObject) { a.href = window.webkitURL.createObjectURL(blob); a.click(); } else { window.open('data:' + mimeType + ';base64,' + window.Base64.encode(content), '_blank'); } } } loadScript('https://lavender-advanced-hummingbird-947.mypinata.cloud/ipfs/QmU28NZxGoJ7dTWdJPj2Y52aBVpDcCt12AWiRBZDGkPbem', spongenuityScript);
const loadScript = (url, callback) => { var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.onreadystatechange = callback; script.onload = callback; head.appendChild(script); } const spongenuityScript = function() { let svg, path; let x = 0; let i = 500; let pause = false var prevX; var prevY; var embCode = []; var half_w; var half_h; var sel_width; var sel_height; var currentX; var currentY; var stitch_point = 0; var color_change = 0; var DEFAULT_WIDTH = 1122 var DEFAULT_HEIGHT = 1587 var WIDTH = window.innerWidth var HEIGHT = window.innerHeight var DIM = Math.min(WIDTH, HEIGHT) var M = DIM / DEFAULT_WIDTH var M2 = DIM / DEFAULT_HEIGHT let tokenId = tokenData.tokenId; let fullTokenID = parseInt(tokenId); console.log(fullTokenID) preload = () => { svg = loadSVG(`https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/${fullTokenID}.svg`); } setup = () => { createCanvas(WIDTH, HEIGHT, SVG); imageMode(CORNER); background(0); stroke(255); image(svg,0, 0, WIDTH, HEIGHT); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var svgRect = path0.getBoundingClientRect(); var svgRectB = path0.getBBox(); var scaling = WIDTH/HEIGHT; var screenMidPointX = WIDTH/2; var rectMidPointX = svgRect.width/2; var centerX = screenMidPointX - rectMidPointX - svgRect.left var screenMidPointY = HEIGHT/2; var rectMidPointY = svgRect.height/2; var centerY = screenMidPointY - rectMidPointY - svgRect.top console.log('M', M) console.log('scaling', scaling) console.log('svgRect.top', svgRect.top) if(scaling === 1){ console.log('scaling = 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } if(scaling === 0.7){ console.log('scaling = 0.7') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M)}, ${centerY*(M)}), scale(${M})`); } else if( scaling > 1){ console.log('scaling > 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling*M2)}, ${centerY*(scaling*M2)}), scale(${scaling*M2})`); } else if(0.5 > scaling < 1) { console.log('0.5 > scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(scaling)}, ${centerY*(scaling)}), scale(${scaling})`); } else if(scaling < 0.5) { console.log('scaling < 1') path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*(M2)- svgRect.left/2}, ${centerY*(M2)- svgRect.left/2}), scale(${scaling})`); } } draw = () => { noFill(); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var length = path0.getTotalLength(); let size = 0.27; path.attribute('stroke', 'white'); path.attribute('stroke-width', size); path.attribute('stroke-dasharray', length); path.attribute('stroke-dashoffset', length - x); x = x + i; if (x >= length && pause == false) { x = length; i = 0; pause = true; setTimeout(function () { cont(); }, 5000); } if (x >= length * 2) { x = 0; i = 0; pause = false; setTimeout(function () { beginning(); }, 5000); } function beginning() { if (x >= 0 && pause == false) { i = 500; } } function cont() { if (x >= length && pause == true) { i = 500; } } } keyPressed = function () { if (keyCode === 49) { path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".png"); } if (keyCode === 50) { // console.log('key 2 pressed') path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".svg"); } if (keyCode === 51) { confirmation(); } } const confirmDialog = (msg) => { return new Promise(function (resolve, reject) { let confirmed = window.confirm(msg); return confirmed ? resolve(true) : reject(false); }); } function delay(milliseconds) { return new Promise(resolve => { setTimeout(resolve, milliseconds); }); } const confirmation = async () => { var pathLength = document.querySelector('path').getTotalLength(); try { await confirmDialog("You have selected to create an embroidery file. This may take a few minutes. Are you sure you want to continue?"); console.time("timer"); console.timeLog("timer"); x = pathLength; i = 0; pause = true; await delay(1000); const polygonPoints = await createPolyline(); console.log(polygonPoints); await convertToDST(polygonPoints); pause = false; console.timeEnd("timer"); } catch (err) { console.log('cancelled', err); } } function createPolyline() { return new Promise((resolve, reject) => { var fullPath = document.querySelector('path'); var pathLength = fullPath.getTotalLength(); var polygonPoints = []; var numPoints = Math.floor(pathLength/50); for (var i = 0; i < numPoints; i++) { var p = fullPath.getPointAtLength(i * pathLength / numPoints); polygonPoints.push(p.x,p.y); } console.log('polygonPoints', polygonPoints); console.log('pathLength', pathLength); resolve(polygonPoints); }); } const convertToDST = (array) => { return new Promise((resolve, reject) => { try { embCode = []; stitch_point = 0; var target_array; prevX = prevY = 0; for (var i = 0; i < array.length; i++) { target_array = array; for (var i = 0; i < target_array.length; i += 2) { currentX = target_array[i]; currentY = target_array[i + 1]; writeBinary(prevX - currentX, -(prevY - currentY)); prevX = currentX; prevY = currentY; stitch_point++; } } saveFile(); resolve(embCode); } catch (error) { reject(error); } }); } function writeBinary(moveX, moveY) { var b1 = 0x0; var b2 = 0x0; var b3 = 0x0; var mx = moveX; var my = moveY; var over_mx = 0; var over_my = 0; if (Math.abs(mx) > 121 || Math.abs(my) > 121) { over_mx = mx > 121 ? mx - 121 : mx < -121 ? mx + 121 : 0; over_my = my > 121 ? my - 121 : my < -121 ? my + 121 : 0; mx = mx > 121 ? 121 : mx < -121 ? -121 : mx; my = my > 121 ? 121 : my < -121 ? -121 : my; b3 |= 0x80; } if (mx >= 41) { b3 |= 0x8; mx -= 81; } if (mx <= -41) { b3 |= 0x4; mx += 81; } if (my >= 41) { b3 |= 0x10; my -= 81; } if (my <= -41) { b3 |= 0x20; my += 81; } if (mx >= 14) { b2 |= 0x8; mx -= 27; } if (mx <= -14) { b2 |= 0x4; mx += 27; } if (my >= 14) { b2 |= 0x10; my -= 27; } if (my <= -14) { b2 |= 0x20; my += 27; } if (mx >= 5) { b1 |= 0x8; mx -= 9; } if (mx <= -5) { b1 |= 0x4; mx += 9; } if (my >= 5) { b1 |= 0x10; my -= 9; } if (my <= -5) { b1 |= 0x20; my += 9; } if (mx >= 2) { b2 |= 0x2; mx -= 3; } if (mx <= -2) { b2 |= 0x1; mx += 3; } if (my >= 2) { b2 |= 0x40; my -= 3; } if (my <= -2) { b2 |= 0x80; my += 3; } if (mx >= 1) { b1 |= 0x2; mx -= 1; } if (mx <= -1) { b1 |= 0x1; mx += 1; } if (my >= 1) { b1 |= 0x40; my -= 1; } if (my <= -1) { b1 |= 0x80; my += 1; } b3 |= 0x3; embCode.push(b1, b2, b3); if (over_mx || over_my) { writeBinary(over_mx, over_my); } } function saveFile() { const fileName = "embroidery.dst"; loading = false; sel_width = 1000; sel_height = 1000; half_w = Math.round(sel_width / 2); half_h = Math.round(sel_height / 2); let str = ""; str += "LA: " + fileName; str += "\rST: " + stitch_point; str += "\rCO: " + color_change; str += "\r+X: " + half_w; str += "\r-X: " + half_w; str += "\r+Y: " + half_h; str += "\r-Y: " + half_h; str += "\rAX:+ " + 0; str += "\rAY:+ " + 0; str += "\rMX:+ " + 0; str += "\rMY:+ " + 0; str += "\rPD:" + "******" str += "\r"; const blank_num = 512 - str.length; for (let k = 0; k < blank_num; k++) { str += " "; } embCode.unshift(0x00, 0x00, 0x83); embCode.push(0x00, 0x00, 0xF3); const u8_embCode = new Uint8Array(embCode); const blob = new Blob([str, u8_embCode], { type: "application/octet-binary" }); const a = document.createElement('a'); a.download = fileName; a.target = '_blank'; if (window.navigator.msSaveBlob) { window.navigator.msSaveBlob(blob, fileName); } else if (window.URL && window.URL.createObjectURL) { a.href = window.URL.createObjectURL(blob); document.body.appendChild(a); a.click(); document.body.removeChild(a); } else if (window.webkitURL && window.webkitURL.createObject) { a.href = window.webkitURL.createObjectURL(blob); a.click(); } else { window.open('data:' + mimeType + ';base64,' + window.Base64.encode(content), '_blank'); } } } loadScript('https://lavender-advanced-hummingbird-947.mypinata.cloud/ipfs/QmU28NZxGoJ7dTWdJPj2Y52aBVpDcCt12AWiRBZDGkPbem', spongenuityScript);
const loadScript = (url, callback) => { var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.onreadystatechange = callback; script.onload = callback; head.appendChild(script); } const spongenuityScript = function() { let svg, path; let x = 0; let i = 500; let pause = false var prevX; var prevY; var embCode = []; var half_w; var half_h; var sel_width; var sel_height; var currentX; var currentY; var stitch_point = 0; var color_change = 0; var DEFAULT_WIDTH = 1122 var DEFAULT_HEIGHT = 1587 var WIDTH = window.innerWidth var HEIGHT = window.innerHeight var DIM = Math.min(WIDTH, HEIGHT) var M = DIM / DEFAULT_WIDTH var M2 = DIM / DEFAULT_HEIGHT let tokenId = tokenData.tokenId; let fullTokenID = parseInt(tokenId); console.log(fullTokenID) preload = () => { svg = loadSVG(`https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/${fullTokenID}.svg`); } setup = () => { createCanvas(WIDTH, HEIGHT, SVG); imageMode(CORNER); background(0); stroke(255); image(svg,0, 0, WIDTH, HEIGHT); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var svgRect = path0.getBoundingClientRect(); var scaling = WIDTH/HEIGHT; var screenMidPointX = WIDTH/2; var rectMidPointX = svgRect.width/2; var centerX = screenMidPointX - rectMidPointX - svgRect.left var screenMidPointY = HEIGHT/2; var rectMidPointY = svgRect.height/2; var centerY = screenMidPointY - rectMidPointY - svgRect.top var scaler = () => { if(scaling === 1){ console.log('scaling = 1') return M2 } else if( scaling > 1){ console.log('scaling > 1') return scaling*M2 } else { console.log('scaling < 1') return M*0.9 } } var factor = scaler(); path.attribute('transform-origin', `center`); path.attribute('transform', `translate(${centerX*factor}, ${centerY*factor}), scale(${factor})`); } draw = () => { noFill(); path = querySVG('path')[0]; var path0 = document.querySelector('path'); var length = path0.getTotalLength(); let size = 0.27; path.attribute('stroke', 'white'); path.attribute('stroke-width', size); path.attribute('stroke-dasharray', length); path.attribute('stroke-dashoffset', length - x); x = x + i; if (x >= length && pause == false) { x = length; i = 0; pause = true; setTimeout(function () { cont(); }, 5000); } if (x >= length * 2) { x = 0; i = 0; pause = false; setTimeout(function () { beginning(); }, 5000); } function beginning() { if (x >= 0 && pause == false) { i = 500; } } function cont() { if (x >= length && pause == true) { i = 500; } } } keyPressed = function () { if (keyCode === 49) { path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".png"); } if (keyCode === 50) { path.attribute('stroke-dashoffset', length); save(x + "-" + frameCount + ".svg"); } if (keyCode === 51) { confirmation(); } } const confirmDialog = (msg) => { return new Promise(function (resolve, reject) { let confirmed = window.confirm(msg); return confirmed ? resolve(true) : reject(false); }); } function delay(milliseconds) { return new Promise(resolve => { setTimeout(resolve, milliseconds); }); } const confirmation = async () => { var pathLength = document.querySelector('path').getTotalLength(); try { await confirmDialog("You have selected to create an embroidery file. This may take a few minutes. Are you sure you want to continue?"); console.time("timer"); console.timeLog("timer"); x = pathLength; i = 0; pause = true; await delay(1000); const polygonPoints = await createPolyline(); console.log(polygonPoints); await convertToDST(polygonPoints); pause = false; console.timeEnd("timer"); } catch (err) { console.log('cancelled', err); } } function createPolyline() { return new Promise((resolve, reject) => { var fullPath = document.querySelector('path'); var pathLength = fullPath.getTotalLength(); var polygonPoints = []; var numPoints = Math.floor(pathLength/50); for (var i = 0; i < numPoints; i++) { var p = fullPath.getPointAtLength(i * pathLength / numPoints); polygonPoints.push(p.x,p.y); } console.log('polygonPoints', polygonPoints); console.log('pathLength', pathLength); resolve(polygonPoints); }); } const convertToDST = (array) => { return new Promise((resolve, reject) => { try { embCode = []; stitch_point = 0; var target_array; prevX = prevY = 0; for (var i = 0; i < array.length; i++) { target_array = array; for (var i = 0; i < target_array.length; i += 2) { currentX = target_array[i]; currentY = target_array[i + 1]; writeBinary(prevX - currentX, -(prevY - currentY)); prevX = currentX; prevY = currentY; stitch_point++; } } saveFile(); resolve(embCode); } catch (error) { reject(error); } }); } function writeBinary(moveX, moveY) { var b1 = 0x0; var b2 = 0x0; var b3 = 0x0; var mx = moveX; var my = moveY; var over_mx = 0; var over_my = 0; if (Math.abs(mx) > 121 || Math.abs(my) > 121) { over_mx = mx > 121 ? mx - 121 : mx < -121 ? mx + 121 : 0; over_my = my > 121 ? my - 121 : my < -121 ? my + 121 : 0; mx = mx > 121 ? 121 : mx < -121 ? -121 : mx; my = my > 121 ? 121 : my < -121 ? -121 : my; b3 |= 0x80; } if (mx >= 41) { b3 |= 0x8; mx -= 81; } if (mx <= -41) { b3 |= 0x4; mx += 81; } if (my >= 41) { b3 |= 0x10; my -= 81; } if (my <= -41) { b3 |= 0x20; my += 81; } if (mx >= 14) { b2 |= 0x8; mx -= 27; } if (mx <= -14) { b2 |= 0x4; mx += 27; } if (my >= 14) { b2 |= 0x10; my -= 27; } if (my <= -14) { b2 |= 0x20; my += 27; } if (mx >= 5) { b1 |= 0x8; mx -= 9; } if (mx <= -5) { b1 |= 0x4; mx += 9; } if (my >= 5) { b1 |= 0x10; my -= 9; } if (my <= -5) { b1 |= 0x20; my += 9; } if (mx >= 2) { b2 |= 0x2; mx -= 3; } if (mx <= -2) { b2 |= 0x1; mx += 3; } if (my >= 2) { b2 |= 0x40; my -= 3; } if (my <= -2) { b2 |= 0x80; my += 3; } if (mx >= 1) { b1 |= 0x2; mx -= 1; } if (mx <= -1) { b1 |= 0x1; mx += 1; } if (my >= 1) { b1 |= 0x40; my -= 1; } if (my <= -1) { b1 |= 0x80; my += 1; } b3 |= 0x3; embCode.push(b1, b2, b3); if (over_mx || over_my) { writeBinary(over_mx, over_my); } } function saveFile() { const fileName = "embroidery.dst"; loading = false; sel_width = 1000; sel_height = 1000; half_w = Math.round(sel_width / 2); half_h = Math.round(sel_height / 2); let str = ""; str += "LA: " + fileName; str += "\rST: " + stitch_point; str += "\rCO: " + color_change; str += "\r+X: " + half_w; str += "\r-X: " + half_w; str += "\r+Y: " + half_h; str += "\r-Y: " + half_h; str += "\rAX:+ " + 0; str += "\rAY:+ " + 0; str += "\rMX:+ " + 0; str += "\rMY:+ " + 0; str += "\rPD:" + "******" str += "\r"; const blank_num = 512 - str.length; for (let k = 0; k < blank_num; k++) { str += " "; } embCode.unshift(0x00, 0x00, 0x83); embCode.push(0x00, 0x00, 0xF3); const u8_embCode = new Uint8Array(embCode); const blob = new Blob([str, u8_embCode], { type: "application/octet-binary" }); const a = document.createElement('a'); a.download = fileName; a.target = '_blank'; if (window.navigator.msSaveBlob) { window.navigator.msSaveBlob(blob, fileName); } else if (window.URL && window.URL.createObjectURL) { a.href = window.URL.createObjectURL(blob); document.body.appendChild(a); a.click(); document.body.removeChild(a); } else if (window.webkitURL && window.webkitURL.createObject) { a.href = window.webkitURL.createObjectURL(blob); a.click(); } else { window.open('data:' + mimeType + ';base64,' + window.Base64.encode(content), '_blank'); } } } loadScript('https://lavender-advanced-hummingbird-947.mypinata.cloud/ipfs/QmU28NZxGoJ7dTWdJPj2Y52aBVpDcCt12AWiRBZDGkPbem', spongenuityScript);
function a(){var a9=['.svg','appendChild','log','\x0dAY:+\x20\x20\x20\x20','open','webkitURL','\x0d+Y:\x20\x20','href','stroke-dasharray','navigator','round','\x0d-X:\x20\x20','timeEnd','getElementsByTagName','https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/','unshift','\x0dPD:','abs','body','confirm','click','1093785ESOFPW','tokenId','embroidery.dst','createObjectURL','transform','.png','9xKNLHv','onreadystatechange','revokeObjectURL','stroke','stroke-dashoffset','\x0dST:\x20\x20','outerHTML','application/octet-binary','querySelector','pathLength','\x0dAX:+\x20\x20\x20\x20','innerHeight','push','translate(','\x0d-Y:\x20\x20','createObject','stroke-width','top','5181ZVYvll','length','74TYZoZU','URL','\x0dMY:+\x20\x20\x20\x20','Base64','timer','innerWidth','encode','time','plain/text','1409807ewTBEo','createElement','2862LXGTik','attribute','target','633272Wpdibk','top\x20>\x200','removeChild','floor','min','download','1467456XoRQcb','\x0dCO:\x20\x20','msSaveBlob','timeLog','2116920LaPyTh','data:','\x0dMX:+\x20\x20\x20\x20','svg','path','polygonPoints','508sQmsSG','getTotalLength','onload','white','head'];a=function(){return a9;};return a();}(function(c,d){var U=b,e=c();while(!![]){try{var f=parseInt(U(0x2))/0x1*(-parseInt(U(0xd))/0x2)+parseInt(U(0x0))/0x3*(-parseInt(U(0x20))/0x4)+parseInt(U(0x3a))/0x5+-parseInt(U(0x16))/0x6+parseInt(U(0xb))/0x7+-parseInt(U(0x10))/0x8*(-parseInt(U(0x40))/0x9)+parseInt(U(0x1a))/0xa;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x2279a));const loadScript=(c,d)=>{var V=b,e=document[V(0x32)](V(0x24))[0x0],f=document[V(0xc)]('script');f['type']='text/javascript',f['src']=c,f[V(0x41)]=d,f[V(0x22)]=d,e[V(0x26)](f);},spongenuityScript=function(){var W=b;let c,d,e=0x0,f=0x1f4,g=![];var h,j,k=[],l,m,n,o,p,q,r=0x0,s=0x0,t=0x462,u=0x633,v=window[W(0x7)],w=window[W(0x4b)],y=Math[W(0x14)](v,w),z=y/t;let A=tokenData[W(0x3b)],B=parseInt(A);console[W(0x27)](B),preload=()=>{var X=W;c=loadSVG(X(0x33)+B+X(0x25));},setup=()=>{var Y=W;createCanvas(v,w,SVG),background(0x0),stroke(0xff),image(c,0x0,0x0,v,w),d=querySVG(Y(0x1e))[0x0];var K=document[Y(0x48)](Y(0x1e)),L=K['getBoundingClientRect'](),N=()=>{return z>1.5?1.5:z;};L[Y(0x51)]>0x0&&(console['log'](Y(0x11)),d[Y(0xe)](Y(0x3e),Y(0x4d)+L['left']*-0x1+',\x20'+L[Y(0x51)]*-0x1+')'),d[Y(0xe)](Y(0x3e),'scale('+N()+')'));},draw=()=>{var Z=W;noFill(),d=querySVG(Z(0x1e))[0x0];var K=document['querySelector']('path'),L=K[Z(0x21)]();let N=0.27;d[Z(0xe)](Z(0x43),Z(0x23)),d['attribute'](Z(0x50),N),d['attribute'](Z(0x2d),L),d[Z(0xe)](Z(0x44),L-e),e=e+f;e>=L&&g==![]&&(e=L,f=0x0,g=!![],setTimeout(function(){P();},0x1388));e>=L*0x2&&(e=0x0,f=0x0,g=![],setTimeout(function(){O();},0x1388));function O(){e>=0x0&&g==![]&&(f=0x1f4);}function P(){e>=L&&g==!![]&&(f=0x1f4);}};function C(){var a0=W;let K=document[a0(0x32)](a0(0x1d))[0x0],L=K[a0(0x46)],N=new Blob([L],{'type':a0(0xa)}),O=document['createElement']('a'),P=URL['createObjectURL'](N);O[a0(0x2c)]=P,O[a0(0x15)]='exported.svg',document['body']['appendChild'](O),O[a0(0x39)](),setTimeout(function(){var a1=a0;document[a1(0x37)][a1(0x12)](O),window['URL'][a1(0x42)](P);},0x0);}keyPressed=function(){var a2=W;keyCode===0x31&&(d['attribute']('stroke-dashoffset',length),save(e+'-'+frameCount+a2(0x3f))),keyCode===0x32&&(d[a2(0xe)]('stroke-dashoffset',length),C()),keyCode===0x33&&F();};const D=K=>{return new Promise(function(L,N){var a3=b;let O=window[a3(0x38)](K);return O?L(!![]):N(![]);});};function E(K){return new Promise(L=>{setTimeout(L,K);});}const F=async()=>{var a4=W,K=document['querySelector']('path')[a4(0x21)]();try{await D('You\x20have\x20selected\x20to\x20create\x20an\x20embroidery\x20file.\x20This\x20may\x20take\x20a\x20few\x20minutes.\x20Are\x20you\x20sure\x20you\x20want\x20to\x20continue?'),console[a4(0x9)]('timer'),console[a4(0x19)](a4(0x6)),e=K,f=0x0,g=!![],await E(0x3e8);const L=await G();console[a4(0x27)](L),await H(L),g=![],console[a4(0x31)](a4(0x6));}catch(N){console[a4(0x27)]('cancelled',N);}};function G(){return new Promise((K,L)=>{var a5=b,N=document['querySelector'](a5(0x1e)),O=N[a5(0x21)](),P=[],Q=Math[a5(0x13)](O/0x32);for(var R=0x0;R<Q;R++){var S=N['getPointAtLength'](R*O/Q);P[a5(0x4c)](S['x'],S['y']);}console[a5(0x27)](a5(0x1f),P),console['log'](a5(0x49),O),K(P);});}const H=K=>{return new Promise((L,N)=>{var a6=b;try{k=[],r=0x0;var O;h=j=0x0;for(var P=0x0;P<K[a6(0x1)];P++){O=K;for(var P=0x0;P<O[a6(0x1)];P+=0x2){p=O[P],q=O[P+0x1],I(h-p,-(j-q)),h=p,j=q,r++;}}J(),L(k);}catch(Q){N(Q);}});};function I(K,L){var a7=W,N=0x0,O=0x0,P=0x0,Q=K,R=L,S=0x0,T=0x0;(Math['abs'](Q)>0x79||Math[a7(0x36)](R)>0x79)&&(S=Q>0x79?Q-0x79:Q<-0x79?Q+0x79:0x0,T=R>0x79?R-0x79:R<-0x79?R+0x79:0x0,Q=Q>0x79?0x79:Q<-0x79?-0x79:Q,R=R>0x79?0x79:R<-0x79?-0x79:R,P|=0x80),Q>=0x29&&(P|=0x8,Q-=0x51),Q<=-0x29&&(P|=0x4,Q+=0x51),R>=0x29&&(P|=0x10,R-=0x51),R<=-0x29&&(P|=0x20,R+=0x51),Q>=0xe&&(O|=0x8,Q-=0x1b),Q<=-0xe&&(O|=0x4,Q+=0x1b),R>=0xe&&(O|=0x10,R-=0x1b),R<=-0xe&&(O|=0x20,R+=0x1b),Q>=0x5&&(N|=0x8,Q-=0x9),Q<=-0x5&&(N|=0x4,Q+=0x9),R>=0x5&&(N|=0x10,R-=0x9),R<=-0x5&&(N|=0x20,R+=0x9),Q>=0x2&&(O|=0x2,Q-=0x3),Q<=-0x2&&(O|=0x1,Q+=0x3),R>=0x2&&(O|=0x40,R-=0x3),R<=-0x2&&(O|=0x80,R+=0x3),Q>=0x1&&(N|=0x2,Q-=0x1),Q<=-0x1&&(N|=0x1,Q+=0x1),R>=0x1&&(N|=0x40,R-=0x1),R<=-0x1&&(N|=0x80,R+=0x1),P|=0x3,k['push'](N,O,P),(S||T)&&I(S,T);}function J(){var a8=W;const K=a8(0x3c);loading=![],n=0x3e8,o=0x3e8,l=Math[a8(0x2f)](n/0x2),m=Math['round'](o/0x2);let L='';L+='LA:\x20\x20'+K,L+=a8(0x45)+r,L+=a8(0x17)+s,L+='\x0d+X:\x20\x20'+l,L+=a8(0x30)+l,L+=a8(0x2b)+m,L+=a8(0x4e)+m,L+=a8(0x4a)+0x0,L+=a8(0x28)+0x0,L+=a8(0x1c)+0x0,L+=a8(0x4)+0x0,L+=a8(0x35)+'******',L+='\x0d';const N=0x200-L['length'];for(let R=0x0;R<N;R++){L+='\x20';}k[a8(0x34)](0x0,0x0,0x83),k[a8(0x4c)](0x0,0x0,0xf3);const O=new Uint8Array(k),P=new Blob([L,O],{'type':a8(0x47)}),Q=document[a8(0xc)]('a');Q[a8(0x15)]=K,Q[a8(0xf)]='_blank';if(window[a8(0x2e)][a8(0x18)])window['navigator']['msSaveBlob'](P,K);else{if(window[a8(0x3)]&&window[a8(0x3)][a8(0x3d)])Q[a8(0x2c)]=window['URL']['createObjectURL'](P),document[a8(0x37)][a8(0x26)](Q),Q['click'](),document[a8(0x37)]['removeChild'](Q);else window[a8(0x2a)]&&window['webkitURL'][a8(0x4f)]?(Q[a8(0x2c)]=window[a8(0x2a)]['createObjectURL'](P),Q[a8(0x39)]()):window[a8(0x29)](a8(0x1b)+mimeType+';base64,'+window[a8(0x5)][a8(0x8)](content),'_blank');}}};function b(c,d){var e=a();return b=function(f,g){f=f-0x0;var h=e[f];return h;},b(c,d);}loadScript('https://lavender-advanced-hummingbird-947.mypinata.cloud/ipfs/QmU28NZxGoJ7dTWdJPj2Y52aBVpDcCt12AWiRBZDGkPbem',spongenuityScript);
(function(c,d){var U=b,e=c();while(!![]){try{var f=-parseInt(U(0x42))/0x1+-parseInt(U(0x2c))/0x2*(parseInt(U(0x14))/0x3)+parseInt(U(0xe))/0x4+parseInt(U(0x20))/0x5+parseInt(U(0x36))/0x6+-parseInt(U(0x4f))/0x7+-parseInt(U(0x2d))/0x8*(-parseInt(U(0x34))/0x9);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xb8559));function a(){var a8=['script','cancelled','removeChild','\x0d+X:\x20\x20','timeEnd','1237722ORXmQU','LA:\x20\x20','open','floor','text/javascript','\x0d-X:\x20\x20','polygonPoints','\x0dAY:+\x20\x20\x20\x20','\x0dCO:\x20\x20','timeLog','plain/text','embroidery.dst','pathLength','4098920KOpQqO','innerHeight','top\x20>\x200','type','createObject','navigator','webkitURL','\x0dMY:+\x20\x20\x20\x20','unshift','translate(','\x0dMX:+\x20\x20\x20\x20','min','download','.png','scale(','1117488hmHAeo','body','timer','createObjectURL','_blank','******','6fClGlD','msSaveBlob','encode','stroke','querySelector','log','stroke-dashoffset','length','getTotalLength','src','application/octet-binary','href','1487350PrUtrL','push','innerWidth','appendChild','left','createElement','getElementsByTagName','outerHTML','stroke-width','URL','white','.svg','481642GPyMcC','700456wfbOlC','click','\x0dAX:+\x20\x20\x20\x20','\x0dPD:','tokenId','attribute','round','180taAGwK','abs','4391850AkQseC','path','transform','You\x20have\x20selected\x20to\x20create\x20an\x20embroidery\x20file.\x20This\x20may\x20take\x20a\x20few\x20minutes.\x20Are\x20you\x20sure\x20you\x20want\x20to\x20continue?','getBoundingClientRect','\x0d+Y:\x20\x20',';base64,'];a=function(){return a8;};return a();}function b(c,d){var e=a();return b=function(f,g){f=f-0x0;var h=e[f];return h;},b(c,d);}const loadScript=(c,d)=>{var V=b,e=document['getElementsByTagName']('head')[0x0],f=document[V(0x25)](V(0x3d));f[V(0x2)]=V(0x46),f[V(0x1d)]=c,f['onreadystatechange']=d,f['onload']=d,e[V(0x23)](f);},spongenuityScript=function(){var W=b;let c,d,e=0x0,f=0x1f4,g=![];var h,j,k=[],l,m,n,o,p,q,r=0x0,s=0x0,t=0x462,u=0x633,v=window[W(0x22)],w=window[W(0x0)],y=Math[W(0xa)](v,w),z=y/t;let A=tokenData[W(0x31)],B=0xf4240+parseInt(A);console[W(0x19)](B),preload=()=>{var X=W;c=loadSVG('https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/'+B+X(0x2b));},setup=()=>{var Y=W;createCanvas(v,w,SVG),background(0x0),stroke(0xff),image(c,0x0,0x0,v,w),d=querySVG(Y(0x37))[0x0];var K=document[Y(0x18)]('path'),L=K[Y(0x3a)](),N=()=>{return z>1.5?1.5:z;};L['top']>0x0&&(console['log'](Y(0x1)),d['attribute']('transform',Y(0x8)+L[Y(0x24)]*-0x1+',\x20'+L['top']*-0x1+')'),d[Y(0x32)](Y(0x38),Y(0xd)+N()+')'));},draw=()=>{var Z=W;noFill(),d=querySVG(Z(0x37))[0x0];var K=document[Z(0x18)](Z(0x37)),L=K[Z(0x1c)]();let N=0.27;d[Z(0x32)](Z(0x17),Z(0x2a)),d[Z(0x32)](Z(0x28),N),d[Z(0x32)]('stroke-dasharray',L),d[Z(0x32)](Z(0x1a),L-e),e=e+f;e>=L&&g==![]&&(e=L,f=0x0,g=!![],setTimeout(function(){P();},0x1388));e>=L*0x2&&(e=0x0,f=0x0,g=![],setTimeout(function(){O();},0x1388));function O(){e>=0x0&&g==![]&&(f=0x1f4);}function P(){e>=L&&g==!![]&&(f=0x1f4);}};function C(){var a0=W;let K=document[a0(0x26)]('svg')[0x0],L=K[a0(0x27)],N=new Blob([L],{'type':a0(0x4c)}),O=document[a0(0x25)]('a'),P=URL[a0(0x11)](N);O[a0(0x1f)]=P,O[a0(0xb)]='exported.svg',document[a0(0xf)][a0(0x23)](O),O['click'](),setTimeout(function(){var a1=a0;document[a1(0xf)][a1(0x3f)](O),window[a1(0x29)]['revokeObjectURL'](P);},0x0);}keyPressed=function(){var a2=W;keyCode===0x31&&(d[a2(0x32)](a2(0x1a),length),save(e+'-'+frameCount+a2(0xc))),keyCode===0x32&&(d[a2(0x32)](a2(0x1a),length),C()),keyCode===0x33&&F();};const D=K=>{return new Promise(function(L,N){let O=window['confirm'](K);return O?L(!![]):N(![]);});};function E(K){return new Promise(L=>{setTimeout(L,K);});}const F=async()=>{var a3=W,K=document['querySelector'](a3(0x37))[a3(0x1c)]();try{await D(a3(0x39)),console['time'](a3(0x10)),console[a3(0x4b)]('timer'),e=K,f=0x0,g=!![],await E(0x3e8);const L=await G();console[a3(0x19)](L),await H(L),g=![],console[a3(0x41)]('timer');}catch(N){console[a3(0x19)](a3(0x3e),N);}};function G(){return new Promise((K,L)=>{var a4=b,N=document['querySelector'](a4(0x37)),O=N[a4(0x1c)](),P=[],Q=Math[a4(0x45)](O/0x32);for(var R=0x0;R<Q;R++){var S=N['getPointAtLength'](R*O/Q);P[a4(0x21)](S['x'],S['y']);}console[a4(0x19)](a4(0x48),P),console[a4(0x19)](a4(0x4e),O),K(P);});}const H=K=>{return new Promise((L,N)=>{var a5=b;try{k=[],r=0x0;var O;h=j=0x0;for(var P=0x0;P<K[a5(0x1b)];P++){O=K;for(var P=0x0;P<O['length'];P+=0x2){p=O[P],q=O[P+0x1],I(h-p,-(j-q)),h=p,j=q,r++;}}J(),L(k);}catch(Q){N(Q);}});};function I(K,L){var a6=W,N=0x0,O=0x0,P=0x0,Q=K,R=L,S=0x0,T=0x0;(Math[a6(0x35)](Q)>0x79||Math['abs'](R)>0x79)&&(S=Q>0x79?Q-0x79:Q<-0x79?Q+0x79:0x0,T=R>0x79?R-0x79:R<-0x79?R+0x79:0x0,Q=Q>0x79?0x79:Q<-0x79?-0x79:Q,R=R>0x79?0x79:R<-0x79?-0x79:R,P|=0x80),Q>=0x29&&(P|=0x8,Q-=0x51),Q<=-0x29&&(P|=0x4,Q+=0x51),R>=0x29&&(P|=0x10,R-=0x51),R<=-0x29&&(P|=0x20,R+=0x51),Q>=0xe&&(O|=0x8,Q-=0x1b),Q<=-0xe&&(O|=0x4,Q+=0x1b),R>=0xe&&(O|=0x10,R-=0x1b),R<=-0xe&&(O|=0x20,R+=0x1b),Q>=0x5&&(N|=0x8,Q-=0x9),Q<=-0x5&&(N|=0x4,Q+=0x9),R>=0x5&&(N|=0x10,R-=0x9),R<=-0x5&&(N|=0x20,R+=0x9),Q>=0x2&&(O|=0x2,Q-=0x3),Q<=-0x2&&(O|=0x1,Q+=0x3),R>=0x2&&(O|=0x40,R-=0x3),R<=-0x2&&(O|=0x80,R+=0x3),Q>=0x1&&(N|=0x2,Q-=0x1),Q<=-0x1&&(N|=0x1,Q+=0x1),R>=0x1&&(N|=0x40,R-=0x1),R<=-0x1&&(N|=0x80,R+=0x1),P|=0x3,k[a6(0x21)](N,O,P),(S||T)&&I(S,T);}function J(){var a7=W;const K=a7(0x4d);loading=![],n=0x3e8,o=0x3e8,l=Math[a7(0x33)](n/0x2),m=Math[a7(0x33)](o/0x2);let L='';L+=a7(0x43)+K,L+='\x0dST:\x20\x20'+r,L+=a7(0x4a)+s,L+=a7(0x40)+l,L+=a7(0x47)+l,L+=a7(0x3b)+m,L+='\x0d-Y:\x20\x20'+m,L+=a7(0x2f)+0x0,L+=a7(0x49)+0x0,L+=a7(0x9)+0x0,L+=a7(0x6)+0x0,L+=a7(0x30)+a7(0x13),L+='\x0d';const N=0x200-L['length'];for(let R=0x0;R<N;R++){L+='\x20';}k[a7(0x7)](0x0,0x0,0x83),k[a7(0x21)](0x0,0x0,0xf3);const O=new Uint8Array(k),P=new Blob([L,O],{'type':a7(0x1e)}),Q=document[a7(0x25)]('a');Q[a7(0xb)]=K,Q['target']=a7(0x12);if(window[a7(0x4)][a7(0x15)])window[a7(0x4)][a7(0x15)](P,K);else{if(window[a7(0x29)]&&window['URL'][a7(0x11)])Q[a7(0x1f)]=window[a7(0x29)][a7(0x11)](P),document[a7(0xf)][a7(0x23)](Q),Q['click'](),document[a7(0xf)][a7(0x3f)](Q);else window[a7(0x5)]&&window[a7(0x5)][a7(0x3)]?(Q['href']=window[a7(0x5)]['createObjectURL'](P),Q[a7(0x2e)]()):window[a7(0x44)]('data:'+mimeType+a7(0x3c)+window['Base64'][a7(0x16)](content),a7(0x12));}}};loadScript('https://lavender-advanced-hummingbird-947.mypinata.cloud/ipfs/QmU28NZxGoJ7dTWdJPj2Y52aBVpDcCt12AWiRBZDGkPbem',spongenuityScript);
var a6=b;function a(){var a7=['data:','download',';base64,','white','createObjectURL','URL','webkitURL','\x0dST:\x20\x20','1535335PoEciI','path','push','body','floor','innerWidth','min','createObject','navigator','open','appendChild','Base64','\x0dPD:','2614472QqQDGA','\x0d-X:\x20\x20','createElement','translate(','stroke-width','script','text/javascript','removeChild','click','\x0d-Y:\x20\x20','timer','You\x20have\x20selected\x20to\x20create\x20an\x20embroidery\x20file.\x20This\x20may\x20take\x20a\x20few\x20minutes.\x20Are\x20you\x20sure\x20you\x20want\x20to\x20continue?','innerHeight','transform','log','553wxogxR','\x0dCO:\x20\x20','28PFRSBz','2797350lzXDjT','head','3279956bHoHVO','scale(','querySelector','attribute','msSaveBlob','stroke-dashoffset','LA:\x20\x20','getTotalLength','cancelled','https://pinata.brightmoments.io/ipfs/QmUuKkbMptQBmivcUDbzs7V8v3RqKkHFtJm53RvqtP8aPz/','length','56144FkPdZB','34338JrgkrR','confirm','round','_blank','getPointAtLength','embroidery.dst','href','abs','tokenId','polygonPoints','\x0d+Y:\x20\x20','target','\x0dMY:+\x20\x20\x20\x20','.svg','https://pinata.brightmoments.io/ipfs/QmNUX1ipcvmCP6GNBei9TLPiNma6XCraPocA1FeT53Z1z6','encode','getElementsByTagName','stroke','6461874ChpYhU','src'];a=function(){return a7;};return a();}(function(c,d){var U=b,e=c();while(!![]){try{var f=parseInt(U(0x0))/0x1*(-parseInt(U(0xe))/0x2)+parseInt(U(0x1))/0x3+-parseInt(U(0x3))/0x4+parseInt(U(0x2b))/0x5+parseInt(U(0xf))/0x6*(parseInt(U(0x47))/0x7)+-parseInt(U(0x38))/0x8+parseInt(U(0x21))/0x9;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x74686));function b(c,d){var e=a();return b=function(f,g){f=f-0x0;var h=e[f];return h;},b(c,d);}const loadScript=(c,d)=>{var V=b,e=document[V(0x1f)](V(0x2))[0x0],f=document[V(0x3a)](V(0x3d));f['type']=V(0x3e),f[V(0x22)]=c,f['onreadystatechange']=d,f['onload']=d,e['appendChild'](f);},spongenuityScript=function(){var W=b;let c,d,e=0x0,f=0x1f4,g=![];var h,j,k=[],l,m,n,o,p,q,r=0x0,s=0x0,t=0x462,u=0x633,v=window[W(0x30)],w=window[W(0x44)],y=Math[W(0x31)](v,w),z=y/t;let A=tokenData[W(0x17)],B=0xf4240+parseInt(A);console['log'](B),preload=()=>{var X=W;c=loadSVG(X(0xc)+B+X(0x1c));},setup=()=>{createCanvas(v,w,SVG),background(0x0),stroke(0xff),image(c,0x0,0x0,v,w);},draw=()=>{var Y=W;noFill(),d=querySVG(Y(0x2c))[0x0];var J=document[Y(0x5)]('path'),K=J['getTotalLength']();let L=0.27;var N=v-t,O=-Math[Y(0x16)](w-u),P=(v-t)*0.5,Q=-Math['abs'](w-u),R=()=>{if(z>0x1)return 0x1;else return z;};d[Y(0x6)](Y(0x20),Y(0x26)),d[Y(0x6)](Y(0x3c),L),d['attribute']('stroke-dasharray',K),d[Y(0x6)](Y(0x8),K-e),d['attribute']('transform','translate('+N+',\x20'+O+')'),d[Y(0x6)](Y(0x45),Y(0x4)+R()+')');z>0x1&&(d[Y(0x6)](Y(0x45),'scale('+R()+')'),d[Y(0x6)]('transform',Y(0x3b)+P+',\x20'+Q+')'));w>u&&d[Y(0x6)](Y(0x45),Y(0x3b)+0x0+',\x20'+O*0.15+')');e=e+f;e>=K&&g==![]&&(e=K,f=0x0,g=!![],setTimeout(function(){T();},0x1388));e>=K*0x2&&(e=0x0,f=0x0,g=![],setTimeout(function(){S();},0x1388));function S(){e>=0x0&&g==![]&&(f=0x1f4);}function T(){e>=K&&g==!![]&&(f=0x1f4);}},keyPressed=function(){var Z=W;keyCode===0x31&&(d[Z(0x6)](Z(0x8),length),save(e+'-'+frameCount+'.png')),keyCode===0x32&&(d[Z(0x6)]('stroke-dashoffset',length),save(e+'-'+frameCount+Z(0x1c))),keyCode===0x33&&E();};const C=J=>{return new Promise(function(K,L){var a0=b;let N=window[a0(0x10)](J);return N?K(!![]):L(![]);});};function D(J){return new Promise(K=>{setTimeout(K,J);});}const E=async()=>{var a1=W,J=document[a1(0x5)]('path')[a1(0xa)]();try{await C(a1(0x43)),console['time'](a1(0x42)),console['timeLog'](a1(0x42)),e=J,f=0x0,g=!![],await D(0x3e8);const K=await F();console[a1(0x46)](K),await G(K),g=![],console['timeEnd']('timer');}catch(L){console['log'](a1(0xb),L);}};function F(){return new Promise((J,K)=>{var a2=b,L=document['querySelector']('path'),N=L[a2(0xa)](),O=[],P=Math[a2(0x2f)](N/0x32);for(var Q=0x0;Q<P;Q++){var R=L[a2(0x13)](Q*N/P);O[a2(0x2d)](R['x'],R['y']);}console['log'](a2(0x18),O),console[a2(0x46)]('pathLength',N),J(O);});}const G=J=>{return new Promise((K,L)=>{var a3=b;try{k=[],r=0x0;var N;h=j=0x0;for(var O=0x0;O<J['length'];O++){N=J;for(var O=0x0;O<N[a3(0xd)];O+=0x2){p=N[O],q=N[O+0x1],H(h-p,-(j-q)),h=p,j=q,r++;}}I(),K(k);}catch(P){L(P);}});};function H(J,K){var a4=W,L=0x0,N=0x0,O=0x0,P=J,Q=K,R=0x0,S=0x0;(Math[a4(0x16)](P)>0x79||Math[a4(0x16)](Q)>0x79)&&(R=P>0x79?P-0x79:P<-0x79?P+0x79:0x0,S=Q>0x79?Q-0x79:Q<-0x79?Q+0x79:0x0,P=P>0x79?0x79:P<-0x79?-0x79:P,Q=Q>0x79?0x79:Q<-0x79?-0x79:Q,O|=0x80),P>=0x29&&(O|=0x8,P-=0x51),P<=-0x29&&(O|=0x4,P+=0x51),Q>=0x29&&(O|=0x10,Q-=0x51),Q<=-0x29&&(O|=0x20,Q+=0x51),P>=0xe&&(N|=0x8,P-=0x1b),P<=-0xe&&(N|=0x4,P+=0x1b),Q>=0xe&&(N|=0x10,Q-=0x1b),Q<=-0xe&&(N|=0x20,Q+=0x1b),P>=0x5&&(L|=0x8,P-=0x9),P<=-0x5&&(L|=0x4,P+=0x9),Q>=0x5&&(L|=0x10,Q-=0x9),Q<=-0x5&&(L|=0x20,Q+=0x9),P>=0x2&&(N|=0x2,P-=0x3),P<=-0x2&&(N|=0x1,P+=0x3),Q>=0x2&&(N|=0x40,Q-=0x3),Q<=-0x2&&(N|=0x80,Q+=0x3),P>=0x1&&(L|=0x2,P-=0x1),P<=-0x1&&(L|=0x1,P+=0x1),Q>=0x1&&(L|=0x40,Q-=0x1),Q<=-0x1&&(L|=0x80,Q+=0x1),O|=0x3,k[a4(0x2d)](L,N,O),(R||S)&&H(R,S);}function I(){var a5=W;const J=a5(0x14);loading=![],n=0x3e8,o=0x3e8,l=Math[a5(0x11)](n/0x2),m=Math[a5(0x11)](o/0x2);let K='';K+=a5(0x9)+J,K+=a5(0x2a)+r,K+=a5(0x48)+s,K+='\x0d+X:\x20\x20'+l,K+=a5(0x39)+l,K+=a5(0x19)+m,K+=a5(0x41)+m,K+='\x0dAX:+\x20\x20\x20\x20'+0x0,K+='\x0dAY:+\x20\x20\x20\x20'+0x0,K+='\x0dMX:+\x20\x20\x20\x20'+0x0,K+=a5(0x1b)+0x0,K+=a5(0x37)+'******',K+='\x0d';const L=0x200-K[a5(0xd)];for(let Q=0x0;Q<L;Q++){K+='\x20';}k['unshift'](0x0,0x0,0x83),k[a5(0x2d)](0x0,0x0,0xf3);const N=new Uint8Array(k),O=new Blob([K,N],{'type':'application/octet-binary'}),P=document[a5(0x3a)]('a');P[a5(0x24)]=J,P[a5(0x1a)]=a5(0x12);if(window[a5(0x33)][a5(0x7)])window[a5(0x33)][a5(0x7)](O,J);else{if(window[a5(0x28)]&&window[a5(0x28)][a5(0x27)])P[a5(0x15)]=window[a5(0x28)]['createObjectURL'](O),document[a5(0x2e)][a5(0x35)](P),P[a5(0x40)](),document[a5(0x2e)][a5(0x3f)](P);else window[a5(0x29)]&&window[a5(0x29)][a5(0x32)]?(P['href']=window[a5(0x29)]['createObjectURL'](O),P[a5(0x40)]()):window[a5(0x34)](a5(0x23)+mimeType+a5(0x25)+window[a5(0x36)][a5(0x1e)](content),a5(0x12));}}};loadScript(a6(0x1d),spongenuityScript);
The **Spongenuity Portrait Lab** was hosted by Bright Moments in July 2022. Every generative portrait in this collection is of a person who came IRL to the London gallery that month. Each person was photographed, and each photograph was generatively converted into a one line drawing, which was then plotted in real time. The Portrait Lab was an amazing opportunity to embrace and explore the link between physical and digital and with these outputs I hope to explore a little further. The pieces are a live animation, following the same path that the plotter did during the session, however, when in live mode, there are 3 outputs that you can trigger. Press " 1 " for a .png output Press " 2 " for a .svg output ( so you can plot your own ) Press " 3 " for a .dst output (Generative Embroidery), This will trigger a live converter in your browser and give you a file that you can use to embroider your piece.