shaderpad 1.0.0-beta.83 → 1.0.0-beta.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/chunk-745KVZYV.mjs +5 -0
  3. package/dist/chunk-745KVZYV.mjs.map +1 -0
  4. package/dist/dev/{chunk-YB3GMXKV.mjs → chunk-D2ESNBZA.mjs} +15 -6
  5. package/dist/dev/chunk-D2ESNBZA.mjs.map +1 -0
  6. package/dist/dev/index.js +14 -5
  7. package/dist/dev/index.js.map +1 -1
  8. package/dist/dev/index.mjs +1 -1
  9. package/dist/dev/plugins/pose.js +14 -5
  10. package/dist/dev/plugins/pose.js.map +1 -1
  11. package/dist/dev/plugins/pose.mjs +1 -1
  12. package/dist/dev/plugins/segmenter.js +14 -5
  13. package/dist/dev/plugins/segmenter.js.map +1 -1
  14. package/dist/dev/plugins/segmenter.mjs +1 -1
  15. package/dist/dev/react.js +14 -5
  16. package/dist/dev/react.js.map +1 -1
  17. package/dist/dev/react.mjs +1 -1
  18. package/dist/dev/web-component.js +14 -5
  19. package/dist/dev/web-component.js.map +1 -1
  20. package/dist/dev/web-component.mjs +1 -1
  21. package/dist/index.d.mts +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.js +2 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +1 -1
  26. package/dist/plugins/pose.js +24 -24
  27. package/dist/plugins/pose.js.map +1 -1
  28. package/dist/plugins/pose.mjs +1 -1
  29. package/dist/plugins/segmenter.js +6 -6
  30. package/dist/plugins/segmenter.js.map +1 -1
  31. package/dist/plugins/segmenter.mjs +1 -1
  32. package/dist/react.js +2 -2
  33. package/dist/react.js.map +1 -1
  34. package/dist/react.mjs +1 -1
  35. package/dist/web-component.js +4 -4
  36. package/dist/web-component.js.map +1 -1
  37. package/dist/web-component.mjs +1 -1
  38. package/package.json +3 -3
  39. package/dist/chunk-4UKNQUGK.mjs +0 -5
  40. package/dist/chunk-4UKNQUGK.mjs.map +0 -1
  41. package/dist/dev/chunk-YB3GMXKV.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # shaderpad
2
2
 
3
+ ## 1.0.0-beta.84
4
+
5
+ ### Minor Changes
6
+
7
+ - Sync `u_time` and `u_frame` updates to internal clock
8
+
3
9
  ## 1.0.0-beta.83
4
10
 
5
11
  ### Minor Changes
