shaderpad 1.0.0-beta.83 → 1.0.0-beta.85

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 (50) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +6 -1
  3. package/dist/chunk-J6JNFFXG.mjs +5 -0
  4. package/dist/chunk-J6JNFFXG.mjs.map +1 -0
  5. package/dist/dev/{chunk-YB3GMXKV.mjs → chunk-6L2ORY3D.mjs} +21 -9
  6. package/dist/dev/chunk-6L2ORY3D.mjs.map +1 -0
  7. package/dist/dev/index.js +20 -8
  8. package/dist/dev/index.js.map +1 -1
  9. package/dist/dev/index.mjs +1 -1
  10. package/dist/dev/plugins/pose.js +20 -8
  11. package/dist/dev/plugins/pose.js.map +1 -1
  12. package/dist/dev/plugins/pose.mjs +1 -1
  13. package/dist/dev/plugins/segmenter.js +20 -8
  14. package/dist/dev/plugins/segmenter.js.map +1 -1
  15. package/dist/dev/plugins/segmenter.mjs +1 -1
  16. package/dist/dev/react.js +23 -8
  17. package/dist/dev/react.js.map +1 -1
  18. package/dist/dev/react.mjs +4 -1
  19. package/dist/dev/react.mjs.map +1 -1
  20. package/dist/dev/web-component.js +23 -8
  21. package/dist/dev/web-component.js.map +1 -1
  22. package/dist/dev/web-component.mjs +4 -1
  23. package/dist/dev/web-component.mjs.map +1 -1
  24. package/dist/index.d.mts +2 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +2 -2
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1 -1
  29. package/dist/plugins/pose.js +24 -24
  30. package/dist/plugins/pose.js.map +1 -1
  31. package/dist/plugins/pose.mjs +1 -1
  32. package/dist/plugins/segmenter.js +6 -6
  33. package/dist/plugins/segmenter.js.map +1 -1
  34. package/dist/plugins/segmenter.mjs +1 -1
  35. package/dist/react.d.mts +1 -0
  36. package/dist/react.d.ts +1 -0
  37. package/dist/react.js +2 -2
  38. package/dist/react.js.map +1 -1
  39. package/dist/react.mjs +1 -1
  40. package/dist/react.mjs.map +1 -1
  41. package/dist/web-component.d.mts +1 -0
  42. package/dist/web-component.d.ts +1 -0
  43. package/dist/web-component.js +4 -4
  44. package/dist/web-component.js.map +1 -1
  45. package/dist/web-component.mjs +2 -2
  46. package/dist/web-component.mjs.map +1 -1
  47. package/package.json +3 -3
  48. package/dist/chunk-4UKNQUGK.mjs +0 -5
  49. package/dist/chunk-4UKNQUGK.mjs.map +0 -1
  50. package/dist/dev/chunk-YB3GMXKV.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # shaderpad
2
2
 
3
+ ## 1.0.0-beta.85
4
+
5
+ ### Minor Changes
6
+
7
+ - Add shader.clearHistory() method
8
+
9
+ ## 1.0.0-beta.84
10
+
11
+ ### Minor Changes
12
+
13
+ - Sync `u_time` and `u_frame` updates to internal clock
14
+
3
15
  ## 1.0.0-beta.83
4
16
 
5
17
  ### Minor Changes
package/README.md CHANGED
@@ -284,6 +284,10 @@ shader.draw({ skipClear: true });
284
284
 
285
285
  Clear ShaderPad’s current render target without advancing time, frame, or history.
286
286
 
287
+ #### `clearHistory()`
288
+
289
+ Clear all output and texture history buffers without clearing the current render target or changing time/frame state.
290
+
287
291
  #### `StepOptions`
288
292
 
289
293
  ```typescript
@@ -298,11 +302,12 @@ interface StepOptions {
298
302
  - `skipClear?: boolean` - If `true`, the canvas is not cleared before rendering. Useful for accumulating effects or multi-pass rendering.
299
303
  - `skipHistory?: boolean` - If `true`, history buffers are not updated. Useful when you want to render without affecting the history state.
300
304
 
301
- #### `pause()`, `rewind()`, `reset()`, `destroy()`
305
+ #### `pause()`, `rewind()`, `clearHistory()`, `reset()`, `destroy()`
302
306
 
303
307
  ```typescript
