webgl-fluid-enhanced
Advanced tools
Comparing version
@@ -435,2 +435,2 @@ (function(a,U){typeof exports=="object"&&typeof module<"u"?module.exports=U():typeof define=="function"&&define.amd?define(U):(a=typeof globalThis<"u"?globalThis:a||self,a["webgl-fluid-enhanced"]=U())})(this,function(){"use strict";const a={SIM_RESOLUTION:128,DYE_RESOLUTION:1024,CAPTURE_RESOLUTION:512,DENSITY_DISSIPATION:1,VELOCITY_DISSIPATION:.2,PRESSURE:.8,PRESSURE_ITERATIONS:20,CURL:30,INITIAL:!0,SPLAT_AMOUNT:5,SPLAT_RADIUS:.25,SPLAT_FORCE:6e3,SPLAT_KEY:"Space",SHADING:!0,COLORFUL:!0,COLOR_UPDATE_SPEED:10,COLOR_PALETTE:[],HOVER:!0,BACK_COLOR:"#000000",TRANSPARENT:!1,BRIGHTNESS:.5,BLOOM:!0,BLOOM_ITERATIONS:8,BLOOM_RESOLUTION:256,BLOOM_INTENSITY:.8,BLOOM_THRESHOLD:.6,BLOOM_SOFT_KNEE:.7,SUNRAYS:!0,SUNRAYS_RESOLUTION:196,SUNRAYS_WEIGHT:1};let U=[],K=[],B=!1;return{splats(){U.push(parseInt(Math.random()*a.SPLAT_AMOUNT*4+a.SPLAT_AMOUNT))},splat(s,X,I,g,D=void 0){K.push([s,X,I,g,D])},paused(){B?B=!1:B=!0},config(s){Object.assign(a,s)},simulation(s,X={}){Object.assign(a,X),ve();function I(){this.id=-1,this.texcoordX=0,this.texcoordY=0,this.prevTexcoordX=0,this.prevTexcoordY=0,this.deltaX=0,this.deltaY=0,this.down=!1,this.moved=!1,this.color=[30,0,300]}let g=[],D=[];g.push(new I);const{gl:t,ext:x}=Re(s);x.supportLinearFiltering||(a.DYE_RESOLUTION=512,a.SHADING=!1,a.BLOOM=!1,a.SUNRAYS=!1);function Re(e){const i={alpha:!0,depth:!1,stencil:!1,antialias:!1,preserveDrawingBuffer:!1};let r=e.getContext("webgl2",i);const o=!!r;o||(r=e.getContext("webgl",i)||e.getContext("experimental-webgl",i));let n,u;o?(r.getExtension("EXT_color_buffer_float"),u=r.getExtension("OES_texture_float_linear")):(n=r.getExtension("OES_texture_half_float"),u=r.getExtension("OES_texture_half_float_linear")),r.clearColor(0,0,0,1);const l=o?r.HALF_FLOAT:n.HALF_FLOAT_OES;let c,m,p;return o?(c=b(r,r.RGBA16F,r.RGBA,l),m=b(r,r.RG16F,r.RG,l),p=b(r,r.R16F,r.RED,l)):(c=b(r,r.RGBA,r.RGBA,l),m=b(r,r.RGBA,r.RGBA,l),p=b(r,r.RGBA,r.RGBA,l)),{gl:r,ext:{formatRGBA:c,formatRG:m,formatR:p,halfFloatTexType:l,supportLinearFiltering:u}}}function b(e,i,r,o){if(!Ae(e,i,r,o))switch(i){case e.R16F:return b(e,e.RG16F,e.RG,o);case e.RG16F:return b(e,e.RGBA16F,e.RGBA,o);default:return null}return{internalFormat:i,format:r}}function Ae(e,i,r,o){let n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,i,4,4,0,r,o,null);let u=e.createFramebuffer();return e.bindFramebuffer(e.FRAMEBUFFER,u),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0),e.checkFramebufferStatus(e.FRAMEBUFFER)==e.FRAMEBUFFER_COMPLETE}class Se{constructor(i,r){this.vertexShader=i,this.fragmentShaderSource=r,this.programs=[],this.activeProgram=null,this.uniforms=[]}setKeywords(i){let r=0;for(let n=0;n<i.length;n++)r+=vt(i[n]);let o=this.programs[r];if(o==null){let n=h(t.FRAGMENT_SHADER,this.fragmentShaderSource,i);o=te(this.vertexShader,n),this.programs[r]=o}o!=this.activeProgram&&(this.uniforms=re(o),this.activeProgram=o)}bind(){t.useProgram(this.activeProgram)}}class d{constructor(i,r){this.uniforms={},this.program=te(i,r),this.uniforms=re(this.program)}bind(){t.useProgram(this.program)}}function te(e,i){let r=t.createProgram();return t.attachShader(r,e),t.attachShader(r,i),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||console.trace(t.getProgramInfoLog(r)),r}function re(e){let i=[],r=t.getProgramParameter(e,t.ACTIVE_UNIFORMS);for(let o=0;o<r;o++){let n=t.getActiveUniform(e,o).name;i[n]=t.getUniformLocation(e,n)}return i}function h(e,i,r){i=pe(i,r);const o=t.createShader(e);return t.shaderSource(o,i),t.compileShader(o),t.getShaderParameter(o,t.COMPILE_STATUS)||console.trace(t.getShaderInfoLog(o)),o}function pe(e,i){if(i==null)return e;let r="";return i.forEach(o=>{r+="#define "+o+` | ||
} | ||
`),v=(()=>(t.bindBuffer(t.ARRAY_BUFFER,t.createBuffer()),t.bufferData(t.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,1,1,-1]),t.STATIC_DRAW),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,t.createBuffer()),t.bufferData(t.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,0,2,3]),t.STATIC_DRAW),t.vertexAttribPointer(0,2,t.FLOAT,!1,0,0),t.enableVertexAttribArray(0),(e,i=!1)=>{e==null?(t.viewport(0,0,t.drawingBufferWidth,t.drawingBufferHeight),t.bindFramebuffer(t.FRAMEBUFFER,null)):(t.viewport(0,0,e.width,e.height),t.bindFramebuffer(t.FRAMEBUFFER,e.fbo)),i&&(t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT)),t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0)}))();let E,f,_,W,L,k,Y,ie,oe=_e("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABGUUKwAAAeK0lEQVR4AT3aBbRuVdUG4HW5hNLdSHd3CyjdEtLd3Y1wKZHuLgFJRenuBqW7u7tTlu8zx//9ZwwG8J397b3WnG/NtU9bYokl+nfffdf//e9/96uuuqrPN998/ZRTTukbb7xxP/zww/u+++7bf/vb3/YddtihP/roo32SSSbpL7zwQj/99NP7Vltt1X/88ce+8sor13Vvv/12Hzp0aF999dX7Bx980P/617/2WWedtX/55Zd9++237zPMMEP/05/+1DfYYIP+0EMP9amnnrq/9957/ZZbbum//PJLf+yxx/pJJ53URxtttL7WWmv1P//5z/3bb7/t9913X63t9ddf7wsvvHBff/31+6GHHtovu+yyPuecc/YbbrihH3300fXshRZaqF900UW1zv/85z991FFHrfXce++9ffjhh+/nnXdeXe8e7tsuv/zy+vKEE07YDzzwwNpoz4/FPfnkk32VVVbpd911V7/66qv7Mccc0y+99NI+yiij9KWWWqoffPDB/frrr6+HWfjss8/e77jjju6ev/vd72ojNrfiiiv21lo98Pzzz6/fnXjiif0f//hH33rrrWujFr7JJpvU/d5///1+wQUX9N12261PNdVUfbnlluvDDTdc//TTT+vzW2+9tY844oj9q6++6i+++GKffPLJaz3W+fXXX1fx3N/6vv/++3rOG2+8Uc/66KOP+njjjVff22OPPXr7+OOPq4oqftZZZ3VdtLkxxhijX3zxxd0XFGeOOebof/zjH/tee+1VC7nnnnv6uuuuWwt55ZVXqurbbLNNH3fccdWv77333t0innrqqX7QQQf1tddeu3uWh88zzzz9m2++6WONNVZt7txzz61njDTSSP2AAw7oM888c1988cX77bffXgvdaKON+rBhw/oEE0xQKJltttn6Lrvs0k844YS+5ppr9i233LK/8847tTYo23bbbfurr75ahYYQaFUk9/Zd31twwQX7yCOP3JuO6cIzzzxTEJppppmqUzrrc50dMmRIf+211/rPP//cF1lkkeqKToK3ii+66KL98ccf74cddlhfZ511+gMPPNCnnXbavsACC9RGJ5tssv7Pf/6zFrLrrrvWxp5++ulC3DXXXFMFff7557uigjy6TTzxxP3zzz8vNM0999zVHDT6wx/+0H/44Yc+6aST1vXW869//aufccYZfZxxxql1oLIGQp/naQLaLbvssoVkdF9ttdUKTUPcaJZZZmnbbbddW2yxxVoW2rKolg0oTgtn0KTluvbggw+2VVddtWXxLbxvJ598cptuuulaqt/CxxZet2hHW2ONNdr444/fbrrpppYCtUCxhUr1WXShpRMtm2tZaJtxxhlbEFf3iP60LLq+Hzq18Lxlg/X9l156qT3yyCP17JtvvrmFw23eeedtvhO0tf3337+eEU1pKVRbYYUV2hZbbNGuu+46KG/Rl5ZN138HPW333Xdv1tJwRJfxjcDoIjHSAb9bb731+u9///uC0MMPP1y8JnogN+aYY5aYqSYhAm1dG3vssTtagPRRRx3VL7zwwu67BImwTTHFFP1vf/tbJ2r3339/T+H7lFNO+f/d9nkWXx3NQquDUObaaaaZpr/55pt9n332qa6iVZrQ05zSEDq133771f1Qw/OJIo2xt3POOafEkMin+L2BK9VNhfumm25am3rrrbf68ccf36effvp+2223lYh88sknxbtUvT7DJ4W54oor+tlnn103tWgLALt0qzaGYoR0zz337F988UUPKop/xx13XBXYIs8888wqqE0RS4JrU6eeempPt8shUIuKe4Zn0g+/41o777xzv+SSS+q7zz33XLmaooK6vaA1rXj55ZeLvhpMY9wHpDuOuRne/v3vfy9h2nHHHTue//rXv64v4h6r0TkbmWiiiTpx+u9//1uL9eC77767ukjEPJDlsUnCR5zYKx7TC87gc0oNGRBEYzbccMNyH88gnksuuSSKVhe5FEvlNoQN8o499tjSp2WWWaZ0gaYQa41TQAJ+5ZVXlk3TtBtvvLGa9Nlnn5VQN/bA71XYZiyanbAYAsOaQMoiRhhhhE683Cj873PNNVc93Pep/vLLL19dJXooQt0hhig9++yz5QTuwUp15c477ywnIcC+S4/cCxVlCcW3Ps2QP6i3Qi+99NKFsJ9++qlHa6rwHMyawZzS/+pXvypas1CiOfroo1c2WWmllaqAHAXyhqZDw6LmJWpZeEshWm7SwtWWbrd0vgQqVW3hT4smlBgFdi0LbVHWloW2ZIYSwXS1hfstlW+x1hZFb3lo3S/cboFhi/2UOPo89CtBCmJaqNOynpYilZimqy0K3vyb0KUALYVrQUdLCGsJXc2a02laVkIX6ywht6cUtgVFLUgu8UvDSsxjwS2bbylyo8ZVeZwQQHQ3Kl48POKII6oz+EaAoOSQQw4pmqgkL46Slr/TEt3i19LlE088UXCPGhfvdEgak+AghBjREPwlbNYhR7AyHcRXYsm+oIhn0wZiRjAJoSSI6yxbXpFUCXAcrdZLIOmYZ9Ekdo5GqAaVbLFygLgLkoTJRnBSwhJ6JEK8JTaxxAojFks0CZbvbL755nVDGxGeQJEPExmKjkI2hueCCe76vQxBNMVn8ZrOEEm6gdvgK9TIBrG5riGbbbZZia414Dp3URzUsVYp1JqEuUFKFfJkC+mU4/3mN78peigs+FRIYVuEaSBykhJ1Z4U2ouJ4bAH4Th+InTlCJ1kirhJUDgItrEkYsgHiRvykQ50mVrric4lvgBwbYJ+aQkdwnCaJxpqicJAEJQoLTRqjWIoIvX44mw0SWYUWxN59991aM3QpnAI2kdRDQA28wYuNUXgLk8HdlANQcsJkEzZA9T3AzMBNWB5kcAjo4bODHGB+IF7U1zU6qsg2RmBFcMpOdBUNhTTg2muvrc4NrIxQU3xdNoxBmCahI4q4l3v7HJ01WMokegOEsVJoMk+0nXbaqTYgxKi4B+I8ZRZ1FQWXcM0QgmduRC8UjXILOjzc4mzCRuUGUVRhKLdAAzF468GGHDriOyhnA7qpQGgoB3ACz0cRz6MX3IDnQyNOW5NOCzacSVaAEBZOf9ghRGkI/YAW+/vwww8LueJq2ZUOgdpgPAZjImGklApBEnT9sDcFs3AzAh5Dh40ZMwUNk54FTp4hRNghPHh9R1AiXVqAcRR3cRVPZfYjjzyy6KRgOiucsV6oM0K7lk0qDC0xA9iQZ8oOGuX+JkciimaKYz+0hZgLcRpBIIcGgsNkejbEcuKZLVVs6XTZT0StcnY43rLYmg8yfFTWDufLKjPEtCysxUnKgrLxulcg2P7yl7+0LKRlcqwZg016Tvjc0v2yx6CnxSVaUNEC45oB2Fj0ptYRXWkJUS2+31K0FsQ1zzYThDpN/g/yWvSobDyFbhHi+tyskaK3jL41N7jeTGNt0aTGR4uLoO0QQycltEGWVzUOMOCoCgobYE0/wAxKVBS36AnRwUWqi49GYdQipCxJR01wEh10SHvsiVhSfQLnWkhLASv9oQv9YaccBRqtRcRmv9DlMzSGCuuDJveEEFolEfo9SkEYyggKpfLgazO+jINg5sAAV90Il3FYFAVXc7/4LN5aGBWnDRSWOBJNOsIdPIj9SWeuAU3pjI06EQJTG8NvHGZVioZi7ItoElTP0whuYk3uqVnEWvSmDRIfEbVeDaFDBJTWSZuElXiyUeM3aFYFXaBzlFQ3cMiNKTyfZ0EcgRCZrjwEP3mvwxIbcnMOomiChqkRgmQDFomjbFSBWRglt1F6gY8Kx8rEcT+QJcv7HI8V2VTIqiGCjnANzYIqG5VBaAWEKTDr4wT2IXpzKPeASM0xi9cmiIRsb4GU3cKo+WmnnVYIsSgCmfm6usvjKTN1pcjETQoDZ65BeS3OdTaniwYRnZt//vlLYHXHIoziJkbf83zU8RyfsUoFhCLZn6gqsvuDNARyEihETRbp964jdhLuAE0yC6pAKYeDJKJXXGMX/FLQ4JGqjKNS1iCMiJtu7LgJ1BSIBbqpYER9DToUmy1avEXhrOIploCiK2wKRaCCPXkm1AhS4rU84uwAVPGco9icNUKt9dIpdPIseUKBBauB1nAeKFJAVgmx3Ix72J/7NzcHFR8uFguRkFSUPeIbDhISm7MxcMchcBSQaILFictmb/BTXQvVYVQydVk0q5LICORgnBaf6Q47pUOKBK6QodBsFZyhk20KVmA+yCiaQDhtVKMgGbc1z+c+U1zUQleplu5A+UYJe3Uo6gGSE5jbHMiKxZTU8KKTNoZ3goQCSWpu4rvCiLME1zrelhuIkqFEpWVv8HNPAudz3XG9giuyhUIjuMojoO06rmTBMoI0R+kVFN10VuCCGg3UKPxWSDFXWrVmKKJdmoqiUO0ZqOj8rNTdzakorlFryPAgygzWkhmoEUkP8K7A71VR91ilDeomblJz3dFFC4SYQbQmqNyAdaIG6HIgG9JZdgzuVF9AY4fuzVJpg2dDn00QZo3SCGiiNSxPYRRRAYkf6xOeFNkaOQ8RNjPXIMFTQUvncFT1LI766rYq4rIHcAwwY4uSHLskKGyL9VioTUiIkENXfK6TtML1vo9OvgN5cohrQBw9OJGcobDug79QBMao5nnWplEgblPcigByKXTzXM3xTJqDhqhhRiCwUNTYDfuyEVAncvhkcaIofuOyQMIx3ETlbNBNXMOLQV0BdZMtsS52aEFsjpvoBvuBNs8kqqhHW1iwzVFoHaYVYMwhFOeOuIzTJKgRwwkvVxDkKL31cAIokw+sleAJWq7lRp7nesGJQ1hLM9CAqxGXbdmsDqsqZeXlKkZZJTTVxWmzPS45eGRbjqsML8SGyNEK98Z1SNIx6FIkIYnduY+xWeEVmvobiuQENsdeuYzQ5RlUX3DDZ9RwvU14HgSjiR/CibpoAUXWBb3SHzrTLFqBMs2GBmd7FBIkcVRXVRU8dY/tWZiqW7DK+p1DVGgRdKCHtVBw6q949ITYKaBFoIchCwd9V4d1V3KzGUXzDM8krLKBwrM3+gR1+I1adAIiFUZHQVrUhlZ000z34CqoNLBRSCHGrqkgRExwfKDSOOPGPncDasmjwZmQ6IwHga9qG2GNoHI2roIsO/MdAgWS+ErkWBko+9E51PP9wczu/hrCjSi4xEh4B+5iU1zK7yGDDdsMd1BQeiVXQDGUQLGiS4PQqEHQZ42Q1AiMYUHwIBwH/t+ZGa7plIgJRjbK3tgNRVVNC1F1N6fOYMxJ8I9OiLEyPsjhN64rJtvDddSACmcI7sU1oE7IIWDETjcV13cImYLSGCdHkOVa3bV+a/MdWoOSsj+xhSpZRyHFZZQgtGxzaBY0LJtogVmuafUqLHxtgWCNw7G5lpvXqXFssMbMIKEFui1HYXUyGzi2bLKl+3XaGttpqXadHqfRLercEptrBHWvLKpOjrPAui6dbrGzOj0Ol+uUN7ZZp82eFerVmO20OBtsQUgLWutEOGitUdsrvRS5GZ3dN/Rs2Vu9HjM+BzE1uvs8DW+hTZ1cezdXXaaQIEt8KKZKCg7SFNjoFsjq8OCQlMgQND+UXVdRh5ARGBxTbV6tu+6rs7QCZ9ktPvJ0Q5PgQ1hZM21wL24BiewM3GmR+Cs3yAwmUzlB9hByRG9OQOyIHppACoRwC9FbHKdJkDnE4gLNerkZ4atDA9XKglt42wKxlgGmXkQGYi0UaVHQBhk+T5HqgEInUqAWgar3AXloXaczWWiL/7aIbJ3VJ6DUO4YIcAtH69Aj/l+dT+QuNIaC1enYKaFu0Z1CpMOVTIFe6LQ4UPM9/x9hrncWySb1XiM6UAci3idEm1oEluPVAYr/T8PrXUHTUSoqLamWyqskd1ApfBJ9VRgXCaUESIlVHyp0kqXhq98TNbkgRargIeYSTdYjPBEgmkFHBBl8hCRKT1iFMF2DRrkCciCG2+iiNEfA8Jsu0S3jufEYx4U1ayC2dA26zDL0gj2K1VBtX0Oz6WERlnrVrcoRshZ4VBcDt3rVHAEsfYi1tShtvcFJZiiEOJpKgqvX2I6oVD4xt6obCLZQqN4g0QhdDZRbrLEl87fQqo7EfCdFbYFyS6EbREZI661R8kaLoLbki5Zg0yKSxV+dT6Oqo5AXqtVxXuhTegOJEcs6NkuRa10pWiHJtaFnvTVqpie8wjfBAnd5NAWnvGZ+DnBegk2qUI7AYnRL5ub5QpEoKqpCivzPXXCdEuMlbnMUAxTbMgu4zowh9bEqdHRvGYSdmT2gU6fkDPbLsdit8ZbmsGkWSem5ECsUiVkphEE2/YCQweDFGh2uCk9D483DVCShpfidQhTXgoxS39hU8VU3qTEOUln8z3dbvLbe1yW21h8v6H5ErUEPRCSEFIqobuBZHfC+LrZXvHRNom/L4koj3JMTQIrOc6TYbv2TIlbnUpCWwpfqQ0bieL1ThFxdpiPQEjEsLfO9vDhpoUY9h45xi4SsNjQXDWN5YBRFrr/ecFOQBbMkr3qhSayS0FrCUb289Pv4bxWBxTltddJKsMLxohChYUFxiPork+hJFYwVEaJwu06H08GCv/sFEXVC7TvhewtaWpBSp8tBaxXEehUhSl+nyERbUxKSzDa1TvdCpzhWi460RPuydvSyPmtN6m26UNOgBEfkQJCoER8pzGAiwLBDtsHafE4kBRCJDMQWy2EKm5LVQUtkFYPNCkTOURg4oxEBJJJoJl2CLCoSMULpWUSLVbmWDUqIIC7WSqqE1T0lWBMeCxWV2SNamTHQyPr9SH/mHTQi9oTYs/0tUG0AL3GJSktnYqvhCE99gZrKDLjsc0pKO2R10x4Vp7ImNQWkJwYj+oG/VNn7OwWjFRZCJ/DZBhWLPtAVz+JA1JvaKyiXwV26YNJUIBmBY0mH8gS34E7Wb+LjDuYI3w9163yBU5l5NMwk2yxUcJCbZWjZ3MINI8KDi3STULEyRRKKoMVi2Q47ZEc6RDhFYQuGFHFTxxTJHKCTCsrOxGOoEmvNAmKzoOJ5rndPYiZqawSEGZoIHXQYtyEOmpwkCWae6VxBECKqRmERWgOEMfeDNBMuNA4ND4bhKtFiWUILvuCJqMuyWGOqXRqRKbDFAcrS0vXiUarZkvAqyAgboia+sz1iF+8tcaIb4mwGl7qHt0MpUIuDNFZMY1KgEuMofOkBvaA/caYmHtMkb3kGApt83zJslXXSi6TQitdE3R9U0I2cNTS2neZUlHfPNK9EWeoqOLM7XMU/ww8ImuJ8LlCwPSOoTuClMwS8gxYQNsQ4gjLUmPt1QZx2HctDmYF9CTqgDa6GKcgAd58btOiR+/g9qOqmY7jBmR5u0w2Q12Vjt3UZtCLchSTrYsNQzZpZuzFfoKJfKII+QyxArKSolJmKB34tPK7BQ0gRLkKV+p1uG168c4voVKQMvOrvB3UUinScLXpfqFOhQ1kblES8KjixMZHYIOVeAk820QxS7EmXDELRAxNrhTOdF2oEJvfxjy6zXsEmha9AxhXSlFpvToCq81ASgayBCOoMc8kJbXieyDtT1cb7QdCiMxjVwhQC/M0Bic31oKh+2YuN8Wn/joDVhlHEotHE5MeK0ItFWQw4K04CV9lcAlbBMY5QtNOAcL9elIbvdX8J1HNMrKyR7doMeCtUFL4yxKBQZhj0MzlKmKiMGglDVVxzi3uiq2hb8KKs2VhNcmAFvgSH8juhSVFqDidOrAh85HWK7rqB0rMkVkQwKbVk6SQJDAktqKJTFlgCxm59DsaDg1dQJraE1z0IlxnDPA/Szg+d97FRSc/pFEGFZk5kT9bmNBptzTtE13Ec27c2Au78QOfqlNZpCSX1EKMtxaWeeGaBYieH8LkhhZ1xAErtd7grEvNmw4rFs0lWRBtwVnGcNfLmdLQ24CTHIo22iiQu0xCF4+ss1TNsKJ0tzXEqJObSFWuiEfgdNNRGNYiOeD6uG7c9h6s5qbIfrsB5hhA5nIqwFbwNN6IpbkUUa+SkqMZSvM35XcVMcEyla2SVzMDJNZJi7KkZS+kBXXEwAZaxsxqfKX42VAcZdIT+cCJpEkx9FwU5EViL03QHRTkP7ovi6ADiRndUFaH9ncBAW9AvBS2quJdYj8ae4Xue52GV+oQMgcI5HMjJBsIDzwQbo6gKg5hr/AgyUCMMqTpYgjvfVnkQNYTIB5KXlKmbMgRncRQmiKETFPFlx9agCknCEeqhIcfhFvKFZ/qRVawNStBqcN7owAZluAbKOB5DXW6V4hU1OIF7ytoFcw8DUxYItqlQpSvBRir0RdYCMaCFp+xQ6lIsfGOdojJqOAkSPQURAQTnRVRTmAKK0U6gxFE8RhtnfWhEQxTQetiWewlknun8wO/wHZVMeOzO57iNRiI3O1RMZwamSY2mJzSHbkmb9jE00XUY5QUfJywCQx5cUKLcqXb9aQzFZUsmKjTJlwt6aGAwMdAkf9dUls3U+aAQ5V4pUA1HaVpNakFVCxfLZVgu50EbEOcgeQdQNpWOFhV9bhI17bG8aFCFrWSDemZEu/50xj6iUbV2kyRbRi32yNn8t7CV5FkUQzOeXXkdnAiR6nIEENQJgUTcVF2hxtCimhvltAekiIlhCaS4ha6AtxCDQjqEPs4L5HW/N5hAC5H1ztDvOYmzQOIHZTpJgJM7KqB5U018iahrhCuoQhvrBnedJYzWa2YxiKEXBIu+0ImO1oB6gle9GsNT6Yqaeh1F0SU5NwNZcE31ym5QxCADWg4jLcAmKbRi2gT6DA5CHJjgpMxvZmCvhhO2qUAWaXMUH5Vs0gDlaA508dfw5R0FOoKw+QLlKD/6+K572KS5wESpoYM3QzTNfIEqNEzTUEQDwKluwhfZhL/6xEeC5gTXzUVkIuYmFq3ygWVxXIecwekCvkKPU2EnTDyfrbonMVUgkxhbtAFez87ci5fzd4OWxRFLqNApAxQL9bYJb53+OKESpxXaAGT8tX5rVjyF9l2F9o6C7WqYaVIjNLEGIpVzI5CzSKLFEXSJuhIOCuqNri463lJRN1Eoi+X5vNYkx2ONxCY8oqdbFuD7ikjRLdj1AgqqQRnBJJ6+R82NutwFMr0fJKTQhW6mS2vTGM/jQFAM0p6BurHrcgt0dH+HrV7puZ5TaZjxfGgS1DAxk++LjsTChEWwCF/SYXkxUeG9PFYeMGHxYzGUgKZDNTmasoif7E2cHEWJnbGl+m5oVTFVLHYKJWOYAYhiXKbyAmHk1+Kr75kXAv2WTdTxt/uLzk6NYoMtNGgpamUZQpem1CGpg1VHbKIwwbQeYur4TcaxT8pf9oJPOqyLKshf2QnYOOzAQ9zBL7+DHNdBjTmehTlqJoyskYbwcKlO53zfxOdAggjpHt1AF8+UCXg8iEMWX0cdMDX70xzfR0EplBBLhCjDLqGHdnmeJOucw+fQpNP0jaB7njfNtISumY7qDQoxw2HiAXZ8FkzB1Y1xGxR9LhCBsqBjkzwYx4gWoXEdvlocqMoQvg+iBFHgwmHiiafECrUslJoLTDIHingemoA4J+FEQWXNDkSM1wteYC3m2hjtUWSx2meuoS8EVaOdLCuO+WG4LLAOHMElvCgqiKxGTxEVhMCW9zuUQBFQTGfq1BZUfZZj6paEV2+DTJaLJ6YGIQVLY3A4WQeuDj/kC/lB/PY7/53sXhQz6UWp656yQcSq3ldmsTUFplhFqcG6THbWHkTUxMjbUdS+HKq4B7ok99dBr2guTkfr6mTYSUxBhp1QbtD2NwK6Q5CIDxEBF6oMptQbrHVYbEUVsVjCy2aqyqDHYQavrcGYUoM7tXY4gkoSnvcArtNdAgd5XAncRVoogyiKzteJMPGFQAIsxRqKvCvgUDIGOorMfN+z3J+buJYDeQ+Bzv6AuWApjAg5oJLulZW4EGzwWbjg75QUZI3MFirIgDOP5vl+7x7itIIJR3RGIVFFYKLQbI9l4bmgYj7gQKZNeUCQ8V3uQIeEKNOba+mEaY/+2ATt4jioi8Luhet+3F8BFYujsWEWKWRp9PAmNScwTlHAOWJSLxdTmKIDpQ0/6ywNjEAqf0NUCi2WOqNzBkipQR49YoN1fQpWVDCRpUMVeU2LFNjLzOhCvRuwhhSxIionckDjBQ2Fp9riuHN/UBeHHb6ghv8O18tdgsiK3UFrTZ/uI7YHlfU6zdp95jDGfaJh5Q4OLauaoEHVCQx15Z9Un7oSGzFT6BCBCaAzwIHf+6MqgYiqowY4yhaE0WdEzH2FIl3UWfTw+tq5o/Qp+Hg+2oGy+6CG0OTckvJDCFEjnARTJwkaYYVC9ybQ1mZQE7khA/JMhWK04OX5hJHw/g8XOw7T79Vd2gAAAABJRU5ErkJggg");const w=new d(De,Ue),ne=new d(T,be),q=new d(T,Le),ae=new d(T,Fe),ue=new d(T,Ne),M=new d(T,ye),C=new d(T,Be),P=new d(T,Ie),le=new d(T,we),J=new d(T,Ce),F=new d(T,Xe),R=new d(T,Ye),Z=new d(T,Me),j=new d(T,Pe),y=new d(T,ze),z=new d(T,Ve),V=new d(T,Ge),N=new Se(T,Oe);function ce(){let e=Q(a.SIM_RESOLUTION),i=Q(a.DYE_RESOLUTION);const r=x.halfFloatTexType,o=x.formatRGBA,n=x.formatRG,u=x.formatR,l=x.supportLinearFiltering?t.LINEAR:t.NEAREST;t.disable(t.BLEND),E==null?E=$(i.width,i.height,o.internalFormat,o.format,r,l):E=fe(E,i.width,i.height,o.internalFormat,o.format,r,l),f==null?f=$(e.width,e.height,n.internalFormat,n.format,r,l):f=fe(f,e.width,e.height,n.internalFormat,n.format,r,l),_=A(e.width,e.height,u.internalFormat,u.format,r,t.NEAREST),W=A(e.width,e.height,u.internalFormat,u.format,r,t.NEAREST),L=$(e.width,e.height,u.internalFormat,u.format,r,t.NEAREST),He(),Qe()}function He(){let e=Q(a.BLOOM_RESOLUTION);const i=x.halfFloatTexType,r=x.formatRGBA,o=x.supportLinearFiltering?t.LINEAR:t.NEAREST;k=A(e.width,e.height,r.internalFormat,r.format,i,o),D.length=0;for(let n=0;n<a.BLOOM_ITERATIONS;n++){let u=e.width>>n+1,l=e.height>>n+1;if(u<2||l<2)break;let c=A(u,l,r.internalFormat,r.format,i,o);D.push(c)}}function Qe(){let e=Q(a.SUNRAYS_RESOLUTION);const i=x.halfFloatTexType,r=x.formatR,o=x.supportLinearFiltering?t.LINEAR:t.NEAREST;Y=A(e.width,e.height,r.internalFormat,r.format,i,o),ie=A(e.width,e.height,r.internalFormat,r.format,i,o)}function A(e,i,r,o,n,u){t.activeTexture(t.TEXTURE0);let l=t.createTexture();t.bindTexture(t.TEXTURE_2D,l),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,u),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,u),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texImage2D(t.TEXTURE_2D,0,r,e,i,0,o,n,null);let c=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,c),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,l,0),t.viewport(0,0,e,i),t.clear(t.COLOR_BUFFER_BIT);let m=1/e,p=1/i;return{texture:l,fbo:c,width:e,height:i,texelSizeX:m,texelSizeY:p,attach(O){return t.activeTexture(t.TEXTURE0+O),t.bindTexture(t.TEXTURE_2D,l),O}}}function $(e,i,r,o,n,u){let l=A(e,i,r,o,n,u),c=A(e,i,r,o,n,u);return{width:e,height:i,texelSizeX:l.texelSizeX,texelSizeY:l.texelSizeY,get read(){return l},set read(m){l=m},get write(){return c},set write(m){c=m},swap(){let m=l;l=c,c=m}}}function Ke(e,i,r,o,n,u,l){let c=A(i,r,o,n,u,l);return ne.bind(),t.uniform1i(ne.uniforms.uTexture,e.attach(0)),v(c),c}function fe(e,i,r,o,n,u,l){return e.width==i&&e.height==r||(e.read=Ke(e.read,i,r,o,n,u,l),e.write=A(i,r,o,n,u,l),e.width=i,e.height=r,e.texelSizeX=1/i,e.texelSizeY=1/r),e}function _e(e){let i=t.createTexture();t.bindTexture(t.TEXTURE_2D,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.texImage2D(t.TEXTURE_2D,0,t.RGB,1,1,0,t.RGB,t.UNSIGNED_BYTE,new Uint8Array([255,255,255]));let r={texture:i,width:1,height:1,attach(n){return t.activeTexture(t.TEXTURE0+n),t.bindTexture(t.TEXTURE_2D,i),n}},o=new Image;return o.onload=()=>{r.width=o.width,r.height=o.height,t.bindTexture(t.TEXTURE_2D,i),t.texImage2D(t.TEXTURE_2D,0,t.RGB,t.RGB,t.UNSIGNED_BYTE,o)},o.src=e,r}function We(){let e=[];a.SHADING&&e.push("SHADING"),a.BLOOM&&e.push("BLOOM"),a.SUNRAYS&&e.push("SUNRAYS"),N.setKeywords(e)}We(),ce(),X.INITIAL&&he(parseInt(Math.random()*a.SPLAT_AMOUNT*4+a.SPLAT_AMOUNT));let se=Date.now(),G=0;me();function me(){const e=ke();ve()&&ce(),qe(e),Je(),B||Ze(e),je(null),requestAnimationFrame(me)}function ke(){let e=Date.now(),i=(e-se)/1e3;return i=Math.min(i,.016666),se=e,i}function ve(){let e=S(s.clientWidth),i=S(s.clientHeight);return s.width!=e||s.height!=i?(s.width=e,s.height=i,!0):!1}function qe(e){a.COLORFUL&&(G+=e*a.COLOR_UPDATE_SPEED,G>=1&&(G=st(G,0,1),g.forEach(i=>{i.color=H()})))}function Je(){if(U.length>0&&he(U.pop()),K.length>0){const e=K.pop(),i=e[0]/s.clientWidth;console.log(i);const r=1-e[1]/s.clientHeight,o=e[2]/2,n=e[3]/2;let u;if(e[4]!=null){const l=xe(e[4]),c=ge(l.h,l.s,a.BRIGHTNESS);c.r*=.15,c.g*=.15,c.b*=.15,u=c}else u=H();u.r*=10,u.g*=10,u.b*=10,ee(i,r,o,n,u)}g.forEach(e=>{e.moved&&(e.moved=!1,nt(e))})}function Ze(e){t.disable(t.BLEND),j.bind(),t.uniform2f(j.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(j.uniforms.uVelocity,f.read.attach(0)),v(W),y.bind(),t.uniform2f(y.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(y.uniforms.uVelocity,f.read.attach(0)),t.uniform1i(y.uniforms.uCurl,W.attach(1)),t.uniform1f(y.uniforms.curl,a.CURL),t.uniform1f(y.uniforms.dt,e),v(f.write),f.swap(),Z.bind(),t.uniform2f(Z.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(Z.uniforms.uVelocity,f.read.attach(0)),v(_),q.bind(),t.uniform1i(q.uniforms.uTexture,L.read.attach(0)),t.uniform1f(q.uniforms.value,a.PRESSURE),v(L.write),L.swap(),z.bind(),t.uniform2f(z.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(z.uniforms.uDivergence,_.attach(0));for(let r=0;r<a.PRESSURE_ITERATIONS;r++)t.uniform1i(z.uniforms.uPressure,L.read.attach(1)),v(L.write),L.swap();V.bind(),t.uniform2f(V.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(V.uniforms.uPressure,L.read.attach(0)),t.uniform1i(V.uniforms.uVelocity,f.read.attach(1)),v(f.write),f.swap(),R.bind(),t.uniform2f(R.uniforms.texelSize,f.texelSizeX,f.texelSizeY),x.supportLinearFiltering||t.uniform2f(R.uniforms.dyeTexelSize,f.texelSizeX,f.texelSizeY);let i=f.read.attach(0);t.uniform1i(R.uniforms.uVelocity,i),t.uniform1i(R.uniforms.uSource,i),t.uniform1f(R.uniforms.dt,e),t.uniform1f(R.uniforms.dissipation,a.VELOCITY_DISSIPATION),v(f.write),f.swap(),x.supportLinearFiltering||t.uniform2f(R.uniforms.dyeTexelSize,E.texelSizeX,E.texelSizeY),t.uniform1i(R.uniforms.uVelocity,f.read.attach(0)),t.uniform1i(R.uniforms.uSource,E.read.attach(1)),t.uniform1f(R.uniforms.dissipation,a.DENSITY_DISSIPATION),v(E.write),E.swap()}function je(e){a.BLOOM&&rt(E.read,k),a.SUNRAYS&&(it(E.read,E.write,Y),ot(Y,ie,1)),e==null||!a.TRANSPARENT?(t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.enable(t.BLEND)):t.disable(t.BLEND),a.TRANSPARENT||$e(e,ft(ct(a.BACK_COLOR))),e==null&&a.TRANSPARENT&&et(e),tt(e)}function $e(e,i){ae.bind(),t.uniform4f(ae.uniforms.color,i.r,i.g,i.b,1),v(e)}function et(e){ue.bind(),t.uniform1f(ue.uniforms.aspectRatio,s.width/s.height),v(e)}function tt(e){let i=e==null?t.drawingBufferWidth:e.width,r=e==null?t.drawingBufferHeight:e.height;if(N.bind(),a.SHADING&&t.uniform2f(N.uniforms.texelSize,1/i,1/r),t.uniform1i(N.uniforms.uTexture,E.read.attach(0)),a.BLOOM){t.uniform1i(N.uniforms.uBloom,k.attach(1)),t.uniform1i(N.uniforms.uDithering,oe.attach(2));let o=mt(oe,i,r);t.uniform2f(N.uniforms.ditherScale,o.x,o.y)}a.SUNRAYS&&t.uniform1i(N.uniforms.uSunrays,Y.attach(3)),v(e)}function rt(e,i){if(D.length<2)return;let r=i;t.disable(t.BLEND),M.bind();let o=a.BLOOM_THRESHOLD*a.BLOOM_SOFT_KNEE+1e-4,n=a.BLOOM_THRESHOLD-o,u=o*2,l=.25/o;t.uniform3f(M.uniforms.curve,n,u,l),t.uniform1f(M.uniforms.threshold,a.BLOOM_THRESHOLD),t.uniform1i(M.uniforms.uTexture,e.attach(0)),v(r),C.bind();for(let c=0;c<D.length;c++){let m=D[c];t.uniform2f(C.uniforms.texelSize,r.texelSizeX,r.texelSizeY),t.uniform1i(C.uniforms.uTexture,r.attach(0)),v(m),r=m}t.blendFunc(t.ONE,t.ONE),t.enable(t.BLEND);for(let c=D.length-2;c>=0;c--){let m=D[c];t.uniform2f(C.uniforms.texelSize,r.texelSizeX,r.texelSizeY),t.uniform1i(C.uniforms.uTexture,r.attach(0)),t.viewport(0,0,m.width,m.height),v(m),r=m}t.disable(t.BLEND),P.bind(),t.uniform2f(P.uniforms.texelSize,r.texelSizeX,r.texelSizeY),t.uniform1i(P.uniforms.uTexture,r.attach(0)),t.uniform1f(P.uniforms.intensity,a.BLOOM_INTENSITY),v(i)}function it(e,i,r){t.disable(t.BLEND),le.bind(),t.uniform1i(le.uniforms.uTexture,e.attach(0)),v(i),J.bind(),t.uniform1f(J.uniforms.weight,a.SUNRAYS_WEIGHT),t.uniform1i(J.uniforms.uTexture,i.attach(0)),v(r)}function ot(e,i,r){w.bind();for(let o=0;o<r;o++)t.uniform2f(w.uniforms.texelSize,e.texelSizeX,0),t.uniform1i(w.uniforms.uTexture,e.attach(0)),v(i),t.uniform2f(w.uniforms.texelSize,0,e.texelSizeY),t.uniform1i(w.uniforms.uTexture,i.attach(0)),v(e)}function nt(e){if(B)return;let i=e.deltaX*a.SPLAT_FORCE,r=e.deltaY*a.SPLAT_FORCE;ee(e.texcoordX,e.texcoordY,i,r,e.color)}function he(e){for(let i=0;i<e;i++){const r=H();r.r*=10,r.g*=10,r.b*=10;const o=Math.random(),n=Math.random(),u=1e3*(Math.random()-.5),l=1e3*(Math.random()-.5);ee(o,n,u,l,r)}}function ee(e,i,r,o,n){F.bind(),t.uniform1i(F.uniforms.uTarget,f.read.attach(0)),t.uniform1f(F.uniforms.aspectRatio,s.width/s.height),t.uniform2f(F.uniforms.point,e,i),t.uniform3f(F.uniforms.color,r,o,0),t.uniform1f(F.uniforms.radius,at(a.SPLAT_RADIUS/100)),v(f.write),f.swap(),t.uniform1i(F.uniforms.uTarget,E.read.attach(0)),t.uniform3f(F.uniforms.color,n.r,n.g,n.b),v(E.write),E.swap()}function at(e){let i=s.width/s.height;return i>1&&(e*=i),e}s.addEventListener("mousedown",e=>{let i=S(e.offsetX),r=S(e.offsetY),o=g.find(n=>n.id==-1);o==null&&(o=new I),de(o,-1,i,r)}),s.addEventListener("mousemove",e=>{let i=g[0],r=S(e.offsetX),o=S(e.offsetY);Te(i,r,o)}),window.addEventListener("mouseup",()=>{a.HOVER||Ee(g[0])}),s.addEventListener("touchstart",e=>{e.preventDefault();const i=e.targetTouches;for(;i.length>=g.length;)g.push(new I);for(let r=0;r<i.length;r++){let o=S(i[r].pageX),n=S(i[r].pageY);de(g[r+1],i[r].identifier,o,n)}}),s.addEventListener("touchmove",e=>{e.preventDefault();const i=e.targetTouches;for(let r=0;r<i.length;r++){let o=g[r+1],n=S(i[r].pageX),u=S(i[r].pageY);Te(o,n,u)}},!1),window.addEventListener("touchend",e=>{const i=e.changedTouches;for(let r=0;r<i.length;r++){let o=g.find(n=>n.id==i[r].identifier);o!=null&&(a.HOVER||Ee(o))}}),window.addEventListener("keydown",e=>{e.code===a.SPLAT_KEY&&U.push(parseInt(Math.random()*a.SPLAT_AMOUNT*4+a.SPLAT_AMOUNT))});function de(e,i,r,o){e.id=i,e.down=!0,e.moved=!1,e.texcoordX=r/s.width,e.texcoordY=1-o/s.height,e.prevTexcoordX=e.texcoordX,e.prevTexcoordY=e.texcoordY,e.deltaX=0,e.deltaY=0,e.color=H()}function Te(e,i,r){e.prevTexcoordX=e.texcoordX,e.prevTexcoordY=e.texcoordY,e.texcoordX=i/s.width,e.texcoordY=1-r/s.height,e.deltaX=ut(e.texcoordX-e.prevTexcoordX),e.deltaY=lt(e.texcoordY-e.prevTexcoordY),a.HOVER?e.moved=Math.abs(e.deltaX)>0||Math.abs(e.deltaY)>0:e.moved=e.down}function Ee(e){e.down=!1}function ut(e){let i=s.width/s.height;return i<1&&(e*=i),e}function lt(e){let i=s.width/s.height;return i>1&&(e/=i),e}function H(){let e,i;if(a.COLOR_PALETTE.length==0)e=Math.random(),i=1;else{const o=Math.floor(Math.random()*a.COLOR_PALETTE.length),n=a.COLOR_PALETTE[o],u=xe(n);e=u.h,i=u.s}let r=ge(e,i,a.BRIGHTNESS);return r.r*=.15,r.g*=.15,r.b*=.15,r}function xe(e){e=e.replace("#","");const i=parseInt(e.substring(0,2),16)/255,r=parseInt(e.substring(2,4),16)/255,o=parseInt(e.substring(4,6),16)/255,n=Math.max(i,r,o),u=Math.min(i,r,o);let l,c,m;return n===u?l=0:n===i?l=((r-o)/(n-u)+6)%6:n===r?l=(o-i)/(n-u)+2:l=(i-r)/(n-u)+4,l/=6,n===0?c=0:c=(n-u)/n,m=n,{h:l,s:c,v:m}}function ct(e){e=e.replace("#","");const i=parseInt(e.substr(0,2),16),r=parseInt(e.substr(2,2),16),o=parseInt(e.substr(4,2),16);return{r:i,g:r,b:o}}function ge(e,i,r){let o,n,u,l,c,m,p,O;switch(l=Math.floor(e*6),c=e*6-l,m=r*(1-i),p=r*(1-c*i),O=r*(1-(1-c)*i),l%6){case 0:o=r,n=O,u=m;break;case 1:o=p,n=r,u=m;break;case 2:o=m,n=r,u=O;break;case 3:o=m,n=p,u=r;break;case 4:o=O,n=m,u=r;break;case 5:o=r,n=m,u=p;break}return{r:o,g:n,b:u}}function ft(e){return{r:e.r/255,g:e.g/255,b:e.b/255}}function st(e,i,r){let o=r-i;return o==0?i:(e-i)%o+i}function Q(e){let i=t.drawingBufferWidth/t.drawingBufferHeight;i<1&&(i=1/i);let r=Math.round(e),o=Math.round(e*i);return t.drawingBufferWidth>t.drawingBufferHeight?{width:o,height:r}:{width:r,height:o}}function mt(e,i,r){return{x:i/e.width,y:r/e.height}}function S(e){let i=window.devicePixelRatio||1;return Math.floor(e*i)}function vt(e){if(e.length==0)return 0;let i=0;for(let r=0;r<e.length;r++)i=(i<<5)-i+e.charCodeAt(r),i|=0;return i}}}}); | ||
`),v=(()=>(t.bindBuffer(t.ARRAY_BUFFER,t.createBuffer()),t.bufferData(t.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,1,1,-1]),t.STATIC_DRAW),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,t.createBuffer()),t.bufferData(t.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,0,2,3]),t.STATIC_DRAW),t.vertexAttribPointer(0,2,t.FLOAT,!1,0,0),t.enableVertexAttribArray(0),(e,i=!1)=>{e==null?(t.viewport(0,0,t.drawingBufferWidth,t.drawingBufferHeight),t.bindFramebuffer(t.FRAMEBUFFER,null)):(t.viewport(0,0,e.width,e.height),t.bindFramebuffer(t.FRAMEBUFFER,e.fbo)),i&&(t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT)),t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0)}))();let E,f,_,W,L,k,Y,ie,oe=_e("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABGUUKwAAAeK0lEQVR4AT3aBbRuVdUG4HW5hNLdSHd3CyjdEtLd3Y1wKZHuLgFJRenuBqW7u7tTlu8zx//9ZwwG8J397b3WnG/NtU9bYokl+nfffdf//e9/96uuuqrPN998/ZRTTukbb7xxP/zww/u+++7bf/vb3/YddtihP/roo32SSSbpL7zwQj/99NP7Vltt1X/88ce+8sor13Vvv/12Hzp0aF999dX7Bx980P/617/2WWedtX/55Zd9++237zPMMEP/05/+1DfYYIP+0EMP9amnnrq/9957/ZZbbum//PJLf+yxx/pJJ53URxtttL7WWmv1P//5z/3bb7/t9913X63t9ddf7wsvvHBff/31+6GHHtovu+yyPuecc/YbbrihH3300fXshRZaqF900UW1zv/85z991FFHrfXce++9ffjhh+/nnXdeXe8e7tsuv/zy+vKEE07YDzzwwNpoz4/FPfnkk32VVVbpd911V7/66qv7Mccc0y+99NI+yiij9KWWWqoffPDB/frrr6+HWfjss8/e77jjju6ev/vd72ojNrfiiiv21lo98Pzzz6/fnXjiif0f//hH33rrrWujFr7JJpvU/d5///1+wQUX9N12261PNdVUfbnlluvDDTdc//TTT+vzW2+9tY844oj9q6++6i+++GKffPLJaz3W+fXXX1fx3N/6vv/++3rOG2+8Uc/66KOP+njjjVff22OPPXr7+OOPq4oqftZZZ3VdtLkxxhijX3zxxd0XFGeOOebof/zjH/tee+1VC7nnnnv6uuuuWwt55ZVXqurbbLNNH3fccdWv77333t0innrqqX7QQQf1tddeu3uWh88zzzz9m2++6WONNVZt7txzz61njDTSSP2AAw7oM888c1988cX77bffXgvdaKON+rBhw/oEE0xQKJltttn6Lrvs0k844YS+5ppr9i233LK/8847tTYo23bbbfurr75ahYYQaFUk9/Zd31twwQX7yCOP3JuO6cIzzzxTEJppppmqUzrrc50dMmRIf+211/rPP//cF1lkkeqKToK3ii+66KL98ccf74cddlhfZ511+gMPPNCnnXbavsACC9RGJ5tssv7Pf/6zFrLrrrvWxp5++ulC3DXXXFMFff7557uigjy6TTzxxP3zzz8vNM0999zVHDT6wx/+0H/44Yc+6aST1vXW869//aufccYZfZxxxql1oLIGQp/naQLaLbvssoVkdF9ttdUKTUPcaJZZZmnbbbddW2yxxVoW2rKolg0oTgtn0KTluvbggw+2VVddtWXxLbxvJ598cptuuulaqt/CxxZet2hHW2ONNdr444/fbrrpppYCtUCxhUr1WXShpRMtm2tZaJtxxhlbEFf3iP60LLq+Hzq18Lxlg/X9l156qT3yyCP17JtvvrmFw23eeedtvhO0tf3337+eEU1pKVRbYYUV2hZbbNGuu+46KG/Rl5ZN138HPW333Xdv1tJwRJfxjcDoIjHSAb9bb731+u9///uC0MMPP1y8JnogN+aYY5aYqSYhAm1dG3vssTtagPRRRx3VL7zwwu67BImwTTHFFP1vf/tbJ2r3339/T+H7lFNO+f/d9nkWXx3NQquDUObaaaaZpr/55pt9n332qa6iVZrQ05zSEDq133771f1Qw/OJIo2xt3POOafEkMin+L2BK9VNhfumm25am3rrrbf68ccf36effvp+2223lYh88sknxbtUvT7DJ4W54oor+tlnn103tWgLALt0qzaGYoR0zz337F988UUPKop/xx13XBXYIs8888wqqE0RS4JrU6eeempPt8shUIuKe4Zn0g+/41o777xzv+SSS+q7zz33XLmaooK6vaA1rXj55ZeLvhpMY9wHpDuOuRne/v3vfy9h2nHHHTue//rXv64v4h6r0TkbmWiiiTpx+u9//1uL9eC77767ukjEPJDlsUnCR5zYKx7TC87gc0oNGRBEYzbccMNyH88gnksuuSSKVhe5FEvlNoQN8o499tjSp2WWWaZ0gaYQa41TQAJ+5ZVXlk3TtBtvvLGa9Nlnn5VQN/bA71XYZiyanbAYAsOaQMoiRhhhhE683Cj873PNNVc93Pep/vLLL19dJXooQt0hhig9++yz5QTuwUp15c477ywnIcC+S4/cCxVlCcW3Ps2QP6i3Qi+99NKFsJ9++qlHa6rwHMyawZzS/+pXvypas1CiOfroo1c2WWmllaqAHAXyhqZDw6LmJWpZeEsh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");const w=new d(De,Ue),ne=new d(T,be),q=new d(T,Le),ae=new d(T,Fe),ue=new d(T,Ne),M=new d(T,ye),C=new d(T,Be),P=new d(T,Ie),le=new d(T,we),J=new d(T,Ce),F=new d(T,Xe),R=new d(T,Ye),Z=new d(T,Me),j=new d(T,Pe),y=new d(T,ze),z=new d(T,Ve),V=new d(T,Ge),N=new Se(T,Oe);function ce(){let e=H(a.SIM_RESOLUTION),i=H(a.DYE_RESOLUTION);const r=x.halfFloatTexType,o=x.formatRGBA,n=x.formatRG,u=x.formatR,l=x.supportLinearFiltering?t.LINEAR:t.NEAREST;t.disable(t.BLEND),E==null?E=$(i.width,i.height,o.internalFormat,o.format,r,l):E=fe(E,i.width,i.height,o.internalFormat,o.format,r,l),f==null?f=$(e.width,e.height,n.internalFormat,n.format,r,l):f=fe(f,e.width,e.height,n.internalFormat,n.format,r,l),_=A(e.width,e.height,u.internalFormat,u.format,r,t.NEAREST),W=A(e.width,e.height,u.internalFormat,u.format,r,t.NEAREST),L=$(e.width,e.height,u.internalFormat,u.format,r,t.NEAREST),Qe(),He()}function Qe(){let e=H(a.BLOOM_RESOLUTION);const i=x.halfFloatTexType,r=x.formatRGBA,o=x.supportLinearFiltering?t.LINEAR:t.NEAREST;k=A(e.width,e.height,r.internalFormat,r.format,i,o),D.length=0;for(let n=0;n<a.BLOOM_ITERATIONS;n++){let u=e.width>>n+1,l=e.height>>n+1;if(u<2||l<2)break;let c=A(u,l,r.internalFormat,r.format,i,o);D.push(c)}}function He(){let e=H(a.SUNRAYS_RESOLUTION);const i=x.halfFloatTexType,r=x.formatR,o=x.supportLinearFiltering?t.LINEAR:t.NEAREST;Y=A(e.width,e.height,r.internalFormat,r.format,i,o),ie=A(e.width,e.height,r.internalFormat,r.format,i,o)}function A(e,i,r,o,n,u){t.activeTexture(t.TEXTURE0);let l=t.createTexture();t.bindTexture(t.TEXTURE_2D,l),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,u),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,u),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texImage2D(t.TEXTURE_2D,0,r,e,i,0,o,n,null);let c=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,c),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,l,0),t.viewport(0,0,e,i),t.clear(t.COLOR_BUFFER_BIT);let m=1/e,p=1/i;return{texture:l,fbo:c,width:e,height:i,texelSizeX:m,texelSizeY:p,attach(O){return t.activeTexture(t.TEXTURE0+O),t.bindTexture(t.TEXTURE_2D,l),O}}}function $(e,i,r,o,n,u){let l=A(e,i,r,o,n,u),c=A(e,i,r,o,n,u);return{width:e,height:i,texelSizeX:l.texelSizeX,texelSizeY:l.texelSizeY,get read(){return l},set read(m){l=m},get write(){return c},set write(m){c=m},swap(){let m=l;l=c,c=m}}}function Ke(e,i,r,o,n,u,l){let c=A(i,r,o,n,u,l);return ne.bind(),t.uniform1i(ne.uniforms.uTexture,e.attach(0)),v(c),c}function fe(e,i,r,o,n,u,l){return e.width==i&&e.height==r||(e.read=Ke(e.read,i,r,o,n,u,l),e.write=A(i,r,o,n,u,l),e.width=i,e.height=r,e.texelSizeX=1/i,e.texelSizeY=1/r),e}function _e(e){let i=t.createTexture();t.bindTexture(t.TEXTURE_2D,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.texImage2D(t.TEXTURE_2D,0,t.RGB,1,1,0,t.RGB,t.UNSIGNED_BYTE,new Uint8Array([255,255,255]));let r={texture:i,width:1,height:1,attach(n){return t.activeTexture(t.TEXTURE0+n),t.bindTexture(t.TEXTURE_2D,i),n}},o=new Image;return o.onload=()=>{r.width=o.width,r.height=o.height,t.bindTexture(t.TEXTURE_2D,i),t.texImage2D(t.TEXTURE_2D,0,t.RGB,t.RGB,t.UNSIGNED_BYTE,o)},o.src=e,r}function We(){let e=[];a.SHADING&&e.push("SHADING"),a.BLOOM&&e.push("BLOOM"),a.SUNRAYS&&e.push("SUNRAYS"),N.setKeywords(e)}We(),ce(),X.INITIAL&&he(parseInt(Math.random()*a.SPLAT_AMOUNT*4+a.SPLAT_AMOUNT));let se=Date.now(),G=0;me();function me(){const e=ke();ve()&&ce(),qe(e),Je(),B||Ze(e),je(null),requestAnimationFrame(me)}function ke(){let e=Date.now(),i=(e-se)/1e3;return i=Math.min(i,.016666),se=e,i}function ve(){let e=S(s.clientWidth),i=S(s.clientHeight);return s.width!=e||s.height!=i?(s.width=e,s.height=i,!0):!1}function qe(e){a.COLORFUL&&(G+=e*a.COLOR_UPDATE_SPEED,G>=1&&(G=st(G,0,1),g.forEach(i=>{i.color=Q()})))}function Je(){if(U.length>0&&he(U.pop()),K.length>0){const e=K.pop(),i=e[0]/s.clientWidth;console.log(i);const r=1-e[1]/s.clientHeight,o=e[2]/2,n=e[3]/2;let u;if(e[4]!=null){const l=xe(e[4]),c=ge(l.h,l.s,a.BRIGHTNESS);c.r*=.15,c.g*=.15,c.b*=.15,u=c}else u=Q();u.r*=10,u.g*=10,u.b*=10,ee(i,r,o,n,u)}g.forEach(e=>{e.moved&&(e.moved=!1,nt(e))})}function Ze(e){t.disable(t.BLEND),j.bind(),t.uniform2f(j.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(j.uniforms.uVelocity,f.read.attach(0)),v(W),y.bind(),t.uniform2f(y.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(y.uniforms.uVelocity,f.read.attach(0)),t.uniform1i(y.uniforms.uCurl,W.attach(1)),t.uniform1f(y.uniforms.curl,a.CURL),t.uniform1f(y.uniforms.dt,e),v(f.write),f.swap(),Z.bind(),t.uniform2f(Z.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(Z.uniforms.uVelocity,f.read.attach(0)),v(_),q.bind(),t.uniform1i(q.uniforms.uTexture,L.read.attach(0)),t.uniform1f(q.uniforms.value,a.PRESSURE),v(L.write),L.swap(),z.bind(),t.uniform2f(z.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(z.uniforms.uDivergence,_.attach(0));for(let r=0;r<a.PRESSURE_ITERATIONS;r++)t.uniform1i(z.uniforms.uPressure,L.read.attach(1)),v(L.write),L.swap();V.bind(),t.uniform2f(V.uniforms.texelSize,f.texelSizeX,f.texelSizeY),t.uniform1i(V.uniforms.uPressure,L.read.attach(0)),t.uniform1i(V.uniforms.uVelocity,f.read.attach(1)),v(f.write),f.swap(),R.bind(),t.uniform2f(R.uniforms.texelSize,f.texelSizeX,f.texelSizeY),x.supportLinearFiltering||t.uniform2f(R.uniforms.dyeTexelSize,f.texelSizeX,f.texelSizeY);let i=f.read.attach(0);t.uniform1i(R.uniforms.uVelocity,i),t.uniform1i(R.uniforms.uSource,i),t.uniform1f(R.uniforms.dt,e),t.uniform1f(R.uniforms.dissipation,a.VELOCITY_DISSIPATION),v(f.write),f.swap(),x.supportLinearFiltering||t.uniform2f(R.uniforms.dyeTexelSize,E.texelSizeX,E.texelSizeY),t.uniform1i(R.uniforms.uVelocity,f.read.attach(0)),t.uniform1i(R.uniforms.uSource,E.read.attach(1)),t.uniform1f(R.uniforms.dissipation,a.DENSITY_DISSIPATION),v(E.write),E.swap()}function je(e){a.BLOOM&&rt(E.read,k),a.SUNRAYS&&(it(E.read,E.write,Y),ot(Y,ie,1)),e==null||!a.TRANSPARENT?(t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.enable(t.BLEND)):t.disable(t.BLEND),a.TRANSPARENT||$e(e,ft(ct(a.BACK_COLOR))),e==null&&a.TRANSPARENT&&et(e),tt(e)}function $e(e,i){ae.bind(),t.uniform4f(ae.uniforms.color,i.r,i.g,i.b,1),v(e)}function et(e){ue.bind(),t.uniform1f(ue.uniforms.aspectRatio,s.width/s.height),v(e)}function tt(e){let i=e==null?t.drawingBufferWidth:e.width,r=e==null?t.drawingBufferHeight:e.height;if(N.bind(),a.SHADING&&t.uniform2f(N.uniforms.texelSize,1/i,1/r),t.uniform1i(N.uniforms.uTexture,E.read.attach(0)),a.BLOOM){t.uniform1i(N.uniforms.uBloom,k.attach(1)),t.uniform1i(N.uniforms.uDithering,oe.attach(2));let o=mt(oe,i,r);t.uniform2f(N.uniforms.ditherScale,o.x,o.y)}a.SUNRAYS&&t.uniform1i(N.uniforms.uSunrays,Y.attach(3)),v(e)}function rt(e,i){if(D.length<2)return;let r=i;t.disable(t.BLEND),M.bind();let o=a.BLOOM_THRESHOLD*a.BLOOM_SOFT_KNEE+1e-4,n=a.BLOOM_THRESHOLD-o,u=o*2,l=.25/o;t.uniform3f(M.uniforms.curve,n,u,l),t.uniform1f(M.uniforms.threshold,a.BLOOM_THRESHOLD),t.uniform1i(M.uniforms.uTexture,e.attach(0)),v(r),C.bind();for(let c=0;c<D.length;c++){let m=D[c];t.uniform2f(C.uniforms.texelSize,r.texelSizeX,r.texelSizeY),t.uniform1i(C.uniforms.uTexture,r.attach(0)),v(m),r=m}t.blendFunc(t.ONE,t.ONE),t.enable(t.BLEND);for(let c=D.length-2;c>=0;c--){let m=D[c];t.uniform2f(C.uniforms.texelSize,r.texelSizeX,r.texelSizeY),t.uniform1i(C.uniforms.uTexture,r.attach(0)),t.viewport(0,0,m.width,m.height),v(m),r=m}t.disable(t.BLEND),P.bind(),t.uniform2f(P.uniforms.texelSize,r.texelSizeX,r.texelSizeY),t.uniform1i(P.uniforms.uTexture,r.attach(0)),t.uniform1f(P.uniforms.intensity,a.BLOOM_INTENSITY),v(i)}function it(e,i,r){t.disable(t.BLEND),le.bind(),t.uniform1i(le.uniforms.uTexture,e.attach(0)),v(i),J.bind(),t.uniform1f(J.uniforms.weight,a.SUNRAYS_WEIGHT),t.uniform1i(J.uniforms.uTexture,i.attach(0)),v(r)}function ot(e,i,r){w.bind();for(let o=0;o<r;o++)t.uniform2f(w.uniforms.texelSize,e.texelSizeX,0),t.uniform1i(w.uniforms.uTexture,e.attach(0)),v(i),t.uniform2f(w.uniforms.texelSize,0,e.texelSizeY),t.uniform1i(w.uniforms.uTexture,i.attach(0)),v(e)}function nt(e){if(B)return;let i=e.deltaX*a.SPLAT_FORCE,r=e.deltaY*a.SPLAT_FORCE;ee(e.texcoordX,e.texcoordY,i,r,e.color)}function he(e){for(let i=0;i<e;i++){const r=Q();r.r*=10,r.g*=10,r.b*=10;const o=Math.random(),n=Math.random(),u=1e3*(Math.random()-.5),l=1e3*(Math.random()-.5);ee(o,n,u,l,r)}}function ee(e,i,r,o,n){F.bind(),t.uniform1i(F.uniforms.uTarget,f.read.attach(0)),t.uniform1f(F.uniforms.aspectRatio,s.width/s.height),t.uniform2f(F.uniforms.point,e,i),t.uniform3f(F.uniforms.color,r,o,0),t.uniform1f(F.uniforms.radius,at(a.SPLAT_RADIUS/100)),v(f.write),f.swap(),t.uniform1i(F.uniforms.uTarget,E.read.attach(0)),t.uniform3f(F.uniforms.color,n.r,n.g,n.b),v(E.write),E.swap()}function at(e){let i=s.width/s.height;return i>1&&(e*=i),e}s.addEventListener("mousedown",e=>{let i=S(e.offsetX),r=S(e.offsetY),o=g.find(n=>n.id==-1);o==null&&(o=new I),de(o,-1,i,r)}),setTimeout(()=>{s.addEventListener("mousemove",e=>{let i=g[0],r=S(e.offsetX),o=S(e.offsetY);Te(i,r,o)})},500),window.addEventListener("mouseup",()=>{Ee(g[0])}),s.addEventListener("touchstart",e=>{e.preventDefault();const i=e.targetTouches;for(;i.length>=g.length;)g.push(new I);for(let r=0;r<i.length;r++){let o=S(i[r].pageX),n=S(i[r].pageY);de(g[r+1],i[r].identifier,o,n)}}),s.addEventListener("touchmove",e=>{e.preventDefault();const i=e.targetTouches;for(let r=0;r<i.length;r++){let o=g[r+1],n=S(i[r].pageX),u=S(i[r].pageY);Te(o,n,u)}},!1),window.addEventListener("touchend",e=>{const i=e.changedTouches;for(let r=0;r<i.length;r++){let o=g.find(n=>n.id==i[r].identifier);o!=null&&Ee(o)}}),window.addEventListener("keydown",e=>{e.code===a.SPLAT_KEY&&U.push(parseInt(Math.random()*a.SPLAT_AMOUNT*4+a.SPLAT_AMOUNT))});function de(e,i,r,o){e.id=i,e.down=!0,e.moved=!1,e.texcoordX=r/s.width,e.texcoordY=1-o/s.height,e.prevTexcoordX=e.texcoordX,e.prevTexcoordY=e.texcoordY,e.deltaX=0,e.deltaY=0,e.color=Q()}function Te(e,i,r){e.prevTexcoordX=e.texcoordX,e.prevTexcoordY=e.texcoordY,e.texcoordX=i/s.width,e.texcoordY=1-r/s.height,e.deltaX=ut(e.texcoordX-e.prevTexcoordX),e.deltaY=lt(e.texcoordY-e.prevTexcoordY),a.HOVER?e.moved=Math.abs(e.deltaX)>0||Math.abs(e.deltaY)>0:e.moved=e.down}function Ee(e){e.down=!1}function ut(e){let i=s.width/s.height;return i<1&&(e*=i),e}function lt(e){let i=s.width/s.height;return i>1&&(e/=i),e}function Q(){let e,i;if(a.COLOR_PALETTE.length==0)e=Math.random(),i=1;else{const o=Math.floor(Math.random()*a.COLOR_PALETTE.length),n=a.COLOR_PALETTE[o],u=xe(n);e=u.h,i=u.s}let r=ge(e,i,a.BRIGHTNESS);return r.r*=.15,r.g*=.15,r.b*=.15,r}function xe(e){e=e.replace("#","");const i=parseInt(e.substring(0,2),16)/255,r=parseInt(e.substring(2,4),16)/255,o=parseInt(e.substring(4,6),16)/255,n=Math.max(i,r,o),u=Math.min(i,r,o);let l,c,m;return n===u?l=0:n===i?l=((r-o)/(n-u)+6)%6:n===r?l=(o-i)/(n-u)+2:l=(i-r)/(n-u)+4,l/=6,n===0?c=0:c=(n-u)/n,m=n,{h:l,s:c,v:m}}function ct(e){e=e.replace("#","");const i=parseInt(e.substr(0,2),16),r=parseInt(e.substr(2,2),16),o=parseInt(e.substr(4,2),16);return{r:i,g:r,b:o}}function ge(e,i,r){let o,n,u,l,c,m,p,O;switch(l=Math.floor(e*6),c=e*6-l,m=r*(1-i),p=r*(1-c*i),O=r*(1-(1-c)*i),l%6){case 0:o=r,n=O,u=m;break;case 1:o=p,n=r,u=m;break;case 2:o=m,n=r,u=O;break;case 3:o=m,n=p,u=r;break;case 4:o=O,n=m,u=r;break;case 5:o=r,n=m,u=p;break}return{r:o,g:n,b:u}}function ft(e){return{r:e.r/255,g:e.g/255,b:e.b/255}}function st(e,i,r){let o=r-i;return o==0?i:(e-i)%o+i}function H(e){let i=t.drawingBufferWidth/t.drawingBufferHeight;i<1&&(i=1/i);let r=Math.round(e),o=Math.round(e*i);return t.drawingBufferWidth>t.drawingBufferHeight?{width:o,height:r}:{width:r,height:o}}function mt(e,i,r){return{x:i/e.width,y:r/e.height}}function S(e){let i=window.devicePixelRatio||1;return Math.floor(e*i)}function vt(e){if(e.length==0)return 0;let i=0;for(let r=0;r<e.length;r++)i=(i<<5)-i+e.charCodeAt(r),i|=0;return i}}}}); |
{ | ||
"name": "webgl-fluid-enhanced", | ||
"version": "0.4.6", | ||
"version": "0.4.7", | ||
"description": "WebGL Fluid Simulation for modern webpages (works even on mobile)", | ||
@@ -5,0 +5,0 @@ "author": "Michael Brusegard", |
Sorry, the diff of this file is not supported yet
96994
0.02%1514
0.13%