@@ -0,0 +1,5 @@
1
+ import{a as m,b as S}from"./chunk-QROQ7JVO.mjs";var C=`#version 300 es
2
+ in vec2 a_position;out vec2 v_uv;void main(){gl_Position=vec4(a_position,0.,1.);v_uv=a_position*.5+.5;}`,M=[["8UI","UNSIGNED_BYTE"],["8I","BYTE"],["16UI","UNSIGNED_SHORT"],["16I","SHORT"],["16F","HALF_FLOAT"],["32UI","UNSIGNED_INT"],["32I","INT"],["32F","FLOAT"],["8","UNSIGNED_BYTE"]],N={float:"f",int:"i",uint:"ui"};function B(u){return u&&M.find(([e])=>u.endsWith(e))?.[1]}var v=Symbol("u_history"),g=Symbol("__SHADERPAD_BUFFER"),F=new WeakMap;function H(u,e){if(!e?.length)return u;let t=u.split(`
3
+ `),i=t.findLastIndex(r=>{let s=r.trimStart();return s.startsWith("precision ")||s.startsWith("#version ")})+1;return t.splice(i,0,...e),t.join(`
4
+ `)}function O(u){return u instanceof WebGLTexture?{width:0,height:0}:u instanceof I?{width:u.canvas.width,height:u.canvas.height}:u instanceof HTMLVideoElement?{width:u.videoWidth,height:u.videoHeight}:u instanceof HTMLImageElement?{width:u.naturalWidth??u.width,height:u.naturalHeight??u.height}:{width:u.width,height:u.height}}function P(u){return typeof u=="symbol"?u.description??"":u}var I=class u{isHeadless=!1;isTouch=!1;uniforms=new Map;textures=new Map;buffer=null;vao=null;program=null;listeners=new Map;frame=0;tElapsed=0;tStart=NaN;cursorPos=[.5,.5];clickPos=[.5,.5];isClicked=!1;resObserver=null;hooks=new Map;historyDepth=0;intermediateFbo=null;constructor(e,{canvas:t,plugins:i,history:r,cursorTarget:s,...a}={}){if(t&&"getContext"in t)this.canvas=t;else{let{width:f=1,height:E=1}=t||{};this.canvas=new OffscreenCanvas(f,E),this.isHeadless=!0}let n=this.canvas.getContext("webgl2",{antialias:!1});if(!n)throw m(0);this.gl=n,this.typeArrays=new Map([[n.FLOAT,Float32Array],[n.HALF_FLOAT,Uint16Array],[n.UNSIGNED_SHORT,Uint16Array],[n.SHORT,Int16Array],[n.BYTE,Int8Array],[n.UNSIGNED_INT,Uint32Array],[n.INT,Int32Array]]),this.typeFormats=new Map([[n.FLOAT,"RGBA32F"],[n.HALF_FLOAT,"RGBA16F"],[n.UNSIGNED_SHORT,"RGBA32UI"],[n.SHORT,"RGBA32I"],[n.BYTE,"RGBA32I"],[n.UNSIGNED_INT,"RGBA32UI"],[n.INT,"RGBA32I"]]),this.uintTypes=new Set([n.UNSIGNED_BYTE,n.UNSIGNED_SHORT,n.UNSIGNED_INT]);let o=F.get(this.canvas);o||(o={texPool:{free:[],next:0,max:n.getParameter(n.MAX_COMBINED_TEXTURE_IMAGE_UNITS)},instances:new Set([this])},F.set(this.canvas,o)),this.texPool=o.texPool,o.instances.add(this),this.texOptions=a,r&&(this.historyDepth=r),this.cursorTgt=s??(this.canvas instanceof HTMLCanvasElement?this.canvas:void 0),this.frameId=null;let h=[];i&&i.forEach(f=>f(this,{injectGLSL:E=>{h.push(E)},emit:this.emit.bind(this),updateTexture:this.updateTex.bind(this)}));let l=n.createProgram();if(!l)throw m(1);this.program=l;let c=this.createShader(n.VERTEX_SHADER,C),p=this.createShader(n.FRAGMENT_SHADER,H(e,h));if(n.attachShader(l,c),n.attachShader(l,p),n.bindAttribLocation(l,0,"a_position"),n.linkProgram(l),n.deleteShader(c),n.deleteShader(p),!n.getProgramParameter(l,n.LINK_STATUS)){let f=m(2);throw n.deleteProgram(l),f}if(this.vao=n.createVertexArray(),n.bindVertexArray(this.vao),this.buffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,this.buffer),n.bufferData(n.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.viewport(0,0,n.drawingBufferWidth,n.drawingBufferHeight),n.useProgram(l),this.canvas instanceof HTMLCanvasElement)this.resObserver=new MutationObserver(()=>this.syncRes()),this.resObserver.observe(this.canvas,{attributes:!0,attributeFilter:["width","height"]});else{let f=E=>{let b=Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype,E),x=this.canvas;Object.defineProperty(x,E,{get:()=>b.get.call(x),set:d=>{b.set.call(x,d);let T=F.get(x);if(T)for(let _ of T.instances)_.syncRes()},configurable:b.configurable,enumerable:b.enumerable})};f("width"),f("height")}this.syncRes(),this.initializeUniform("u_cursor","float",this.cursorPos,{allowMissing:!0}),this.initializeUniform("u_click","float",[...this.clickPos,this.isClicked?1:0],{allowMissing:!0}),this.initializeUniform("u_time","float",0,{allowMissing:!0}),this.initializeUniform("u_frame","int",0,{allowMissing:!0}),this.initTex(g,this.canvas,{...this.texOptions}),this.intermediateFbo=n.createFramebuffer(),this.bindIntermediate(),n.bindFramebuffer(n.FRAMEBUFFER,null),this.historyDepth>0&&this.initTex(v,this.canvas,{history:this.historyDepth,...this.texOptions}),this.addListeners(),this.emit("_init")}resolveGLConst(e){let i=this.gl[e];if(i===void 0)throw m(3);return i}emit(e,...t){this.hooks.get(e)?.forEach(i=>i.call(this,...t))}on(e,t){this.hooks.has(e)||this.hooks.set(e,[]),this.hooks.get(e).push(t)}off(e,t){let i=this.hooks.get(e);if(i){let r=i.indexOf(t);r>=0&&i.splice(r,1)}}createShader(e,t){let i=this.gl,r=i.createShader(e);if(i.shaderSource(r,t),i.compileShader(r),!i.getShaderParameter(r,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(r));let s=m(4);throw i.deleteShader(r),s}return r}getCursorTgtRect(){let e=this.cursorTgt;return e===window?{left:0,top:0,width:window.innerWidth,height:window.innerHeight}:e.getBoundingClientRect()}addListeners(){if(!this.cursorTgt)return;let e=(i,r)=>{if(!this.uniforms.has("u_cursor"))return;let s=this.getCursorTgtRect(),a=(i-s.left)/s.width,n=1-(r-s.top)/s.height;this.cursorPos[0]=Math.max(0,Math.min(1,a)),this.cursorPos[1]=Math.max(0,Math.min(1,n)),this.updateUniforms({u_cursor:this.cursorPos})},t=(i,r,s)=>{if(this.uniforms.has("u_click")){if(this.isClicked=i,i){let a=this.getCursorTgtRect(),n=r,o=s;this.clickPos[0]=Math.max(0,Math.min(1,(n-a.left)/a.width)),this.clickPos[1]=Math.max(0,Math.min(1,1-(o-a.top)/a.height))}this.updateUniforms({u_click:[...this.clickPos,this.isClicked?1:0]})}};this.listeners.set("mousemove",i=>{let r=i;this.isTouch||e(r.clientX,r.clientY)}),this.listeners.set("mousedown",i=>{let r=i;this.isTouch||r.button===0&&(this.isClicked=!0,t(!0,r.clientX,r.clientY))}),this.listeners.set("mouseup",i=>{let r=i;this.isTouch||r.button===0&&t(!1)}),this.listeners.set("touchmove",i=>{let r=i;r.touches.length>0&&e(r.touches[0].clientX,r.touches[0].clientY)}),this.listeners.set("touchstart",i=>{let r=i;this.isTouch=!0,r.touches.length>0&&(e(r.touches[0].clientX,r.touches[0].clientY),t(!0,r.touches[0].clientX,r.touches[0].clientY))}),this.listeners.set("touchend",i=>{i.touches.length===0&&t(!1)}),this.listeners.forEach((i,r)=>{this.cursorTgt.addEventListener(r,i)})}syncRes(){let e=this.gl,t=[e.drawingBufferWidth,e.drawingBufferHeight];e.viewport(0,0,...t),this.uniforms.has("u_resolution")?this.updateUniforms({u_resolution:t}):this.initializeUniform("u_resolution","float",t,{allowMissing:!0}),this.resizeTex(g,...t),this.historyDepth>0&&this.resizeTex(v,...t),this.emit("updateResolution",...t)}resizeTex(e,t,i){let r=this.textures.get(e);if(!r||r.width===t&&r.height===i)return;this.gl.deleteTexture(r.texture),r.width=t,r.height=i;let{texture:a}=this.createTex(e,r);r.texture=a,this.resetHist(e,r)}reserveTex(e){let t=this.textures.get(e);if(t)return t.unitIndex;if(this.texPool.free.length>0)return this.texPool.free.pop();if(this.texPool.next>=this.texPool.max)throw m(5);return this.texPool.next++}resolveTexOpts(e){let{gl:t}=this,i=e?.internalFormat,r=e?.type??B(i)??"UNSIGNED_BYTE",s=this.resolveGLConst(r),a=i??this.typeFormats.get(s)??"RGBA8",n=/^(R|RG|RGB|RGBA)(8|16|32)(UI|I)$/.test(a),o=e?.format??(n?"RGBA_INTEGER":"RGBA"),h={type:s,format:this.resolveGLConst(o),internalFormat:this.resolveGLConst(a),minFilter:this.resolveGLConst(e?.minFilter??"LINEAR"),magFilter:this.resolveGLConst(e?.magFilter??"LINEAR"),wrapS:this.resolveGLConst(e?.wrapS??"CLAMP_TO_EDGE"),wrapT:this.resolveGLConst(e?.wrapT??"CLAMP_TO_EDGE"),colorSpace:e?.colorSpace,preserveY:e?.preserveY,isIntegerColorFormat:n};if((h.internalFormat===t.RGBA16F||h.internalFormat===t.RGBA32F)&&!t.getExtension("EXT_color_buffer_float"))throw m(6);return h}getPxArray(e,t){let i=this.typeArrays.get(e)??Uint8Array;return new i(t)}isRgba(e){let t=this.gl;return e===t.RGBA||e===t.RGBA_INTEGER}clearHistTexLayers(e){if(!e.history)return;let t=this.gl,{type:i,format:r}=e.options,s=this.getPxArray(i,e.width*e.height*4);t.activeTexture(t.TEXTURE0+e.unitIndex),t.bindTexture(t.TEXTURE_2D_ARRAY,e.texture);let a=!this.isRgba(r),n;a&&(n=t.getParameter(t.UNPACK_ALIGNMENT),t.pixelStorei(t.UNPACK_ALIGNMENT,1));for(let o=0;o<e.history.depth;++o)t.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,o,e.width,e.height,1,r,i,s);a&&t.pixelStorei(t.UNPACK_ALIGNMENT,n)}updateFrameOffset(e,t,i){this.updateUniforms({[`${P(e)}FrameOffset`]:t},i)}resetHist(e,t){t.history&&(t.history.writeIndex=0,this.clearHistTexLayers(t),this.updateFrameOffset(e,0,{allowMissing:!0}))}initializeUniform(e,t,i,r){let s=r?.arrayLength,a=r?.allowMissing??!1;if(this.uniforms.has(e))throw m(7);if(!N[t])throw m(8);if(s&&!(Array.isArray(i)&&i.length===s))throw m(9);let n=this.gl,o=n.getUniformLocation(this.program,e);if(!o&&s&&(o=n.getUniformLocation(this.program,`${e}[0]`)),!o){if(a)return;throw m(19)}let h=s?i[0]:i,l=Array.isArray(h)?h.length:1;this.uniforms.set(e,{type:t,length:l,location:o,arrayLength:s});try{this.updateUniforms({[e]:i})}catch(c){throw this.uniforms.delete(e),c}this.emit("initializeUniform",...arguments)}_updateUniforms(e,t){let i=this.gl;i.useProgram(this.program),Object.entries(e).forEach(([r,s])=>{let a=this.uniforms.get(r);if(!a){if(t?.allowMissing)return;throw m(20)}let n=`uniform${a.length}${N[a.type]}`;if(a.arrayLength){if(!Array.isArray(s))throw m(10);let o=s.length;if(!o)return;if(o>a.arrayLength)throw m(11);if(s.some(p=>(Array.isArray(p)?p.length:1)!==a.length))throw m(12);let h=s.flat(),l=a.type==="float"?new Float32Array(h):a.type==="uint"?new Uint32Array(h):new Int32Array(h),c=a.location;if(t?.startIndex){let p=i.getUniformLocation(this.program,`${r}[${t.startIndex}]`);if(!p)throw m(13);c=p}i[n+"v"](c,l)}else{Array.isArray(s)||(s=[s]);let o=s;if(o.length!==a.length)throw m(14);i[n](a.location,...o)}}),this.emit("updateUniforms",...arguments)}updateUniforms(e,t){this._updateUniforms(e,t),typeof e.u_time=="number"&&(this.tElapsed=e.u_time,isNaN(this.tStart)||(this.tStart=performance.now())),typeof e.u_frame=="number"&&(this.frame=e.u_frame)}createTex(e,t){let i=this.gl,{width:r,height:s}=t,a=t.history?.depth??0,n=i.createTexture();if(!n)throw m(15);let o=t.unitIndex;if(typeof o!="number")try{o=this.reserveTex(e)}catch(p){throw i.deleteTexture(n),p}let h=a>0,l=h?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D,{options:c}=t;return i.activeTexture(i.TEXTURE0+o),i.bindTexture(l,n),i.texParameteri(l,i.TEXTURE_WRAP_S,c.wrapS),i.texParameteri(l,i.TEXTURE_WRAP_T,c.wrapT),i.texParameteri(l,i.TEXTURE_MIN_FILTER,c.minFilter),i.texParameteri(l,i.TEXTURE_MAG_FILTER,c.magFilter),h?i.texStorage3D(l,1,c.internalFormat,r,s,a):e===g&&i.texImage2D(i.TEXTURE_2D,0,c.internalFormat,r,s,0,c.format,c.type,null),{texture:n,unitIndex:o}}initTex(e,t,i){let r=this.gl;if(this.textures.has(e))throw m(16);let{history:s=0,...a}=i??{},{width:n,height:o}=O(t);if(!n||!o)throw m(17);let h={width:n,height:o,options:t instanceof u&&Object.keys(a).length===0&&t.textures.has(g)?t.textures.get(g).options:this.resolveTexOpts(a)};s>0&&(h.history={depth:s,writeIndex:0});let{texture:l,unitIndex:c}=this.createTex(e,h),p={texture:l,unitIndex:c,...h};s>0&&(this.initializeUniform(`${P(e)}FrameOffset`,"int",0,{allowMissing:!0}),this.clearHistTexLayers(p)),this.textures.set(e,p),e!==g&&e!==v&&this.updateTex(e,t),r.useProgram(this.program);let f=r.getUniformLocation(this.program,P(e));f&&r.uniform1i(f,c)}initializeTexture(e,t,i){let r=i?.history!=null&&i.history>0?{...i,history:i.history+1}:i;this.initTex(e,t,r),this.emit("initializeTexture",...arguments)}updateTextures(e){Object.entries(e).forEach(([t,i])=>{this.updateTex(t,i)}),this.emit("updateTextures",...arguments)}updateTex(e,t,i){let r=this.gl,s=this.textures.get(e);if(!s)throw m(18);if(t instanceof WebGLTexture){r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D,t);return}let a=t;if(t instanceof u){let d=t.textures.get(g),T=d.width,_=d.height;if(t.gl===r){if(!s.history){r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D,d.texture);return}let{depth:L}=s.history,D=i===void 0?[s.history.writeIndex]:Array.isArray(i)?i.map(U=>S(U,L)):[S(i,L)];r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D_ARRAY,s.texture),r.bindFramebuffer(r.READ_FRAMEBUFFER,t.intermediateFbo);for(let U of D)r.copyTexSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,U,0,0,T,_);r.bindFramebuffer(r.READ_FRAMEBUFFER,null),this.updateFrameOffset(e,D[D.length-1],{allowMissing:!0}),i===void 0&&(s.history.writeIndex=(s.history.writeIndex+1)%L);return}let{width:y,height:R,options:{format:w,type:A}}=d,G=this.getPxArray(A,y*R*4);t.gl.bindFramebuffer(t.gl.FRAMEBUFFER,t.intermediateFbo),t.gl.readPixels(0,0,y,R,w,A,G),t.gl.bindFramebuffer(t.gl.FRAMEBUFFER,null),a={data:G,width:y,height:R}}let{width:n,height:o}=O(a);if(!n||!o)return;let h="isPartial"in a&&a.isPartial;h||this.resizeTex(e,n,o);let l="data"in a&&a.data,c=!l&&!s.options?.preserveY,p=r.getParameter(r.UNPACK_FLIP_Y_WEBGL),f=l&&!this.isRgba(s.options.format),E=!l&&s.options.colorSpace&&"unpackColorSpace"in r,b=r.unpackColorSpace,x;if(f&&(x=r.getParameter(r.UNPACK_ALIGNMENT),r.pixelStorei(r.UNPACK_ALIGNMENT,1)),E&&(r.unpackColorSpace=s.options.colorSpace),s.history){r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D_ARRAY,s.texture);let{depth:d}=s.history,T=i===void 0?[s.history.writeIndex]:Array.isArray(i)?i.map(A=>S(A,d)):[S(i,d)];r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,c);let _=a,y=_.data??a,R=h?_.x??0:0,w=h?_.y??0:0;for(let A of T)r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,R,w,A,n,o,1,s.options.format,s.options.type,y);r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,p),this.updateFrameOffset(e,T[T.length-1]),i===void 0&&(s.history.writeIndex=(s.history.writeIndex+1)%d)}else{if(r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D,s.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,c),h){let d=a;r.texSubImage2D(r.TEXTURE_2D,0,d.x??0,d.y??0,n,o,s.options.format,s.options.type,d.data)}else r.texImage2D(r.TEXTURE_2D,0,s.options.internalFormat,n,o,0,s.options.format,s.options.type,a.data??a);r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,p)}E&&(r.unpackColorSpace=b),f&&r.pixelStorei(r.UNPACK_ALIGNMENT,x)}bindIntermediate(){let e=this.gl,t=this.textures.get(g);e.bindFramebuffer(e.FRAMEBUFFER,this.intermediateFbo),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.texture,0)}clear(){this.bindIntermediate();let e=this.gl,t=this.textures.get(g);if(t.options.isIntegerColorFormat){let i=t.options.type;this.uintTypes.has(i)?e.clearBufferuiv(e.COLOR,0,new Uint32Array(4)):e.clearBufferiv(e.COLOR,0,new Int32Array(4))}else e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.emit("preDraw",...arguments);let t=this.gl,i=t.drawingBufferWidth,r=t.drawingBufferHeight;if(e?.skipClear?this.bindIntermediate():this.clear(),t.useProgram(this.program),t.bindVertexArray(this.vao),t.viewport(0,0,i,r),t.drawArrays(t.TRIANGLES,0,3),!this.isHeadless){let s=this.textures.get(g);if(!s.options.isIntegerColorFormat){let a=s.options.colorSpace??"srgb";"drawingBufferColorSpace"in t&&t.drawingBufferColorSpace!==a&&(t.drawingBufferColorSpace=a),t.bindFramebuffer(t.READ_FRAMEBUFFER,this.intermediateFbo),t.bindFramebuffer(t.DRAW_FRAMEBUFFER,null),t.blitFramebuffer(0,0,i,r,0,0,i,r,t.COLOR_BUFFER_BIT,t.NEAREST),t.bindFramebuffer(t.FRAMEBUFFER,null)}}this.emit("postDraw",...arguments)}step(e){this._step(performance.now(),e)}tick(){let e={};this.uniforms.has("u_time")&&(e.u_time=this.tElapsed),this.uniforms.has("u_frame")&&(e.u_frame=this.frame),Object.keys(e).length&&this._updateUniforms(e)}_step(e,t){let i=this.getElapsed(e);this.tElapsed=i,this.tStart=e;let r=typeof t=="function"?t(i,this.frame):t;this.emit("preStep",i,this.frame,r),this.tick(),this.draw(r);let s=this.textures.get(v);if(s&&!r?.skipHistory){let{writeIndex:a,depth:n}=s.history,o=this.gl;o.bindFramebuffer(o.READ_FRAMEBUFFER,this.intermediateFbo),o.bindTexture(o.TEXTURE_2D_ARRAY,s.texture),o.copyTexSubImage3D(o.TEXTURE_2D_ARRAY,0,0,0,a,0,0,o.drawingBufferWidth,o.drawingBufferHeight),o.bindFramebuffer(o.READ_FRAMEBUFFER,null);let h=(a+1)%n;this.updateFrameOffset(v,h,{allowMissing:!0}),s.history.writeIndex=h}++this.frame,this.emit("postStep",i,this.frame,r)}play(e){this._pause();let t=i=>{this._step(i,e),this.frameId!=null&&(this.frameId=requestAnimationFrame(t))};this.frameId=requestAnimationFrame(t),this.emit("play")}getElapsed(e){return isNaN(this.tStart)?this.tElapsed:this.tElapsed+(e-this.tStart)/1e3}_pause(){if(!(isNaN(this.tStart)&&this.frameId==null))return this.frameId!=null&&(cancelAnimationFrame(this.frameId),this.frameId=null),this.tElapsed=this.getElapsed(performance.now()),this.tStart=NaN,!0}pause(){this._pause()&&this.emit("pause")}rewind(){this.frame=0,this.tElapsed=0,this.tStart=NaN,this.tick()}reset(){this.rewind(),this.textures.forEach((e,t)=>{this.resetHist(t,e)}),this.clear(),this.emit("reset")}destroy(){this.emit("destroy"),this._pause();let e=this.gl;this.cursorTgt&&(this.listeners.forEach((i,r)=>{this.cursorTgt.removeEventListener(r,i)}),this.listeners.clear()),this.resObserver&&(this.resObserver.disconnect(),this.resObserver=null),this.program&&(e.deleteProgram(this.program),this.program=null),this.intermediateFbo&&(e.deleteFramebuffer(this.intermediateFbo),this.intermediateFbo=null),this.textures.forEach(i=>{this.texPool.free.push(i.unitIndex),e.deleteTexture(i.texture)}),this.textures.clear();let t=F.get(this.canvas);t&&(t.instances.delete(this),t.instances.size===0&&F.delete(this.canvas)),this.vao&&(e.deleteVertexArray(this.vao),this.vao=null),this.buffer&&(e.deleteBuffer(this.buffer),this.buffer=null),this.uniforms.clear(),this.hooks.clear()}},Y=I;export{Y as a};
5
+ //# sourceMappingURL=chunk-745KVZYV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { safeMod, spError } from './internal/util';\n\nconst DEFAULT_VERTEX_SHADER_SRC = `#version 300 es\nin vec2 a_position;out vec2 v_uv;void main(){gl_Position=vec4(a_position,0.,1.);v_uv=a_position*.5+.5;}`;\n\ninterface Uniform {\n\ttype: 'float' | 'int' | 'uint';\n\tlength: 1 | 2 | 3 | 4;\n\tlocation: WebGLUniformLocation;\n\tarrayLength?: number;\n}\n\ntype GLInternalFormatChannels = 'R' | 'RG' | 'RGB' | 'RGBA';\ntype GLInternalFormatDepth = '8' | '16F' | '32F' | '8UI' | '8I' | '16UI' | '16I' | '32UI' | '32I';\nexport type GLInternalFormatString = `${GLInternalFormatChannels}${GLInternalFormatDepth}`;\n\nexport type GLFormatString =\n\t| 'RED'\n\t| 'RG'\n\t| 'RGB'\n\t| 'RGBA'\n\t| 'RED_INTEGER'\n\t| 'RG_INTEGER'\n\t| 'RGB_INTEGER'\n\t| 'RGBA_INTEGER';\nexport type GLTypeString =\n\t| 'UNSIGNED_BYTE'\n\t| 'BYTE'\n\t| 'FLOAT'\n\t| 'HALF_FLOAT'\n\t| 'UNSIGNED_SHORT'\n\t| 'SHORT'\n\t| 'UNSIGNED_INT'\n\t| 'INT';\nexport type GLFilterString = 'LINEAR' | 'NEAREST';\nexport type GLWrapString = 'CLAMP_TO_EDGE' | 'REPEAT' | 'MIRRORED_REPEAT';\nexport type ColorSpace = PredefinedColorSpace;\n\nconst FORMAT_TYPE_SUFFIXES: [string, GLTypeString][] = [\n\t['8UI', 'UNSIGNED_BYTE'],\n\t['8I', 'BYTE'],\n\t['16UI', 'UNSIGNED_SHORT'],\n\t['16I', 'SHORT'],\n\t['16F', 'HALF_FLOAT'],\n\t['32UI', 'UNSIGNED_INT'],\n\t['32I', 'INT'],\n\t['32F', 'FLOAT'],\n\t['8', 'UNSIGNED_BYTE'],\n];\n\nconst UNIFORM_TYPE_SUFFIXES: Record<Uniform['type'], string> = {\n\tfloat: 'f',\n\tint: 'i',\n\tuint: 'ui',\n};\n\nfunction typeFromInternalFormatString(internalFormatString?: GLInternalFormatString): GLTypeString | undefined {\n\treturn internalFormatString && FORMAT_TYPE_SUFFIXES.find(([suffix]) => internalFormatString.endsWith(suffix))?.[1];\n}\n\ntype GLConstantString = GLInternalFormatString | GLFormatString | GLTypeString | GLFilterString | GLWrapString;\n\nexport interface TextureOptions {\n\tinternalFormat?: GLInternalFormatString;\n\tformat?: GLFormatString;\n\ttype?: GLTypeString;\n\tminFilter?: GLFilterString;\n\tmagFilter?: GLFilterString;\n\twrapS?: GLWrapString;\n\twrapT?: GLWrapString;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n}\ntype ResolvedTextureOptions = {\n\ttype: number;\n\tformat: number;\n\tinternalFormat: number;\n\tminFilter: number;\n\tmagFilter: number;\n\twrapS: number;\n\twrapT: number;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n\tisIntegerColorFormat: boolean;\n};\n\ninterface Texture {\n\ttexture: WebGLTexture;\n\tunitIndex: number;\n\twidth: number;\n\theight: number;\n\thistory?: {\n\t\tdepth: number;\n\t\twriteIndex: number;\n\t};\n\toptions: ResolvedTextureOptions;\n}\n\nexport interface CustomTexture {\n\tdata: ArrayBufferView | null;\n\twidth: number;\n\theight: number;\n}\n\nexport interface PartialCustomTexture extends CustomTexture {\n\tisPartial?: boolean;\n\tx?: number;\n\ty?: number;\n}\n\nexport interface InitializeTextureOptions extends TextureOptions {\n\thistory?: number;\n}\n\nexport type TextureSource =\n\t| HTMLImageElement\n\t| HTMLVideoElement\n\t| HTMLCanvasElement\n\t| OffscreenCanvas\n\t| ImageBitmap\n\t| WebGLTexture\n\t| CustomTexture\n\t| ShaderPad;\n\n// Custom textures allow partial updates starting from (x, y).\nexport type UpdateTextureSource = Exclude<TextureSource, CustomTexture> | PartialCustomTexture;\n\nexport interface PluginContext {\n\tinjectGLSL: (code: string) => void;\n\temit: (name: ShaderPadEventName, ...args: any[]) => void;\n\tupdateTexture: (name: string, source: UpdateTextureSource, historySlots?: HistorySlots) => void;\n}\n\nexport type Plugin = (shaderPad: ShaderPad, context: PluginContext) => void;\n\nexport type ShaderPadEventName =\n\t| '_init'\n\t| 'initializeTexture'\n\t| 'initializeUniform'\n\t| 'updateTextures'\n\t| 'updateUniforms'\n\t| 'preStep'\n\t| 'postStep'\n\t| 'preDraw'\n\t| 'postDraw'\n\t| 'updateResolution'\n\t| 'play'\n\t| 'pause'\n\t| 'reset'\n\t| 'destroy'\n\t| `${string}:${string}`;\n\nexport type RenderTextureOptions = Omit<TextureOptions, 'preserveY'>;\n\nexport interface Options extends RenderTextureOptions {\n\tcanvas?: HTMLCanvasElement | OffscreenCanvas | { width: number; height: number } | null;\n\tplugins?: Plugin[];\n\thistory?: number;\n\tcursorTarget?: Window | Element;\n}\n\nexport interface StepOptions {\n\tskipClear?: boolean;\n\tskipHistory?: boolean;\n}\n\ntype HistorySlots = number | number[];\n\ntype TextureUnitPool = {\n\tfree: number[];\n\tnext: number;\n\tmax: number;\n};\n\nconst HISTORY_TEXTURE_KEY = Symbol('u_history');\nconst INTERMEDIATE_TEXTURE_KEY = Symbol('__SHADERPAD_BUFFER');\n\nconst canvasRegistry = new WeakMap<\n\tHTMLCanvasElement | OffscreenCanvas,\n\t{ texPool: TextureUnitPool; instances: Set<ShaderPad> }\n>();\n\nfunction combineShaderCode(shader: string, injections: string[]): string {\n\tif (!injections?.length) return shader;\n\tconst lines = shader.split('\\n');\n\tconst insertAt =\n\t\tlines.findLastIndex(line => {\n\t\t\tconst trimmed = line.trimStart();\n\t\t\treturn trimmed.startsWith('precision ') || trimmed.startsWith('#version ');\n\t\t}) + 1;\n\tlines.splice(insertAt, 0, ...injections);\n\treturn lines.join('\\n');\n}\n\nfunction getSourceDimensions(source: TextureSource): {\n\twidth: number;\n\theight: number;\n} {\n\tif (source instanceof WebGLTexture) {\n\t\treturn { width: 0, height: 0 }; // Invalid - dimensions not readable.\n\t}\n\tif (source instanceof ShaderPad) {\n\t\treturn { width: source.canvas.width, height: source.canvas.height };\n\t}\n\tif (source instanceof HTMLVideoElement) {\n\t\treturn { width: source.videoWidth, height: source.videoHeight };\n\t}\n\tif (source instanceof HTMLImageElement) {\n\t\treturn {\n\t\t\twidth: source.naturalWidth ?? source.width,\n\t\t\theight: source.naturalHeight ?? source.height,\n\t\t};\n\t}\n\t// CustomTexture, HTMLCanvasElement, OffscreenCanvas, ImageBitmap.\n\treturn { width: source.width, height: source.height };\n}\n\nfunction stringFrom(name: string | symbol) {\n\treturn typeof name === 'symbol' ? (name.description ?? '') : name;\n}\n\nclass ShaderPad {\n\tprivate isHeadless = false;\n\tprivate isTouch = false;\n\tdeclare public readonly gl: WebGL2RenderingContext;\n\tdeclare private typeArrays: Map<number, new (length: number) => ArrayBufferView>;\n\tdeclare private typeFormats: Map<number, GLInternalFormatString>;\n\tdeclare private uintTypes: Set<number>;\n\tprivate uniforms: Map<string, Uniform> = new Map();\n\tprivate textures: Map<string | symbol, Texture> = new Map();\n\tdeclare private texPool: TextureUnitPool;\n\tprivate buffer: WebGLBuffer | null = null;\n\tprivate vao: WebGLVertexArrayObject | null = null;\n\tprivate program: WebGLProgram | null = null;\n\tdeclare private frameId: number | null;\n\tprivate listeners: Map<string, EventListener> = new Map();\n\tprivate frame = 0;\n\tprivate tElapsed = 0;\n\tprivate tStart = NaN;\n\tprivate cursorPos = [0.5, 0.5];\n\tprivate clickPos = [0.5, 0.5];\n\tprivate isClicked = false;\n\tdeclare public canvas: HTMLCanvasElement | OffscreenCanvas;\n\tprivate resObserver: MutationObserver | null = null;\n\tprivate hooks: Map<ShaderPadEventName, Function[]> = new Map();\n\tprivate historyDepth = 0;\n\tdeclare private texOptions: TextureOptions;\n\tdeclare private cursorTgt: Window | Element | undefined;\n\t// WebGL can’t read from and write to the history texture at the same time.\n\t// We write to an intermediate texture then blit to the history texture.\n\tprivate intermediateFbo: WebGLFramebuffer | null = null;\n\n\tconstructor(fragmentShaderSrc: string, { canvas, plugins, history, cursorTarget, ...texOptions }: Options = {}) {\n\t\tif (canvas && 'getContext' in canvas) {\n\t\t\tthis.canvas = canvas;\n\t\t} else {\n\t\t\tconst { width = 1, height = 1 } = canvas || {};\n\t\t\tthis.canvas = new OffscreenCanvas(width, height);\n\t\t\tthis.isHeadless = true;\n\t\t}\n\n\t\tconst gl = this.canvas.getContext('webgl2', {\n\t\t\tantialias: false,\n\t\t}) as WebGL2RenderingContext;\n\t\tif (!gl) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(0, {\n\t\t\t\t\t\tcanvasType: this.canvas.constructor.name,\n\t\t\t\t\t\tisHeadless: this.isHeadless,\n\t\t\t\t\t\tcanvasWidth: this.canvas.width,\n\t\t\t\t\t\tcanvasHeight: this.canvas.height,\n\t\t\t\t\t})\n\t\t\t\t: spError(0);\n\t\t}\n\t\tthis.gl = gl;\n\t\tthis.typeArrays = new Map<number, new (length: number) => ArrayBufferView>([\n\t\t\t[gl.FLOAT, Float32Array],\n\t\t\t[gl.HALF_FLOAT, Uint16Array],\n\t\t\t[gl.UNSIGNED_SHORT, Uint16Array],\n\t\t\t[gl.SHORT, Int16Array],\n\t\t\t[gl.BYTE, Int8Array],\n\t\t\t[gl.UNSIGNED_INT, Uint32Array],\n\t\t\t[gl.INT, Int32Array],\n\t\t]);\n\t\tthis.typeFormats = new Map<number, GLInternalFormatString>([\n\t\t\t[gl.FLOAT, 'RGBA32F'],\n\t\t\t[gl.HALF_FLOAT, 'RGBA16F'],\n\t\t\t[gl.UNSIGNED_SHORT, 'RGBA32UI'],\n\t\t\t[gl.SHORT, 'RGBA32I'],\n\t\t\t[gl.BYTE, 'RGBA32I'],\n\t\t\t[gl.UNSIGNED_INT, 'RGBA32UI'],\n\t\t\t[gl.INT, 'RGBA32I'],\n\t\t]);\n\t\tthis.uintTypes = new Set([gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT]);\n\n\t\tlet registryEntry = canvasRegistry.get(this.canvas);\n\t\tif (!registryEntry) {\n\t\t\tregistryEntry = {\n\t\t\t\ttexPool: {\n\t\t\t\t\tfree: [],\n\t\t\t\t\tnext: 0,\n\t\t\t\t\tmax: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n\t\t\t\t},\n\t\t\t\tinstances: new Set([this]),\n\t\t\t};\n\t\t\tcanvasRegistry.set(this.canvas, registryEntry);\n\t\t}\n\t\tthis.texPool = registryEntry.texPool;\n\t\tregistryEntry.instances.add(this);\n\n\t\tthis.texOptions = texOptions;\n\n\t\tif (history) this.historyDepth = history;\n\t\tthis.cursorTgt = cursorTarget ?? (this.canvas instanceof HTMLCanvasElement ? this.canvas : undefined);\n\t\tthis.frameId = null;\n\n\t\tconst glslInjections: string[] = [];\n\t\tif (plugins) {\n\t\t\tplugins.forEach(plugin =>\n\t\t\t\tplugin(this, {\n\t\t\t\t\tinjectGLSL: (code: string) => {\n\t\t\t\t\t\tglslInjections.push(code);\n\t\t\t\t\t},\n\t\t\t\t\temit: this.emit.bind(this),\n\t\t\t\t\tupdateTexture: this.updateTex.bind(this),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst program = gl.createProgram();\n\t\tif (!program) {\n\t\t\tthrow spError(1);\n\t\t}\n\t\tthis.program = program;\n\n\t\tconst vertexShader = this.createShader(gl.VERTEX_SHADER, DEFAULT_VERTEX_SHADER_SRC);\n\t\tconst fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tcombineShaderCode(fragmentShaderSrc, glslInjections),\n\t\t);\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.bindAttribLocation(program, 0, 'a_position');\n\t\tgl.linkProgram(program);\n\t\tgl.deleteShader(vertexShader);\n\t\tgl.deleteShader(fragmentShader);\n\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst linkError = __SHADERPAD_DEV__\n\t\t\t\t? spError(2, {\n\t\t\t\t\t\tprogramInfoLog: gl.getProgramInfoLog(program),\n\t\t\t\t\t\tfragmentShaderLength: fragmentShaderSrc.length,\n\t\t\t\t\t\tglslInjectionCount: glslInjections.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(2);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow linkError;\n\t\t}\n\n\t\tthis.vao = gl.createVertexArray();\n\t\tgl.bindVertexArray(this.vao);\n\t\tthis.buffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(0);\n\t\tgl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n\t\tgl.useProgram(program);\n\n\t\tif (this.canvas instanceof HTMLCanvasElement) {\n\t\t\tthis.resObserver = new MutationObserver(() => this.syncRes());\n\t\t\tthis.resObserver.observe(this.canvas, {\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: ['width', 'height'],\n\t\t\t});\n\t\t} else {\n\t\t\tconst wrapDimension = (dimension: 'width' | 'height') => {\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype, dimension)!;\n\t\t\t\tconst canvas = this.canvas;\n\t\t\t\tObject.defineProperty(canvas, dimension, {\n\t\t\t\t\tget: () => descriptor.get!.call(canvas),\n\t\t\t\t\tset: v => {\n\t\t\t\t\t\tdescriptor.set!.call(canvas, v);\n\t\t\t\t\t\tconst entry = canvasRegistry.get(canvas);\n\t\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t\tfor (const instance of entry.instances) {\n\t\t\t\t\t\t\t\tinstance.syncRes();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconfigurable: descriptor.configurable,\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t});\n\t\t\t};\n\t\t\twrapDimension('width');\n\t\t\twrapDimension('height');\n\t\t}\n\t\tthis.syncRes();\n\n\t\tthis.initializeUniform('u_cursor', 'float', this.cursorPos, { allowMissing: true });\n\t\tthis.initializeUniform('u_click', 'float', [...this.clickPos, this.isClicked ? 1.0 : 0.0], {\n\t\t\tallowMissing: true,\n\t\t});\n\t\tthis.initializeUniform('u_time', 'float', 0, { allowMissing: true });\n\t\tthis.initializeUniform('u_frame', 'int', 0, { allowMissing: true });\n\n\t\tthis.initTex(INTERMEDIATE_TEXTURE_KEY, this.canvas, {\n\t\t\t...this.texOptions,\n\t\t});\n\t\tthis.intermediateFbo = gl.createFramebuffer();\n\t\tthis.bindIntermediate();\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.initTex(HISTORY_TEXTURE_KEY, this.canvas, {\n\t\t\t\thistory: this.historyDepth,\n\t\t\t\t...this.texOptions,\n\t\t\t});\n\t\t}\n\t\tthis.addListeners();\n\t\tthis.emit('_init');\n\t}\n\n\tprivate resolveGLConst(value: GLConstantString): number {\n\t\tconst gl = this.gl;\n\t\tconst resolved = gl[value];\n\t\tif (resolved === undefined) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(3, { value }) : spError(3);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\tprivate emit(name: ShaderPadEventName, ...args: any[]) {\n\t\tthis.hooks.get(name)?.forEach(hook => hook.call(this, ...args));\n\t}\n\n\ton(name: ShaderPadEventName, fn: Function) {\n\t\tif (!this.hooks.has(name)) {\n\t\t\tthis.hooks.set(name, []);\n\t\t}\n\t\tthis.hooks.get(name)!.push(fn);\n\t}\n\n\toff(name: ShaderPadEventName, fn: Function) {\n\t\tconst hooks = this.hooks.get(name);\n\t\tif (hooks) {\n\t\t\tconst index = hooks.indexOf(fn);\n\t\t\tif (index >= 0) {\n\t\t\t\thooks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createShader(type: number, source: string): WebGLShader {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type)!;\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tconsole.error(gl.getShaderInfoLog(shader));\n\t\t\tconst compilationError = __SHADERPAD_DEV__\n\t\t\t\t? spError(4, {\n\t\t\t\t\t\tshaderType: type === gl.VERTEX_SHADER ? 'vertex' : 'fragment',\n\t\t\t\t\t\tsource,\n\t\t\t\t\t})\n\t\t\t\t: spError(4);\n\t\t\tgl.deleteShader(shader);\n\t\t\tthrow compilationError;\n\t\t}\n\t\treturn shader;\n\t}\n\n\tprivate getCursorTgtRect(): {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t} {\n\t\tconst target = this.cursorTgt!;\n\t\tif (target === window) {\n\t\t\treturn {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: window.innerWidth,\n\t\t\t\theight: window.innerHeight,\n\t\t\t};\n\t\t}\n\t\treturn (target as Element).getBoundingClientRect();\n\t}\n\n\tprivate addListeners() {\n\t\tif (!this.cursorTgt) return;\n\t\tconst updateCursor = (x: number, y: number) => {\n\t\t\tif (!this.uniforms.has('u_cursor')) return;\n\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\tconst u = (x - rect.left) / rect.width;\n\t\t\tconst v = 1 - (y - rect.top) / rect.height; // Flip Y for WebGL\n\t\t\tthis.cursorPos[0] = Math.max(0, Math.min(1, u));\n\t\t\tthis.cursorPos[1] = Math.max(0, Math.min(1, v));\n\t\t\tthis.updateUniforms({ u_cursor: this.cursorPos });\n\t\t};\n\n\t\tconst updateClick = (isClicked: boolean, x?: number, y?: number) => {\n\t\t\tif (!this.uniforms.has('u_click')) return;\n\t\t\tthis.isClicked = isClicked;\n\t\t\tif (isClicked) {\n\t\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\t\tconst xVal = x as number;\n\t\t\t\tconst yVal = y as number;\n\t\t\t\tthis.clickPos[0] = Math.max(0, Math.min(1, (xVal - rect.left) / rect.width));\n\t\t\t\tthis.clickPos[1] = Math.max(0, Math.min(1, 1 - (yVal - rect.top) / rect.height)); // Flip Y for WebGL\n\t\t\t}\n\t\t\tthis.updateUniforms({\n\t\t\t\tu_click: [...this.clickPos, this.isClicked ? 1.0 : 0.0],\n\t\t\t});\n\t\t};\n\n\t\tthis.listeners.set('mousemove', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tupdateCursor(mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mousedown', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tthis.isClicked = true;\n\t\t\t\t\tupdateClick(true, mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mouseup', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tupdateClick(false);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchmove', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchstart', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tthis.isTouch = true;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t\tupdateClick(true, touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchend', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length === 0) {\n\t\t\t\tupdateClick(false);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.forEach((listener, event) => {\n\t\t\tthis.cursorTgt!.addEventListener(event, listener);\n\t\t});\n\t}\n\n\tprivate syncRes() {\n\t\tconst gl = this.gl;\n\t\tconst resolution: [number, number] = [gl.drawingBufferWidth, gl.drawingBufferHeight];\n\t\tgl.viewport(0, 0, ...resolution);\n\t\tif (this.uniforms.has('u_resolution')) {\n\t\t\tthis.updateUniforms({ u_resolution: resolution });\n\t\t} else {\n\t\t\tthis.initializeUniform('u_resolution', 'float', resolution, { allowMissing: true });\n\t\t}\n\t\tthis.resizeTex(INTERMEDIATE_TEXTURE_KEY, ...resolution);\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.resizeTex(HISTORY_TEXTURE_KEY, ...resolution);\n\t\t}\n\t\tthis.emit('updateResolution', ...resolution);\n\t}\n\n\tprivate resizeTex(name: string | symbol, width: number, height: number) {\n\t\tconst info = this.textures.get(name);\n\t\tif (!info || (info.width === width && info.height === height)) return;\n\n\t\tconst gl = this.gl;\n\t\tgl.deleteTexture(info.texture);\n\t\tinfo.width = width;\n\t\tinfo.height = height;\n\t\tconst { texture } = this.createTex(name, info);\n\t\tinfo.texture = texture;\n\t\tthis.resetHist(name, info);\n\t}\n\n\tprivate reserveTex(name: string | symbol) {\n\t\tconst existing = this.textures.get(name);\n\t\tif (existing) return existing.unitIndex;\n\t\tif (this.texPool.free.length > 0) return this.texPool.free.pop()!;\n\t\tif (this.texPool.next >= this.texPool.max) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(5, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\tnextTextureUnit: this.texPool.next,\n\t\t\t\t\t\tmaxTextureUnits: this.texPool.max,\n\t\t\t\t\t\tfreeTextureUnits: this.texPool.free.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(5);\n\t\t}\n\t\treturn this.texPool.next++;\n\t}\n\n\tprivate resolveTexOpts(options?: TextureOptions): ResolvedTextureOptions {\n\t\tconst { gl } = this;\n\t\tconst internalFormatOption = options?.internalFormat;\n\t\tconst typeString = options?.type ?? typeFromInternalFormatString(internalFormatOption) ?? 'UNSIGNED_BYTE';\n\t\tconst type = this.resolveGLConst(typeString);\n\t\tconst internalFormatString = internalFormatOption ?? this.typeFormats.get(type) ?? 'RGBA8';\n\t\tconst isIntegerColorFormat = /^(R|RG|RGB|RGBA)(8|16|32)(UI|I)$/.test(internalFormatString);\n\t\tconst formatString = options?.format ?? (isIntegerColorFormat ? 'RGBA_INTEGER' : 'RGBA');\n\t\tconst result: ResolvedTextureOptions = {\n\t\t\ttype,\n\t\t\tformat: this.resolveGLConst(formatString),\n\t\t\tinternalFormat: this.resolveGLConst(internalFormatString),\n\t\t\tminFilter: this.resolveGLConst(options?.minFilter ?? 'LINEAR'),\n\t\t\tmagFilter: this.resolveGLConst(options?.magFilter ?? 'LINEAR'),\n\t\t\twrapS: this.resolveGLConst(options?.wrapS ?? 'CLAMP_TO_EDGE'),\n\t\t\twrapT: this.resolveGLConst(options?.wrapT ?? 'CLAMP_TO_EDGE'),\n\t\t\tcolorSpace: options?.colorSpace,\n\t\t\tpreserveY: options?.preserveY,\n\t\t\tisIntegerColorFormat,\n\t\t};\n\t\tconst isFloatColorFormat = result.internalFormat === gl.RGBA16F || result.internalFormat === gl.RGBA32F;\n\t\t// gl.getExtension isn’t just a check, it’s a required side-effect to enable floats.\n\t\tif (isFloatColorFormat && !gl.getExtension('EXT_color_buffer_float')) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(6, {\n\t\t\t\t\t\tinternalFormat: internalFormatString,\n\t\t\t\t\t\ttype: typeString,\n\t\t\t\t\t})\n\t\t\t\t: spError(6);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate getPxArray(type: number, size: number): ArrayBufferView {\n\t\tconst ArrayType = this.typeArrays.get(type) ?? Uint8Array;\n\t\treturn new ArrayType(size);\n\t}\n\n\tprivate isRgba(format: number): boolean {\n\t\tconst gl = this.gl;\n\t\treturn format === gl.RGBA || format === gl.RGBA_INTEGER;\n\t}\n\n\tprivate clearHistTexLayers(textureInfo: Texture): void {\n\t\tif (!textureInfo.history) return;\n\n\t\tconst gl = this.gl;\n\t\tconst { type, format } = textureInfo.options;\n\t\tconst transparent = this.getPxArray(type, textureInfo.width * textureInfo.height * 4);\n\t\tgl.activeTexture(gl.TEXTURE0 + textureInfo.unitIndex);\n\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, textureInfo.texture);\n\t\tconst needsAlignmentFix = !this.isRgba(format);\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tfor (let layer = 0; layer < textureInfo.history.depth; ++layer) {\n\t\t\tgl.texSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tlayer,\n\t\t\t\ttextureInfo.width,\n\t\t\t\ttextureInfo.height,\n\t\t\t\t1,\n\t\t\t\tformat,\n\t\t\t\ttype,\n\t\t\t\ttransparent,\n\t\t\t);\n\t\t}\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate updateFrameOffset(\n\t\tname: string | symbol,\n\t\tframeOffset: number,\n\t\toptions?: {\n\t\t\tallowMissing?: boolean;\n\t\t},\n\t) {\n\t\tthis.updateUniforms(\n\t\t\t{\n\t\t\t\t[`${stringFrom(name)}FrameOffset`]: frameOffset,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tprivate resetHist(name: string | symbol, textureInfo: Texture) {\n\t\tif (!textureInfo.history) return;\n\t\ttextureInfo.history.writeIndex = 0;\n\t\tthis.clearHistTexLayers(textureInfo);\n\t\tthis.updateFrameOffset(name, 0, { allowMissing: true });\n\t}\n\n\tinitializeUniform(\n\t\tname: string,\n\t\ttype: Uniform['type'],\n\t\tvalue: number | number[] | (number | number[])[],\n\t\toptions?: { arrayLength?: number; allowMissing?: boolean },\n\t) {\n\t\tconst arrayLength = options?.arrayLength;\n\t\tconst allowMissing = options?.allowMissing ?? false;\n\t\tif (this.uniforms.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(7, { name, arrayLength: arrayLength ?? null }) : spError(7);\n\t\t}\n\t\tif (!UNIFORM_TYPE_SUFFIXES[type]) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(8, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tsupportedTypes: Object.keys(UNIFORM_TYPE_SUFFIXES),\n\t\t\t\t\t})\n\t\t\t\t: spError(8);\n\t\t}\n\t\tif (arrayLength && !(Array.isArray(value) && value.length === arrayLength)) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(9, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\texpectedLength: arrayLength,\n\t\t\t\t\t\treceivedLength: Array.isArray(value) ? value.length : 1,\n\t\t\t\t\t})\n\t\t\t\t: spError(9);\n\t\t}\n\n\t\tconst gl = this.gl;\n\t\tlet location = gl.getUniformLocation(this.program!, name);\n\t\tif (!location && arrayLength) {\n\t\t\tlocation = gl.getUniformLocation(this.program!, `${name}[0]`);\n\t\t}\n\t\tif (!location) {\n\t\t\tif (allowMissing) return;\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(19, { name, arrayLength: arrayLength ?? null }) : spError(19);\n\t\t}\n\n\t\tconst probeValue = arrayLength ? (value as number[] | number[][])[0] : value;\n\t\tconst length = Array.isArray(probeValue) ? (probeValue.length as 1 | 2 | 3 | 4) : 1;\n\t\tthis.uniforms.set(name, { type, length, location, arrayLength });\n\n\t\ttry {\n\t\t\tthis.updateUniforms({ [name]: value });\n\t\t} catch (error) {\n\t\t\tthis.uniforms.delete(name);\n\t\t\tthrow error;\n\t\t}\n\t\tthis.emit('initializeUniform', ...arguments);\n\t}\n\n\tprivate _updateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tObject.entries(updates).forEach(([name, newValue]) => {\n\t\t\tconst uniform = this.uniforms.get(name);\n\t\t\tif (!uniform) {\n\t\t\t\tif (options?.allowMissing) return;\n\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t? spError(20, {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tstartIndex: options?.startIndex ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: spError(20);\n\t\t\t}\n\t\t\tlet glFunctionName = `uniform${uniform.length}${UNIFORM_TYPE_SUFFIXES[uniform.type]}`;\n\t\t\tif (uniform.arrayLength) {\n\t\t\t\tif (!Array.isArray(newValue)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(10, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedType: typeof newValue,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(10);\n\t\t\t\t}\n\t\t\t\tconst nValues = newValue.length;\n\t\t\t\tif (!nValues) return;\n\t\t\t\tif (nValues > uniform.arrayLength) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(11, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: nValues,\n\t\t\t\t\t\t\t\tmaxLength: uniform.arrayLength,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(11);\n\t\t\t\t}\n\t\t\t\tif (newValue.some(item => (Array.isArray(item) ? item.length : 1) !== uniform.length)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(12, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\texpectedElementLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(12);\n\t\t\t\t}\n\t\t\t\tconst flat = newValue.flat();\n\t\t\t\tconst typedArray =\n\t\t\t\t\tuniform.type === 'float'\n\t\t\t\t\t\t? new Float32Array(flat)\n\t\t\t\t\t\t: uniform.type === 'uint'\n\t\t\t\t\t\t\t? new Uint32Array(flat)\n\t\t\t\t\t\t\t: new Int32Array(flat);\n\t\t\t\tlet location = uniform.location;\n\t\t\t\tif (options?.startIndex) {\n\t\t\t\t\tconst newLocation = gl.getUniformLocation(this.program!, `${name}[${options.startIndex}]`);\n\t\t\t\t\tif (!newLocation) {\n\t\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t\t? spError(13, {\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tstartIndex: options.startIndex,\n\t\t\t\t\t\t\t\t\tarrayLength: uniform.arrayLength,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: spError(13);\n\t\t\t\t\t}\n\t\t\t\t\tlocation = newLocation;\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName + 'v'](location, typedArray);\n\t\t\t} else {\n\t\t\t\tif (!Array.isArray(newValue)) newValue = [newValue];\n\t\t\t\tconst scalarValue = newValue as number[];\n\t\t\t\tif (scalarValue.length !== uniform.length) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(14, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: scalarValue.length,\n\t\t\t\t\t\t\t\texpectedLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(14);\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName](uniform.location, ...scalarValue);\n\t\t\t}\n\t\t});\n\t\tthis.emit('updateUniforms', ...arguments);\n\t}\n\n\tupdateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tthis._updateUniforms(updates, options);\n\n\t\tif (typeof updates.u_time === 'number') {\n\t\t\tthis.tElapsed = updates.u_time;\n\t\t\tif (!isNaN(this.tStart)) this.tStart = performance.now();\n\t\t}\n\t\tif (typeof updates.u_frame === 'number') this.frame = updates.u_frame;\n\t}\n\n\tprivate createTex(\n\t\tname: string | symbol,\n\t\ttextureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> & { unitIndex?: number },\n\t) {\n\t\tconst gl = this.gl;\n\t\tconst { width, height } = textureInfo;\n\t\tconst historyDepth = textureInfo.history?.depth ?? 0;\n\n\t\tconst texture = gl.createTexture();\n\t\tif (!texture) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(15, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\thistoryDepth,\n\t\t\t\t\t})\n\t\t\t\t: spError(15);\n\t\t}\n\n\t\tlet unitIndex = textureInfo.unitIndex;\n\t\tif (typeof unitIndex !== 'number') {\n\t\t\ttry {\n\t\t\t\tunitIndex = this.reserveTex(name);\n\t\t\t} catch (error) {\n\t\t\t\tgl.deleteTexture(texture);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst hasHistory = historyDepth > 0;\n\t\tconst textureTarget = hasHistory ? gl.TEXTURE_2D_ARRAY : gl.TEXTURE_2D;\n\t\tconst { options } = textureInfo;\n\t\tgl.activeTexture(gl.TEXTURE0 + unitIndex);\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, options.wrapS);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, options.wrapT);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, options.minFilter);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, options.magFilter);\n\t\tif (hasHistory) {\n\t\t\tgl.texStorage3D(textureTarget, 1, options.internalFormat, width, height, historyDepth);\n\t\t} else if (name === INTERMEDIATE_TEXTURE_KEY) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\toptions.internalFormat,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\toptions.format,\n\t\t\t\toptions.type,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\treturn { texture, unitIndex };\n\t}\n\n\tprivate initTex(name: string | symbol, source: TextureSource, options?: InitializeTextureOptions) {\n\t\tconst gl = this.gl;\n\t\tif (this.textures.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(16, { name: stringFrom(name) }) : spError(16);\n\t\t}\n\n\t\tconst { history: historyDepth = 0, ...texOptions } = options ?? {};\n\t\tconst { width, height } = getSourceDimensions(source);\n\t\tif (!width || !height) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(17, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tsourceType: source.constructor.name,\n\t\t\t\t\t})\n\t\t\t\t: spError(17);\n\t\t}\n\t\tconst textureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> = {\n\t\t\twidth,\n\t\t\theight,\n\t\t\toptions:\n\t\t\t\tsource instanceof ShaderPad &&\n\t\t\t\tObject.keys(texOptions).length === 0 &&\n\t\t\t\tsource.textures.has(INTERMEDIATE_TEXTURE_KEY)\n\t\t\t\t\t? source.textures.get(INTERMEDIATE_TEXTURE_KEY)!.options\n\t\t\t\t\t: this.resolveTexOpts(texOptions),\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\ttextureInfo.history = { depth: historyDepth, writeIndex: 0 };\n\t\t}\n\t\tconst { texture, unitIndex } = this.createTex(name, textureInfo);\n\t\tconst completeTextureInfo: Texture = {\n\t\t\ttexture,\n\t\t\tunitIndex,\n\t\t\t...textureInfo,\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\tthis.initializeUniform(`${stringFrom(name)}FrameOffset`, 'int', 0, { allowMissing: true });\n\t\t\tthis.clearHistTexLayers(completeTextureInfo);\n\t\t}\n\t\tthis.textures.set(name, completeTextureInfo);\n\t\tif (name !== INTERMEDIATE_TEXTURE_KEY && name !== HISTORY_TEXTURE_KEY) {\n\t\t\tthis.updateTex(name, source);\n\t\t}\n\n\t\t// Set a uniform to access the texture in the fragment shader.\n\t\tgl.useProgram(this.program!);\n\t\tconst uSampler = gl.getUniformLocation(this.program!, stringFrom(name));\n\t\tif (uSampler) {\n\t\t\tgl.uniform1i(uSampler, unitIndex);\n\t\t}\n\t}\n\n\tinitializeTexture(name: string, source: TextureSource, options?: InitializeTextureOptions) {\n\t\t// Since history[0] is the current frame, add 1 to history depth to allow history[maxHistory].\n\t\tconst opts =\n\t\t\toptions?.history != null && options.history > 0 ? { ...options, history: options.history + 1 } : options;\n\t\tthis.initTex(name, source, opts);\n\t\tthis.emit('initializeTexture', ...arguments);\n\t}\n\n\tupdateTextures(updates: Record<string, UpdateTextureSource>) {\n\t\tObject.entries(updates).forEach(([name, source]) => {\n\t\t\tthis.updateTex(name, source);\n\t\t});\n\t\tthis.emit('updateTextures', ...arguments);\n\t}\n\n\tprivate updateTex(name: string | symbol, source: UpdateTextureSource, historySlots?: HistorySlots) {\n\t\tconst gl = this.gl;\n\t\tconst info = this.textures.get(name);\n\t\tif (!info) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(18, { name: stringFrom(name) }) : spError(18);\n\t\t}\n\n\t\tif (source instanceof WebGLTexture) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, source);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nonShaderPadSource = source as Exclude<UpdateTextureSource, ShaderPad>;\n\t\tif (source instanceof ShaderPad) {\n\t\t\tconst sourceIntermediateInfo = source.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tconst srcW = sourceIntermediateInfo.width;\n\t\t\tconst srcH = sourceIntermediateInfo.height;\n\n\t\t\tif (source.gl === gl) {\n\t\t\t\tif (!info.history) {\n\t\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, sourceIntermediateInfo.texture);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { depth } = info.history;\n\t\t\t\tconst targetSlots =\n\t\t\t\t\thistorySlots === undefined\n\t\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, source.intermediateFbo);\n\t\t\t\tfor (const slot of targetSlots) {\n\t\t\t\t\tgl.copyTexSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, slot, 0, 0, srcW, srcH);\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1], { allowMissing: true });\n\t\t\t\tif (historySlots === undefined) {\n\t\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Different contexts - transfer via readPixels to preserve precision.\n\t\t\tconst {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\toptions: { format, type },\n\t\t\t} = sourceIntermediateInfo;\n\t\t\tconst pixels = this.getPxArray(type, width * height * 4);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, source.intermediateFbo);\n\t\t\tsource.gl.readPixels(0, 0, width, height, format, type, pixels);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, null);\n\t\t\tnonShaderPadSource = { data: pixels, width, height };\n\t\t}\n\n\t\t// If dimensions changed, recreate the texture with new dimensions.\n\t\tconst { width, height } = getSourceDimensions(nonShaderPadSource);\n\t\tif (!width || !height) return;\n\n\t\tconst isPartial = 'isPartial' in nonShaderPadSource && nonShaderPadSource.isPartial;\n\t\tif (!isPartial) {\n\t\t\tthis.resizeTex(name, width, height);\n\t\t}\n\n\t\t// UNPACK_FLIP_Y_WEBGL only works for DOM element sources, not typed arrays.\n\t\tconst isCustomTexture = 'data' in nonShaderPadSource && nonShaderPadSource.data;\n\t\tconst shouldFlipY = !isCustomTexture && !info.options?.preserveY;\n\t\tconst previousFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);\n\t\tconst needsAlignmentFix = isCustomTexture && !this.isRgba(info.options.format);\n\t\tconst shouldConvertColorSpace = !isCustomTexture && info.options.colorSpace && 'unpackColorSpace' in gl;\n\t\tconst previousColorSpace = gl.unpackColorSpace;\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = info.options.colorSpace!;\n\n\t\tif (info.history) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\tconst { depth } = info.history;\n\t\t\tconst targetSlots =\n\t\t\t\thistorySlots === undefined\n\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\tconst sourceData =\n\t\t\t\tpartialSource.data ?? (nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>);\n\t\t\tconst xOffset = isPartial ? (partialSource.x ?? 0) : 0;\n\t\t\tconst yOffset = isPartial ? (partialSource.y ?? 0) : 0;\n\n\t\t\tfor (const slot of targetSlots) {\n\t\t\t\tgl.texSubImage3D(\n\t\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t\t0,\n\t\t\t\t\txOffset,\n\t\t\t\t\tyOffset,\n\t\t\t\t\tslot,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t1,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tsourceData as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1]);\n\t\t\tif (historySlots === undefined) {\n\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t}\n\t\t} else {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, info.texture);\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\n\t\t\tif (isPartial) {\n\t\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\t\tgl.texSubImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tpartialSource.x ?? 0,\n\t\t\t\t\tpartialSource.y ?? 0,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tpartialSource.data,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.internalFormat,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\t((nonShaderPadSource as PartialCustomTexture).data ??\n\t\t\t\t\t\t(nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>)) as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t}\n\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = previousColorSpace;\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate bindIntermediate() {\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.intermediateFbo);\n\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, intermediateInfo.texture, 0);\n\t}\n\n\tclear() {\n\t\tthis.bindIntermediate();\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tif (intermediateInfo.options.isIntegerColorFormat) {\n\t\t\tconst t = intermediateInfo.options.type;\n\t\t\tif (this.uintTypes.has(t)) {\n\t\t\t\tgl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(4));\n\t\t\t} else {\n\t\t\t\tgl.clearBufferiv(gl.COLOR, 0, new Int32Array(4));\n\t\t\t}\n\t\t} else {\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t}\n\t}\n\n\tdraw(options?: StepOptions | void) {\n\t\tthis.emit('preDraw', ...arguments);\n\t\tconst gl = this.gl;\n\t\tconst w = gl.drawingBufferWidth;\n\t\tconst h = gl.drawingBufferHeight;\n\n\t\tif (options?.skipClear) {\n\t\t\tthis.bindIntermediate();\n\t\t} else {\n\t\t\tthis.clear();\n\t\t}\n\n\t\tgl.useProgram(this.program);\n\t\tgl.bindVertexArray(this.vao);\n\t\tgl.viewport(0, 0, w, h);\n\t\tgl.drawArrays(gl.TRIANGLES, 0, 3);\n\n\t\tif (!this.isHeadless) {\n\t\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tif (!intermediateInfo.options.isIntegerColorFormat) {\n\t\t\t\tconst desiredColorSpace = intermediateInfo.options.colorSpace ?? 'srgb';\n\t\t\t\tif ('drawingBufferColorSpace' in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {\n\t\t\t\t\tgl.drawingBufferColorSpace = desiredColorSpace;\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\t\tgl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n\t\t\t\tgl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t}\n\t\t}\n\t\tthis.emit('postDraw', ...arguments);\n\t}\n\n\tstep(options?: StepOptions) {\n\t\tthis._step(performance.now(), options);\n\t}\n\n\tprivate tick() {\n\t\tconst updates: Record<string, number> = {};\n\t\tif (this.uniforms.has('u_time')) updates.u_time = this.tElapsed;\n\t\tif (this.uniforms.has('u_frame')) updates.u_frame = this.frame;\n\t\tif (Object.keys(updates).length) this._updateUniforms(updates);\n\t}\n\n\tprivate _step(now: number, opts?: StepOptions | ((time: number, frame: number) => StepOptions | void)) {\n\t\tconst t = this.getElapsed(now);\n\t\tthis.tElapsed = t;\n\t\tthis.tStart = now;\n\t\tconst options = typeof opts === 'function' ? opts(t, this.frame) : opts;\n\t\tthis.emit('preStep', t, this.frame, options);\n\t\tthis.tick();\n\t\tthis.draw(options);\n\t\tconst historyInfo = this.textures.get(HISTORY_TEXTURE_KEY);\n\t\tif (historyInfo && !options?.skipHistory) {\n\t\t\tconst { writeIndex, depth } = historyInfo.history!;\n\t\t\tconst gl = this.gl;\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, historyInfo.texture);\n\t\t\tgl.copyTexSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\twriteIndex,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tgl.drawingBufferWidth,\n\t\t\t\tgl.drawingBufferHeight,\n\t\t\t);\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\tconst nextWriteIndex = (writeIndex + 1) % depth;\n\t\t\tthis.updateFrameOffset(HISTORY_TEXTURE_KEY, nextWriteIndex, { allowMissing: true });\n\t\t\thistoryInfo.history!.writeIndex = nextWriteIndex;\n\t\t}\n\t\t++this.frame;\n\t\tthis.emit('postStep', t, this.frame, options);\n\t}\n\n\tplay(onPreStep?: (time: number, frame: number) => StepOptions | void) {\n\t\tthis._pause();\n\t\tconst loop = (now: number) => {\n\t\t\tthis._step(now, onPreStep);\n\t\t\tif (this.frameId != null) this.frameId = requestAnimationFrame(loop);\n\t\t};\n\t\tthis.frameId = requestAnimationFrame(loop);\n\t\tthis.emit('play');\n\t}\n\n\tprivate getElapsed(time: number) {\n\t\tif (isNaN(this.tStart)) return this.tElapsed;\n\t\treturn this.tElapsed + (time - this.tStart) / 1000;\n\t}\n\n\tprivate _pause() {\n\t\tif (isNaN(this.tStart) && this.frameId == null) return;\n\t\tif (this.frameId != null) {\n\t\t\tcancelAnimationFrame(this.frameId);\n\t\t\tthis.frameId = null;\n\t\t}\n\t\tthis.tElapsed = this.getElapsed(performance.now());\n\t\tthis.tStart = NaN;\n\t\treturn true;\n\t}\n\n\tpause() {\n\t\tif (this._pause()) this.emit('pause');\n\t}\n\n\trewind() {\n\t\tthis.frame = 0;\n\t\tthis.tElapsed = 0;\n\t\tthis.tStart = NaN;\n\t\tthis.tick();\n\t}\n\n\treset() {\n\t\tthis.rewind();\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHist(name, texture);\n\t\t});\n\t\tthis.clear();\n\t\tthis.emit('reset');\n\t}\n\n\tdestroy() {\n\t\tthis.emit('destroy');\n\n\t\tthis._pause();\n\t\tconst gl = this.gl;\n\n\t\tif (this.cursorTgt) {\n\t\t\tthis.listeners.forEach((listener, event) => {\n\t\t\t\tthis.cursorTgt!.removeEventListener(event, listener);\n\t\t\t});\n\t\t\tthis.listeners.clear();\n\t\t}\n\n\t\tif (this.resObserver) {\n\t\t\tthis.resObserver.disconnect();\n\t\t\tthis.resObserver = null;\n\t\t}\n\n\t\tif (this.program) {\n\t\t\tgl.deleteProgram(this.program);\n\t\t\tthis.program = null;\n\t\t}\n\n\t\tif (this.intermediateFbo) {\n\t\t\tgl.deleteFramebuffer(this.intermediateFbo);\n\t\t\tthis.intermediateFbo = null;\n\t\t}\n\n\t\tthis.textures.forEach(texture => {\n\t\t\tthis.texPool.free.push(texture.unitIndex);\n\t\t\tgl.deleteTexture(texture.texture);\n\t\t});\n\t\tthis.textures.clear();\n\t\tconst entry = canvasRegistry.get(this.canvas);\n\t\tif (entry) {\n\t\t\tentry.instances.delete(this);\n\t\t\tif (entry.instances.size === 0) {\n\t\t\t\tcanvasRegistry.delete(this.canvas);\n\t\t\t}\n\t\t}\n\n\t\tif (this.vao) {\n\t\t\tgl.deleteVertexArray(this.vao);\n\t\t\tthis.vao = null;\n\t\t}\n\n\t\tif (this.buffer) {\n\t\t\tgl.deleteBuffer(this.buffer);\n\t\t\tthis.buffer = null;\n\t\t}\n\n\t\tthis.uniforms.clear();\n\t\tthis.hooks.clear();\n\t}\n}\n\nexport default ShaderPad;\n"],"mappings":"gDAEA,IAAMA,EAA4B;AAAA,yGAoC5BC,EAAiD,CACtD,CAAC,MAAO,eAAe,EACvB,CAAC,KAAM,MAAM,EACb,CAAC,OAAQ,gBAAgB,EACzB,CAAC,MAAO,OAAO,EACf,CAAC,MAAO,YAAY,EACpB,CAAC,OAAQ,cAAc,EACvB,CAAC,MAAO,KAAK,EACb,CAAC,MAAO,OAAO,EACf,CAAC,IAAK,eAAe,CACtB,EAEMC,EAAyD,CAC9D,MAAO,IACP,IAAK,IACL,KAAM,IACP,EAEA,SAASC,EAA6BC,EAAyE,CAC9G,OAAOA,GAAwBH,EAAqB,KAAK,CAAC,CAACI,CAAM,IAAMD,EAAqB,SAASC,CAAM,CAAC,IAAI,CAAC,CAClH,CAoHA,IAAMC,EAAsB,OAAO,WAAW,EACxCC,EAA2B,OAAO,oBAAoB,EAEtDC,EAAiB,IAAI,QAK3B,SAASC,EAAkBC,EAAgBC,EAA8B,CACxE,GAAI,CAACA,GAAY,OAAQ,OAAOD,EAChC,IAAME,EAAQF,EAAO,MAAM;AAAA,CAAI,EACzBG,EACLD,EAAM,cAAcE,GAAQ,CAC3B,IAAMC,EAAUD,EAAK,UAAU,EAC/B,OAAOC,EAAQ,WAAW,YAAY,GAAKA,EAAQ,WAAW,WAAW,CAC1E,CAAC,EAAI,EACN,OAAAH,EAAM,OAAOC,EAAU,EAAG,GAAGF,CAAU,EAChCC,EAAM,KAAK;AAAA,CAAI,CACvB,CAEA,SAASI,EAAoBC,EAG3B,CACD,OAAIA,aAAkB,aACd,CAAE,MAAO,EAAG,OAAQ,CAAE,EAE1BA,aAAkBC,EACd,CAAE,MAAOD,EAAO,OAAO,MAAO,OAAQA,EAAO,OAAO,MAAO,EAE/DA,aAAkB,iBACd,CAAE,MAAOA,EAAO,WAAY,OAAQA,EAAO,WAAY,EAE3DA,aAAkB,iBACd,CACN,MAAOA,EAAO,cAAgBA,EAAO,MACrC,OAAQA,EAAO,eAAiBA,EAAO,MACxC,EAGM,CAAE,MAAOA,EAAO,MAAO,OAAQA,EAAO,MAAO,CACrD,CAEA,SAASE,EAAWC,EAAuB,CAC1C,OAAO,OAAOA,GAAS,SAAYA,EAAK,aAAe,GAAMA,CAC9D,CAEA,IAAMF,EAAN,MAAMG,CAAU,CACP,WAAa,GACb,QAAU,GAKV,SAAiC,IAAI,IACrC,SAA0C,IAAI,IAE9C,OAA6B,KAC7B,IAAqC,KACrC,QAA+B,KAE/B,UAAwC,IAAI,IAC5C,MAAQ,EACR,SAAW,EACX,OAAS,IACT,UAAY,CAAC,GAAK,EAAG,EACrB,SAAW,CAAC,GAAK,EAAG,EACpB,UAAY,GAEZ,YAAuC,KACvC,MAA6C,IAAI,IACjD,aAAe,EAKf,gBAA2C,KAEnD,YAAYC,EAA2B,CAAE,OAAAC,EAAQ,QAAAC,EAAS,QAAAC,EAAS,aAAAC,EAAc,GAAGC,CAAW,EAAa,CAAC,EAAG,CAC/G,GAAIJ,GAAU,eAAgBA,EAC7B,KAAK,OAASA,MACR,CACN,GAAM,CAAE,MAAAK,EAAQ,EAAG,OAAAC,EAAS,CAAE,EAAIN,GAAU,CAAC,EAC7C,KAAK,OAAS,IAAI,gBAAgBK,EAAOC,CAAM,EAC/C,KAAK,WAAa,EACnB,CAEA,IAAMC,EAAK,KAAK,OAAO,WAAW,SAAU,CAC3C,UAAW,EACZ,CAAC,EACD,GAAI,CAACA,EACJ,MAOGC,EAAQ,CAAC,EAEb,KAAK,GAAKD,EACV,KAAK,WAAa,IAAI,IAAqD,CAC1E,CAACA,EAAG,MAAO,YAAY,EACvB,CAACA,EAAG,WAAY,WAAW,EAC3B,CAACA,EAAG,eAAgB,WAAW,EAC/B,CAACA,EAAG,MAAO,UAAU,EACrB,CAACA,EAAG,KAAM,SAAS,EACnB,CAACA,EAAG,aAAc,WAAW,EAC7B,CAACA,EAAG,IAAK,UAAU,CACpB,CAAC,EACD,KAAK,YAAc,IAAI,IAAoC,CAC1D,CAACA,EAAG,MAAO,SAAS,EACpB,CAACA,EAAG,WAAY,SAAS,EACzB,CAACA,EAAG,eAAgB,UAAU,EAC9B,CAACA,EAAG,MAAO,SAAS,EACpB,CAACA,EAAG,KAAM,SAAS,EACnB,CAACA,EAAG,aAAc,UAAU,EAC5B,CAACA,EAAG,IAAK,SAAS,CACnB,CAAC,EACD,KAAK,UAAY,IAAI,IAAI,CAACA,EAAG,cAAeA,EAAG,eAAgBA,EAAG,YAAY,CAAC,EAE/E,IAAIE,EAAgBxB,EAAe,IAAI,KAAK,MAAM,EAC7CwB,IACJA,EAAgB,CACf,QAAS,CACR,KAAM,CAAC,EACP,KAAM,EACN,IAAKF,EAAG,aAAaA,EAAG,gCAAgC,CACzD,EACA,UAAW,IAAI,IAAI,CAAC,IAAI,CAAC,CAC1B,EACAtB,EAAe,IAAI,KAAK,OAAQwB,CAAa,GAE9C,KAAK,QAAUA,EAAc,QAC7BA,EAAc,UAAU,IAAI,IAAI,EAEhC,KAAK,WAAaL,EAEdF,IAAS,KAAK,aAAeA,GACjC,KAAK,UAAYC,IAAiB,KAAK,kBAAkB,kBAAoB,KAAK,OAAS,QAC3F,KAAK,QAAU,KAEf,IAAMO,EAA2B,CAAC,EAC9BT,GACHA,EAAQ,QAAQU,GACfA,EAAO,KAAM,CACZ,WAAaC,GAAiB,CAC7BF,EAAe,KAAKE,CAAI,CACzB,EACA,KAAM,KAAK,KAAK,KAAK,IAAI,EACzB,cAAe,KAAK,UAAU,KAAK,IAAI,CACxC,CAAC,CACF,EAGD,IAAMC,EAAUN,EAAG,cAAc,EACjC,GAAI,CAACM,EACJ,MAAML,EAAQ,CAAC,EAEhB,KAAK,QAAUK,EAEf,IAAMC,EAAe,KAAK,aAAaP,EAAG,cAAe9B,CAAyB,EAC5EsC,EAAiB,KAAK,aAC3BR,EAAG,gBACHrB,EAAkBa,EAAmBW,CAAc,CACpD,EAQA,GAPAH,EAAG,aAAaM,EAASC,CAAY,EACrCP,EAAG,aAAaM,EAASE,CAAc,EACvCR,EAAG,mBAAmBM,EAAS,EAAG,YAAY,EAC9CN,EAAG,YAAYM,CAAO,EACtBN,EAAG,aAAaO,CAAY,EAC5BP,EAAG,aAAaQ,CAAc,EAE1B,CAACR,EAAG,oBAAoBM,EAASN,EAAG,WAAW,EAAG,CACrD,IAAMS,EAMHR,EAAQ,CAAC,EACZ,MAAAD,EAAG,cAAcM,CAAO,EAClBG,CACP,CAcA,GAZA,KAAK,IAAMT,EAAG,kBAAkB,EAChCA,EAAG,gBAAgB,KAAK,GAAG,EAC3B,KAAK,OAASA,EAAG,aAAa,EAC9BA,EAAG,WAAWA,EAAG,aAAc,KAAK,MAAM,EAC1CA,EAAG,WAAWA,EAAG,aAAc,IAAI,aAAa,CAAC,GAAI,GAAI,EAAG,GAAI,GAAI,CAAC,CAAC,EAAGA,EAAG,WAAW,EACvFA,EAAG,wBAAwB,CAAC,EAC5BA,EAAG,oBAAoB,EAAG,EAAGA,EAAG,MAAO,GAAO,EAAG,CAAC,EAElDA,EAAG,SAAS,EAAG,EAAGA,EAAG,mBAAoBA,EAAG,mBAAmB,EAE/DA,EAAG,WAAWM,CAAO,EAEjB,KAAK,kBAAkB,kBAC1B,KAAK,YAAc,IAAI,iBAAiB,IAAM,KAAK,QAAQ,CAAC,EAC5D,KAAK,YAAY,QAAQ,KAAK,OAAQ,CACrC,WAAY,GACZ,gBAAiB,CAAC,QAAS,QAAQ,CACpC,CAAC,MACK,CACN,IAAMI,EAAiBC,GAAkC,CACxD,IAAMC,EAAa,OAAO,yBAAyB,gBAAgB,UAAWD,CAAS,EACjFlB,EAAS,KAAK,OACpB,OAAO,eAAeA,EAAQkB,EAAW,CACxC,IAAK,IAAMC,EAAW,IAAK,KAAKnB,CAAM,EACtC,IAAKoB,GAAK,CACTD,EAAW,IAAK,KAAKnB,EAAQoB,CAAC,EAC9B,IAAMC,EAAQpC,EAAe,IAAIe,CAAM,EACvC,GAAIqB,EACH,QAAWC,KAAYD,EAAM,UAC5BC,EAAS,QAAQ,CAGpB,EACA,aAAcH,EAAW,aACzB,WAAYA,EAAW,UACxB,CAAC,CACF,EACAF,EAAc,OAAO,EACrBA,EAAc,QAAQ,CACvB,CACA,KAAK,QAAQ,EAEb,KAAK,kBAAkB,WAAY,QAAS,KAAK,UAAW,CAAE,aAAc,EAAK,CAAC,EAClF,KAAK,kBAAkB,UAAW,QAAS,CAAC,GAAG,KAAK,SAAU,KAAK,UAAY,EAAM,CAAG,EAAG,CAC1F,aAAc,EACf,CAAC,EACD,KAAK,kBAAkB,SAAU,QAAS,EAAG,CAAE,aAAc,EAAK,CAAC,EACnE,KAAK,kBAAkB,UAAW,MAAO,EAAG,CAAE,aAAc,EAAK,CAAC,EAElE,KAAK,QAAQjC,EAA0B,KAAK,OAAQ,CACnD,GAAG,KAAK,UACT,CAAC,EACD,KAAK,gBAAkBuB,EAAG,kBAAkB,EAC5C,KAAK,iBAAiB,EACtBA,EAAG,gBAAgBA,EAAG,YAAa,IAAI,EAEnC,KAAK,aAAe,GACvB,KAAK,QAAQxB,EAAqB,KAAK,OAAQ,CAC9C,QAAS,KAAK,aACd,GAAG,KAAK,UACT,CAAC,EAEF,KAAK,aAAa,EAClB,KAAK,KAAK,OAAO,CAClB,CAEQ,eAAewC,EAAiC,CAEvD,IAAMC,EADK,KAAK,GACID,CAAK,EACzB,GAAIC,IAAa,OAChB,MAAkDhB,EAAQ,CAAC,EAE5D,OAAOgB,CACR,CAEQ,KAAK3B,KAA6B4B,EAAa,CACtD,KAAK,MAAM,IAAI5B,CAAI,GAAG,QAAQ6B,GAAQA,EAAK,KAAK,KAAM,GAAGD,CAAI,CAAC,CAC/D,CAEA,GAAG5B,EAA0B8B,EAAc,CACrC,KAAK,MAAM,IAAI9B,CAAI,GACvB,KAAK,MAAM,IAAIA,EAAM,CAAC,CAAC,EAExB,KAAK,MAAM,IAAIA,CAAI,EAAG,KAAK8B,CAAE,CAC9B,CAEA,IAAI9B,EAA0B8B,EAAc,CAC3C,IAAMC,EAAQ,KAAK,MAAM,IAAI/B,CAAI,EACjC,GAAI+B,EAAO,CACV,IAAMC,EAAQD,EAAM,QAAQD,CAAE,EAC1BE,GAAS,GACZD,EAAM,OAAOC,EAAO,CAAC,CAEvB,CACD,CAEQ,aAAaC,EAAcpC,EAA6B,CAC/D,IAAMa,EAAK,KAAK,GACVpB,EAASoB,EAAG,aAAauB,CAAI,EAGnC,GAFAvB,EAAG,aAAapB,EAAQO,CAAM,EAC9Ba,EAAG,cAAcpB,CAAM,EACnB,CAACoB,EAAG,mBAAmBpB,EAAQoB,EAAG,cAAc,EAAG,CACtD,QAAQ,MAAMA,EAAG,iBAAiBpB,CAAM,CAAC,EACzC,IAAM4C,EAKHvB,EAAQ,CAAC,EACZ,MAAAD,EAAG,aAAapB,CAAM,EAChB4C,CACP,CACA,OAAO5C,CACR,CAEQ,kBAKN,CACD,IAAM6C,EAAS,KAAK,UACpB,OAAIA,IAAW,OACP,CACN,KAAM,EACN,IAAK,EACL,MAAO,OAAO,WACd,OAAQ,OAAO,WAChB,EAEOA,EAAmB,sBAAsB,CAClD,CAEQ,cAAe,CACtB,GAAI,CAAC,KAAK,UAAW,OACrB,IAAMC,EAAe,CAACC,EAAWC,IAAc,CAC9C,GAAI,CAAC,KAAK,SAAS,IAAI,UAAU,EAAG,OACpC,IAAMC,EAAO,KAAK,iBAAiB,EAC7BC,GAAKH,EAAIE,EAAK,MAAQA,EAAK,MAC3BhB,EAAI,GAAKe,EAAIC,EAAK,KAAOA,EAAK,OACpC,KAAK,UAAU,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGC,CAAC,CAAC,EAC9C,KAAK,UAAU,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGjB,CAAC,CAAC,EAC9C,KAAK,eAAe,CAAE,SAAU,KAAK,SAAU,CAAC,CACjD,EAEMkB,EAAc,CAACC,EAAoBL,EAAYC,IAAe,CACnE,GAAK,KAAK,SAAS,IAAI,SAAS,EAEhC,IADA,KAAK,UAAYI,EACbA,EAAW,CACd,IAAMH,EAAO,KAAK,iBAAiB,EAC7BI,EAAON,EACPO,EAAON,EACb,KAAK,SAAS,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,GAAIK,EAAOJ,EAAK,MAAQA,EAAK,KAAK,CAAC,EAC3E,KAAK,SAAS,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,GAAKK,EAAOL,EAAK,KAAOA,EAAK,MAAM,CAAC,CAChF,CACA,KAAK,eAAe,CACnB,QAAS,CAAC,GAAG,KAAK,SAAU,KAAK,UAAY,EAAM,CAAG,CACvD,CAAC,EACF,EAEA,KAAK,UAAU,IAAI,YAAaM,GAAS,CACxC,IAAMC,EAAaD,EACd,KAAK,SACTT,EAAaU,EAAW,QAASA,EAAW,OAAO,CAErD,CAAC,EAED,KAAK,UAAU,IAAI,YAAaD,GAAS,CACxC,IAAMC,EAAaD,EACd,KAAK,SACLC,EAAW,SAAW,IACzB,KAAK,UAAY,GACjBL,EAAY,GAAMK,EAAW,QAASA,EAAW,OAAO,EAG3D,CAAC,EAED,KAAK,UAAU,IAAI,UAAWD,GAAS,CACtC,IAAMC,EAAaD,EACd,KAAK,SACLC,EAAW,SAAW,GACzBL,EAAY,EAAK,CAGpB,CAAC,EAED,KAAK,UAAU,IAAI,YAAaI,GAAS,CACxC,IAAME,EAAaF,EACfE,EAAW,QAAQ,OAAS,GAC/BX,EAAaW,EAAW,QAAQ,CAAC,EAAE,QAASA,EAAW,QAAQ,CAAC,EAAE,OAAO,CAE3E,CAAC,EAED,KAAK,UAAU,IAAI,aAAcF,GAAS,CACzC,IAAME,EAAaF,EACnB,KAAK,QAAU,GACXE,EAAW,QAAQ,OAAS,IAC/BX,EAAaW,EAAW,QAAQ,CAAC,EAAE,QAASA,EAAW,QAAQ,CAAC,EAAE,OAAO,EACzEN,EAAY,GAAMM,EAAW,QAAQ,CAAC,EAAE,QAASA,EAAW,QAAQ,CAAC,EAAE,OAAO,EAEhF,CAAC,EAED,KAAK,UAAU,IAAI,WAAYF,GAAS,CACpBA,EACJ,QAAQ,SAAW,GACjCJ,EAAY,EAAK,CAEnB,CAAC,EAED,KAAK,UAAU,QAAQ,CAACO,EAAUH,IAAU,CAC3C,KAAK,UAAW,iBAAiBA,EAAOG,CAAQ,CACjD,CAAC,CACF,CAEQ,SAAU,CACjB,IAAMtC,EAAK,KAAK,GACVuC,EAA+B,CAACvC,EAAG,mBAAoBA,EAAG,mBAAmB,EACnFA,EAAG,SAAS,EAAG,EAAG,GAAGuC,CAAU,EAC3B,KAAK,SAAS,IAAI,cAAc,EACnC,KAAK,eAAe,CAAE,aAAcA,CAAW,CAAC,EAEhD,KAAK,kBAAkB,eAAgB,QAASA,EAAY,CAAE,aAAc,EAAK,CAAC,EAEnF,KAAK,UAAU9D,EAA0B,GAAG8D,CAAU,EAClD,KAAK,aAAe,GACvB,KAAK,UAAU/D,EAAqB,GAAG+D,CAAU,EAElD,KAAK,KAAK,mBAAoB,GAAGA,CAAU,CAC5C,CAEQ,UAAUjD,EAAuBQ,EAAeC,EAAgB,CACvE,IAAMyC,EAAO,KAAK,SAAS,IAAIlD,CAAI,EACnC,GAAI,CAACkD,GAASA,EAAK,QAAU1C,GAAS0C,EAAK,SAAWzC,EAAS,OAEpD,KAAK,GACb,cAAcyC,EAAK,OAAO,EAC7BA,EAAK,MAAQ1C,EACb0C,EAAK,OAASzC,EACd,GAAM,CAAE,QAAA0C,CAAQ,EAAI,KAAK,UAAUnD,EAAMkD,CAAI,EAC7CA,EAAK,QAAUC,EACf,KAAK,UAAUnD,EAAMkD,CAAI,CAC1B,CAEQ,WAAWlD,EAAuB,CACzC,IAAMoD,EAAW,KAAK,SAAS,IAAIpD,CAAI,EACvC,GAAIoD,EAAU,OAAOA,EAAS,UAC9B,GAAI,KAAK,QAAQ,KAAK,OAAS,EAAG,OAAO,KAAK,QAAQ,KAAK,IAAI,EAC/D,GAAI,KAAK,QAAQ,MAAQ,KAAK,QAAQ,IACrC,MAOGzC,EAAQ,CAAC,EAEb,OAAO,KAAK,QAAQ,MACrB,CAEQ,eAAe0C,EAAkD,CACxE,GAAM,CAAE,GAAA3C,CAAG,EAAI,KACT4C,EAAuBD,GAAS,eAChCE,EAAaF,GAAS,MAAQtE,EAA6BuE,CAAoB,GAAK,gBACpFrB,EAAO,KAAK,eAAesB,CAAU,EACrCvE,EAAuBsE,GAAwB,KAAK,YAAY,IAAIrB,CAAI,GAAK,QAC7EuB,EAAuB,mCAAmC,KAAKxE,CAAoB,EACnFyE,EAAeJ,GAAS,SAAWG,EAAuB,eAAiB,QAC3EE,EAAiC,CACtC,KAAAzB,EACA,OAAQ,KAAK,eAAewB,CAAY,EACxC,eAAgB,KAAK,eAAezE,CAAoB,EACxD,UAAW,KAAK,eAAeqE,GAAS,WAAa,QAAQ,EAC7D,UAAW,KAAK,eAAeA,GAAS,WAAa,QAAQ,EAC7D,MAAO,KAAK,eAAeA,GAAS,OAAS,eAAe,EAC5D,MAAO,KAAK,eAAeA,GAAS,OAAS,eAAe,EAC5D,WAAYA,GAAS,WACrB,UAAWA,GAAS,UACpB,qBAAAG,CACD,EAGA,IAF2BE,EAAO,iBAAmBhD,EAAG,SAAWgD,EAAO,iBAAmBhD,EAAG,UAEtE,CAACA,EAAG,aAAa,wBAAwB,EAClE,MAKGC,EAAQ,CAAC,EAEb,OAAO+C,CACR,CAEQ,WAAWzB,EAAc0B,EAA+B,CAC/D,IAAMC,EAAY,KAAK,WAAW,IAAI3B,CAAI,GAAK,WAC/C,OAAO,IAAI2B,EAAUD,CAAI,CAC1B,CAEQ,OAAOE,EAAyB,CACvC,IAAMnD,EAAK,KAAK,GAChB,OAAOmD,IAAWnD,EAAG,MAAQmD,IAAWnD,EAAG,YAC5C,CAEQ,mBAAmBoD,EAA4B,CACtD,GAAI,CAACA,EAAY,QAAS,OAE1B,IAAMpD,EAAK,KAAK,GACV,CAAE,KAAAuB,EAAM,OAAA4B,CAAO,EAAIC,EAAY,QAC/BC,EAAc,KAAK,WAAW9B,EAAM6B,EAAY,MAAQA,EAAY,OAAS,CAAC,EACpFpD,EAAG,cAAcA,EAAG,SAAWoD,EAAY,SAAS,EACpDpD,EAAG,YAAYA,EAAG,iBAAkBoD,EAAY,OAAO,EACvD,IAAME,EAAoB,CAAC,KAAK,OAAOH,CAAM,EACzCI,EACAD,IACHC,EAAoBvD,EAAG,aAAaA,EAAG,gBAAgB,EACvDA,EAAG,YAAYA,EAAG,iBAAkB,CAAC,GAEtC,QAASwD,EAAQ,EAAGA,EAAQJ,EAAY,QAAQ,MAAO,EAAEI,EACxDxD,EAAG,cACFA,EAAG,iBACH,EACA,EACA,EACAwD,EACAJ,EAAY,MACZA,EAAY,OACZ,EACAD,EACA5B,EACA8B,CACD,EAEGC,GAAmBtD,EAAG,YAAYA,EAAG,iBAAkBuD,CAAiB,CAC7E,CAEQ,kBACPjE,EACAmE,EACAd,EAGC,CACD,KAAK,eACJ,CACC,CAAC,GAAGtD,EAAWC,CAAI,CAAC,aAAa,EAAGmE,CACrC,EACAd,CACD,CACD,CAEQ,UAAUrD,EAAuB8D,EAAsB,CACzDA,EAAY,UACjBA,EAAY,QAAQ,WAAa,EACjC,KAAK,mBAAmBA,CAAW,EACnC,KAAK,kBAAkB9D,EAAM,EAAG,CAAE,aAAc,EAAK,CAAC,EACvD,CAEA,kBACCA,EACAiC,EACAP,EACA2B,EACC,CACD,IAAMe,EAAcf,GAAS,YACvBgB,EAAehB,GAAS,cAAgB,GAC9C,GAAI,KAAK,SAAS,IAAIrD,CAAI,EACzB,MAAmFW,EAAQ,CAAC,EAE7F,GAAI,CAAC7B,EAAsBmD,CAAI,EAC9B,MAMGtB,EAAQ,CAAC,EAEb,GAAIyD,GAAe,EAAE,MAAM,QAAQ1C,CAAK,GAAKA,EAAM,SAAW0C,GAC7D,MAMGzD,EAAQ,CAAC,EAGb,IAAMD,EAAK,KAAK,GACZ4D,EAAW5D,EAAG,mBAAmB,KAAK,QAAUV,CAAI,EAIxD,GAHI,CAACsE,GAAYF,IAChBE,EAAW5D,EAAG,mBAAmB,KAAK,QAAU,GAAGV,CAAI,KAAK,GAEzD,CAACsE,EAAU,CACd,GAAID,EAAc,OAClB,MAAoF1D,EAAQ,EAAE,CAC/F,CAEA,IAAM4D,EAAaH,EAAe1C,EAAgC,CAAC,EAAIA,EACjE8C,EAAS,MAAM,QAAQD,CAAU,EAAKA,EAAW,OAA2B,EAClF,KAAK,SAAS,IAAIvE,EAAM,CAAE,KAAAiC,EAAM,OAAAuC,EAAQ,SAAAF,EAAU,YAAAF,CAAY,CAAC,EAE/D,GAAI,CACH,KAAK,eAAe,CAAE,CAACpE,CAAI,EAAG0B,CAAM,CAAC,CACtC,OAAS+C,EAAO,CACf,WAAK,SAAS,OAAOzE,CAAI,EACnByE,CACP,CACA,KAAK,KAAK,oBAAqB,GAAG,SAAS,CAC5C,CAEQ,gBACPC,EACArB,EACC,CACD,IAAM3C,EAAK,KAAK,GAChBA,EAAG,WAAW,KAAK,OAAO,EAC1B,OAAO,QAAQgE,CAAO,EAAE,QAAQ,CAAC,CAAC1E,EAAM2E,CAAQ,IAAM,CACrD,IAAMC,EAAU,KAAK,SAAS,IAAI5E,CAAI,EACtC,GAAI,CAAC4E,EAAS,CACb,GAAIvB,GAAS,aAAc,OAC3B,MAKG1C,EAAQ,EAAE,CACd,CACA,IAAIkE,EAAiB,UAAUD,EAAQ,MAAM,GAAG9F,EAAsB8F,EAAQ,IAAI,CAAC,GACnF,GAAIA,EAAQ,YAAa,CACxB,GAAI,CAAC,MAAM,QAAQD,CAAQ,EAC1B,MAKGhE,EAAQ,EAAE,EAEd,IAAMmE,EAAUH,EAAS,OACzB,GAAI,CAACG,EAAS,OACd,GAAIA,EAAUF,EAAQ,YACrB,MAMGjE,EAAQ,EAAE,EAEd,GAAIgE,EAAS,KAAKI,IAAS,MAAM,QAAQA,CAAI,EAAIA,EAAK,OAAS,KAAOH,EAAQ,MAAM,EACnF,MAKGjE,EAAQ,EAAE,EAEd,IAAMqE,EAAOL,EAAS,KAAK,EACrBM,EACLL,EAAQ,OAAS,QACd,IAAI,aAAaI,CAAI,EACrBJ,EAAQ,OAAS,OAChB,IAAI,YAAYI,CAAI,EACpB,IAAI,WAAWA,CAAI,EACpBV,EAAWM,EAAQ,SACvB,GAAIvB,GAAS,WAAY,CACxB,IAAM6B,EAAcxE,EAAG,mBAAmB,KAAK,QAAU,GAAGV,CAAI,IAAIqD,EAAQ,UAAU,GAAG,EACzF,GAAI,CAAC6B,EACJ,MAMGvE,EAAQ,EAAE,EAEd2D,EAAWY,CACZ,CACCxE,EAAWmE,EAAiB,GAAG,EAAEP,EAAUW,CAAU,CACvD,KAAO,CACD,MAAM,QAAQN,CAAQ,IAAGA,EAAW,CAACA,CAAQ,GAClD,IAAMQ,EAAcR,EACpB,GAAIQ,EAAY,SAAWP,EAAQ,OAClC,MAMGjE,EAAQ,EAAE,EAEbD,EAAWmE,CAAc,EAAED,EAAQ,SAAU,GAAGO,CAAW,CAC7D,CACD,CAAC,EACD,KAAK,KAAK,iBAAkB,GAAG,SAAS,CACzC,CAEA,eACCT,EACArB,EACC,CACD,KAAK,gBAAgBqB,EAASrB,CAAO,EAEjC,OAAOqB,EAAQ,QAAW,WAC7B,KAAK,SAAWA,EAAQ,OACnB,MAAM,KAAK,MAAM,IAAG,KAAK,OAAS,YAAY,IAAI,IAEpD,OAAOA,EAAQ,SAAY,WAAU,KAAK,MAAQA,EAAQ,QAC/D,CAEQ,UACP1E,EACA8D,EACC,CACD,IAAMpD,EAAK,KAAK,GACV,CAAE,MAAAF,EAAO,OAAAC,CAAO,EAAIqD,EACpBsB,EAAetB,EAAY,SAAS,OAAS,EAE7CX,EAAUzC,EAAG,cAAc,EACjC,GAAI,CAACyC,EACJ,MAOGxC,EAAQ,EAAE,EAGd,IAAI0E,EAAYvB,EAAY,UAC5B,GAAI,OAAOuB,GAAc,SACxB,GAAI,CACHA,EAAY,KAAK,WAAWrF,CAAI,CACjC,OAASyE,EAAO,CACf,MAAA/D,EAAG,cAAcyC,CAAO,EAClBsB,CACP,CAGD,IAAMa,EAAaF,EAAe,EAC5BG,EAAgBD,EAAa5E,EAAG,iBAAmBA,EAAG,WACtD,CAAE,QAAA2C,CAAQ,EAAIS,EACpB,OAAApD,EAAG,cAAcA,EAAG,SAAW2E,CAAS,EACxC3E,EAAG,YAAY6E,EAAepC,CAAO,EACrCzC,EAAG,cAAc6E,EAAe7E,EAAG,eAAgB2C,EAAQ,KAAK,EAChE3C,EAAG,cAAc6E,EAAe7E,EAAG,eAAgB2C,EAAQ,KAAK,EAChE3C,EAAG,cAAc6E,EAAe7E,EAAG,mBAAoB2C,EAAQ,SAAS,EACxE3C,EAAG,cAAc6E,EAAe7E,EAAG,mBAAoB2C,EAAQ,SAAS,EACpEiC,EACH5E,EAAG,aAAa6E,EAAe,EAAGlC,EAAQ,eAAgB7C,EAAOC,EAAQ2E,CAAY,EAC3EpF,IAASb,GACnBuB,EAAG,WACFA,EAAG,WACH,EACA2C,EAAQ,eACR7C,EACAC,EACA,EACA4C,EAAQ,OACRA,EAAQ,KACR,IACD,EAEM,CAAE,QAAAF,EAAS,UAAAkC,CAAU,CAC7B,CAEQ,QAAQrF,EAAuBH,EAAuBwD,EAAoC,CACjG,IAAM3C,EAAK,KAAK,GAChB,GAAI,KAAK,SAAS,IAAIV,CAAI,EACzB,MAAoEW,EAAQ,EAAE,EAG/E,GAAM,CAAE,QAASyE,EAAe,EAAG,GAAG7E,CAAW,EAAI8C,GAAW,CAAC,EAC3D,CAAE,MAAA7C,EAAO,OAAAC,CAAO,EAAIb,EAAoBC,CAAM,EACpD,GAAI,CAACW,GAAS,CAACC,EACd,MAOGE,EAAQ,EAAE,EAEd,IAAMmD,EAAyE,CAC9E,MAAAtD,EACA,OAAAC,EACA,QACCZ,aAAkBI,GAClB,OAAO,KAAKM,CAAU,EAAE,SAAW,GACnCV,EAAO,SAAS,IAAIV,CAAwB,EACzCU,EAAO,SAAS,IAAIV,CAAwB,EAAG,QAC/C,KAAK,eAAeoB,CAAU,CACnC,EACI6E,EAAe,IAClBtB,EAAY,QAAU,CAAE,MAAOsB,EAAc,WAAY,CAAE,GAE5D,GAAM,CAAE,QAAAjC,EAAS,UAAAkC,CAAU,EAAI,KAAK,UAAUrF,EAAM8D,CAAW,EACzD0B,EAA+B,CACpC,QAAArC,EACA,UAAAkC,EACA,GAAGvB,CACJ,EACIsB,EAAe,IAClB,KAAK,kBAAkB,GAAGrF,EAAWC,CAAI,CAAC,cAAe,MAAO,EAAG,CAAE,aAAc,EAAK,CAAC,EACzF,KAAK,mBAAmBwF,CAAmB,GAE5C,KAAK,SAAS,IAAIxF,EAAMwF,CAAmB,EACvCxF,IAASb,GAA4Ba,IAASd,GACjD,KAAK,UAAUc,EAAMH,CAAM,EAI5Ba,EAAG,WAAW,KAAK,OAAQ,EAC3B,IAAM+E,EAAW/E,EAAG,mBAAmB,KAAK,QAAUX,EAAWC,CAAI,CAAC,EAClEyF,GACH/E,EAAG,UAAU+E,EAAUJ,CAAS,CAElC,CAEA,kBAAkBrF,EAAcH,EAAuBwD,EAAoC,CAE1F,IAAMqC,EACLrC,GAAS,SAAW,MAAQA,EAAQ,QAAU,EAAI,CAAE,GAAGA,EAAS,QAASA,EAAQ,QAAU,CAAE,EAAIA,EAClG,KAAK,QAAQrD,EAAMH,EAAQ6F,CAAI,EAC/B,KAAK,KAAK,oBAAqB,GAAG,SAAS,CAC5C,CAEA,eAAehB,EAA8C,CAC5D,OAAO,QAAQA,CAAO,EAAE,QAAQ,CAAC,CAAC1E,EAAMH,CAAM,IAAM,CACnD,KAAK,UAAUG,EAAMH,CAAM,CAC5B,CAAC,EACD,KAAK,KAAK,iBAAkB,GAAG,SAAS,CACzC,CAEQ,UAAUG,EAAuBH,EAA6B8F,EAA6B,CAClG,IAAMjF,EAAK,KAAK,GACVwC,EAAO,KAAK,SAAS,IAAIlD,CAAI,EACnC,GAAI,CAACkD,EACJ,MAAoEvC,EAAQ,EAAE,EAG/E,GAAId,aAAkB,aAAc,CACnCa,EAAG,cAAcA,EAAG,SAAWwC,EAAK,SAAS,EAC7CxC,EAAG,YAAYA,EAAG,WAAYb,CAAM,EACpC,MACD,CAEA,IAAI+F,EAAqB/F,EACzB,GAAIA,aAAkBI,EAAW,CAChC,IAAM4F,EAAyBhG,EAAO,SAAS,IAAIV,CAAwB,EACrE2G,EAAOD,EAAuB,MAC9BE,EAAOF,EAAuB,OAEpC,GAAIhG,EAAO,KAAOa,EAAI,CACrB,GAAI,CAACwC,EAAK,QAAS,CAClBxC,EAAG,cAAcA,EAAG,SAAWwC,EAAK,SAAS,EAC7CxC,EAAG,YAAYA,EAAG,WAAYmF,EAAuB,OAAO,EAC5D,MACD,CACA,GAAM,CAAE,MAAAG,CAAM,EAAI9C,EAAK,QACjB+C,EACLN,IAAiB,OACd,CAACzC,EAAK,QAAQ,UAAU,EACxB,MAAM,QAAQyC,CAAY,EACzBA,EAAa,IAAIO,GAAKC,EAAQD,EAAGF,CAAK,CAAC,EACvC,CAACG,EAAQR,EAAcK,CAAK,CAAC,EAClCtF,EAAG,cAAcA,EAAG,SAAWwC,EAAK,SAAS,EAC7CxC,EAAG,YAAYA,EAAG,iBAAkBwC,EAAK,OAAO,EAChDxC,EAAG,gBAAgBA,EAAG,iBAAkBb,EAAO,eAAe,EAC9D,QAAWuG,KAAQH,EAClBvF,EAAG,kBAAkBA,EAAG,iBAAkB,EAAG,EAAG,EAAG0F,EAAM,EAAG,EAAGN,EAAMC,CAAI,EAE1ErF,EAAG,gBAAgBA,EAAG,iBAAkB,IAAI,EAC5C,KAAK,kBAAkBV,EAAMiG,EAAYA,EAAY,OAAS,CAAC,EAAG,CAAE,aAAc,EAAK,CAAC,EACpFN,IAAiB,SACpBzC,EAAK,QAAQ,YAAcA,EAAK,QAAQ,WAAa,GAAK8C,GAE3D,MACD,CAGA,GAAM,CACL,MAAAxF,EACA,OAAAC,EACA,QAAS,CAAE,OAAAoD,EAAQ,KAAA5B,CAAK,CACzB,EAAI4D,EACEQ,EAAS,KAAK,WAAWpE,EAAMzB,EAAQC,EAAS,CAAC,EACvDZ,EAAO,GAAG,gBAAgBA,EAAO,GAAG,YAAaA,EAAO,eAAe,EACvEA,EAAO,GAAG,WAAW,EAAG,EAAGW,EAAOC,EAAQoD,EAAQ5B,EAAMoE,CAAM,EAC9DxG,EAAO,GAAG,gBAAgBA,EAAO,GAAG,YAAa,IAAI,EACrD+F,EAAqB,CAAE,KAAMS,EAAQ,MAAA7F,EAAO,OAAAC,CAAO,CACpD,CAGA,GAAM,CAAE,MAAAD,EAAO,OAAAC,CAAO,EAAIb,EAAoBgG,CAAkB,EAChE,GAAI,CAACpF,GAAS,CAACC,EAAQ,OAEvB,IAAM6F,EAAY,cAAeV,GAAsBA,EAAmB,UACrEU,GACJ,KAAK,UAAUtG,EAAMQ,EAAOC,CAAM,EAInC,IAAM8F,EAAkB,SAAUX,GAAsBA,EAAmB,KACrEY,EAAc,CAACD,GAAmB,CAACrD,EAAK,SAAS,UACjDuD,EAAgB/F,EAAG,aAAaA,EAAG,mBAAmB,EACtDsD,EAAoBuC,GAAmB,CAAC,KAAK,OAAOrD,EAAK,QAAQ,MAAM,EACvEwD,EAA0B,CAACH,GAAmBrD,EAAK,QAAQ,YAAc,qBAAsBxC,EAC/FiG,EAAqBjG,EAAG,iBAC1BuD,EAOJ,GANID,IACHC,EAAoBvD,EAAG,aAAaA,EAAG,gBAAgB,EACvDA,EAAG,YAAYA,EAAG,iBAAkB,CAAC,GAElCgG,IAAyBhG,EAAG,iBAAmBwC,EAAK,QAAQ,YAE5DA,EAAK,QAAS,CACjBxC,EAAG,cAAcA,EAAG,SAAWwC,EAAK,SAAS,EAC7CxC,EAAG,YAAYA,EAAG,iBAAkBwC,EAAK,OAAO,EAChD,GAAM,CAAE,MAAA8C,CAAM,EAAI9C,EAAK,QACjB+C,EACLN,IAAiB,OACd,CAACzC,EAAK,QAAQ,UAAU,EACxB,MAAM,QAAQyC,CAAY,EACzBA,EAAa,IAAIO,GAAKC,EAAQD,EAAGF,CAAK,CAAC,EACvC,CAACG,EAAQR,EAAcK,CAAK,CAAC,EAElCtF,EAAG,YAAYA,EAAG,oBAAqB8F,CAAW,EAClD,IAAMI,EAAgBhB,EAChBiB,EACLD,EAAc,MAAShB,EAClBkB,EAAUR,EAAaM,EAAc,GAAK,EAAK,EAC/CG,EAAUT,EAAaM,EAAc,GAAK,EAAK,EAErD,QAAWR,KAAQH,EAClBvF,EAAG,cACFA,EAAG,iBACH,EACAoG,EACAC,EACAX,EACA5F,EACAC,EACA,EACAyC,EAAK,QAAQ,OACbA,EAAK,QAAQ,KACb2D,CACD,EAEDnG,EAAG,YAAYA,EAAG,oBAAqB+F,CAAa,EACpD,KAAK,kBAAkBzG,EAAMiG,EAAYA,EAAY,OAAS,CAAC,CAAC,EAC5DN,IAAiB,SACpBzC,EAAK,QAAQ,YAAcA,EAAK,QAAQ,WAAa,GAAK8C,EAE5D,KAAO,CAKN,GAJAtF,EAAG,cAAcA,EAAG,SAAWwC,EAAK,SAAS,EAC7CxC,EAAG,YAAYA,EAAG,WAAYwC,EAAK,OAAO,EAC1CxC,EAAG,YAAYA,EAAG,oBAAqB8F,CAAW,EAE9CF,EAAW,CACd,IAAMM,EAAgBhB,EACtBlF,EAAG,cACFA,EAAG,WACH,EACAkG,EAAc,GAAK,EACnBA,EAAc,GAAK,EACnBpG,EACAC,EACAyC,EAAK,QAAQ,OACbA,EAAK,QAAQ,KACb0D,EAAc,IACf,CACD,MACClG,EAAG,WACFA,EAAG,WACH,EACAwC,EAAK,QAAQ,eACb1C,EACAC,EACA,EACAyC,EAAK,QAAQ,OACbA,EAAK,QAAQ,KACX0C,EAA4C,MAC5CA,CACH,EAEDlF,EAAG,YAAYA,EAAG,oBAAqB+F,CAAa,CACrD,CAEIC,IAAyBhG,EAAG,iBAAmBiG,GAC/C3C,GAAmBtD,EAAG,YAAYA,EAAG,iBAAkBuD,CAAiB,CAC7E,CAEQ,kBAAmB,CAC1B,IAAMvD,EAAK,KAAK,GACVsG,EAAmB,KAAK,SAAS,IAAI7H,CAAwB,EACnEuB,EAAG,gBAAgBA,EAAG,YAAa,KAAK,eAAe,EACvDA,EAAG,qBAAqBA,EAAG,YAAaA,EAAG,kBAAmBA,EAAG,WAAYsG,EAAiB,QAAS,CAAC,CACzG,CAEA,OAAQ,CACP,KAAK,iBAAiB,EACtB,IAAMtG,EAAK,KAAK,GACVsG,EAAmB,KAAK,SAAS,IAAI7H,CAAwB,EACnE,GAAI6H,EAAiB,QAAQ,qBAAsB,CAClD,IAAMC,EAAID,EAAiB,QAAQ,KAC/B,KAAK,UAAU,IAAIC,CAAC,EACvBvG,EAAG,eAAeA,EAAG,MAAO,EAAG,IAAI,YAAY,CAAC,CAAC,EAEjDA,EAAG,cAAcA,EAAG,MAAO,EAAG,IAAI,WAAW,CAAC,CAAC,CAEjD,MACCA,EAAG,MAAMA,EAAG,gBAAgB,CAE9B,CAEA,KAAK2C,EAA8B,CAClC,KAAK,KAAK,UAAW,GAAG,SAAS,EACjC,IAAM3C,EAAK,KAAK,GACVwG,EAAIxG,EAAG,mBACPyG,EAAIzG,EAAG,oBAab,GAXI2C,GAAS,UACZ,KAAK,iBAAiB,EAEtB,KAAK,MAAM,EAGZ3C,EAAG,WAAW,KAAK,OAAO,EAC1BA,EAAG,gBAAgB,KAAK,GAAG,EAC3BA,EAAG,SAAS,EAAG,EAAGwG,EAAGC,CAAC,EACtBzG,EAAG,WAAWA,EAAG,UAAW,EAAG,CAAC,EAE5B,CAAC,KAAK,WAAY,CACrB,IAAMsG,EAAmB,KAAK,SAAS,IAAI7H,CAAwB,EACnE,GAAI,CAAC6H,EAAiB,QAAQ,qBAAsB,CACnD,IAAMI,EAAoBJ,EAAiB,QAAQ,YAAc,OAC7D,4BAA6BtG,GAAMA,EAAG,0BAA4B0G,IACrE1G,EAAG,wBAA0B0G,GAE9B1G,EAAG,gBAAgBA,EAAG,iBAAkB,KAAK,eAAe,EAC5DA,EAAG,gBAAgBA,EAAG,iBAAkB,IAAI,EAC5CA,EAAG,gBAAgB,EAAG,EAAGwG,EAAGC,EAAG,EAAG,EAAGD,EAAGC,EAAGzG,EAAG,iBAAkBA,EAAG,OAAO,EAC1EA,EAAG,gBAAgBA,EAAG,YAAa,IAAI,CACxC,CACD,CACA,KAAK,KAAK,WAAY,GAAG,SAAS,CACnC,CAEA,KAAK2C,EAAuB,CAC3B,KAAK,MAAM,YAAY,IAAI,EAAGA,CAAO,CACtC,CAEQ,MAAO,CACd,IAAMqB,EAAkC,CAAC,EACrC,KAAK,SAAS,IAAI,QAAQ,IAAGA,EAAQ,OAAS,KAAK,UACnD,KAAK,SAAS,IAAI,SAAS,IAAGA,EAAQ,QAAU,KAAK,OACrD,OAAO,KAAKA,CAAO,EAAE,QAAQ,KAAK,gBAAgBA,CAAO,CAC9D,CAEQ,MAAM2C,EAAa3B,EAA4E,CACtG,IAAMuB,EAAI,KAAK,WAAWI,CAAG,EAC7B,KAAK,SAAWJ,EAChB,KAAK,OAASI,EACd,IAAMhE,EAAU,OAAOqC,GAAS,WAAaA,EAAKuB,EAAG,KAAK,KAAK,EAAIvB,EACnE,KAAK,KAAK,UAAWuB,EAAG,KAAK,MAAO5D,CAAO,EAC3C,KAAK,KAAK,EACV,KAAK,KAAKA,CAAO,EACjB,IAAMiE,EAAc,KAAK,SAAS,IAAIpI,CAAmB,EACzD,GAAIoI,GAAe,CAACjE,GAAS,YAAa,CACzC,GAAM,CAAE,WAAAkE,EAAY,MAAAvB,CAAM,EAAIsB,EAAY,QACpC5G,EAAK,KAAK,GAChBA,EAAG,gBAAgBA,EAAG,iBAAkB,KAAK,eAAe,EAC5DA,EAAG,YAAYA,EAAG,iBAAkB4G,EAAY,OAAO,EACvD5G,EAAG,kBACFA,EAAG,iBACH,EACA,EACA,EACA6G,EACA,EACA,EACA7G,EAAG,mBACHA,EAAG,mBACJ,EACAA,EAAG,gBAAgBA,EAAG,iBAAkB,IAAI,EAC5C,IAAM8G,GAAkBD,EAAa,GAAKvB,EAC1C,KAAK,kBAAkB9G,EAAqBsI,EAAgB,CAAE,aAAc,EAAK,CAAC,EAClFF,EAAY,QAAS,WAAaE,CACnC,CACA,EAAE,KAAK,MACP,KAAK,KAAK,WAAYP,EAAG,KAAK,MAAO5D,CAAO,CAC7C,CAEA,KAAKoE,EAAiE,CACrE,KAAK,OAAO,EACZ,IAAMC,EAAQL,GAAgB,CAC7B,KAAK,MAAMA,EAAKI,CAAS,EACrB,KAAK,SAAW,OAAM,KAAK,QAAU,sBAAsBC,CAAI,EACpE,EACA,KAAK,QAAU,sBAAsBA,CAAI,EACzC,KAAK,KAAK,MAAM,CACjB,CAEQ,WAAWC,EAAc,CAChC,OAAI,MAAM,KAAK,MAAM,EAAU,KAAK,SAC7B,KAAK,UAAYA,EAAO,KAAK,QAAU,GAC/C,CAEQ,QAAS,CAChB,GAAI,QAAM,KAAK,MAAM,GAAK,KAAK,SAAW,MAC1C,OAAI,KAAK,SAAW,OACnB,qBAAqB,KAAK,OAAO,EACjC,KAAK,QAAU,MAEhB,KAAK,SAAW,KAAK,WAAW,YAAY,IAAI,CAAC,EACjD,KAAK,OAAS,IACP,EACR,CAEA,OAAQ,CACH,KAAK,OAAO,GAAG,KAAK,KAAK,OAAO,CACrC,CAEA,QAAS,CACR,KAAK,MAAQ,EACb,KAAK,SAAW,EAChB,KAAK,OAAS,IACd,KAAK,KAAK,CACX,CAEA,OAAQ,CACP,KAAK,OAAO,EACZ,KAAK,SAAS,QAAQ,CAACxE,EAASnD,IAAS,CACxC,KAAK,UAAUA,EAAMmD,CAAO,CAC7B,CAAC,EACD,KAAK,MAAM,EACX,KAAK,KAAK,OAAO,CAClB,CAEA,SAAU,CACT,KAAK,KAAK,SAAS,EAEnB,KAAK,OAAO,EACZ,IAAMzC,EAAK,KAAK,GAEZ,KAAK,YACR,KAAK,UAAU,QAAQ,CAACsC,EAAUH,IAAU,CAC3C,KAAK,UAAW,oBAAoBA,EAAOG,CAAQ,CACpD,CAAC,EACD,KAAK,UAAU,MAAM,GAGlB,KAAK,cACR,KAAK,YAAY,WAAW,EAC5B,KAAK,YAAc,MAGhB,KAAK,UACRtC,EAAG,cAAc,KAAK,OAAO,EAC7B,KAAK,QAAU,MAGZ,KAAK,kBACRA,EAAG,kBAAkB,KAAK,eAAe,EACzC,KAAK,gBAAkB,MAGxB,KAAK,SAAS,QAAQyC,GAAW,CAChC,KAAK,QAAQ,KAAK,KAAKA,EAAQ,SAAS,EACxCzC,EAAG,cAAcyC,EAAQ,OAAO,CACjC,CAAC,EACD,KAAK,SAAS,MAAM,EACpB,IAAM3B,EAAQpC,EAAe,IAAI,KAAK,MAAM,EACxCoC,IACHA,EAAM,UAAU,OAAO,IAAI,EACvBA,EAAM,UAAU,OAAS,GAC5BpC,EAAe,OAAO,KAAK,MAAM,GAI/B,KAAK,MACRsB,EAAG,kBAAkB,KAAK,GAAG,EAC7B,KAAK,IAAM,MAGR,KAAK,SACRA,EAAG,aAAa,KAAK,MAAM,EAC3B,KAAK,OAAS,MAGf,KAAK,SAAS,MAAM,EACpB,KAAK,MAAM,MAAM,CAClB,CACD,EAEOkH,EAAQ9H","names":["DEFAULT_VERTEX_SHADER_SRC","FORMAT_TYPE_SUFFIXES","UNIFORM_TYPE_SUFFIXES","typeFromInternalFormatString","internalFormatString","suffix","HISTORY_TEXTURE_KEY","INTERMEDIATE_TEXTURE_KEY","canvasRegistry","combineShaderCode","shader","injections","lines","insertAt","line","trimmed","getSourceDimensions","source","ShaderPad","stringFrom","name","_ShaderPad","fragmentShaderSrc","canvas","plugins","history","cursorTarget","texOptions","width","height","gl","spError","registryEntry","glslInjections","plugin","code","program","vertexShader","fragmentShader","linkError","wrapDimension","dimension","descriptor","v","entry","instance","value","resolved","args","hook","fn","hooks","index","type","compilationError","target","updateCursor","x","y","rect","u","updateClick","isClicked","xVal","yVal","event","mouseEvent","touchEvent","listener","resolution","info","texture","existing","options","internalFormatOption","typeString","isIntegerColorFormat","formatString","result","size","ArrayType","format","textureInfo","transparent","needsAlignmentFix","previousAlignment","layer","frameOffset","arrayLength","allowMissing","location","probeValue","length","error","updates","newValue","uniform","glFunctionName","nValues","item","flat","typedArray","newLocation","scalarValue","historyDepth","unitIndex","hasHistory","textureTarget","completeTextureInfo","uSampler","opts","historySlots","nonShaderPadSource","sourceIntermediateInfo","srcW","srcH","depth","targetSlots","i","safeMod","slot","pixels","isPartial","isCustomTexture","shouldFlipY","previousFlipY","shouldConvertColorSpace","previousColorSpace","partialSource","sourceData","xOffset","yOffset","intermediateInfo","t","w","h","desiredColorSpace","now","historyInfo","writeIndex","nextWriteIndex","onPreStep","loop","time","index_default"]}
@@ -99,9 +99,6 @@ var ShaderPad = class _ShaderPad {
99
99
  canvasHeight: this.canvas.height
100
100
  }) : spError(0);