304
308
  shader.pause(); // Pause the render loop and preserve playback time/frame.
305
309
  shader.rewind(); // Reset frame counter and clock.
310
+ shader.clearHistory(); // Clear history buffers without rewinding.
306
311
  shader.reset(); // Rewind and clear output/history buffers.
307
312
  shader.destroy(); // Clean up resources.
308
313
  ```
@@ -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(l){return l&&M.find(([e])=>l.endsWith(e))?.[1]}var v=Symbol("u_history"),g=Symbol("__SHADERPAD_BUFFER"),F=new WeakMap;function H(l,e){if(!e?.length)return l;let t=l.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(l){return l instanceof WebGLTexture?{width:0,height:0}:l instanceof I?{width:l.canvas.width,height:l.canvas.height}:l instanceof HTMLVideoElement?{width:l.videoWidth,height:l.videoHeight}:l instanceof HTMLImageElement?{width:l.naturalWidth??l.width,height:l.naturalHeight??l.height}:{width:l.width,height:l.height}}function P(l){return typeof l=="symbol"?l.description??"":l}var I=class l{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 u=n.createProgram();if(!u)throw m(1);this.program=u;let c=this.createShader(n.VERTEX_SHADER,C),p=this.createShader(n.FRAGMENT_SHADER,H(e,h));if(n.attachShader(u,c),n.attachShader(u,p),n.bindAttribLocation(u,0,"a_position"),n.linkProgram(u),n.deleteShader(c),n.deleteShader(p),!n.getProgramParameter(u,n.LINK_STATUS)){let f=m(2);throw n.deleteProgram(u),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(u),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,u=Array.isArray(h)?h.length:1;this.uniforms.set(e,{type:t,length:u,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(),u=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,u)}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,u=h?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D,{options:c}=t;return i.activeTexture(i.TEXTURE0+o),i.bindTexture(u,n),i.texParameteri(u,i.TEXTURE_WRAP_S,c.wrapS),i.texParameteri(u,i.TEXTURE_WRAP_T,c.wrapT),i.texParameteri(u,i.TEXTURE_MIN_FILTER,c.minFilter),i.texParameteri(u,i.TEXTURE_MAG_FILTER,c.magFilter),h?i.texStorage3D(u,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 l&&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:u,unitIndex:c}=this.createTex(e,h),p={texture:u,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 l){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:A,height:R,options:{format:w,type:y}}=d,G=this.getPxArray(y,A*R*4);t.gl.bindFramebuffer(t.gl.FRAMEBUFFER,t.intermediateFbo),t.gl.readPixels(0,0,A,R,w,y,G),t.gl.bindFramebuffer(t.gl.FRAMEBUFFER,null),a={data:G,width:A,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 u="data"in a&&a.data,c=!u&&!s.options?.preserveY,p=r.getParameter(r.UNPACK_FLIP_Y_WEBGL),f=u&&!this.isRgba(s.options.format),E=!u&&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(y=>S(y,d)):[S(i,d)];r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,c);let _=a,A=_.data??a,R=h?_.x??0:0,w=h?_.y??0:0;for(let y of T)r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,R,w,y,n,o,1,s.options.format,s.options.type,A);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)}clearHistory(){this.textures.forEach((e,t)=>{this.resetHist(t,e)})}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.clearHistory(),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-J6JNFFXG.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\tclearHistory() {\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHist(name, texture);\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.clearHistory();\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":["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;
@@ -842,6 +847,11 @@ var ShaderPad = class _ShaderPad {
842
847
  gl.clear(gl.COLOR_BUFFER_BIT);
843
848
  }
844
849
  }
850
+ clearHistory() {
851
+ this.textures.forEach((texture, name) => {
852
+ this.resetHist(name, texture);
853
+ });
854
+ }
845
855
  draw(options) {
846
856
  this.emit("preDraw", ...arguments);
847
857
  const gl = this.gl;
@@ -859,6 +869,10 @@ var ShaderPad = class _ShaderPad {
859
869
  if (!this.isHeadless) {
860
870
  const intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY);
861
871
  if (!intermediateInfo.options.isIntegerColorFormat) {
872
+ const desiredColorSpace = intermediateInfo.options.colorSpace ?? "srgb";
873
+ if ("drawingBufferColorSpace" in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {
874
+ gl.drawingBufferColorSpace = desiredColorSpace;
875
+ }
862
876
  gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);
863
877
  gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
864
878
  gl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);
@@ -874,7 +888,7 @@ var ShaderPad = class _ShaderPad {
874
888
  const updates = {};
875
889
  if (this.uniforms.has("u_time")) updates.u_time = this.tElapsed;
876
890
  if (this.uniforms.has("u_frame")) updates.u_frame = this.frame;
877
- if (Object.keys(updates).length) this.updateUniforms(updates);
891
+ if (Object.keys(updates).length) this._updateUniforms(updates);
878
892
  }
879
893
  _step(now, opts) {
880
894
  const t = this.getElapsed(now);
@@ -943,9 +957,7 @@ var ShaderPad = class _ShaderPad {
943
957
  }
944
958
  reset() {
945
959
  this.rewind();
946
- this.textures.forEach((texture, name) => {
947
- this.resetHist(name, texture);
948
- });
960
+ this.clearHistory();
949
961
  this.clear();
950
962
  this.emit("reset");
951
963
  }
@@ -1000,4 +1012,4 @@ var index_default = ShaderPad;
1000
1012
  export {
1001
1013
  index_default
1002
1014
  };
1003
- //# sourceMappingURL=chunk-YB3GMXKV.mjs.map
1015
+ //# sourceMappingURL=chunk-6L2ORY3D.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\tclearHistory() {\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHist(name, texture);\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.clearHistory();\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;
@@ -1002,6 +1007,11 @@ var ShaderPad = class _ShaderPad {
1002
1007
  gl.clear(gl.COLOR_BUFFER_BIT);
1003
1008
  }
1004
1009
  }
1010
+ clearHistory() {
1011
+ this.textures.forEach((texture, name) => {
1012
+ this.resetHist(name, texture);
1013
+ });
1014
+ }
1005
1015
  draw(options) {
1006
1016
  this.emit("preDraw", ...arguments);
1007
1017
  const gl = this.gl;
@@ -1019,6 +1029,10 @@ var ShaderPad = class _ShaderPad {
1019
1029
  if (!this.isHeadless) {
1020
1030
  const intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY);
1021
1031
  if (!intermediateInfo.options.isIntegerColorFormat) {
1032
+ const desiredColorSpace = intermediateInfo.options.colorSpace ?? "srgb";
1033
+ if ("drawingBufferColorSpace" in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {
1034
+ gl.drawingBufferColorSpace = desiredColorSpace;
1035
+ }
1022
1036
  gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);
1023
1037
  gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
1024
1038
  gl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);
@@ -1034,7 +1048,7 @@ var ShaderPad = class _ShaderPad {
1034
1048
  const updates = {};
1035
1049
  if (this.uniforms.has("u_time")) updates.u_time = this.tElapsed;
1036
1050
  if (this.uniforms.has("u_frame")) updates.u_frame = this.frame;
1037
- if (Object.keys(updates).length) this.updateUniforms(updates);
1051
+ if (Object.keys(updates).length) this._updateUniforms(updates);
1038
1052
  }
1039
1053
  _step(now, opts) {
1040
1054
  const t = this.getElapsed(now);
@@ -1103,9 +1117,7 @@ var ShaderPad = class _ShaderPad {
1103
1117
  }
1104
1118
  reset() {
1105
1119
  this.rewind();
1106
- this.textures.forEach((texture, name) => {
1107
- this.resetHist(name, texture);
1108
- });
1120
+ this.clearHistory();
1109
1121
  this.clear();
1110
1122
  this.emit("reset");
1111
1123
  }