101
101
  }
102
- if (texOptions.colorSpace && "drawingBufferColorSpace" in gl) {
103
- gl.drawingBufferColorSpace = texOptions.colorSpace;
104
- }
105
102
  this.gl = gl;
106
103
  this.typeArrays = /* @__PURE__ */ new Map([
107
104
  [gl.FLOAT, Float32Array],
@@ -523,7 +520,7 @@ var ShaderPad = class _ShaderPad {
523
520
  }
524
521
  this.emit("initializeUniform", ...arguments);
525
522
  }
526
- updateUniforms(updates, options) {
523
+ _updateUniforms(updates, options) {
527
524
  const gl = this.gl;
528
525
  gl.useProgram(this.program);
529
526
  Object.entries(updates).forEach(([name, newValue]) => {
@@ -588,6 +585,14 @@ var ShaderPad = class _ShaderPad {
588
585
  });
589
586
  this.emit("updateUniforms", ...arguments);
590
587
  }
588
+ updateUniforms(updates, options) {
589
+ this._updateUniforms(updates, options);
590
+ if (typeof updates.u_time === "number") {
591
+ this.tElapsed = updates.u_time;
592
+ if (!isNaN(this.tStart)) this.tStart = performance.now();
593
+ }
594
+ if (typeof updates.u_frame === "number") this.frame = updates.u_frame;
595
+ }
591
596
  createTex(name, textureInfo) {
592
597
  const gl = this.gl;
593
598
  const { width, height } = textureInfo;
@@ -859,6 +864,10 @@ var ShaderPad = class _ShaderPad {
859
864
  if (!this.isHeadless) {
860
865
  const intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY);
861
866
  if (!intermediateInfo.options.isIntegerColorFormat) {
867
+ const desiredColorSpace = intermediateInfo.options.colorSpace ?? "srgb";
868
+ if ("drawingBufferColorSpace" in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {
869
+ gl.drawingBufferColorSpace = desiredColorSpace;
870
+ }
862
871
  gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);
863
872
  gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
864
873
  gl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);
@@ -874,7 +883,7 @@ var ShaderPad = class _ShaderPad {
874
883
  const updates = {};
875
884
  if (this.uniforms.has("u_time")) updates.u_time = this.tElapsed;
876
885
  if (this.uniforms.has("u_frame")) updates.u_frame = this.frame;
877
- if (Object.keys(updates).length) this.updateUniforms(updates);
886
+ if (Object.keys(updates).length) this._updateUniforms(updates);
878
887
  }
879
888
  _step(now, opts) {
880
889
  const t = this.getElapsed(now);
@@ -1000,4 +1009,4 @@ var index_default = ShaderPad;
1000
1009
  export {
1001
1010
  index_default
1002
1011
  };
1003
- //# sourceMappingURL=chunk-YB3GMXKV.mjs.map
1012
+ //# sourceMappingURL=chunk-D2ESNBZA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import { safeMod, spError } from './internal/util';\n\nconst DEFAULT_VERTEX_SHADER_SRC = `#version 300 es\nin vec2 a_position;out vec2 v_uv;void main(){gl_Position=vec4(a_position,0.,1.);v_uv=a_position*.5+.5;}`;\n\ninterface Uniform {\n\ttype: 'float' | 'int' | 'uint';\n\tlength: 1 | 2 | 3 | 4;\n\tlocation: WebGLUniformLocation;\n\tarrayLength?: number;\n}\n\ntype GLInternalFormatChannels = 'R' | 'RG' | 'RGB' | 'RGBA';\ntype GLInternalFormatDepth = '8' | '16F' | '32F' | '8UI' | '8I' | '16UI' | '16I' | '32UI' | '32I';\nexport type GLInternalFormatString = `${GLInternalFormatChannels}${GLInternalFormatDepth}`;\n\nexport type GLFormatString =\n\t| 'RED'\n\t| 'RG'\n\t| 'RGB'\n\t| 'RGBA'\n\t| 'RED_INTEGER'\n\t| 'RG_INTEGER'\n\t| 'RGB_INTEGER'\n\t| 'RGBA_INTEGER';\nexport type GLTypeString =\n\t| 'UNSIGNED_BYTE'\n\t| 'BYTE'\n\t| 'FLOAT'\n\t| 'HALF_FLOAT'\n\t| 'UNSIGNED_SHORT'\n\t| 'SHORT'\n\t| 'UNSIGNED_INT'\n\t| 'INT';\nexport type GLFilterString = 'LINEAR' | 'NEAREST';\nexport type GLWrapString = 'CLAMP_TO_EDGE' | 'REPEAT' | 'MIRRORED_REPEAT';\nexport type ColorSpace = PredefinedColorSpace;\n\nconst FORMAT_TYPE_SUFFIXES: [string, GLTypeString][] = [\n\t['8UI', 'UNSIGNED_BYTE'],\n\t['8I', 'BYTE'],\n\t['16UI', 'UNSIGNED_SHORT'],\n\t['16I', 'SHORT'],\n\t['16F', 'HALF_FLOAT'],\n\t['32UI', 'UNSIGNED_INT'],\n\t['32I', 'INT'],\n\t['32F', 'FLOAT'],\n\t['8', 'UNSIGNED_BYTE'],\n];\n\nconst UNIFORM_TYPE_SUFFIXES: Record<Uniform['type'], string> = {\n\tfloat: 'f',\n\tint: 'i',\n\tuint: 'ui',\n};\n\nfunction typeFromInternalFormatString(internalFormatString?: GLInternalFormatString): GLTypeString | undefined {\n\treturn internalFormatString && FORMAT_TYPE_SUFFIXES.find(([suffix]) => internalFormatString.endsWith(suffix))?.[1];\n}\n\ntype GLConstantString = GLInternalFormatString | GLFormatString | GLTypeString | GLFilterString | GLWrapString;\n\nexport interface TextureOptions {\n\tinternalFormat?: GLInternalFormatString;\n\tformat?: GLFormatString;\n\ttype?: GLTypeString;\n\tminFilter?: GLFilterString;\n\tmagFilter?: GLFilterString;\n\twrapS?: GLWrapString;\n\twrapT?: GLWrapString;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n}\ntype ResolvedTextureOptions = {\n\ttype: number;\n\tformat: number;\n\tinternalFormat: number;\n\tminFilter: number;\n\tmagFilter: number;\n\twrapS: number;\n\twrapT: number;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n\tisIntegerColorFormat: boolean;\n};\n\ninterface Texture {\n\ttexture: WebGLTexture;\n\tunitIndex: number;\n\twidth: number;\n\theight: number;\n\thistory?: {\n\t\tdepth: number;\n\t\twriteIndex: number;\n\t};\n\toptions: ResolvedTextureOptions;\n}\n\nexport interface CustomTexture {\n\tdata: ArrayBufferView | null;\n\twidth: number;\n\theight: number;\n}\n\nexport interface PartialCustomTexture extends CustomTexture {\n\tisPartial?: boolean;\n\tx?: number;\n\ty?: number;\n}\n\nexport interface InitializeTextureOptions extends TextureOptions {\n\thistory?: number;\n}\n\nexport type TextureSource =\n\t| HTMLImageElement\n\t| HTMLVideoElement\n\t| HTMLCanvasElement\n\t| OffscreenCanvas\n\t| ImageBitmap\n\t| WebGLTexture\n\t| CustomTexture\n\t| ShaderPad;\n\n// Custom textures allow partial updates starting from (x, y).\nexport type UpdateTextureSource = Exclude<TextureSource, CustomTexture> | PartialCustomTexture;\n\nexport interface PluginContext {\n\tinjectGLSL: (code: string) => void;\n\temit: (name: ShaderPadEventName, ...args: any[]) => void;\n\tupdateTexture: (name: string, source: UpdateTextureSource, historySlots?: HistorySlots) => void;\n}\n\nexport type Plugin = (shaderPad: ShaderPad, context: PluginContext) => void;\n\nexport type ShaderPadEventName =\n\t| '_init'\n\t| 'initializeTexture'\n\t| 'initializeUniform'\n\t| 'updateTextures'\n\t| 'updateUniforms'\n\t| 'preStep'\n\t| 'postStep'\n\t| 'preDraw'\n\t| 'postDraw'\n\t| 'updateResolution'\n\t| 'play'\n\t| 'pause'\n\t| 'reset'\n\t| 'destroy'\n\t| `${string}:${string}`;\n\nexport type RenderTextureOptions = Omit<TextureOptions, 'preserveY'>;\n\nexport interface Options extends RenderTextureOptions {\n\tcanvas?: HTMLCanvasElement | OffscreenCanvas | { width: number; height: number } | null;\n\tplugins?: Plugin[];\n\thistory?: number;\n\tcursorTarget?: Window | Element;\n}\n\nexport interface StepOptions {\n\tskipClear?: boolean;\n\tskipHistory?: boolean;\n}\n\ntype HistorySlots = number | number[];\n\ntype TextureUnitPool = {\n\tfree: number[];\n\tnext: number;\n\tmax: number;\n};\n\nconst HISTORY_TEXTURE_KEY = Symbol('u_history');\nconst INTERMEDIATE_TEXTURE_KEY = Symbol('__SHADERPAD_BUFFER');\n\nconst canvasRegistry = new WeakMap<\n\tHTMLCanvasElement | OffscreenCanvas,\n\t{ texPool: TextureUnitPool; instances: Set<ShaderPad> }\n>();\n\nfunction combineShaderCode(shader: string, injections: string[]): string {\n\tif (!injections?.length) return shader;\n\tconst lines = shader.split('\\n');\n\tconst insertAt =\n\t\tlines.findLastIndex(line => {\n\t\t\tconst trimmed = line.trimStart();\n\t\t\treturn trimmed.startsWith('precision ') || trimmed.startsWith('#version ');\n\t\t}) + 1;\n\tlines.splice(insertAt, 0, ...injections);\n\treturn lines.join('\\n');\n}\n\nfunction getSourceDimensions(source: TextureSource): {\n\twidth: number;\n\theight: number;\n} {\n\tif (source instanceof WebGLTexture) {\n\t\treturn { width: 0, height: 0 }; // Invalid - dimensions not readable.\n\t}\n\tif (source instanceof ShaderPad) {\n\t\treturn { width: source.canvas.width, height: source.canvas.height };\n\t}\n\tif (source instanceof HTMLVideoElement) {\n\t\treturn { width: source.videoWidth, height: source.videoHeight };\n\t}\n\tif (source instanceof HTMLImageElement) {\n\t\treturn {\n\t\t\twidth: source.naturalWidth ?? source.width,\n\t\t\theight: source.naturalHeight ?? source.height,\n\t\t};\n\t}\n\t// CustomTexture, HTMLCanvasElement, OffscreenCanvas, ImageBitmap.\n\treturn { width: source.width, height: source.height };\n}\n\nfunction stringFrom(name: string | symbol) {\n\treturn typeof name === 'symbol' ? (name.description ?? '') : name;\n}\n\nclass ShaderPad {\n\tprivate isHeadless = false;\n\tprivate isTouch = false;\n\tdeclare public readonly gl: WebGL2RenderingContext;\n\tdeclare private typeArrays: Map<number, new (length: number) => ArrayBufferView>;\n\tdeclare private typeFormats: Map<number, GLInternalFormatString>;\n\tdeclare private uintTypes: Set<number>;\n\tprivate uniforms: Map<string, Uniform> = new Map();\n\tprivate textures: Map<string | symbol, Texture> = new Map();\n\tdeclare private texPool: TextureUnitPool;\n\tprivate buffer: WebGLBuffer | null = null;\n\tprivate vao: WebGLVertexArrayObject | null = null;\n\tprivate program: WebGLProgram | null = null;\n\tdeclare private frameId: number | null;\n\tprivate listeners: Map<string, EventListener> = new Map();\n\tprivate frame = 0;\n\tprivate tElapsed = 0;\n\tprivate tStart = NaN;\n\tprivate cursorPos = [0.5, 0.5];\n\tprivate clickPos = [0.5, 0.5];\n\tprivate isClicked = false;\n\tdeclare public canvas: HTMLCanvasElement | OffscreenCanvas;\n\tprivate resObserver: MutationObserver | null = null;\n\tprivate hooks: Map<ShaderPadEventName, Function[]> = new Map();\n\tprivate historyDepth = 0;\n\tdeclare private texOptions: TextureOptions;\n\tdeclare private cursorTgt: Window | Element | undefined;\n\t// WebGL can’t read from and write to the history texture at the same time.\n\t// We write to an intermediate texture then blit to the history texture.\n\tprivate intermediateFbo: WebGLFramebuffer | null = null;\n\n\tconstructor(fragmentShaderSrc: string, { canvas, plugins, history, cursorTarget, ...texOptions }: Options = {}) {\n\t\tif (canvas && 'getContext' in canvas) {\n\t\t\tthis.canvas = canvas;\n\t\t} else {\n\t\t\tconst { width = 1, height = 1 } = canvas || {};\n\t\t\tthis.canvas = new OffscreenCanvas(width, height);\n\t\t\tthis.isHeadless = true;\n\t\t}\n\n\t\tconst gl = this.canvas.getContext('webgl2', {\n\t\t\tantialias: false,\n\t\t}) as WebGL2RenderingContext;\n\t\tif (!gl) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(0, {\n\t\t\t\t\t\tcanvasType: this.canvas.constructor.name,\n\t\t\t\t\t\tisHeadless: this.isHeadless,\n\t\t\t\t\t\tcanvasWidth: this.canvas.width,\n\t\t\t\t\t\tcanvasHeight: this.canvas.height,\n\t\t\t\t\t})\n\t\t\t\t: spError(0);\n\t\t}\n\t\tthis.gl = gl;\n\t\tthis.typeArrays = new Map<number, new (length: number) => ArrayBufferView>([\n\t\t\t[gl.FLOAT, Float32Array],\n\t\t\t[gl.HALF_FLOAT, Uint16Array],\n\t\t\t[gl.UNSIGNED_SHORT, Uint16Array],\n\t\t\t[gl.SHORT, Int16Array],\n\t\t\t[gl.BYTE, Int8Array],\n\t\t\t[gl.UNSIGNED_INT, Uint32Array],\n\t\t\t[gl.INT, Int32Array],\n\t\t]);\n\t\tthis.typeFormats = new Map<number, GLInternalFormatString>([\n\t\t\t[gl.FLOAT, 'RGBA32F'],\n\t\t\t[gl.HALF_FLOAT, 'RGBA16F'],\n\t\t\t[gl.UNSIGNED_SHORT, 'RGBA32UI'],\n\t\t\t[gl.SHORT, 'RGBA32I'],\n\t\t\t[gl.BYTE, 'RGBA32I'],\n\t\t\t[gl.UNSIGNED_INT, 'RGBA32UI'],\n\t\t\t[gl.INT, 'RGBA32I'],\n\t\t]);\n\t\tthis.uintTypes = new Set([gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT]);\n\n\t\tlet registryEntry = canvasRegistry.get(this.canvas);\n\t\tif (!registryEntry) {\n\t\t\tregistryEntry = {\n\t\t\t\ttexPool: {\n\t\t\t\t\tfree: [],\n\t\t\t\t\tnext: 0,\n\t\t\t\t\tmax: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n\t\t\t\t},\n\t\t\t\tinstances: new Set([this]),\n\t\t\t};\n\t\t\tcanvasRegistry.set(this.canvas, registryEntry);\n\t\t}\n\t\tthis.texPool = registryEntry.texPool;\n\t\tregistryEntry.instances.add(this);\n\n\t\tthis.texOptions = texOptions;\n\n\t\tif (history) this.historyDepth = history;\n\t\tthis.cursorTgt = cursorTarget ?? (this.canvas instanceof HTMLCanvasElement ? this.canvas : undefined);\n\t\tthis.frameId = null;\n\n\t\tconst glslInjections: string[] = [];\n\t\tif (plugins) {\n\t\t\tplugins.forEach(plugin =>\n\t\t\t\tplugin(this, {\n\t\t\t\t\tinjectGLSL: (code: string) => {\n\t\t\t\t\t\tglslInjections.push(code);\n\t\t\t\t\t},\n\t\t\t\t\temit: this.emit.bind(this),\n\t\t\t\t\tupdateTexture: this.updateTex.bind(this),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst program = gl.createProgram();\n\t\tif (!program) {\n\t\t\tthrow spError(1);\n\t\t}\n\t\tthis.program = program;\n\n\t\tconst vertexShader = this.createShader(gl.VERTEX_SHADER, DEFAULT_VERTEX_SHADER_SRC);\n\t\tconst fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tcombineShaderCode(fragmentShaderSrc, glslInjections),\n\t\t);\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.bindAttribLocation(program, 0, 'a_position');\n\t\tgl.linkProgram(program);\n\t\tgl.deleteShader(vertexShader);\n\t\tgl.deleteShader(fragmentShader);\n\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst linkError = __SHADERPAD_DEV__\n\t\t\t\t? spError(2, {\n\t\t\t\t\t\tprogramInfoLog: gl.getProgramInfoLog(program),\n\t\t\t\t\t\tfragmentShaderLength: fragmentShaderSrc.length,\n\t\t\t\t\t\tglslInjectionCount: glslInjections.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(2);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow linkError;\n\t\t}\n\n\t\tthis.vao = gl.createVertexArray();\n\t\tgl.bindVertexArray(this.vao);\n\t\tthis.buffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(0);\n\t\tgl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n\t\tgl.useProgram(program);\n\n\t\tif (this.canvas instanceof HTMLCanvasElement) {\n\t\t\tthis.resObserver = new MutationObserver(() => this.syncRes());\n\t\t\tthis.resObserver.observe(this.canvas, {\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: ['width', 'height'],\n\t\t\t});\n\t\t} else {\n\t\t\tconst wrapDimension = (dimension: 'width' | 'height') => {\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype, dimension)!;\n\t\t\t\tconst canvas = this.canvas;\n\t\t\t\tObject.defineProperty(canvas, dimension, {\n\t\t\t\t\tget: () => descriptor.get!.call(canvas),\n\t\t\t\t\tset: v => {\n\t\t\t\t\t\tdescriptor.set!.call(canvas, v);\n\t\t\t\t\t\tconst entry = canvasRegistry.get(canvas);\n\t\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t\tfor (const instance of entry.instances) {\n\t\t\t\t\t\t\t\tinstance.syncRes();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconfigurable: descriptor.configurable,\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t});\n\t\t\t};\n\t\t\twrapDimension('width');\n\t\t\twrapDimension('height');\n\t\t}\n\t\tthis.syncRes();\n\n\t\tthis.initializeUniform('u_cursor', 'float', this.cursorPos, { allowMissing: true });\n\t\tthis.initializeUniform('u_click', 'float', [...this.clickPos, this.isClicked ? 1.0 : 0.0], {\n\t\t\tallowMissing: true,\n\t\t});\n\t\tthis.initializeUniform('u_time', 'float', 0, { allowMissing: true });\n\t\tthis.initializeUniform('u_frame', 'int', 0, { allowMissing: true });\n\n\t\tthis.initTex(INTERMEDIATE_TEXTURE_KEY, this.canvas, {\n\t\t\t...this.texOptions,\n\t\t});\n\t\tthis.intermediateFbo = gl.createFramebuffer();\n\t\tthis.bindIntermediate();\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.initTex(HISTORY_TEXTURE_KEY, this.canvas, {\n\t\t\t\thistory: this.historyDepth,\n\t\t\t\t...this.texOptions,\n\t\t\t});\n\t\t}\n\t\tthis.addListeners();\n\t\tthis.emit('_init');\n\t}\n\n\tprivate resolveGLConst(value: GLConstantString): number {\n\t\tconst gl = this.gl;\n\t\tconst resolved = gl[value];\n\t\tif (resolved === undefined) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(3, { value }) : spError(3);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\tprivate emit(name: ShaderPadEventName, ...args: any[]) {\n\t\tthis.hooks.get(name)?.forEach(hook => hook.call(this, ...args));\n\t}\n\n\ton(name: ShaderPadEventName, fn: Function) {\n\t\tif (!this.hooks.has(name)) {\n\t\t\tthis.hooks.set(name, []);\n\t\t}\n\t\tthis.hooks.get(name)!.push(fn);\n\t}\n\n\toff(name: ShaderPadEventName, fn: Function) {\n\t\tconst hooks = this.hooks.get(name);\n\t\tif (hooks) {\n\t\t\tconst index = hooks.indexOf(fn);\n\t\t\tif (index >= 0) {\n\t\t\t\thooks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createShader(type: number, source: string): WebGLShader {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type)!;\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tconsole.error(gl.getShaderInfoLog(shader));\n\t\t\tconst compilationError = __SHADERPAD_DEV__\n\t\t\t\t? spError(4, {\n\t\t\t\t\t\tshaderType: type === gl.VERTEX_SHADER ? 'vertex' : 'fragment',\n\t\t\t\t\t\tsource,\n\t\t\t\t\t})\n\t\t\t\t: spError(4);\n\t\t\tgl.deleteShader(shader);\n\t\t\tthrow compilationError;\n\t\t}\n\t\treturn shader;\n\t}\n\n\tprivate getCursorTgtRect(): {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t} {\n\t\tconst target = this.cursorTgt!;\n\t\tif (target === window) {\n\t\t\treturn {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: window.innerWidth,\n\t\t\t\theight: window.innerHeight,\n\t\t\t};\n\t\t}\n\t\treturn (target as Element).getBoundingClientRect();\n\t}\n\n\tprivate addListeners() {\n\t\tif (!this.cursorTgt) return;\n\t\tconst updateCursor = (x: number, y: number) => {\n\t\t\tif (!this.uniforms.has('u_cursor')) return;\n\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\tconst u = (x - rect.left) / rect.width;\n\t\t\tconst v = 1 - (y - rect.top) / rect.height; // Flip Y for WebGL\n\t\t\tthis.cursorPos[0] = Math.max(0, Math.min(1, u));\n\t\t\tthis.cursorPos[1] = Math.max(0, Math.min(1, v));\n\t\t\tthis.updateUniforms({ u_cursor: this.cursorPos });\n\t\t};\n\n\t\tconst updateClick = (isClicked: boolean, x?: number, y?: number) => {\n\t\t\tif (!this.uniforms.has('u_click')) return;\n\t\t\tthis.isClicked = isClicked;\n\t\t\tif (isClicked) {\n\t\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\t\tconst xVal = x as number;\n\t\t\t\tconst yVal = y as number;\n\t\t\t\tthis.clickPos[0] = Math.max(0, Math.min(1, (xVal - rect.left) / rect.width));\n\t\t\t\tthis.clickPos[1] = Math.max(0, Math.min(1, 1 - (yVal - rect.top) / rect.height)); // Flip Y for WebGL\n\t\t\t}\n\t\t\tthis.updateUniforms({\n\t\t\t\tu_click: [...this.clickPos, this.isClicked ? 1.0 : 0.0],\n\t\t\t});\n\t\t};\n\n\t\tthis.listeners.set('mousemove', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tupdateCursor(mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mousedown', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tthis.isClicked = true;\n\t\t\t\t\tupdateClick(true, mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mouseup', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tupdateClick(false);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchmove', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchstart', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tthis.isTouch = true;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t\tupdateClick(true, touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchend', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length === 0) {\n\t\t\t\tupdateClick(false);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.forEach((listener, event) => {\n\t\t\tthis.cursorTgt!.addEventListener(event, listener);\n\t\t});\n\t}\n\n\tprivate syncRes() {\n\t\tconst gl = this.gl;\n\t\tconst resolution: [number, number] = [gl.drawingBufferWidth, gl.drawingBufferHeight];\n\t\tgl.viewport(0, 0, ...resolution);\n\t\tif (this.uniforms.has('u_resolution')) {\n\t\t\tthis.updateUniforms({ u_resolution: resolution });\n\t\t} else {\n\t\t\tthis.initializeUniform('u_resolution', 'float', resolution, { allowMissing: true });\n\t\t}\n\t\tthis.resizeTex(INTERMEDIATE_TEXTURE_KEY, ...resolution);\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.resizeTex(HISTORY_TEXTURE_KEY, ...resolution);\n\t\t}\n\t\tthis.emit('updateResolution', ...resolution);\n\t}\n\n\tprivate resizeTex(name: string | symbol, width: number, height: number) {\n\t\tconst info = this.textures.get(name);\n\t\tif (!info || (info.width === width && info.height === height)) return;\n\n\t\tconst gl = this.gl;\n\t\tgl.deleteTexture(info.texture);\n\t\tinfo.width = width;\n\t\tinfo.height = height;\n\t\tconst { texture } = this.createTex(name, info);\n\t\tinfo.texture = texture;\n\t\tthis.resetHist(name, info);\n\t}\n\n\tprivate reserveTex(name: string | symbol) {\n\t\tconst existing = this.textures.get(name);\n\t\tif (existing) return existing.unitIndex;\n\t\tif (this.texPool.free.length > 0) return this.texPool.free.pop()!;\n\t\tif (this.texPool.next >= this.texPool.max) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(5, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\tnextTextureUnit: this.texPool.next,\n\t\t\t\t\t\tmaxTextureUnits: this.texPool.max,\n\t\t\t\t\t\tfreeTextureUnits: this.texPool.free.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(5);\n\t\t}\n\t\treturn this.texPool.next++;\n\t}\n\n\tprivate resolveTexOpts(options?: TextureOptions): ResolvedTextureOptions {\n\t\tconst { gl } = this;\n\t\tconst internalFormatOption = options?.internalFormat;\n\t\tconst typeString = options?.type ?? typeFromInternalFormatString(internalFormatOption) ?? 'UNSIGNED_BYTE';\n\t\tconst type = this.resolveGLConst(typeString);\n\t\tconst internalFormatString = internalFormatOption ?? this.typeFormats.get(type) ?? 'RGBA8';\n\t\tconst isIntegerColorFormat = /^(R|RG|RGB|RGBA)(8|16|32)(UI|I)$/.test(internalFormatString);\n\t\tconst formatString = options?.format ?? (isIntegerColorFormat ? 'RGBA_INTEGER' : 'RGBA');\n\t\tconst result: ResolvedTextureOptions = {\n\t\t\ttype,\n\t\t\tformat: this.resolveGLConst(formatString),\n\t\t\tinternalFormat: this.resolveGLConst(internalFormatString),\n\t\t\tminFilter: this.resolveGLConst(options?.minFilter ?? 'LINEAR'),\n\t\t\tmagFilter: this.resolveGLConst(options?.magFilter ?? 'LINEAR'),\n\t\t\twrapS: this.resolveGLConst(options?.wrapS ?? 'CLAMP_TO_EDGE'),\n\t\t\twrapT: this.resolveGLConst(options?.wrapT ?? 'CLAMP_TO_EDGE'),\n\t\t\tcolorSpace: options?.colorSpace,\n\t\t\tpreserveY: options?.preserveY,\n\t\t\tisIntegerColorFormat,\n\t\t};\n\t\tconst isFloatColorFormat = result.internalFormat === gl.RGBA16F || result.internalFormat === gl.RGBA32F;\n\t\t// gl.getExtension isn’t just a check, it’s a required side-effect to enable floats.\n\t\tif (isFloatColorFormat && !gl.getExtension('EXT_color_buffer_float')) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(6, {\n\t\t\t\t\t\tinternalFormat: internalFormatString,\n\t\t\t\t\t\ttype: typeString,\n\t\t\t\t\t})\n\t\t\t\t: spError(6);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate getPxArray(type: number, size: number): ArrayBufferView {\n\t\tconst ArrayType = this.typeArrays.get(type) ?? Uint8Array;\n\t\treturn new ArrayType(size);\n\t}\n\n\tprivate isRgba(format: number): boolean {\n\t\tconst gl = this.gl;\n\t\treturn format === gl.RGBA || format === gl.RGBA_INTEGER;\n\t}\n\n\tprivate clearHistTexLayers(textureInfo: Texture): void {\n\t\tif (!textureInfo.history) return;\n\n\t\tconst gl = this.gl;\n\t\tconst { type, format } = textureInfo.options;\n\t\tconst transparent = this.getPxArray(type, textureInfo.width * textureInfo.height * 4);\n\t\tgl.activeTexture(gl.TEXTURE0 + textureInfo.unitIndex);\n\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, textureInfo.texture);\n\t\tconst needsAlignmentFix = !this.isRgba(format);\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tfor (let layer = 0; layer < textureInfo.history.depth; ++layer) {\n\t\t\tgl.texSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tlayer,\n\t\t\t\ttextureInfo.width,\n\t\t\t\ttextureInfo.height,\n\t\t\t\t1,\n\t\t\t\tformat,\n\t\t\t\ttype,\n\t\t\t\ttransparent,\n\t\t\t);\n\t\t}\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate updateFrameOffset(\n\t\tname: string | symbol,\n\t\tframeOffset: number,\n\t\toptions?: {\n\t\t\tallowMissing?: boolean;\n\t\t},\n\t) {\n\t\tthis.updateUniforms(\n\t\t\t{\n\t\t\t\t[`${stringFrom(name)}FrameOffset`]: frameOffset,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tprivate resetHist(name: string | symbol, textureInfo: Texture) {\n\t\tif (!textureInfo.history) return;\n\t\ttextureInfo.history.writeIndex = 0;\n\t\tthis.clearHistTexLayers(textureInfo);\n\t\tthis.updateFrameOffset(name, 0, { allowMissing: true });\n\t}\n\n\tinitializeUniform(\n\t\tname: string,\n\t\ttype: Uniform['type'],\n\t\tvalue: number | number[] | (number | number[])[],\n\t\toptions?: { arrayLength?: number; allowMissing?: boolean },\n\t) {\n\t\tconst arrayLength = options?.arrayLength;\n\t\tconst allowMissing = options?.allowMissing ?? false;\n\t\tif (this.uniforms.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(7, { name, arrayLength: arrayLength ?? null }) : spError(7);\n\t\t}\n\t\tif (!UNIFORM_TYPE_SUFFIXES[type]) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(8, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tsupportedTypes: Object.keys(UNIFORM_TYPE_SUFFIXES),\n\t\t\t\t\t})\n\t\t\t\t: spError(8);\n\t\t}\n\t\tif (arrayLength && !(Array.isArray(value) && value.length === arrayLength)) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(9, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\texpectedLength: arrayLength,\n\t\t\t\t\t\treceivedLength: Array.isArray(value) ? value.length : 1,\n\t\t\t\t\t})\n\t\t\t\t: spError(9);\n\t\t}\n\n\t\tconst gl = this.gl;\n\t\tlet location = gl.getUniformLocation(this.program!, name);\n\t\tif (!location && arrayLength) {\n\t\t\tlocation = gl.getUniformLocation(this.program!, `${name}[0]`);\n\t\t}\n\t\tif (!location) {\n\t\t\tif (allowMissing) return;\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(19, { name, arrayLength: arrayLength ?? null }) : spError(19);\n\t\t}\n\n\t\tconst probeValue = arrayLength ? (value as number[] | number[][])[0] : value;\n\t\tconst length = Array.isArray(probeValue) ? (probeValue.length as 1 | 2 | 3 | 4) : 1;\n\t\tthis.uniforms.set(name, { type, length, location, arrayLength });\n\n\t\ttry {\n\t\t\tthis.updateUniforms({ [name]: value });\n\t\t} catch (error) {\n\t\t\tthis.uniforms.delete(name);\n\t\t\tthrow error;\n\t\t}\n\t\tthis.emit('initializeUniform', ...arguments);\n\t}\n\n\tprivate _updateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tObject.entries(updates).forEach(([name, newValue]) => {\n\t\t\tconst uniform = this.uniforms.get(name);\n\t\t\tif (!uniform) {\n\t\t\t\tif (options?.allowMissing) return;\n\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t? spError(20, {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tstartIndex: options?.startIndex ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: spError(20);\n\t\t\t}\n\t\t\tlet glFunctionName = `uniform${uniform.length}${UNIFORM_TYPE_SUFFIXES[uniform.type]}`;\n\t\t\tif (uniform.arrayLength) {\n\t\t\t\tif (!Array.isArray(newValue)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(10, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedType: typeof newValue,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(10);\n\t\t\t\t}\n\t\t\t\tconst nValues = newValue.length;\n\t\t\t\tif (!nValues) return;\n\t\t\t\tif (nValues > uniform.arrayLength) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(11, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: nValues,\n\t\t\t\t\t\t\t\tmaxLength: uniform.arrayLength,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(11);\n\t\t\t\t}\n\t\t\t\tif (newValue.some(item => (Array.isArray(item) ? item.length : 1) !== uniform.length)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(12, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\texpectedElementLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(12);\n\t\t\t\t}\n\t\t\t\tconst flat = newValue.flat();\n\t\t\t\tconst typedArray =\n\t\t\t\t\tuniform.type === 'float'\n\t\t\t\t\t\t? new Float32Array(flat)\n\t\t\t\t\t\t: uniform.type === 'uint'\n\t\t\t\t\t\t\t? new Uint32Array(flat)\n\t\t\t\t\t\t\t: new Int32Array(flat);\n\t\t\t\tlet location = uniform.location;\n\t\t\t\tif (options?.startIndex) {\n\t\t\t\t\tconst newLocation = gl.getUniformLocation(this.program!, `${name}[${options.startIndex}]`);\n\t\t\t\t\tif (!newLocation) {\n\t\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t\t? spError(13, {\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tstartIndex: options.startIndex,\n\t\t\t\t\t\t\t\t\tarrayLength: uniform.arrayLength,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: spError(13);\n\t\t\t\t\t}\n\t\t\t\t\tlocation = newLocation;\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName + 'v'](location, typedArray);\n\t\t\t} else {\n\t\t\t\tif (!Array.isArray(newValue)) newValue = [newValue];\n\t\t\t\tconst scalarValue = newValue as number[];\n\t\t\t\tif (scalarValue.length !== uniform.length) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(14, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: scalarValue.length,\n\t\t\t\t\t\t\t\texpectedLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(14);\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName](uniform.location, ...scalarValue);\n\t\t\t}\n\t\t});\n\t\tthis.emit('updateUniforms', ...arguments);\n\t}\n\n\tupdateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tthis._updateUniforms(updates, options);\n\n\t\tif (typeof updates.u_time === 'number') {\n\t\t\tthis.tElapsed = updates.u_time;\n\t\t\tif (!isNaN(this.tStart)) this.tStart = performance.now();\n\t\t}\n\t\tif (typeof updates.u_frame === 'number') this.frame = updates.u_frame;\n\t}\n\n\tprivate createTex(\n\t\tname: string | symbol,\n\t\ttextureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> & { unitIndex?: number },\n\t) {\n\t\tconst gl = this.gl;\n\t\tconst { width, height } = textureInfo;\n\t\tconst historyDepth = textureInfo.history?.depth ?? 0;\n\n\t\tconst texture = gl.createTexture();\n\t\tif (!texture) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(15, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\thistoryDepth,\n\t\t\t\t\t})\n\t\t\t\t: spError(15);\n\t\t}\n\n\t\tlet unitIndex = textureInfo.unitIndex;\n\t\tif (typeof unitIndex !== 'number') {\n\t\t\ttry {\n\t\t\t\tunitIndex = this.reserveTex(name);\n\t\t\t} catch (error) {\n\t\t\t\tgl.deleteTexture(texture);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst hasHistory = historyDepth > 0;\n\t\tconst textureTarget = hasHistory ? gl.TEXTURE_2D_ARRAY : gl.TEXTURE_2D;\n\t\tconst { options } = textureInfo;\n\t\tgl.activeTexture(gl.TEXTURE0 + unitIndex);\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, options.wrapS);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, options.wrapT);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, options.minFilter);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, options.magFilter);\n\t\tif (hasHistory) {\n\t\t\tgl.texStorage3D(textureTarget, 1, options.internalFormat, width, height, historyDepth);\n\t\t} else if (name === INTERMEDIATE_TEXTURE_KEY) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\toptions.internalFormat,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\toptions.format,\n\t\t\t\toptions.type,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\treturn { texture, unitIndex };\n\t}\n\n\tprivate initTex(name: string | symbol, source: TextureSource, options?: InitializeTextureOptions) {\n\t\tconst gl = this.gl;\n\t\tif (this.textures.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(16, { name: stringFrom(name) }) : spError(16);\n\t\t}\n\n\t\tconst { history: historyDepth = 0, ...texOptions } = options ?? {};\n\t\tconst { width, height } = getSourceDimensions(source);\n\t\tif (!width || !height) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(17, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tsourceType: source.constructor.name,\n\t\t\t\t\t})\n\t\t\t\t: spError(17);\n\t\t}\n\t\tconst textureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> = {\n\t\t\twidth,\n\t\t\theight,\n\t\t\toptions:\n\t\t\t\tsource instanceof ShaderPad &&\n\t\t\t\tObject.keys(texOptions).length === 0 &&\n\t\t\t\tsource.textures.has(INTERMEDIATE_TEXTURE_KEY)\n\t\t\t\t\t? source.textures.get(INTERMEDIATE_TEXTURE_KEY)!.options\n\t\t\t\t\t: this.resolveTexOpts(texOptions),\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\ttextureInfo.history = { depth: historyDepth, writeIndex: 0 };\n\t\t}\n\t\tconst { texture, unitIndex } = this.createTex(name, textureInfo);\n\t\tconst completeTextureInfo: Texture = {\n\t\t\ttexture,\n\t\t\tunitIndex,\n\t\t\t...textureInfo,\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\tthis.initializeUniform(`${stringFrom(name)}FrameOffset`, 'int', 0, { allowMissing: true });\n\t\t\tthis.clearHistTexLayers(completeTextureInfo);\n\t\t}\n\t\tthis.textures.set(name, completeTextureInfo);\n\t\tif (name !== INTERMEDIATE_TEXTURE_KEY && name !== HISTORY_TEXTURE_KEY) {\n\t\t\tthis.updateTex(name, source);\n\t\t}\n\n\t\t// Set a uniform to access the texture in the fragment shader.\n\t\tgl.useProgram(this.program!);\n\t\tconst uSampler = gl.getUniformLocation(this.program!, stringFrom(name));\n\t\tif (uSampler) {\n\t\t\tgl.uniform1i(uSampler, unitIndex);\n\t\t}\n\t}\n\n\tinitializeTexture(name: string, source: TextureSource, options?: InitializeTextureOptions) {\n\t\t// Since history[0] is the current frame, add 1 to history depth to allow history[maxHistory].\n\t\tconst opts =\n\t\t\toptions?.history != null && options.history > 0 ? { ...options, history: options.history + 1 } : options;\n\t\tthis.initTex(name, source, opts);\n\t\tthis.emit('initializeTexture', ...arguments);\n\t}\n\n\tupdateTextures(updates: Record<string, UpdateTextureSource>) {\n\t\tObject.entries(updates).forEach(([name, source]) => {\n\t\t\tthis.updateTex(name, source);\n\t\t});\n\t\tthis.emit('updateTextures', ...arguments);\n\t}\n\n\tprivate updateTex(name: string | symbol, source: UpdateTextureSource, historySlots?: HistorySlots) {\n\t\tconst gl = this.gl;\n\t\tconst info = this.textures.get(name);\n\t\tif (!info) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(18, { name: stringFrom(name) }) : spError(18);\n\t\t}\n\n\t\tif (source instanceof WebGLTexture) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, source);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nonShaderPadSource = source as Exclude<UpdateTextureSource, ShaderPad>;\n\t\tif (source instanceof ShaderPad) {\n\t\t\tconst sourceIntermediateInfo = source.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tconst srcW = sourceIntermediateInfo.width;\n\t\t\tconst srcH = sourceIntermediateInfo.height;\n\n\t\t\tif (source.gl === gl) {\n\t\t\t\tif (!info.history) {\n\t\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, sourceIntermediateInfo.texture);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { depth } = info.history;\n\t\t\t\tconst targetSlots =\n\t\t\t\t\thistorySlots === undefined\n\t\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, source.intermediateFbo);\n\t\t\t\tfor (const slot of targetSlots) {\n\t\t\t\t\tgl.copyTexSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, slot, 0, 0, srcW, srcH);\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1], { allowMissing: true });\n\t\t\t\tif (historySlots === undefined) {\n\t\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Different contexts - transfer via readPixels to preserve precision.\n\t\t\tconst {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\toptions: { format, type },\n\t\t\t} = sourceIntermediateInfo;\n\t\t\tconst pixels = this.getPxArray(type, width * height * 4);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, source.intermediateFbo);\n\t\t\tsource.gl.readPixels(0, 0, width, height, format, type, pixels);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, null);\n\t\t\tnonShaderPadSource = { data: pixels, width, height };\n\t\t}\n\n\t\t// If dimensions changed, recreate the texture with new dimensions.\n\t\tconst { width, height } = getSourceDimensions(nonShaderPadSource);\n\t\tif (!width || !height) return;\n\n\t\tconst isPartial = 'isPartial' in nonShaderPadSource && nonShaderPadSource.isPartial;\n\t\tif (!isPartial) {\n\t\t\tthis.resizeTex(name, width, height);\n\t\t}\n\n\t\t// UNPACK_FLIP_Y_WEBGL only works for DOM element sources, not typed arrays.\n\t\tconst isCustomTexture = 'data' in nonShaderPadSource && nonShaderPadSource.data;\n\t\tconst shouldFlipY = !isCustomTexture && !info.options?.preserveY;\n\t\tconst previousFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);\n\t\tconst needsAlignmentFix = isCustomTexture && !this.isRgba(info.options.format);\n\t\tconst shouldConvertColorSpace = !isCustomTexture && info.options.colorSpace && 'unpackColorSpace' in gl;\n\t\tconst previousColorSpace = gl.unpackColorSpace;\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = info.options.colorSpace!;\n\n\t\tif (info.history) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\tconst { depth } = info.history;\n\t\t\tconst targetSlots =\n\t\t\t\thistorySlots === undefined\n\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\tconst sourceData =\n\t\t\t\tpartialSource.data ?? (nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>);\n\t\t\tconst xOffset = isPartial ? (partialSource.x ?? 0) : 0;\n\t\t\tconst yOffset = isPartial ? (partialSource.y ?? 0) : 0;\n\n\t\t\tfor (const slot of targetSlots) {\n\t\t\t\tgl.texSubImage3D(\n\t\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t\t0,\n\t\t\t\t\txOffset,\n\t\t\t\t\tyOffset,\n\t\t\t\t\tslot,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t1,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tsourceData as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1]);\n\t\t\tif (historySlots === undefined) {\n\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t}\n\t\t} else {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, info.texture);\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\n\t\t\tif (isPartial) {\n\t\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\t\tgl.texSubImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tpartialSource.x ?? 0,\n\t\t\t\t\tpartialSource.y ?? 0,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tpartialSource.data,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.internalFormat,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\t((nonShaderPadSource as PartialCustomTexture).data ??\n\t\t\t\t\t\t(nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>)) as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t}\n\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = previousColorSpace;\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate bindIntermediate() {\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.intermediateFbo);\n\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, intermediateInfo.texture, 0);\n\t}\n\n\tclear() {\n\t\tthis.bindIntermediate();\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tif (intermediateInfo.options.isIntegerColorFormat) {\n\t\t\tconst t = intermediateInfo.options.type;\n\t\t\tif (this.uintTypes.has(t)) {\n\t\t\t\tgl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(4));\n\t\t\t} else {\n\t\t\t\tgl.clearBufferiv(gl.COLOR, 0, new Int32Array(4));\n\t\t\t}\n\t\t} else {\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t}\n\t}\n\n\tdraw(options?: StepOptions | void) {\n\t\tthis.emit('preDraw', ...arguments);\n\t\tconst gl = this.gl;\n\t\tconst w = gl.drawingBufferWidth;\n\t\tconst h = gl.drawingBufferHeight;\n\n\t\tif (options?.skipClear) {\n\t\t\tthis.bindIntermediate();\n\t\t} else {\n\t\t\tthis.clear();\n\t\t}\n\n\t\tgl.useProgram(this.program);\n\t\tgl.bindVertexArray(this.vao);\n\t\tgl.viewport(0, 0, w, h);\n\t\tgl.drawArrays(gl.TRIANGLES, 0, 3);\n\n\t\tif (!this.isHeadless) {\n\t\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tif (!intermediateInfo.options.isIntegerColorFormat) {\n\t\t\t\tconst desiredColorSpace = intermediateInfo.options.colorSpace ?? 'srgb';\n\t\t\t\tif ('drawingBufferColorSpace' in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {\n\t\t\t\t\tgl.drawingBufferColorSpace = desiredColorSpace;\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\t\tgl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n\t\t\t\tgl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t}\n\t\t}\n\t\tthis.emit('postDraw', ...arguments);\n\t}\n\n\tstep(options?: StepOptions) {\n\t\tthis._step(performance.now(), options);\n\t}\n\n\tprivate tick() {\n\t\tconst updates: Record<string, number> = {};\n\t\tif (this.uniforms.has('u_time')) updates.u_time = this.tElapsed;\n\t\tif (this.uniforms.has('u_frame')) updates.u_frame = this.frame;\n\t\tif (Object.keys(updates).length) this._updateUniforms(updates);\n\t}\n\n\tprivate _step(now: number, opts?: StepOptions | ((time: number, frame: number) => StepOptions | void)) {\n\t\tconst t = this.getElapsed(now);\n\t\tthis.tElapsed = t;\n\t\tthis.tStart = now;\n\t\tconst options = typeof opts === 'function' ? opts(t, this.frame) : opts;\n\t\tthis.emit('preStep', t, this.frame, options);\n\t\tthis.tick();\n\t\tthis.draw(options);\n\t\tconst historyInfo = this.textures.get(HISTORY_TEXTURE_KEY);\n\t\tif (historyInfo && !options?.skipHistory) {\n\t\t\tconst { writeIndex, depth } = historyInfo.history!;\n\t\t\tconst gl = this.gl;\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, historyInfo.texture);\n\t\t\tgl.copyTexSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\twriteIndex,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tgl.drawingBufferWidth,\n\t\t\t\tgl.drawingBufferHeight,\n\t\t\t);\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\tconst nextWriteIndex = (writeIndex + 1) % depth;\n\t\t\tthis.updateFrameOffset(HISTORY_TEXTURE_KEY, nextWriteIndex, { allowMissing: true });\n\t\t\thistoryInfo.history!.writeIndex = nextWriteIndex;\n\t\t}\n\t\t++this.frame;\n\t\tthis.emit('postStep', t, this.frame, options);\n\t}\n\n\tplay(onPreStep?: (time: number, frame: number) => StepOptions | void) {\n\t\tthis._pause();\n\t\tconst loop = (now: number) => {\n\t\t\tthis._step(now, onPreStep);\n\t\t\tif (this.frameId != null) this.frameId = requestAnimationFrame(loop);\n\t\t};\n\t\tthis.frameId = requestAnimationFrame(loop);\n\t\tthis.emit('play');\n\t}\n\n\tprivate getElapsed(time: number) {\n\t\tif (isNaN(this.tStart)) return this.tElapsed;\n\t\treturn this.tElapsed + (time - this.tStart) / 1000;\n\t}\n\n\tprivate _pause() {\n\t\tif (isNaN(this.tStart) && this.frameId == null) return;\n\t\tif (this.frameId != null) {\n\t\t\tcancelAnimationFrame(this.frameId);\n\t\t\tthis.frameId = null;\n\t\t}\n\t\tthis.tElapsed = this.getElapsed(performance.now());\n\t\tthis.tStart = NaN;\n\t\treturn true;\n\t}\n\n\tpause() {\n\t\tif (this._pause()) this.emit('pause');\n\t}\n\n\trewind() {\n\t\tthis.frame = 0;\n\t\tthis.tElapsed = 0;\n\t\tthis.tStart = NaN;\n\t\tthis.tick();\n\t}\n\n\treset() {\n\t\tthis.rewind();\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHist(name, texture);\n\t\t});\n\t\tthis.clear();\n\t\tthis.emit('reset');\n\t}\n\n\tdestroy() {\n\t\tthis.emit('destroy');\n\n\t\tthis._pause();\n\t\tconst gl = this.gl;\n\n\t\tif (this.cursorTgt) {\n\t\t\tthis.listeners.forEach((listener, event) => {\n\t\t\t\tthis.cursorTgt!.removeEventListener(event, listener);\n\t\t\t});\n\t\t\tthis.listeners.clear();\n\t\t}\n\n\t\tif (this.resObserver) {\n\t\t\tthis.resObserver.disconnect();\n\t\t\tthis.resObserver = null;\n\t\t}\n\n\t\tif (this.program) {\n\t\t\tgl.deleteProgram(this.program);\n\t\t\tthis.program = null;\n\t\t}\n\n\t\tif (this.intermediateFbo) {\n\t\t\tgl.deleteFramebuffer(this.intermediateFbo);\n\t\t\tthis.intermediateFbo = null;\n\t\t}\n\n\t\tthis.textures.forEach(texture => {\n\t\t\tthis.texPool.free.push(texture.unitIndex);\n\t\t\tgl.deleteTexture(texture.texture);\n\t\t});\n\t\tthis.textures.clear();\n\t\tconst entry = canvasRegistry.get(this.canvas);\n\t\tif (entry) {\n\t\t\tentry.instances.delete(this);\n\t\t\tif (entry.instances.size === 0) {\n\t\t\t\tcanvasRegistry.delete(this.canvas);\n\t\t\t}\n\t\t}\n\n\t\tif (this.vao) {\n\t\t\tgl.deleteVertexArray(this.vao);\n\t\t\tthis.vao = null;\n\t\t}\n\n\t\tif (this.buffer) {\n\t\t\tgl.deleteBuffer(this.buffer);\n\t\t\tthis.buffer = null;\n\t\t}\n\n\t\tthis.uniforms.clear();\n\t\tthis.hooks.clear();\n\t}\n}\n\nexport default ShaderPad;\n"],"mappings":"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","names":["canvas","width","height"]}
package/dist/dev/index.js CHANGED
@@ -259,9 +259,6 @@ var ShaderPad = class _ShaderPad {
259
259
  canvasHeight: this.canvas.height
260
260
  }) : spError(0);
261
261
  }
262
- if (texOptions.colorSpace && "drawingBufferColorSpace" in gl) {
263
- gl.drawingBufferColorSpace = texOptions.colorSpace;
264
- }
265
262
  this.gl = gl;
266
263
  this.typeArrays = /* @__PURE__ */ new Map([
267
264
  [gl.FLOAT, Float32Array],
@@ -683,7 +680,7 @@ var ShaderPad = class _ShaderPad {
683
680
  }
684
681
  this.emit("initializeUniform", ...arguments);
685
682
  }
686
- updateUniforms(updates, options) {
683
+ _updateUniforms(updates, options) {
687
684
  const gl = this.gl;
688
685
  gl.useProgram(this.program);
689
686
  Object.entries(updates).forEach(([name, newValue]) => {
@@ -748,6 +745,14 @@ var ShaderPad = class _ShaderPad {
748
745
  });
749
746
  this.emit("updateUniforms", ...arguments);
750
747
  }
748
+ updateUniforms(updates, options) {
749
+ this._updateUniforms(updates, options);
750
+ if (typeof updates.u_time === "number") {
751
+ this.tElapsed = updates.u_time;
752
+ if (!isNaN(this.tStart)) this.tStart = performance.now();
753
+ }
754
+ if (typeof updates.u_frame === "number") this.frame = updates.u_frame;
755
+ }
751
756
  createTex(name, textureInfo) {
752
757
  const gl = this.gl;
753
758
  const { width, height } = textureInfo;
@@ -1019,6 +1024,10 @@ var ShaderPad = class _ShaderPad {
1019
1024
  if (!this.isHeadless) {
1020
1025
  const intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY);
1021
1026
  if (!intermediateInfo.options.isIntegerColorFormat) {
1027
+ const desiredColorSpace = intermediateInfo.options.colorSpace ?? "srgb";
1028
+ if ("drawingBufferColorSpace" in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {
1029
+ gl.drawingBufferColorSpace = desiredColorSpace;
1030
+ }
1022
1031
  gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);
1023
1032
  gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
1024
1033
  gl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);
@@ -1034,7 +1043,7 @@ var ShaderPad = class _ShaderPad {
1034
1043
  const updates = {};
1035
1044
  if (this.uniforms.has("u_time")) updates.u_time = this.tElapsed;
1036
1045
  if (this.uniforms.has("u_frame")) updates.u_frame = this.frame;
1037
- if (Object.keys(updates).length) this.updateUniforms(updates);
1046
+ if (Object.keys(updates).length) this._updateUniforms(updates);
1038
1047
  }
1039
1048
  _step(now, opts) {
1040
1049
  const t = this.getElapsed(now);