shaderpad 1.0.0-beta.82 → 1.0.0-beta.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +19 -2
  3. package/dist/chunk-745KVZYV.mjs +5 -0
  4. package/dist/chunk-745KVZYV.mjs.map +1 -0
  5. package/dist/chunk-FVO6LH2F.mjs +2 -0
  6. package/dist/chunk-FVO6LH2F.mjs.map +1 -0
  7. package/dist/dev/{chunk-TTKZ43JC.mjs → chunk-D2ESNBZA.mjs} +26 -9
  8. package/dist/dev/chunk-D2ESNBZA.mjs.map +1 -0
  9. package/dist/dev/{chunk-YN3AO6HP.mjs → chunk-UOFU6ODR.mjs} +3 -2
  10. package/dist/dev/chunk-UOFU6ODR.mjs.map +1 -0
  11. package/dist/dev/index.js +25 -8
  12. package/dist/dev/index.js.map +1 -1
  13. package/dist/dev/index.mjs +1 -1
  14. package/dist/dev/plugins/pose.js +25 -8
  15. package/dist/dev/plugins/pose.js.map +1 -1
  16. package/dist/dev/plugins/pose.mjs +1 -1
  17. package/dist/dev/plugins/segmenter.js +25 -8
  18. package/dist/dev/plugins/segmenter.js.map +1 -1
  19. package/dist/dev/plugins/segmenter.mjs +1 -1
  20. package/dist/dev/react.js +27 -9
  21. package/dist/dev/react.js.map +1 -1
  22. package/dist/dev/react.mjs +2 -2
  23. package/dist/dev/web-component.js +27 -9
  24. package/dist/dev/web-component.js.map +1 -1
  25. package/dist/dev/web-component.mjs +2 -2
  26. package/dist/index.d.mts +5 -2
  27. package/dist/index.d.ts +5 -2
  28. package/dist/index.js +4 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.mjs +1 -1
  31. package/dist/plugins/pose.js +27 -27
  32. package/dist/plugins/pose.js.map +1 -1
  33. package/dist/plugins/pose.mjs +1 -1
  34. package/dist/plugins/segmenter.js +11 -11
  35. package/dist/plugins/segmenter.js.map +1 -1
  36. package/dist/plugins/segmenter.mjs +1 -1
  37. package/dist/react.js +4 -4
  38. package/dist/react.js.map +1 -1
  39. package/dist/react.mjs +1 -1
  40. package/dist/web-component.js +4 -4
  41. package/dist/web-component.js.map +1 -1
  42. package/dist/web-component.mjs +1 -1
  43. package/package.json +3 -3
  44. package/dist/chunk-B3EEZDUT.mjs +0 -5
  45. package/dist/chunk-B3EEZDUT.mjs.map +0 -1
  46. package/dist/chunk-O3TAD633.mjs +0 -2
  47. package/dist/chunk-O3TAD633.mjs.map +0 -1
  48. package/dist/dev/chunk-TTKZ43JC.mjs.map +0 -1
  49. package/dist/dev/chunk-YN3AO6HP.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # shaderpad
2
2
 
3
+ ## 1.0.0-beta.84
4
+
5
+ ### Minor Changes
6
+
7
+ - Sync `u_time` and `u_frame` updates to internal clock
8
+
9
+ ## 1.0.0-beta.83
10
+
11
+ ### Minor Changes
12
+
13
+ - Add support for wide-gamut color
14
+
3
15
  ## 1.0.0-beta.82
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -222,6 +222,7 @@ shader.initializeTexture('u_canvas', canvasElement, { preserveY: true });
222
222
  - `magFilter?: string` - Magnification filter (default: `'LINEAR'`). Examples: `'LINEAR'`, `'NEAREST'`
223
223
  - `wrapS?: string` - Wrap mode for S coordinate (default: `'CLAMP_TO_EDGE'`). Examples: `'CLAMP_TO_EDGE'`, `'REPEAT'`, `'MIRRORED_REPEAT'`
224
224
  - `wrapT?: string` - Wrap mode for T coordinate (default: `'CLAMP_TO_EDGE'`). Examples: `'CLAMP_TO_EDGE'`, `'REPEAT'`, `'MIRRORED_REPEAT'`
225
+ - `colorSpace?: 'srgb' | 'display-p3'` - Color space for DOM texture upload conversion where supported
225
226
 
226
227
  **Note:** For typed array sources (`CustomTexture`), you must provide data in bottom-up orientation (WebGL convention). The `preserveY` option is ignored for typed arrays.
227
228
 
@@ -314,7 +315,7 @@ shader.destroy(); // Clean up resources.
314
315
  ### Type exports
315
316
 
316
317
  `shaderpad` exports `Options`, `StepOptions`, `TextureOptions`, `InitializeTextureOptions`, `TextureSource`,
317
- `UpdateTextureSource`, `CustomTexture`, `PartialCustomTexture`, `Plugin`, `PluginContext`, `ShaderPadEventName`, and
318
+ `UpdateTextureSource`, `CustomTexture`, `PartialCustomTexture`, `Plugin`, `PluginContext`, `ShaderPadEventName`, `ColorSpace`, and
318
319
  the GL literal string types. `shaderpad/util` exports `ToBlobOptions` and `SaveOptions`.
319
320
 
320
321
  ### Event Listeners
@@ -388,7 +389,7 @@ examples, browse the
388
389
  ShaderPad’s constructor accepts an optional `options` object.
389
390
 
390
391
  In addition to the fields below, constructor options also accept texture storage/filter/wrap settings such as
391
- `internalFormat`, `format`, `type`, `minFilter`, `magFilter`, `wrapS`, and `wrapT`. These configure ShaderPad’s
392
+ `internalFormat`, `format`, `type`, `minFilter`, `magFilter`, `wrapS`, `wrapT`, and `colorSpace`. These configure ShaderPad’s
392
393
  internal render targets and history buffers, which is mainly useful for float/integer pipelines and chained shaders.
393
394
 
394
395
  ### canvas
@@ -464,6 +465,22 @@ float zIndex = historyZ(u_webcam, u_webcamFrameOffset, nFramesAgo);
464
465
  vec4 historyColor = texture(u_webcam, vec3(v_uv, zIndex));
465
466
  ```
466
467
 
468
+ ### colorSpace
469
+
470
+ Opt into browser color management for wide-gamut work.
471
+
472
+ ```typescript
473
+ const shader = new ShaderPad(fragmentShaderSrc, {
474
+ colorSpace: 'display-p3',
475
+ });
476
+
477
+ shader.initializeTexture('u_image', imageElement, {
478
+ colorSpace: 'display-p3',
479
+ });
480
+ ```
481
+
482
+ On the constructor, `colorSpace` applies to the WebGL drawing buffer and ShaderPad’s internal render texture. On `initializeTexture()`, it applies while uploading DOM image-like sources such as images, videos, canvases, and `ImageBitmap`. Typed-array textures are not color-converted.
483
+
467
484
  ### plugins
468
485
 
469
486
  ShaderPad adds additional functionality through plugins, which keeps bundle sizes small.
@@ -0,0 +1,5 @@
1
+ import{a as m,b as S}from"./chunk-QROQ7JVO.mjs";var C=`#version 300 es
2
+ in vec2 a_position;out vec2 v_uv;void main(){gl_Position=vec4(a_position,0.,1.);v_uv=a_position*.5+.5;}`,M=[["8UI","UNSIGNED_BYTE"],["8I","BYTE"],["16UI","UNSIGNED_SHORT"],["16I","SHORT"],["16F","HALF_FLOAT"],["32UI","UNSIGNED_INT"],["32I","INT"],["32F","FLOAT"],["8","UNSIGNED_BYTE"]],N={float:"f",int:"i",uint:"ui"};function B(u){return u&&M.find(([e])=>u.endsWith(e))?.[1]}var v=Symbol("u_history"),g=Symbol("__SHADERPAD_BUFFER"),F=new WeakMap;function H(u,e){if(!e?.length)return u;let t=u.split(`
3
+ `),i=t.findLastIndex(r=>{let s=r.trimStart();return s.startsWith("precision ")||s.startsWith("#version ")})+1;return t.splice(i,0,...e),t.join(`
4
+ `)}function O(u){return u instanceof WebGLTexture?{width:0,height:0}:u instanceof I?{width:u.canvas.width,height:u.canvas.height}:u instanceof HTMLVideoElement?{width:u.videoWidth,height:u.videoHeight}:u instanceof HTMLImageElement?{width:u.naturalWidth??u.width,height:u.naturalHeight??u.height}:{width:u.width,height:u.height}}function P(u){return typeof u=="symbol"?u.description??"":u}var I=class u{isHeadless=!1;isTouch=!1;uniforms=new Map;textures=new Map;buffer=null;vao=null;program=null;listeners=new Map;frame=0;tElapsed=0;tStart=NaN;cursorPos=[.5,.5];clickPos=[.5,.5];isClicked=!1;resObserver=null;hooks=new Map;historyDepth=0;intermediateFbo=null;constructor(e,{canvas:t,plugins:i,history:r,cursorTarget:s,...a}={}){if(t&&"getContext"in t)this.canvas=t;else{let{width:f=1,height:E=1}=t||{};this.canvas=new OffscreenCanvas(f,E),this.isHeadless=!0}let n=this.canvas.getContext("webgl2",{antialias:!1});if(!n)throw m(0);this.gl=n,this.typeArrays=new Map([[n.FLOAT,Float32Array],[n.HALF_FLOAT,Uint16Array],[n.UNSIGNED_SHORT,Uint16Array],[n.SHORT,Int16Array],[n.BYTE,Int8Array],[n.UNSIGNED_INT,Uint32Array],[n.INT,Int32Array]]),this.typeFormats=new Map([[n.FLOAT,"RGBA32F"],[n.HALF_FLOAT,"RGBA16F"],[n.UNSIGNED_SHORT,"RGBA32UI"],[n.SHORT,"RGBA32I"],[n.BYTE,"RGBA32I"],[n.UNSIGNED_INT,"RGBA32UI"],[n.INT,"RGBA32I"]]),this.uintTypes=new Set([n.UNSIGNED_BYTE,n.UNSIGNED_SHORT,n.UNSIGNED_INT]);let o=F.get(this.canvas);o||(o={texPool:{free:[],next:0,max:n.getParameter(n.MAX_COMBINED_TEXTURE_IMAGE_UNITS)},instances:new Set([this])},F.set(this.canvas,o)),this.texPool=o.texPool,o.instances.add(this),this.texOptions=a,r&&(this.historyDepth=r),this.cursorTgt=s??(this.canvas instanceof HTMLCanvasElement?this.canvas:void 0),this.frameId=null;let h=[];i&&i.forEach(f=>f(this,{injectGLSL:E=>{h.push(E)},emit:this.emit.bind(this),updateTexture:this.updateTex.bind(this)}));let l=n.createProgram();if(!l)throw m(1);this.program=l;let c=this.createShader(n.VERTEX_SHADER,C),p=this.createShader(n.FRAGMENT_SHADER,H(e,h));if(n.attachShader(l,c),n.attachShader(l,p),n.bindAttribLocation(l,0,"a_position"),n.linkProgram(l),n.deleteShader(c),n.deleteShader(p),!n.getProgramParameter(l,n.LINK_STATUS)){let f=m(2);throw n.deleteProgram(l),f}if(this.vao=n.createVertexArray(),n.bindVertexArray(this.vao),this.buffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,this.buffer),n.bufferData(n.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.viewport(0,0,n.drawingBufferWidth,n.drawingBufferHeight),n.useProgram(l),this.canvas instanceof HTMLCanvasElement)this.resObserver=new MutationObserver(()=>this.syncRes()),this.resObserver.observe(this.canvas,{attributes:!0,attributeFilter:["width","height"]});else{let f=E=>{let b=Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype,E),x=this.canvas;Object.defineProperty(x,E,{get:()=>b.get.call(x),set:d=>{b.set.call(x,d);let T=F.get(x);if(T)for(let _ of T.instances)_.syncRes()},configurable:b.configurable,enumerable:b.enumerable})};f("width"),f("height")}this.syncRes(),this.initializeUniform("u_cursor","float",this.cursorPos,{allowMissing:!0}),this.initializeUniform("u_click","float",[...this.clickPos,this.isClicked?1:0],{allowMissing:!0}),this.initializeUniform("u_time","float",0,{allowMissing:!0}),this.initializeUniform("u_frame","int",0,{allowMissing:!0}),this.initTex(g,this.canvas,{...this.texOptions}),this.intermediateFbo=n.createFramebuffer(),this.bindIntermediate(),n.bindFramebuffer(n.FRAMEBUFFER,null),this.historyDepth>0&&this.initTex(v,this.canvas,{history:this.historyDepth,...this.texOptions}),this.addListeners(),this.emit("_init")}resolveGLConst(e){let i=this.gl[e];if(i===void 0)throw m(3);return i}emit(e,...t){this.hooks.get(e)?.forEach(i=>i.call(this,...t))}on(e,t){this.hooks.has(e)||this.hooks.set(e,[]),this.hooks.get(e).push(t)}off(e,t){let i=this.hooks.get(e);if(i){let r=i.indexOf(t);r>=0&&i.splice(r,1)}}createShader(e,t){let i=this.gl,r=i.createShader(e);if(i.shaderSource(r,t),i.compileShader(r),!i.getShaderParameter(r,i.COMPILE_STATUS)){console.error(i.getShaderInfoLog(r));let s=m(4);throw i.deleteShader(r),s}return r}getCursorTgtRect(){let e=this.cursorTgt;return e===window?{left:0,top:0,width:window.innerWidth,height:window.innerHeight}:e.getBoundingClientRect()}addListeners(){if(!this.cursorTgt)return;let e=(i,r)=>{if(!this.uniforms.has("u_cursor"))return;let s=this.getCursorTgtRect(),a=(i-s.left)/s.width,n=1-(r-s.top)/s.height;this.cursorPos[0]=Math.max(0,Math.min(1,a)),this.cursorPos[1]=Math.max(0,Math.min(1,n)),this.updateUniforms({u_cursor:this.cursorPos})},t=(i,r,s)=>{if(this.uniforms.has("u_click")){if(this.isClicked=i,i){let a=this.getCursorTgtRect(),n=r,o=s;this.clickPos[0]=Math.max(0,Math.min(1,(n-a.left)/a.width)),this.clickPos[1]=Math.max(0,Math.min(1,1-(o-a.top)/a.height))}this.updateUniforms({u_click:[...this.clickPos,this.isClicked?1:0]})}};this.listeners.set("mousemove",i=>{let r=i;this.isTouch||e(r.clientX,r.clientY)}),this.listeners.set("mousedown",i=>{let r=i;this.isTouch||r.button===0&&(this.isClicked=!0,t(!0,r.clientX,r.clientY))}),this.listeners.set("mouseup",i=>{let r=i;this.isTouch||r.button===0&&t(!1)}),this.listeners.set("touchmove",i=>{let r=i;r.touches.length>0&&e(r.touches[0].clientX,r.touches[0].clientY)}),this.listeners.set("touchstart",i=>{let r=i;this.isTouch=!0,r.touches.length>0&&(e(r.touches[0].clientX,r.touches[0].clientY),t(!0,r.touches[0].clientX,r.touches[0].clientY))}),this.listeners.set("touchend",i=>{i.touches.length===0&&t(!1)}),this.listeners.forEach((i,r)=>{this.cursorTgt.addEventListener(r,i)})}syncRes(){let e=this.gl,t=[e.drawingBufferWidth,e.drawingBufferHeight];e.viewport(0,0,...t),this.uniforms.has("u_resolution")?this.updateUniforms({u_resolution:t}):this.initializeUniform("u_resolution","float",t,{allowMissing:!0}),this.resizeTex(g,...t),this.historyDepth>0&&this.resizeTex(v,...t),this.emit("updateResolution",...t)}resizeTex(e,t,i){let r=this.textures.get(e);if(!r||r.width===t&&r.height===i)return;this.gl.deleteTexture(r.texture),r.width=t,r.height=i;let{texture:a}=this.createTex(e,r);r.texture=a,this.resetHist(e,r)}reserveTex(e){let t=this.textures.get(e);if(t)return t.unitIndex;if(this.texPool.free.length>0)return this.texPool.free.pop();if(this.texPool.next>=this.texPool.max)throw m(5);return this.texPool.next++}resolveTexOpts(e){let{gl:t}=this,i=e?.internalFormat,r=e?.type??B(i)??"UNSIGNED_BYTE",s=this.resolveGLConst(r),a=i??this.typeFormats.get(s)??"RGBA8",n=/^(R|RG|RGB|RGBA)(8|16|32)(UI|I)$/.test(a),o=e?.format??(n?"RGBA_INTEGER":"RGBA"),h={type:s,format:this.resolveGLConst(o),internalFormat:this.resolveGLConst(a),minFilter:this.resolveGLConst(e?.minFilter??"LINEAR"),magFilter:this.resolveGLConst(e?.magFilter??"LINEAR"),wrapS:this.resolveGLConst(e?.wrapS??"CLAMP_TO_EDGE"),wrapT:this.resolveGLConst(e?.wrapT??"CLAMP_TO_EDGE"),colorSpace:e?.colorSpace,preserveY:e?.preserveY,isIntegerColorFormat:n};if((h.internalFormat===t.RGBA16F||h.internalFormat===t.RGBA32F)&&!t.getExtension("EXT_color_buffer_float"))throw m(6);return h}getPxArray(e,t){let i=this.typeArrays.get(e)??Uint8Array;return new i(t)}isRgba(e){let t=this.gl;return e===t.RGBA||e===t.RGBA_INTEGER}clearHistTexLayers(e){if(!e.history)return;let t=this.gl,{type:i,format:r}=e.options,s=this.getPxArray(i,e.width*e.height*4);t.activeTexture(t.TEXTURE0+e.unitIndex),t.bindTexture(t.TEXTURE_2D_ARRAY,e.texture);let a=!this.isRgba(r),n;a&&(n=t.getParameter(t.UNPACK_ALIGNMENT),t.pixelStorei(t.UNPACK_ALIGNMENT,1));for(let o=0;o<e.history.depth;++o)t.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,o,e.width,e.height,1,r,i,s);a&&t.pixelStorei(t.UNPACK_ALIGNMENT,n)}updateFrameOffset(e,t,i){this.updateUniforms({[`${P(e)}FrameOffset`]:t},i)}resetHist(e,t){t.history&&(t.history.writeIndex=0,this.clearHistTexLayers(t),this.updateFrameOffset(e,0,{allowMissing:!0}))}initializeUniform(e,t,i,r){let s=r?.arrayLength,a=r?.allowMissing??!1;if(this.uniforms.has(e))throw m(7);if(!N[t])throw m(8);if(s&&!(Array.isArray(i)&&i.length===s))throw m(9);let n=this.gl,o=n.getUniformLocation(this.program,e);if(!o&&s&&(o=n.getUniformLocation(this.program,`${e}[0]`)),!o){if(a)return;throw m(19)}let h=s?i[0]:i,l=Array.isArray(h)?h.length:1;this.uniforms.set(e,{type:t,length:l,location:o,arrayLength:s});try{this.updateUniforms({[e]:i})}catch(c){throw this.uniforms.delete(e),c}this.emit("initializeUniform",...arguments)}_updateUniforms(e,t){let i=this.gl;i.useProgram(this.program),Object.entries(e).forEach(([r,s])=>{let a=this.uniforms.get(r);if(!a){if(t?.allowMissing)return;throw m(20)}let n=`uniform${a.length}${N[a.type]}`;if(a.arrayLength){if(!Array.isArray(s))throw m(10);let o=s.length;if(!o)return;if(o>a.arrayLength)throw m(11);if(s.some(p=>(Array.isArray(p)?p.length:1)!==a.length))throw m(12);let h=s.flat(),l=a.type==="float"?new Float32Array(h):a.type==="uint"?new Uint32Array(h):new Int32Array(h),c=a.location;if(t?.startIndex){let p=i.getUniformLocation(this.program,`${r}[${t.startIndex}]`);if(!p)throw m(13);c=p}i[n+"v"](c,l)}else{Array.isArray(s)||(s=[s]);let o=s;if(o.length!==a.length)throw m(14);i[n](a.location,...o)}}),this.emit("updateUniforms",...arguments)}updateUniforms(e,t){this._updateUniforms(e,t),typeof e.u_time=="number"&&(this.tElapsed=e.u_time,isNaN(this.tStart)||(this.tStart=performance.now())),typeof e.u_frame=="number"&&(this.frame=e.u_frame)}createTex(e,t){let i=this.gl,{width:r,height:s}=t,a=t.history?.depth??0,n=i.createTexture();if(!n)throw m(15);let o=t.unitIndex;if(typeof o!="number")try{o=this.reserveTex(e)}catch(p){throw i.deleteTexture(n),p}let h=a>0,l=h?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D,{options:c}=t;return i.activeTexture(i.TEXTURE0+o),i.bindTexture(l,n),i.texParameteri(l,i.TEXTURE_WRAP_S,c.wrapS),i.texParameteri(l,i.TEXTURE_WRAP_T,c.wrapT),i.texParameteri(l,i.TEXTURE_MIN_FILTER,c.minFilter),i.texParameteri(l,i.TEXTURE_MAG_FILTER,c.magFilter),h?i.texStorage3D(l,1,c.internalFormat,r,s,a):e===g&&i.texImage2D(i.TEXTURE_2D,0,c.internalFormat,r,s,0,c.format,c.type,null),{texture:n,unitIndex:o}}initTex(e,t,i){let r=this.gl;if(this.textures.has(e))throw m(16);let{history:s=0,...a}=i??{},{width:n,height:o}=O(t);if(!n||!o)throw m(17);let h={width:n,height:o,options:t instanceof u&&Object.keys(a).length===0&&t.textures.has(g)?t.textures.get(g).options:this.resolveTexOpts(a)};s>0&&(h.history={depth:s,writeIndex:0});let{texture:l,unitIndex:c}=this.createTex(e,h),p={texture:l,unitIndex:c,...h};s>0&&(this.initializeUniform(`${P(e)}FrameOffset`,"int",0,{allowMissing:!0}),this.clearHistTexLayers(p)),this.textures.set(e,p),e!==g&&e!==v&&this.updateTex(e,t),r.useProgram(this.program);let f=r.getUniformLocation(this.program,P(e));f&&r.uniform1i(f,c)}initializeTexture(e,t,i){let r=i?.history!=null&&i.history>0?{...i,history:i.history+1}:i;this.initTex(e,t,r),this.emit("initializeTexture",...arguments)}updateTextures(e){Object.entries(e).forEach(([t,i])=>{this.updateTex(t,i)}),this.emit("updateTextures",...arguments)}updateTex(e,t,i){let r=this.gl,s=this.textures.get(e);if(!s)throw m(18);if(t instanceof WebGLTexture){r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D,t);return}let a=t;if(t instanceof u){let d=t.textures.get(g),T=d.width,_=d.height;if(t.gl===r){if(!s.history){r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D,d.texture);return}let{depth:L}=s.history,D=i===void 0?[s.history.writeIndex]:Array.isArray(i)?i.map(U=>S(U,L)):[S(i,L)];r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D_ARRAY,s.texture),r.bindFramebuffer(r.READ_FRAMEBUFFER,t.intermediateFbo);for(let U of D)r.copyTexSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,U,0,0,T,_);r.bindFramebuffer(r.READ_FRAMEBUFFER,null),this.updateFrameOffset(e,D[D.length-1],{allowMissing:!0}),i===void 0&&(s.history.writeIndex=(s.history.writeIndex+1)%L);return}let{width:y,height:R,options:{format:w,type:A}}=d,G=this.getPxArray(A,y*R*4);t.gl.bindFramebuffer(t.gl.FRAMEBUFFER,t.intermediateFbo),t.gl.readPixels(0,0,y,R,w,A,G),t.gl.bindFramebuffer(t.gl.FRAMEBUFFER,null),a={data:G,width:y,height:R}}let{width:n,height:o}=O(a);if(!n||!o)return;let h="isPartial"in a&&a.isPartial;h||this.resizeTex(e,n,o);let l="data"in a&&a.data,c=!l&&!s.options?.preserveY,p=r.getParameter(r.UNPACK_FLIP_Y_WEBGL),f=l&&!this.isRgba(s.options.format),E=!l&&s.options.colorSpace&&"unpackColorSpace"in r,b=r.unpackColorSpace,x;if(f&&(x=r.getParameter(r.UNPACK_ALIGNMENT),r.pixelStorei(r.UNPACK_ALIGNMENT,1)),E&&(r.unpackColorSpace=s.options.colorSpace),s.history){r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D_ARRAY,s.texture);let{depth:d}=s.history,T=i===void 0?[s.history.writeIndex]:Array.isArray(i)?i.map(A=>S(A,d)):[S(i,d)];r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,c);let _=a,y=_.data??a,R=h?_.x??0:0,w=h?_.y??0:0;for(let A of T)r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,R,w,A,n,o,1,s.options.format,s.options.type,y);r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,p),this.updateFrameOffset(e,T[T.length-1]),i===void 0&&(s.history.writeIndex=(s.history.writeIndex+1)%d)}else{if(r.activeTexture(r.TEXTURE0+s.unitIndex),r.bindTexture(r.TEXTURE_2D,s.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,c),h){let d=a;r.texSubImage2D(r.TEXTURE_2D,0,d.x??0,d.y??0,n,o,s.options.format,s.options.type,d.data)}else r.texImage2D(r.TEXTURE_2D,0,s.options.internalFormat,n,o,0,s.options.format,s.options.type,a.data??a);r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,p)}E&&(r.unpackColorSpace=b),f&&r.pixelStorei(r.UNPACK_ALIGNMENT,x)}bindIntermediate(){let e=this.gl,t=this.textures.get(g);e.bindFramebuffer(e.FRAMEBUFFER,this.intermediateFbo),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.texture,0)}clear(){this.bindIntermediate();let e=this.gl,t=this.textures.get(g);if(t.options.isIntegerColorFormat){let i=t.options.type;this.uintTypes.has(i)?e.clearBufferuiv(e.COLOR,0,new Uint32Array(4)):e.clearBufferiv(e.COLOR,0,new Int32Array(4))}else e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.emit("preDraw",...arguments);let t=this.gl,i=t.drawingBufferWidth,r=t.drawingBufferHeight;if(e?.skipClear?this.bindIntermediate():this.clear(),t.useProgram(this.program),t.bindVertexArray(this.vao),t.viewport(0,0,i,r),t.drawArrays(t.TRIANGLES,0,3),!this.isHeadless){let s=this.textures.get(g);if(!s.options.isIntegerColorFormat){let a=s.options.colorSpace??"srgb";"drawingBufferColorSpace"in t&&t.drawingBufferColorSpace!==a&&(t.drawingBufferColorSpace=a),t.bindFramebuffer(t.READ_FRAMEBUFFER,this.intermediateFbo),t.bindFramebuffer(t.DRAW_FRAMEBUFFER,null),t.blitFramebuffer(0,0,i,r,0,0,i,r,t.COLOR_BUFFER_BIT,t.NEAREST),t.bindFramebuffer(t.FRAMEBUFFER,null)}}this.emit("postDraw",...arguments)}step(e){this._step(performance.now(),e)}tick(){let e={};this.uniforms.has("u_time")&&(e.u_time=this.tElapsed),this.uniforms.has("u_frame")&&(e.u_frame=this.frame),Object.keys(e).length&&this._updateUniforms(e)}_step(e,t){let i=this.getElapsed(e);this.tElapsed=i,this.tStart=e;let r=typeof t=="function"?t(i,this.frame):t;this.emit("preStep",i,this.frame,r),this.tick(),this.draw(r);let s=this.textures.get(v);if(s&&!r?.skipHistory){let{writeIndex:a,depth:n}=s.history,o=this.gl;o.bindFramebuffer(o.READ_FRAMEBUFFER,this.intermediateFbo),o.bindTexture(o.TEXTURE_2D_ARRAY,s.texture),o.copyTexSubImage3D(o.TEXTURE_2D_ARRAY,0,0,0,a,0,0,o.drawingBufferWidth,o.drawingBufferHeight),o.bindFramebuffer(o.READ_FRAMEBUFFER,null);let h=(a+1)%n;this.updateFrameOffset(v,h,{allowMissing:!0}),s.history.writeIndex=h}++this.frame,this.emit("postStep",i,this.frame,r)}play(e){this._pause();let t=i=>{this._step(i,e),this.frameId!=null&&(this.frameId=requestAnimationFrame(t))};this.frameId=requestAnimationFrame(t),this.emit("play")}getElapsed(e){return isNaN(this.tStart)?this.tElapsed:this.tElapsed+(e-this.tStart)/1e3}_pause(){if(!(isNaN(this.tStart)&&this.frameId==null))return this.frameId!=null&&(cancelAnimationFrame(this.frameId),this.frameId=null),this.tElapsed=this.getElapsed(performance.now()),this.tStart=NaN,!0}pause(){this._pause()&&this.emit("pause")}rewind(){this.frame=0,this.tElapsed=0,this.tStart=NaN,this.tick()}reset(){this.rewind(),this.textures.forEach((e,t)=>{this.resetHist(t,e)}),this.clear(),this.emit("reset")}destroy(){this.emit("destroy"),this._pause();let e=this.gl;this.cursorTgt&&(this.listeners.forEach((i,r)=>{this.cursorTgt.removeEventListener(r,i)}),this.listeners.clear()),this.resObserver&&(this.resObserver.disconnect(),this.resObserver=null),this.program&&(e.deleteProgram(this.program),this.program=null),this.intermediateFbo&&(e.deleteFramebuffer(this.intermediateFbo),this.intermediateFbo=null),this.textures.forEach(i=>{this.texPool.free.push(i.unitIndex),e.deleteTexture(i.texture)}),this.textures.clear();let t=F.get(this.canvas);t&&(t.instances.delete(this),t.instances.size===0&&F.delete(this.canvas)),this.vao&&(e.deleteVertexArray(this.vao),this.vao=null),this.buffer&&(e.deleteBuffer(this.buffer),this.buffer=null),this.uniforms.clear(),this.hooks.clear()}},Y=I;export{Y as a};
5
+ //# sourceMappingURL=chunk-745KVZYV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { safeMod, spError } from './internal/util';\n\nconst DEFAULT_VERTEX_SHADER_SRC = `#version 300 es\nin vec2 a_position;out vec2 v_uv;void main(){gl_Position=vec4(a_position,0.,1.);v_uv=a_position*.5+.5;}`;\n\ninterface Uniform {\n\ttype: 'float' | 'int' | 'uint';\n\tlength: 1 | 2 | 3 | 4;\n\tlocation: WebGLUniformLocation;\n\tarrayLength?: number;\n}\n\ntype GLInternalFormatChannels = 'R' | 'RG' | 'RGB' | 'RGBA';\ntype GLInternalFormatDepth = '8' | '16F' | '32F' | '8UI' | '8I' | '16UI' | '16I' | '32UI' | '32I';\nexport type GLInternalFormatString = `${GLInternalFormatChannels}${GLInternalFormatDepth}`;\n\nexport type GLFormatString =\n\t| 'RED'\n\t| 'RG'\n\t| 'RGB'\n\t| 'RGBA'\n\t| 'RED_INTEGER'\n\t| 'RG_INTEGER'\n\t| 'RGB_INTEGER'\n\t| 'RGBA_INTEGER';\nexport type GLTypeString =\n\t| 'UNSIGNED_BYTE'\n\t| 'BYTE'\n\t| 'FLOAT'\n\t| 'HALF_FLOAT'\n\t| 'UNSIGNED_SHORT'\n\t| 'SHORT'\n\t| 'UNSIGNED_INT'\n\t| 'INT';\nexport type GLFilterString = 'LINEAR' | 'NEAREST';\nexport type GLWrapString = 'CLAMP_TO_EDGE' | 'REPEAT' | 'MIRRORED_REPEAT';\nexport type ColorSpace = PredefinedColorSpace;\n\nconst FORMAT_TYPE_SUFFIXES: [string, GLTypeString][] = [\n\t['8UI', 'UNSIGNED_BYTE'],\n\t['8I', 'BYTE'],\n\t['16UI', 'UNSIGNED_SHORT'],\n\t['16I', 'SHORT'],\n\t['16F', 'HALF_FLOAT'],\n\t['32UI', 'UNSIGNED_INT'],\n\t['32I', 'INT'],\n\t['32F', 'FLOAT'],\n\t['8', 'UNSIGNED_BYTE'],\n];\n\nconst UNIFORM_TYPE_SUFFIXES: Record<Uniform['type'], string> = {\n\tfloat: 'f',\n\tint: 'i',\n\tuint: 'ui',\n};\n\nfunction typeFromInternalFormatString(internalFormatString?: GLInternalFormatString): GLTypeString | undefined {\n\treturn internalFormatString && FORMAT_TYPE_SUFFIXES.find(([suffix]) => internalFormatString.endsWith(suffix))?.[1];\n}\n\ntype GLConstantString = GLInternalFormatString | GLFormatString | GLTypeString | GLFilterString | GLWrapString;\n\nexport interface TextureOptions {\n\tinternalFormat?: GLInternalFormatString;\n\tformat?: GLFormatString;\n\ttype?: GLTypeString;\n\tminFilter?: GLFilterString;\n\tmagFilter?: GLFilterString;\n\twrapS?: GLWrapString;\n\twrapT?: GLWrapString;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n}\ntype ResolvedTextureOptions = {\n\ttype: number;\n\tformat: number;\n\tinternalFormat: number;\n\tminFilter: number;\n\tmagFilter: number;\n\twrapS: number;\n\twrapT: number;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n\tisIntegerColorFormat: boolean;\n};\n\ninterface Texture {\n\ttexture: WebGLTexture;\n\tunitIndex: number;\n\twidth: number;\n\theight: number;\n\thistory?: {\n\t\tdepth: number;\n\t\twriteIndex: number;\n\t};\n\toptions: ResolvedTextureOptions;\n}\n\nexport interface CustomTexture {\n\tdata: ArrayBufferView | null;\n\twidth: number;\n\theight: number;\n}\n\nexport interface PartialCustomTexture extends CustomTexture {\n\tisPartial?: boolean;\n\tx?: number;\n\ty?: number;\n}\n\nexport interface InitializeTextureOptions extends TextureOptions {\n\thistory?: number;\n}\n\nexport type TextureSource =\n\t| HTMLImageElement\n\t| HTMLVideoElement\n\t| HTMLCanvasElement\n\t| OffscreenCanvas\n\t| ImageBitmap\n\t| WebGLTexture\n\t| CustomTexture\n\t| ShaderPad;\n\n// Custom textures allow partial updates starting from (x, y).\nexport type UpdateTextureSource = Exclude<TextureSource, CustomTexture> | PartialCustomTexture;\n\nexport interface PluginContext {\n\tinjectGLSL: (code: string) => void;\n\temit: (name: ShaderPadEventName, ...args: any[]) => void;\n\tupdateTexture: (name: string, source: UpdateTextureSource, historySlots?: HistorySlots) => void;\n}\n\nexport type Plugin = (shaderPad: ShaderPad, context: PluginContext) => void;\n\nexport type ShaderPadEventName =\n\t| '_init'\n\t| 'initializeTexture'\n\t| 'initializeUniform'\n\t| 'updateTextures'\n\t| 'updateUniforms'\n\t| 'preStep'\n\t| 'postStep'\n\t| 'preDraw'\n\t| 'postDraw'\n\t| 'updateResolution'\n\t| 'play'\n\t| 'pause'\n\t| 'reset'\n\t| 'destroy'\n\t| `${string}:${string}`;\n\nexport type RenderTextureOptions = Omit<TextureOptions, 'preserveY'>;\n\nexport interface Options extends RenderTextureOptions {\n\tcanvas?: HTMLCanvasElement | OffscreenCanvas | { width: number; height: number } | null;\n\tplugins?: Plugin[];\n\thistory?: number;\n\tcursorTarget?: Window | Element;\n}\n\nexport interface StepOptions {\n\tskipClear?: boolean;\n\tskipHistory?: boolean;\n}\n\ntype HistorySlots = number | number[];\n\ntype TextureUnitPool = {\n\tfree: number[];\n\tnext: number;\n\tmax: number;\n};\n\nconst HISTORY_TEXTURE_KEY = Symbol('u_history');\nconst INTERMEDIATE_TEXTURE_KEY = Symbol('__SHADERPAD_BUFFER');\n\nconst canvasRegistry = new WeakMap<\n\tHTMLCanvasElement | OffscreenCanvas,\n\t{ texPool: TextureUnitPool; instances: Set<ShaderPad> }\n>();\n\nfunction combineShaderCode(shader: string, injections: string[]): string {\n\tif (!injections?.length) return shader;\n\tconst lines = shader.split('\\n');\n\tconst insertAt =\n\t\tlines.findLastIndex(line => {\n\t\t\tconst trimmed = line.trimStart();\n\t\t\treturn trimmed.startsWith('precision ') || trimmed.startsWith('#version ');\n\t\t}) + 1;\n\tlines.splice(insertAt, 0, ...injections);\n\treturn lines.join('\\n');\n}\n\nfunction getSourceDimensions(source: TextureSource): {\n\twidth: number;\n\theight: number;\n} {\n\tif (source instanceof WebGLTexture) {\n\t\treturn { width: 0, height: 0 }; // Invalid - dimensions not readable.\n\t}\n\tif (source instanceof ShaderPad) {\n\t\treturn { width: source.canvas.width, height: source.canvas.height };\n\t}\n\tif (source instanceof HTMLVideoElement) {\n\t\treturn { width: source.videoWidth, height: source.videoHeight };\n\t}\n\tif (source instanceof HTMLImageElement) {\n\t\treturn {\n\t\t\twidth: source.naturalWidth ?? source.width,\n\t\t\theight: source.naturalHeight ?? source.height,\n\t\t};\n\t}\n\t// CustomTexture, HTMLCanvasElement, OffscreenCanvas, ImageBitmap.\n\treturn { width: source.width, height: source.height };\n}\n\nfunction stringFrom(name: string | symbol) {\n\treturn typeof name === 'symbol' ? (name.description ?? '') : name;\n}\n\nclass ShaderPad {\n\tprivate isHeadless = false;\n\tprivate isTouch = false;\n\tdeclare public readonly gl: WebGL2RenderingContext;\n\tdeclare private typeArrays: Map<number, new (length: number) => ArrayBufferView>;\n\tdeclare private typeFormats: Map<number, GLInternalFormatString>;\n\tdeclare private uintTypes: Set<number>;\n\tprivate uniforms: Map<string, Uniform> = new Map();\n\tprivate textures: Map<string | symbol, Texture> = new Map();\n\tdeclare private texPool: TextureUnitPool;\n\tprivate buffer: WebGLBuffer | null = null;\n\tprivate vao: WebGLVertexArrayObject | null = null;\n\tprivate program: WebGLProgram | null = null;\n\tdeclare private frameId: number | null;\n\tprivate listeners: Map<string, EventListener> = new Map();\n\tprivate frame = 0;\n\tprivate tElapsed = 0;\n\tprivate tStart = NaN;\n\tprivate cursorPos = [0.5, 0.5];\n\tprivate clickPos = [0.5, 0.5];\n\tprivate isClicked = false;\n\tdeclare public canvas: HTMLCanvasElement | OffscreenCanvas;\n\tprivate resObserver: MutationObserver | null = null;\n\tprivate hooks: Map<ShaderPadEventName, Function[]> = new Map();\n\tprivate historyDepth = 0;\n\tdeclare private texOptions: TextureOptions;\n\tdeclare private cursorTgt: Window | Element | undefined;\n\t// WebGL can’t read from and write to the history texture at the same time.\n\t// We write to an intermediate texture then blit to the history texture.\n\tprivate intermediateFbo: WebGLFramebuffer | null = null;\n\n\tconstructor(fragmentShaderSrc: string, { canvas, plugins, history, cursorTarget, ...texOptions }: Options = {}) {\n\t\tif (canvas && 'getContext' in canvas) {\n\t\t\tthis.canvas = canvas;\n\t\t} else {\n\t\t\tconst { width = 1, height = 1 } = canvas || {};\n\t\t\tthis.canvas = new OffscreenCanvas(width, height);\n\t\t\tthis.isHeadless = true;\n\t\t}\n\n\t\tconst gl = this.canvas.getContext('webgl2', {\n\t\t\tantialias: false,\n\t\t}) as WebGL2RenderingContext;\n\t\tif (!gl) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(0, {\n\t\t\t\t\t\tcanvasType: this.canvas.constructor.name,\n\t\t\t\t\t\tisHeadless: this.isHeadless,\n\t\t\t\t\t\tcanvasWidth: this.canvas.width,\n\t\t\t\t\t\tcanvasHeight: this.canvas.height,\n\t\t\t\t\t})\n\t\t\t\t: spError(0);\n\t\t}\n\t\tthis.gl = gl;\n\t\tthis.typeArrays = new Map<number, new (length: number) => ArrayBufferView>([\n\t\t\t[gl.FLOAT, Float32Array],\n\t\t\t[gl.HALF_FLOAT, Uint16Array],\n\t\t\t[gl.UNSIGNED_SHORT, Uint16Array],\n\t\t\t[gl.SHORT, Int16Array],\n\t\t\t[gl.BYTE, Int8Array],\n\t\t\t[gl.UNSIGNED_INT, Uint32Array],\n\t\t\t[gl.INT, Int32Array],\n\t\t]);\n\t\tthis.typeFormats = new Map<number, GLInternalFormatString>([\n\t\t\t[gl.FLOAT, 'RGBA32F'],\n\t\t\t[gl.HALF_FLOAT, 'RGBA16F'],\n\t\t\t[gl.UNSIGNED_SHORT, 'RGBA32UI'],\n\t\t\t[gl.SHORT, 'RGBA32I'],\n\t\t\t[gl.BYTE, 'RGBA32I'],\n\t\t\t[gl.UNSIGNED_INT, 'RGBA32UI'],\n\t\t\t[gl.INT, 'RGBA32I'],\n\t\t]);\n\t\tthis.uintTypes = new Set([gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT]);\n\n\t\tlet registryEntry = canvasRegistry.get(this.canvas);\n\t\tif (!registryEntry) {\n\t\t\tregistryEntry = {\n\t\t\t\ttexPool: {\n\t\t\t\t\tfree: [],\n\t\t\t\t\tnext: 0,\n\t\t\t\t\tmax: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n\t\t\t\t},\n\t\t\t\tinstances: new Set([this]),\n\t\t\t};\n\t\t\tcanvasRegistry.set(this.canvas, registryEntry);\n\t\t}\n\t\tthis.texPool = registryEntry.texPool;\n\t\tregistryEntry.instances.add(this);\n\n\t\tthis.texOptions = texOptions;\n\n\t\tif (history) this.historyDepth = history;\n\t\tthis.cursorTgt = cursorTarget ?? (this.canvas instanceof HTMLCanvasElement ? this.canvas : undefined);\n\t\tthis.frameId = null;\n\n\t\tconst glslInjections: string[] = [];\n\t\tif (plugins) {\n\t\t\tplugins.forEach(plugin =>\n\t\t\t\tplugin(this, {\n\t\t\t\t\tinjectGLSL: (code: string) => {\n\t\t\t\t\t\tglslInjections.push(code);\n\t\t\t\t\t},\n\t\t\t\t\temit: this.emit.bind(this),\n\t\t\t\t\tupdateTexture: this.updateTex.bind(this),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst program = gl.createProgram();\n\t\tif (!program) {\n\t\t\tthrow spError(1);\n\t\t}\n\t\tthis.program = program;\n\n\t\tconst vertexShader = this.createShader(gl.VERTEX_SHADER, DEFAULT_VERTEX_SHADER_SRC);\n\t\tconst fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tcombineShaderCode(fragmentShaderSrc, glslInjections),\n\t\t);\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.bindAttribLocation(program, 0, 'a_position');\n\t\tgl.linkProgram(program);\n\t\tgl.deleteShader(vertexShader);\n\t\tgl.deleteShader(fragmentShader);\n\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst linkError = __SHADERPAD_DEV__\n\t\t\t\t? spError(2, {\n\t\t\t\t\t\tprogramInfoLog: gl.getProgramInfoLog(program),\n\t\t\t\t\t\tfragmentShaderLength: fragmentShaderSrc.length,\n\t\t\t\t\t\tglslInjectionCount: glslInjections.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(2);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow linkError;\n\t\t}\n\n\t\tthis.vao = gl.createVertexArray();\n\t\tgl.bindVertexArray(this.vao);\n\t\tthis.buffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(0);\n\t\tgl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n\t\tgl.useProgram(program);\n\n\t\tif (this.canvas instanceof HTMLCanvasElement) {\n\t\t\tthis.resObserver = new MutationObserver(() => this.syncRes());\n\t\t\tthis.resObserver.observe(this.canvas, {\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: ['width', 'height'],\n\t\t\t});\n\t\t} else {\n\t\t\tconst wrapDimension = (dimension: 'width' | 'height') => {\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype, dimension)!;\n\t\t\t\tconst canvas = this.canvas;\n\t\t\t\tObject.defineProperty(canvas, dimension, {\n\t\t\t\t\tget: () => descriptor.get!.call(canvas),\n\t\t\t\t\tset: v => {\n\t\t\t\t\t\tdescriptor.set!.call(canvas, v);\n\t\t\t\t\t\tconst entry = canvasRegistry.get(canvas);\n\t\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t\tfor (const instance of entry.instances) {\n\t\t\t\t\t\t\t\tinstance.syncRes();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconfigurable: descriptor.configurable,\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t});\n\t\t\t};\n\t\t\twrapDimension('width');\n\t\t\twrapDimension('height');\n\t\t}\n\t\tthis.syncRes();\n\n\t\tthis.initializeUniform('u_cursor', 'float', this.cursorPos, { allowMissing: true });\n\t\tthis.initializeUniform('u_click', 'float', [...this.clickPos, this.isClicked ? 1.0 : 0.0], {\n\t\t\tallowMissing: true,\n\t\t});\n\t\tthis.initializeUniform('u_time', 'float', 0, { allowMissing: true });\n\t\tthis.initializeUniform('u_frame', 'int', 0, { allowMissing: true });\n\n\t\tthis.initTex(INTERMEDIATE_TEXTURE_KEY, this.canvas, {\n\t\t\t...this.texOptions,\n\t\t});\n\t\tthis.intermediateFbo = gl.createFramebuffer();\n\t\tthis.bindIntermediate();\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.initTex(HISTORY_TEXTURE_KEY, this.canvas, {\n\t\t\t\thistory: this.historyDepth,\n\t\t\t\t...this.texOptions,\n\t\t\t});\n\t\t}\n\t\tthis.addListeners();\n\t\tthis.emit('_init');\n\t}\n\n\tprivate resolveGLConst(value: GLConstantString): number {\n\t\tconst gl = this.gl;\n\t\tconst resolved = gl[value];\n\t\tif (resolved === undefined) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(3, { value }) : spError(3);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\tprivate emit(name: ShaderPadEventName, ...args: any[]) {\n\t\tthis.hooks.get(name)?.forEach(hook => hook.call(this, ...args));\n\t}\n\n\ton(name: ShaderPadEventName, fn: Function) {\n\t\tif (!this.hooks.has(name)) {\n\t\t\tthis.hooks.set(name, []);\n\t\t}\n\t\tthis.hooks.get(name)!.push(fn);\n\t}\n\n\toff(name: ShaderPadEventName, fn: Function) {\n\t\tconst hooks = this.hooks.get(name);\n\t\tif (hooks) {\n\t\t\tconst index = hooks.indexOf(fn);\n\t\t\tif (index >= 0) {\n\t\t\t\thooks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createShader(type: number, source: string): WebGLShader {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type)!;\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tconsole.error(gl.getShaderInfoLog(shader));\n\t\t\tconst compilationError = __SHADERPAD_DEV__\n\t\t\t\t? spError(4, {\n\t\t\t\t\t\tshaderType: type === gl.VERTEX_SHADER ? 'vertex' : 'fragment',\n\t\t\t\t\t\tsource,\n\t\t\t\t\t})\n\t\t\t\t: spError(4);\n\t\t\tgl.deleteShader(shader);\n\t\t\tthrow compilationError;\n\t\t}\n\t\treturn shader;\n\t}\n\n\tprivate getCursorTgtRect(): {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t} {\n\t\tconst target = this.cursorTgt!;\n\t\tif (target === window) {\n\t\t\treturn {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: window.innerWidth,\n\t\t\t\theight: window.innerHeight,\n\t\t\t};\n\t\t}\n\t\treturn (target as Element).getBoundingClientRect();\n\t}\n\n\tprivate addListeners() {\n\t\tif (!this.cursorTgt) return;\n\t\tconst updateCursor = (x: number, y: number) => {\n\t\t\tif (!this.uniforms.has('u_cursor')) return;\n\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\tconst u = (x - rect.left) / rect.width;\n\t\t\tconst v = 1 - (y - rect.top) / rect.height; // Flip Y for WebGL\n\t\t\tthis.cursorPos[0] = Math.max(0, Math.min(1, u));\n\t\t\tthis.cursorPos[1] = Math.max(0, Math.min(1, v));\n\t\t\tthis.updateUniforms({ u_cursor: this.cursorPos });\n\t\t};\n\n\t\tconst updateClick = (isClicked: boolean, x?: number, y?: number) => {\n\t\t\tif (!this.uniforms.has('u_click')) return;\n\t\t\tthis.isClicked = isClicked;\n\t\t\tif (isClicked) {\n\t\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\t\tconst xVal = x as number;\n\t\t\t\tconst yVal = y as number;\n\t\t\t\tthis.clickPos[0] = Math.max(0, Math.min(1, (xVal - rect.left) / rect.width));\n\t\t\t\tthis.clickPos[1] = Math.max(0, Math.min(1, 1 - (yVal - rect.top) / rect.height)); // Flip Y for WebGL\n\t\t\t}\n\t\t\tthis.updateUniforms({\n\t\t\t\tu_click: [...this.clickPos, this.isClicked ? 1.0 : 0.0],\n\t\t\t});\n\t\t};\n\n\t\tthis.listeners.set('mousemove', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tupdateCursor(mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mousedown', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tthis.isClicked = true;\n\t\t\t\t\tupdateClick(true, mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mouseup', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tupdateClick(false);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchmove', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchstart', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tthis.isTouch = true;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t\tupdateClick(true, touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchend', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length === 0) {\n\t\t\t\tupdateClick(false);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.forEach((listener, event) => {\n\t\t\tthis.cursorTgt!.addEventListener(event, listener);\n\t\t});\n\t}\n\n\tprivate syncRes() {\n\t\tconst gl = this.gl;\n\t\tconst resolution: [number, number] = [gl.drawingBufferWidth, gl.drawingBufferHeight];\n\t\tgl.viewport(0, 0, ...resolution);\n\t\tif (this.uniforms.has('u_resolution')) {\n\t\t\tthis.updateUniforms({ u_resolution: resolution });\n\t\t} else {\n\t\t\tthis.initializeUniform('u_resolution', 'float', resolution, { allowMissing: true });\n\t\t}\n\t\tthis.resizeTex(INTERMEDIATE_TEXTURE_KEY, ...resolution);\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.resizeTex(HISTORY_TEXTURE_KEY, ...resolution);\n\t\t}\n\t\tthis.emit('updateResolution', ...resolution);\n\t}\n\n\tprivate resizeTex(name: string | symbol, width: number, height: number) {\n\t\tconst info = this.textures.get(name);\n\t\tif (!info || (info.width === width && info.height === height)) return;\n\n\t\tconst gl = this.gl;\n\t\tgl.deleteTexture(info.texture);\n\t\tinfo.width = width;\n\t\tinfo.height = height;\n\t\tconst { texture } = this.createTex(name, info);\n\t\tinfo.texture = texture;\n\t\tthis.resetHist(name, info);\n\t}\n\n\tprivate reserveTex(name: string | symbol) {\n\t\tconst existing = this.textures.get(name);\n\t\tif (existing) return existing.unitIndex;\n\t\tif (this.texPool.free.length > 0) return this.texPool.free.pop()!;\n\t\tif (this.texPool.next >= this.texPool.max) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(5, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\tnextTextureUnit: this.texPool.next,\n\t\t\t\t\t\tmaxTextureUnits: this.texPool.max,\n\t\t\t\t\t\tfreeTextureUnits: this.texPool.free.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(5);\n\t\t}\n\t\treturn this.texPool.next++;\n\t}\n\n\tprivate resolveTexOpts(options?: TextureOptions): ResolvedTextureOptions {\n\t\tconst { gl } = this;\n\t\tconst internalFormatOption = options?.internalFormat;\n\t\tconst typeString = options?.type ?? typeFromInternalFormatString(internalFormatOption) ?? 'UNSIGNED_BYTE';\n\t\tconst type = this.resolveGLConst(typeString);\n\t\tconst internalFormatString = internalFormatOption ?? this.typeFormats.get(type) ?? 'RGBA8';\n\t\tconst isIntegerColorFormat = /^(R|RG|RGB|RGBA)(8|16|32)(UI|I)$/.test(internalFormatString);\n\t\tconst formatString = options?.format ?? (isIntegerColorFormat ? 'RGBA_INTEGER' : 'RGBA');\n\t\tconst result: ResolvedTextureOptions = {\n\t\t\ttype,\n\t\t\tformat: this.resolveGLConst(formatString),\n\t\t\tinternalFormat: this.resolveGLConst(internalFormatString),\n\t\t\tminFilter: this.resolveGLConst(options?.minFilter ?? 'LINEAR'),\n\t\t\tmagFilter: this.resolveGLConst(options?.magFilter ?? 'LINEAR'),\n\t\t\twrapS: this.resolveGLConst(options?.wrapS ?? 'CLAMP_TO_EDGE'),\n\t\t\twrapT: this.resolveGLConst(options?.wrapT ?? 'CLAMP_TO_EDGE'),\n\t\t\tcolorSpace: options?.colorSpace,\n\t\t\tpreserveY: options?.preserveY,\n\t\t\tisIntegerColorFormat,\n\t\t};\n\t\tconst isFloatColorFormat = result.internalFormat === gl.RGBA16F || result.internalFormat === gl.RGBA32F;\n\t\t// gl.getExtension isn’t just a check, it’s a required side-effect to enable floats.\n\t\tif (isFloatColorFormat && !gl.getExtension('EXT_color_buffer_float')) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(6, {\n\t\t\t\t\t\tinternalFormat: internalFormatString,\n\t\t\t\t\t\ttype: typeString,\n\t\t\t\t\t})\n\t\t\t\t: spError(6);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate getPxArray(type: number, size: number): ArrayBufferView {\n\t\tconst ArrayType = this.typeArrays.get(type) ?? Uint8Array;\n\t\treturn new ArrayType(size);\n\t}\n\n\tprivate isRgba(format: number): boolean {\n\t\tconst gl = this.gl;\n\t\treturn format === gl.RGBA || format === gl.RGBA_INTEGER;\n\t}\n\n\tprivate clearHistTexLayers(textureInfo: Texture): void {\n\t\tif (!textureInfo.history) return;\n\n\t\tconst gl = this.gl;\n\t\tconst { type, format } = textureInfo.options;\n\t\tconst transparent = this.getPxArray(type, textureInfo.width * textureInfo.height * 4);\n\t\tgl.activeTexture(gl.TEXTURE0 + textureInfo.unitIndex);\n\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, textureInfo.texture);\n\t\tconst needsAlignmentFix = !this.isRgba(format);\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tfor (let layer = 0; layer < textureInfo.history.depth; ++layer) {\n\t\t\tgl.texSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tlayer,\n\t\t\t\ttextureInfo.width,\n\t\t\t\ttextureInfo.height,\n\t\t\t\t1,\n\t\t\t\tformat,\n\t\t\t\ttype,\n\t\t\t\ttransparent,\n\t\t\t);\n\t\t}\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate updateFrameOffset(\n\t\tname: string | symbol,\n\t\tframeOffset: number,\n\t\toptions?: {\n\t\t\tallowMissing?: boolean;\n\t\t},\n\t) {\n\t\tthis.updateUniforms(\n\t\t\t{\n\t\t\t\t[`${stringFrom(name)}FrameOffset`]: frameOffset,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tprivate resetHist(name: string | symbol, textureInfo: Texture) {\n\t\tif (!textureInfo.history) return;\n\t\ttextureInfo.history.writeIndex = 0;\n\t\tthis.clearHistTexLayers(textureInfo);\n\t\tthis.updateFrameOffset(name, 0, { allowMissing: true });\n\t}\n\n\tinitializeUniform(\n\t\tname: string,\n\t\ttype: Uniform['type'],\n\t\tvalue: number | number[] | (number | number[])[],\n\t\toptions?: { arrayLength?: number; allowMissing?: boolean },\n\t) {\n\t\tconst arrayLength = options?.arrayLength;\n\t\tconst allowMissing = options?.allowMissing ?? false;\n\t\tif (this.uniforms.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(7, { name, arrayLength: arrayLength ?? null }) : spError(7);\n\t\t}\n\t\tif (!UNIFORM_TYPE_SUFFIXES[type]) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(8, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tsupportedTypes: Object.keys(UNIFORM_TYPE_SUFFIXES),\n\t\t\t\t\t})\n\t\t\t\t: spError(8);\n\t\t}\n\t\tif (arrayLength && !(Array.isArray(value) && value.length === arrayLength)) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(9, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\texpectedLength: arrayLength,\n\t\t\t\t\t\treceivedLength: Array.isArray(value) ? value.length : 1,\n\t\t\t\t\t})\n\t\t\t\t: spError(9);\n\t\t}\n\n\t\tconst gl = this.gl;\n\t\tlet location = gl.getUniformLocation(this.program!, name);\n\t\tif (!location && arrayLength) {\n\t\t\tlocation = gl.getUniformLocation(this.program!, `${name}[0]`);\n\t\t}\n\t\tif (!location) {\n\t\t\tif (allowMissing) return;\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(19, { name, arrayLength: arrayLength ?? null }) : spError(19);\n\t\t}\n\n\t\tconst probeValue = arrayLength ? (value as number[] | number[][])[0] : value;\n\t\tconst length = Array.isArray(probeValue) ? (probeValue.length as 1 | 2 | 3 | 4) : 1;\n\t\tthis.uniforms.set(name, { type, length, location, arrayLength });\n\n\t\ttry {\n\t\t\tthis.updateUniforms({ [name]: value });\n\t\t} catch (error) {\n\t\t\tthis.uniforms.delete(name);\n\t\t\tthrow error;\n\t\t}\n\t\tthis.emit('initializeUniform', ...arguments);\n\t}\n\n\tprivate _updateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tObject.entries(updates).forEach(([name, newValue]) => {\n\t\t\tconst uniform = this.uniforms.get(name);\n\t\t\tif (!uniform) {\n\t\t\t\tif (options?.allowMissing) return;\n\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t? spError(20, {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tstartIndex: options?.startIndex ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: spError(20);\n\t\t\t}\n\t\t\tlet glFunctionName = `uniform${uniform.length}${UNIFORM_TYPE_SUFFIXES[uniform.type]}`;\n\t\t\tif (uniform.arrayLength) {\n\t\t\t\tif (!Array.isArray(newValue)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(10, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedType: typeof newValue,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(10);\n\t\t\t\t}\n\t\t\t\tconst nValues = newValue.length;\n\t\t\t\tif (!nValues) return;\n\t\t\t\tif (nValues > uniform.arrayLength) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(11, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: nValues,\n\t\t\t\t\t\t\t\tmaxLength: uniform.arrayLength,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(11);\n\t\t\t\t}\n\t\t\t\tif (newValue.some(item => (Array.isArray(item) ? item.length : 1) !== uniform.length)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(12, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\texpectedElementLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(12);\n\t\t\t\t}\n\t\t\t\tconst flat = newValue.flat();\n\t\t\t\tconst typedArray =\n\t\t\t\t\tuniform.type === 'float'\n\t\t\t\t\t\t? new Float32Array(flat)\n\t\t\t\t\t\t: uniform.type === 'uint'\n\t\t\t\t\t\t\t? new Uint32Array(flat)\n\t\t\t\t\t\t\t: new Int32Array(flat);\n\t\t\t\tlet location = uniform.location;\n\t\t\t\tif (options?.startIndex) {\n\t\t\t\t\tconst newLocation = gl.getUniformLocation(this.program!, `${name}[${options.startIndex}]`);\n\t\t\t\t\tif (!newLocation) {\n\t\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t\t? spError(13, {\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tstartIndex: options.startIndex,\n\t\t\t\t\t\t\t\t\tarrayLength: uniform.arrayLength,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: spError(13);\n\t\t\t\t\t}\n\t\t\t\t\tlocation = newLocation;\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName + 'v'](location, typedArray);\n\t\t\t} else {\n\t\t\t\tif (!Array.isArray(newValue)) newValue = [newValue];\n\t\t\t\tconst scalarValue = newValue as number[];\n\t\t\t\tif (scalarValue.length !== uniform.length) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(14, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: scalarValue.length,\n\t\t\t\t\t\t\t\texpectedLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(14);\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName](uniform.location, ...scalarValue);\n\t\t\t}\n\t\t});\n\t\tthis.emit('updateUniforms', ...arguments);\n\t}\n\n\tupdateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tthis._updateUniforms(updates, options);\n\n\t\tif (typeof updates.u_time === 'number') {\n\t\t\tthis.tElapsed = updates.u_time;\n\t\t\tif (!isNaN(this.tStart)) this.tStart = performance.now();\n\t\t}\n\t\tif (typeof updates.u_frame === 'number') this.frame = updates.u_frame;\n\t}\n\n\tprivate createTex(\n\t\tname: string | symbol,\n\t\ttextureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> & { unitIndex?: number },\n\t) {\n\t\tconst gl = this.gl;\n\t\tconst { width, height } = textureInfo;\n\t\tconst historyDepth = textureInfo.history?.depth ?? 0;\n\n\t\tconst texture = gl.createTexture();\n\t\tif (!texture) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(15, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\thistoryDepth,\n\t\t\t\t\t})\n\t\t\t\t: spError(15);\n\t\t}\n\n\t\tlet unitIndex = textureInfo.unitIndex;\n\t\tif (typeof unitIndex !== 'number') {\n\t\t\ttry {\n\t\t\t\tunitIndex = this.reserveTex(name);\n\t\t\t} catch (error) {\n\t\t\t\tgl.deleteTexture(texture);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst hasHistory = historyDepth > 0;\n\t\tconst textureTarget = hasHistory ? gl.TEXTURE_2D_ARRAY : gl.TEXTURE_2D;\n\t\tconst { options } = textureInfo;\n\t\tgl.activeTexture(gl.TEXTURE0 + unitIndex);\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, options.wrapS);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, options.wrapT);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, options.minFilter);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, options.magFilter);\n\t\tif (hasHistory) {\n\t\t\tgl.texStorage3D(textureTarget, 1, options.internalFormat, width, height, historyDepth);\n\t\t} else if (name === INTERMEDIATE_TEXTURE_KEY) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\toptions.internalFormat,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\toptions.format,\n\t\t\t\toptions.type,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\treturn { texture, unitIndex };\n\t}\n\n\tprivate initTex(name: string | symbol, source: TextureSource, options?: InitializeTextureOptions) {\n\t\tconst gl = this.gl;\n\t\tif (this.textures.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(16, { name: stringFrom(name) }) : spError(16);\n\t\t}\n\n\t\tconst { history: historyDepth = 0, ...texOptions } = options ?? {};\n\t\tconst { width, height } = getSourceDimensions(source);\n\t\tif (!width || !height) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(17, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tsourceType: source.constructor.name,\n\t\t\t\t\t})\n\t\t\t\t: spError(17);\n\t\t}\n\t\tconst textureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> = {\n\t\t\twidth,\n\t\t\theight,\n\t\t\toptions:\n\t\t\t\tsource instanceof ShaderPad &&\n\t\t\t\tObject.keys(texOptions).length === 0 &&\n\t\t\t\tsource.textures.has(INTERMEDIATE_TEXTURE_KEY)\n\t\t\t\t\t? source.textures.get(INTERMEDIATE_TEXTURE_KEY)!.options\n\t\t\t\t\t: this.resolveTexOpts(texOptions),\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\ttextureInfo.history = { depth: historyDepth, writeIndex: 0 };\n\t\t}\n\t\tconst { texture, unitIndex } = this.createTex(name, textureInfo);\n\t\tconst completeTextureInfo: Texture = {\n\t\t\ttexture,\n\t\t\tunitIndex,\n\t\t\t...textureInfo,\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\tthis.initializeUniform(`${stringFrom(name)}FrameOffset`, 'int', 0, { allowMissing: true });\n\t\t\tthis.clearHistTexLayers(completeTextureInfo);\n\t\t}\n\t\tthis.textures.set(name, completeTextureInfo);\n\t\tif (name !== INTERMEDIATE_TEXTURE_KEY && name !== HISTORY_TEXTURE_KEY) {\n\t\t\tthis.updateTex(name, source);\n\t\t}\n\n\t\t// Set a uniform to access the texture in the fragment shader.\n\t\tgl.useProgram(this.program!);\n\t\tconst uSampler = gl.getUniformLocation(this.program!, stringFrom(name));\n\t\tif (uSampler) {\n\t\t\tgl.uniform1i(uSampler, unitIndex);\n\t\t}\n\t}\n\n\tinitializeTexture(name: string, source: TextureSource, options?: InitializeTextureOptions) {\n\t\t// Since history[0] is the current frame, add 1 to history depth to allow history[maxHistory].\n\t\tconst opts =\n\t\t\toptions?.history != null && options.history > 0 ? { ...options, history: options.history + 1 } : options;\n\t\tthis.initTex(name, source, opts);\n\t\tthis.emit('initializeTexture', ...arguments);\n\t}\n\n\tupdateTextures(updates: Record<string, UpdateTextureSource>) {\n\t\tObject.entries(updates).forEach(([name, source]) => {\n\t\t\tthis.updateTex(name, source);\n\t\t});\n\t\tthis.emit('updateTextures', ...arguments);\n\t}\n\n\tprivate updateTex(name: string | symbol, source: UpdateTextureSource, historySlots?: HistorySlots) {\n\t\tconst gl = this.gl;\n\t\tconst info = this.textures.get(name);\n\t\tif (!info) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(18, { name: stringFrom(name) }) : spError(18);\n\t\t}\n\n\t\tif (source instanceof WebGLTexture) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, source);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nonShaderPadSource = source as Exclude<UpdateTextureSource, ShaderPad>;\n\t\tif (source instanceof ShaderPad) {\n\t\t\tconst sourceIntermediateInfo = source.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tconst srcW = sourceIntermediateInfo.width;\n\t\t\tconst srcH = sourceIntermediateInfo.height;\n\n\t\t\tif (source.gl === gl) {\n\t\t\t\tif (!info.history) {\n\t\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, sourceIntermediateInfo.texture);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { depth } = info.history;\n\t\t\t\tconst targetSlots =\n\t\t\t\t\thistorySlots === undefined\n\t\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, source.intermediateFbo);\n\t\t\t\tfor (const slot of targetSlots) {\n\t\t\t\t\tgl.copyTexSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, slot, 0, 0, srcW, srcH);\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1], { allowMissing: true });\n\t\t\t\tif (historySlots === undefined) {\n\t\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Different contexts - transfer via readPixels to preserve precision.\n\t\t\tconst {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\toptions: { format, type },\n\t\t\t} = sourceIntermediateInfo;\n\t\t\tconst pixels = this.getPxArray(type, width * height * 4);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, source.intermediateFbo);\n\t\t\tsource.gl.readPixels(0, 0, width, height, format, type, pixels);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, null);\n\t\t\tnonShaderPadSource = { data: pixels, width, height };\n\t\t}\n\n\t\t// If dimensions changed, recreate the texture with new dimensions.\n\t\tconst { width, height } = getSourceDimensions(nonShaderPadSource);\n\t\tif (!width || !height) return;\n\n\t\tconst isPartial = 'isPartial' in nonShaderPadSource && nonShaderPadSource.isPartial;\n\t\tif (!isPartial) {\n\t\t\tthis.resizeTex(name, width, height);\n\t\t}\n\n\t\t// UNPACK_FLIP_Y_WEBGL only works for DOM element sources, not typed arrays.\n\t\tconst isCustomTexture = 'data' in nonShaderPadSource && nonShaderPadSource.data;\n\t\tconst shouldFlipY = !isCustomTexture && !info.options?.preserveY;\n\t\tconst previousFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);\n\t\tconst needsAlignmentFix = isCustomTexture && !this.isRgba(info.options.format);\n\t\tconst shouldConvertColorSpace = !isCustomTexture && info.options.colorSpace && 'unpackColorSpace' in gl;\n\t\tconst previousColorSpace = gl.unpackColorSpace;\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = info.options.colorSpace!;\n\n\t\tif (info.history) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\tconst { depth } = info.history;\n\t\t\tconst targetSlots =\n\t\t\t\thistorySlots === undefined\n\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\tconst sourceData =\n\t\t\t\tpartialSource.data ?? (nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>);\n\t\t\tconst xOffset = isPartial ? (partialSource.x ?? 0) : 0;\n\t\t\tconst yOffset = isPartial ? (partialSource.y ?? 0) : 0;\n\n\t\t\tfor (const slot of targetSlots) {\n\t\t\t\tgl.texSubImage3D(\n\t\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t\t0,\n\t\t\t\t\txOffset,\n\t\t\t\t\tyOffset,\n\t\t\t\t\tslot,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t1,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tsourceData as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1]);\n\t\t\tif (historySlots === undefined) {\n\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t}\n\t\t} else {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, info.texture);\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\n\t\t\tif (isPartial) {\n\t\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\t\tgl.texSubImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tpartialSource.x ?? 0,\n\t\t\t\t\tpartialSource.y ?? 0,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tpartialSource.data,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.internalFormat,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\t((nonShaderPadSource as PartialCustomTexture).data ??\n\t\t\t\t\t\t(nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>)) as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t}\n\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = previousColorSpace;\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate bindIntermediate() {\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.intermediateFbo);\n\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, intermediateInfo.texture, 0);\n\t}\n\n\tclear() {\n\t\tthis.bindIntermediate();\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tif (intermediateInfo.options.isIntegerColorFormat) {\n\t\t\tconst t = intermediateInfo.options.type;\n\t\t\tif (this.uintTypes.has(t)) {\n\t\t\t\tgl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(4));\n\t\t\t} else {\n\t\t\t\tgl.clearBufferiv(gl.COLOR, 0, new Int32Array(4));\n\t\t\t}\n\t\t} else {\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t}\n\t}\n\n\tdraw(options?: StepOptions | void) {\n\t\tthis.emit('preDraw', ...arguments);\n\t\tconst gl = this.gl;\n\t\tconst w = gl.drawingBufferWidth;\n\t\tconst h = gl.drawingBufferHeight;\n\n\t\tif (options?.skipClear) {\n\t\t\tthis.bindIntermediate();\n\t\t} else {\n\t\t\tthis.clear();\n\t\t}\n\n\t\tgl.useProgram(this.program);\n\t\tgl.bindVertexArray(this.vao);\n\t\tgl.viewport(0, 0, w, h);\n\t\tgl.drawArrays(gl.TRIANGLES, 0, 3);\n\n\t\tif (!this.isHeadless) {\n\t\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tif (!intermediateInfo.options.isIntegerColorFormat) {\n\t\t\t\tconst desiredColorSpace = intermediateInfo.options.colorSpace ?? 'srgb';\n\t\t\t\tif ('drawingBufferColorSpace' in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {\n\t\t\t\t\tgl.drawingBufferColorSpace = desiredColorSpace;\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\t\tgl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n\t\t\t\tgl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t}\n\t\t}\n\t\tthis.emit('postDraw', ...arguments);\n\t}\n\n\tstep(options?: StepOptions) {\n\t\tthis._step(performance.now(), options);\n\t}\n\n\tprivate tick() {\n\t\tconst updates: Record<string, number> = {};\n\t\tif (this.uniforms.has('u_time')) updates.u_time = this.tElapsed;\n\t\tif (this.uniforms.has('u_frame')) updates.u_frame = this.frame;\n\t\tif (Object.keys(updates).length) this._updateUniforms(updates);\n\t}\n\n\tprivate _step(now: number, opts?: StepOptions | ((time: number, frame: number) => StepOptions | void)) {\n\t\tconst t = this.getElapsed(now);\n\t\tthis.tElapsed = t;\n\t\tthis.tStart = now;\n\t\tconst options = typeof opts === 'function' ? opts(t, this.frame) : opts;\n\t\tthis.emit('preStep', t, this.frame, options);\n\t\tthis.tick();\n\t\tthis.draw(options);\n\t\tconst historyInfo = this.textures.get(HISTORY_TEXTURE_KEY);\n\t\tif (historyInfo && !options?.skipHistory) {\n\t\t\tconst { writeIndex, depth } = historyInfo.history!;\n\t\t\tconst gl = this.gl;\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, historyInfo.texture);\n\t\t\tgl.copyTexSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\twriteIndex,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tgl.drawingBufferWidth,\n\t\t\t\tgl.drawingBufferHeight,\n\t\t\t);\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\tconst nextWriteIndex = (writeIndex + 1) % depth;\n\t\t\tthis.updateFrameOffset(HISTORY_TEXTURE_KEY, nextWriteIndex, { allowMissing: true });\n\t\t\thistoryInfo.history!.writeIndex = nextWriteIndex;\n\t\t}\n\t\t++this.frame;\n\t\tthis.emit('postStep', t, this.frame, options);\n\t}\n\n\tplay(onPreStep?: (time: number, frame: number) => StepOptions | void) {\n\t\tthis._pause();\n\t\tconst loop = (now: number) => {\n\t\t\tthis._step(now, onPreStep);\n\t\t\tif (this.frameId != null) this.frameId = requestAnimationFrame(loop);\n\t\t};\n\t\tthis.frameId = requestAnimationFrame(loop);\n\t\tthis.emit('play');\n\t}\n\n\tprivate getElapsed(time: number) {\n\t\tif (isNaN(this.tStart)) return this.tElapsed;\n\t\treturn this.tElapsed + (time - this.tStart) / 1000;\n\t}\n\n\tprivate _pause() {\n\t\tif (isNaN(this.tStart) && this.frameId == null) return;\n\t\tif (this.frameId != null) {\n\t\t\tcancelAnimationFrame(this.frameId);\n\t\t\tthis.frameId = null;\n\t\t}\n\t\tthis.tElapsed = this.getElapsed(performance.now());\n\t\tthis.tStart = NaN;\n\t\treturn true;\n\t}\n\n\tpause() {\n\t\tif (this._pause()) this.emit('pause');\n\t}\n\n\trewind() {\n\t\tthis.frame = 0;\n\t\tthis.tElapsed = 0;\n\t\tthis.tStart = NaN;\n\t\tthis.tick();\n\t}\n\n\treset() {\n\t\tthis.rewind();\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHist(name, texture);\n\t\t});\n\t\tthis.clear();\n\t\tthis.emit('reset');\n\t}\n\n\tdestroy() {\n\t\tthis.emit('destroy');\n\n\t\tthis._pause();\n\t\tconst gl = this.gl;\n\n\t\tif (this.cursorTgt) {\n\t\t\tthis.listeners.forEach((listener, event) => {\n\t\t\t\tthis.cursorTgt!.removeEventListener(event, listener);\n\t\t\t});\n\t\t\tthis.listeners.clear();\n\t\t}\n\n\t\tif (this.resObserver) {\n\t\t\tthis.resObserver.disconnect();\n\t\t\tthis.resObserver = null;\n\t\t}\n\n\t\tif (this.program) {\n\t\t\tgl.deleteProgram(this.program);\n\t\t\tthis.program = null;\n\t\t}\n\n\t\tif (this.intermediateFbo) {\n\t\t\tgl.deleteFramebuffer(this.intermediateFbo);\n\t\t\tthis.intermediateFbo = null;\n\t\t}\n\n\t\tthis.textures.forEach(texture => {\n\t\t\tthis.texPool.free.push(texture.unitIndex);\n\t\t\tgl.deleteTexture(texture.texture);\n\t\t});\n\t\tthis.textures.clear();\n\t\tconst entry = canvasRegistry.get(this.canvas);\n\t\tif (entry) {\n\t\t\tentry.instances.delete(this);\n\t\t\tif (entry.instances.size === 0) {\n\t\t\t\tcanvasRegistry.delete(this.canvas);\n\t\t\t}\n\t\t}\n\n\t\tif (this.vao) {\n\t\t\tgl.deleteVertexArray(this.vao);\n\t\t\tthis.vao = null;\n\t\t}\n\n\t\tif (this.buffer) {\n\t\t\tgl.deleteBuffer(this.buffer);\n\t\t\tthis.buffer = null;\n\t\t}\n\n\t\tthis.uniforms.clear();\n\t\tthis.hooks.clear();\n\t}\n}\n\nexport default ShaderPad;\n"],"mappings":"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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"]}
@@ -0,0 +1,2 @@
1
+ function T(e){let t=e.ownerDocument.defaultView??window,n=e.getBoundingClientRect();return n.width>0&&n.height>0&&n.bottom>0&&n.right>0&&n.top<t.innerHeight&&n.left<t.innerWidth}function M({target:e,autoplay:t,autopause:n,isPlaying:a,play:s,pause:i,onVisibilityChange:u}){let o=e.ownerDocument,l=t,f=n,p=o.visibilityState==="visible",m=T(e),c=!1,v=null,h=()=>p&&(typeof IntersectionObserver=="function"?m:T(e))&&e.isConnected,d=()=>{let r=h();if(v!==r&&(v=r,u?.(r)),!l){c&&a()&&i(),c=!1;return}if(!f||r){a()||s(),c=!0;return}c&&a()&&i(),c=!1},E=()=>{p=o.visibilityState==="visible",d()};o.addEventListener("visibilitychange",E);let b=typeof IntersectionObserver=="function"?new IntersectionObserver(r=>{m=r.some(x=>x.isIntersecting),d()}):null;return b?.observe(e),{sync:d,update(r){l=r.autoplay,f=r.autopause,d()},destroy(){b?.disconnect(),o.removeEventListener("visibilitychange",E)}}}var V=[["internal-format","internalFormat"],["format","format"],["type","type"],["min-filter","minFilter"],["mag-filter","magFilter"],["wrap-s","wrapS"],["wrap-t","wrapT"],["color-space","colorSpace"]];function y(e){if(!(e==null||e===!1))return String(e)}function g(e,t){if(e==null)return t;if(typeof e=="boolean")return e;switch(String(e).trim().toLowerCase()){case"false":case"0":case"no":case"off":return!1;default:return!0}}function w(e,t=""){let n={},a=y(e(`${t}history`));if(a!=null){let i=Number.parseInt(a,10);Number.isFinite(i)&&i>=0&&(n.history=i)}let s=e(`${t}preserve-y`);s!=null&&(n.preserveY=g(s,!0));for(let[i,u]of V){let o=y(e(`${t}${i}`));o&&(n[u]=o)}return n}function D(e,t=""){return w(n=>e.getAttribute(n),t)}function S(e){return e instanceof HTMLImageElement||e instanceof HTMLVideoElement||e instanceof HTMLCanvasElement}function O(e){return!(e instanceof HTMLImageElement)}function L(e,t){let n={once:!0};return new Promise((a,s)=>{let i=()=>{e.removeEventListener(t,u),e.removeEventListener("error",o)},u=l=>{i(),a(l)},o=l=>{i(),s(l)};e.addEventListener(t,u,n),e.addEventListener("error",o,n)})}async function H(e){return e.complete&&e.naturalWidth>0&&e.naturalHeight>0||await L(e,"load"),e}async function I(e){return e.videoWidth>0&&e.videoHeight>0||await L(e,"loadedmetadata"),e}async function P(e){if(e instanceof HTMLImageElement)return H(e);if(e instanceof HTMLVideoElement)return I(e);if(e.width<=0||e.height<=0)throw new Error("Texture canvas elements must have a positive width and height.");return e}function k(e){if(e instanceof HTMLVideoElement)return e.videoWidth>0&&e.videoHeight>0?e:void 0;if(e instanceof HTMLCanvasElement)return e.width>0&&e.height>0?e:void 0}function A(e,t){if(e instanceof HTMLImageElement)return e.addEventListener("load",t),()=>e.removeEventListener("load",t);if(e instanceof HTMLVideoElement)return e.addEventListener("loadedmetadata",t),()=>e.removeEventListener("loadedmetadata",t)}export{M as a,g as b,w as c,D as d,S as e,O as f,P as g,k as h,A as i};
2
+ //# sourceMappingURL=chunk-FVO6LH2F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/autoplay.ts","../src/internal/declarative-textures.ts"],"sourcesContent":["export type PlaybackVisibilityController = {\n\tsync: () => void;\n\tupdate: (options: { autoplay: boolean; autopause: boolean }) => void;\n\tdestroy: () => void;\n};\n\ntype PlaybackVisibilityOptions = {\n\ttarget: HTMLElement;\n\tautoplay: boolean;\n\tautopause: boolean;\n\tisPlaying: () => boolean;\n\tplay: () => void;\n\tpause: () => void;\n\tonVisibilityChange?: (isVisible: boolean) => void;\n};\n\nfunction isElementInViewport(element: HTMLElement) {\n\tconst view = element.ownerDocument.defaultView ?? window;\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.width > 0 &&\n\t\trect.height > 0 &&\n\t\trect.bottom > 0 &&\n\t\trect.right > 0 &&\n\t\trect.top < view.innerHeight &&\n\t\trect.left < view.innerWidth\n\t);\n}\n\nexport function createPlaybackVisibilityController({\n\ttarget,\n\tautoplay,\n\tautopause,\n\tisPlaying,\n\tplay,\n\tpause,\n\tonVisibilityChange,\n}: PlaybackVisibilityOptions): PlaybackVisibilityController {\n\tconst documentRef = target.ownerDocument;\n\tlet currentAutoplay = autoplay;\n\tlet currentAutopause = autopause;\n\tlet isDocumentVisible = documentRef.visibilityState === 'visible';\n\tlet isIntersecting = isElementInViewport(target);\n\tlet isManagedPlayback = false;\n\tlet lastVisible: boolean | null = null;\n\n\tconst getIsVisible = () =>\n\t\tisDocumentVisible &&\n\t\t(typeof IntersectionObserver === 'function' ? isIntersecting : isElementInViewport(target)) &&\n\t\ttarget.isConnected;\n\n\tconst sync = () => {\n\t\tconst isVisible = getIsVisible();\n\t\tif (lastVisible !== isVisible) {\n\t\t\tlastVisible = isVisible;\n\t\t\tonVisibilityChange?.(isVisible);\n\t\t}\n\n\t\tif (!currentAutoplay) {\n\t\t\tif (isManagedPlayback && isPlaying()) {\n\t\t\t\tpause();\n\t\t\t}\n\t\t\tisManagedPlayback = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!currentAutopause || isVisible) {\n\t\t\tif (!isPlaying()) {\n\t\t\t\tplay();\n\t\t\t}\n\t\t\tisManagedPlayback = true;\n\t\t\treturn;\n\t\t}\n\n\t\tif (isManagedPlayback && isPlaying()) {\n\t\t\tpause();\n\t\t}\n\t\tisManagedPlayback = false;\n\t};\n\n\tconst handleVisibilityChange = () => {\n\t\tisDocumentVisible = documentRef.visibilityState === 'visible';\n\t\tsync();\n\t};\n\tdocumentRef.addEventListener('visibilitychange', handleVisibilityChange);\n\n\tconst intersectionObserver =\n\t\ttypeof IntersectionObserver === 'function'\n\t\t\t? new IntersectionObserver(entries => {\n\t\t\t\t\tisIntersecting = entries.some(entry => entry.isIntersecting);\n\t\t\t\t\tsync();\n\t\t\t\t})\n\t\t\t: null;\n\tintersectionObserver?.observe(target);\n\n\treturn {\n\t\tsync,\n\t\tupdate(options) {\n\t\t\tcurrentAutoplay = options.autoplay;\n\t\t\tcurrentAutopause = options.autopause;\n\t\t\tsync();\n\t\t},\n\t\tdestroy() {\n\t\t\tintersectionObserver?.disconnect();\n\t\t\tdocumentRef.removeEventListener('visibilitychange', handleVisibilityChange);\n\t\t},\n\t};\n}\n","import type CoreShaderPad from '..';\nimport type { InitializeTextureOptions } from '..';\n\nexport type DomTextureElement = HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\nexport type LiveTextureSource = HTMLVideoElement | HTMLCanvasElement | CoreShaderPad;\n\nconst TEXTURE_OPTION_ATTRIBUTES = [\n\t['internal-format', 'internalFormat'],\n\t['format', 'format'],\n\t['type', 'type'],\n\t['min-filter', 'minFilter'],\n\t['mag-filter', 'magFilter'],\n\t['wrap-s', 'wrapS'],\n\t['wrap-t', 'wrapT'],\n\t['color-space', 'colorSpace'],\n] as const;\n\ntype AttributeValue = string | number | boolean | null | undefined;\n\nfunction stringFromAttribute(value: AttributeValue) {\n\tif (value == null || value === false) return undefined;\n\treturn String(value);\n}\n\nexport function parseBooleanLikeValue(value: AttributeValue, defaultValue: boolean) {\n\tif (value == null) return defaultValue;\n\tif (typeof value === 'boolean') return value;\n\n\tswitch (String(value).trim().toLowerCase()) {\n\t\tcase 'false':\n\t\tcase '0':\n\t\tcase 'no':\n\t\tcase 'off':\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nexport function parseTextureOptionsFromAttributes(\n\treadAttribute: (name: string) => AttributeValue,\n\tprefix = '',\n): InitializeTextureOptions {\n\tconst options: InitializeTextureOptions = {};\n\n\tconst historyValue = stringFromAttribute(readAttribute(`${prefix}history`));\n\tif (historyValue != null) {\n\t\tconst parsed = Number.parseInt(historyValue, 10);\n\t\tif (Number.isFinite(parsed) && parsed >= 0) options.history = parsed;\n\t}\n\n\tconst preserveYValue = readAttribute(`${prefix}preserve-y`);\n\tif (preserveYValue != null) {\n\t\toptions.preserveY = parseBooleanLikeValue(preserveYValue, true);\n\t}\n\n\tfor (const [attribute, option] of TEXTURE_OPTION_ATTRIBUTES) {\n\t\tconst value = stringFromAttribute(readAttribute(`${prefix}${attribute}`));\n\t\tif (value) (options as Record<string, unknown>)[option] = value;\n\t}\n\n\treturn options;\n}\n\nexport function parseTextureOptions(element: Element, prefix = '') {\n\treturn parseTextureOptionsFromAttributes(name => element.getAttribute(name), prefix);\n}\n\nexport function isDomTextureElement(element: Element): element is DomTextureElement {\n\treturn (\n\t\telement instanceof HTMLImageElement ||\n\t\telement instanceof HTMLVideoElement ||\n\t\telement instanceof HTMLCanvasElement\n\t);\n}\n\nexport function isLiveDomTextureElement(element: DomTextureElement) {\n\treturn !(element instanceof HTMLImageElement);\n}\n\nfunction onceEvent<T extends Event>(target: EventTarget, type: string): Promise<T> {\n\tconst options = { once: true };\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst cleanup = () => {\n\t\t\ttarget.removeEventListener(type, onResolve);\n\t\t\ttarget.removeEventListener('error', onReject as EventListener);\n\t\t};\n\n\t\tconst onResolve = (event: Event) => {\n\t\t\tcleanup();\n\t\t\tresolve(event as T);\n\t\t};\n\n\t\tconst onReject = (event: Event) => {\n\t\t\tcleanup();\n\t\t\treject(event);\n\t\t};\n\n\t\ttarget.addEventListener(type, onResolve, options);\n\t\ttarget.addEventListener('error', onReject as EventListener, options);\n\t});\n}\n\nasync function loadImageSource(image: HTMLImageElement) {\n\tif (image.complete && image.naturalWidth > 0 && image.naturalHeight > 0) return image;\n\tawait onceEvent(image, 'load');\n\treturn image;\n}\n\nasync function loadVideoSource(video: HTMLVideoElement) {\n\tif (video.videoWidth > 0 && video.videoHeight > 0) return video;\n\tawait onceEvent(video, 'loadedmetadata');\n\treturn video;\n}\n\nexport async function loadDomTextureSource(element: DomTextureElement) {\n\tif (element instanceof HTMLImageElement) return loadImageSource(element);\n\tif (element instanceof HTMLVideoElement) return loadVideoSource(element);\n\tif (element.width <= 0 || element.height <= 0) {\n\t\tthrow new Error('Texture canvas elements must have a positive width and height.');\n\t}\n\treturn element;\n}\n\nexport function getLiveDomTextureSource(element: DomTextureElement) {\n\tif (element instanceof HTMLVideoElement) {\n\t\treturn element.videoWidth > 0 && element.videoHeight > 0 ? element : undefined;\n\t}\n\tif (element instanceof HTMLCanvasElement) {\n\t\treturn element.width > 0 && element.height > 0 ? element : undefined;\n\t}\n\treturn undefined;\n}\n\nexport function addDomTextureRefreshListener(element: DomTextureElement, listener: () => void) {\n\tif (element instanceof HTMLImageElement) {\n\t\telement.addEventListener('load', listener);\n\t\treturn () => element.removeEventListener('load', listener);\n\t}\n\tif (element instanceof HTMLVideoElement) {\n\t\telement.addEventListener('loadedmetadata', listener);\n\t\treturn () => element.removeEventListener('loadedmetadata', listener);\n\t}\n\treturn undefined;\n}\n"],"mappings":"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","names":["isElementInViewport","element","view","rect","createPlaybackVisibilityController","target","autoplay","autopause","isPlaying","play","pause","onVisibilityChange","documentRef","currentAutoplay","currentAutopause","isDocumentVisible","isIntersecting","isManagedPlayback","lastVisible","getIsVisible","sync","isVisible","handleVisibilityChange","intersectionObserver","entries","entry","options","TEXTURE_OPTION_ATTRIBUTES","stringFromAttribute","value","parseBooleanLikeValue","defaultValue","parseTextureOptionsFromAttributes","readAttribute","prefix","options","historyValue","parsed","preserveYValue","attribute","option","parseTextureOptions","element","name","isDomTextureElement","isLiveDomTextureElement","onceEvent","target","type","resolve","reject","cleanup","onResolve","onReject","event","loadImageSource","image","loadVideoSource","video","loadDomTextureSource","getLiveDomTextureSource","addDomTextureRefreshListener","listener"]}
@@ -415,6 +415,7 @@ var ShaderPad = class _ShaderPad {
415
415
  magFilter: this.resolveGLConst(options?.magFilter ?? "LINEAR"),
416
416
  wrapS: this.resolveGLConst(options?.wrapS ?? "CLAMP_TO_EDGE"),
417
417
  wrapT: this.resolveGLConst(options?.wrapT ?? "CLAMP_TO_EDGE"),
418
+ colorSpace: options?.colorSpace,
418
419
  preserveY: options?.preserveY,
419
420
  isIntegerColorFormat
420
421
  };
@@ -431,9 +432,9 @@ var ShaderPad = class _ShaderPad {
431
432
  const ArrayType = this.typeArrays.get(type) ?? Uint8Array;
432
433
  return new ArrayType(size);
433
434
  }
434
- isNotRgba(format) {
435
+ isRgba(format) {
435
436
  const gl = this.gl;
436
- return format !== gl.RGBA && format !== gl.RGBA_INTEGER;
437
+ return format === gl.RGBA || format === gl.RGBA_INTEGER;
437
438
  }
438
439
  clearHistTexLayers(textureInfo) {
439
440
  if (!textureInfo.history) return;
@@ -442,7 +443,7 @@ var ShaderPad = class _ShaderPad {
442
443
  const transparent = this.getPxArray(type, textureInfo.width * textureInfo.height * 4);
443
444
  gl.activeTexture(gl.TEXTURE0 + textureInfo.unitIndex);
444
445
  gl.bindTexture(gl.TEXTURE_2D_ARRAY, textureInfo.texture);
445
- const needsAlignmentFix = this.isNotRgba(format);
446
+ const needsAlignmentFix = !this.isRgba(format);
446
447
  let previousAlignment;
447
448
  if (needsAlignmentFix) {
448
449
  previousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);
@@ -519,7 +520,7 @@ var ShaderPad = class _ShaderPad {
519
520
  }
520
521
  this.emit("initializeUniform", ...arguments);
521
522
  }
522
- updateUniforms(updates, options) {
523
+ _updateUniforms(updates, options) {
523
524
  const gl = this.gl;
524
525
  gl.useProgram(this.program);
525
526
  Object.entries(updates).forEach(([name, newValue]) => {
@@ -584,6 +585,14 @@ var ShaderPad = class _ShaderPad {
584
585
  });
585
586
  this.emit("updateUniforms", ...arguments);
586
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
+ }
587
596
  createTex(name, textureInfo) {
588
597
  const gl = this.gl;
589
598
  const { width, height } = textureInfo;
@@ -740,15 +749,18 @@ var ShaderPad = class _ShaderPad {
740
749
  if (!isPartial) {
741
750
  this.resizeTex(name, width, height);
742
751
  }
743
- const isTypedArray = "data" in nonShaderPadSource && nonShaderPadSource.data;
744
- const shouldFlipY = !isTypedArray && !info.options?.preserveY;
752
+ const isCustomTexture = "data" in nonShaderPadSource && nonShaderPadSource.data;
753
+ const shouldFlipY = !isCustomTexture && !info.options?.preserveY;
745
754
  const previousFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);
746
- const needsAlignmentFix = isTypedArray && this.isNotRgba(info.options.format);
755
+ const needsAlignmentFix = isCustomTexture && !this.isRgba(info.options.format);
756
+ const shouldConvertColorSpace = !isCustomTexture && info.options.colorSpace && "unpackColorSpace" in gl;
757
+ const previousColorSpace = gl.unpackColorSpace;
747
758
  let previousAlignment;
748
759
  if (needsAlignmentFix) {
749
760
  previousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);
750
761
  gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
751
762
  }
763
+ if (shouldConvertColorSpace) gl.unpackColorSpace = info.options.colorSpace;
752
764
  if (info.history) {
753
765
  gl.activeTexture(gl.TEXTURE0 + info.unitIndex);
754
766
  gl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);
@@ -811,6 +823,7 @@ var ShaderPad = class _ShaderPad {
811
823
  }
812
824
  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);
813
825
  }
826
+ if (shouldConvertColorSpace) gl.unpackColorSpace = previousColorSpace;
814
827
  if (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);
815
828
  }
816
829
  bindIntermediate() {
@@ -851,6 +864,10 @@ var ShaderPad = class _ShaderPad {
851
864
  if (!this.isHeadless) {
852
865
  const intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY);
853
866
  if (!intermediateInfo.options.isIntegerColorFormat) {
867
+ const desiredColorSpace = intermediateInfo.options.colorSpace ?? "srgb";
868
+ if ("drawingBufferColorSpace" in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {
869
+ gl.drawingBufferColorSpace = desiredColorSpace;
870
+ }
854
871
  gl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);
855
872
  gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
856
873
  gl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);
@@ -866,7 +883,7 @@ var ShaderPad = class _ShaderPad {
866
883
  const updates = {};
867
884
  if (this.uniforms.has("u_time")) updates.u_time = this.tElapsed;
868
885
  if (this.uniforms.has("u_frame")) updates.u_frame = this.frame;
869
- if (Object.keys(updates).length) this.updateUniforms(updates);
886
+ if (Object.keys(updates).length) this._updateUniforms(updates);
870
887
  }
871
888
  _step(now, opts) {
872
889
  const t = this.getElapsed(now);
@@ -992,4 +1009,4 @@ var index_default = ShaderPad;
992
1009
  export {
993
1010
  index_default
994
1011
  };
995
- //# sourceMappingURL=chunk-TTKZ43JC.mjs.map
1012
+ //# sourceMappingURL=chunk-D2ESNBZA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import { safeMod, spError } from './internal/util';\n\nconst DEFAULT_VERTEX_SHADER_SRC = `#version 300 es\nin vec2 a_position;out vec2 v_uv;void main(){gl_Position=vec4(a_position,0.,1.);v_uv=a_position*.5+.5;}`;\n\ninterface Uniform {\n\ttype: 'float' | 'int' | 'uint';\n\tlength: 1 | 2 | 3 | 4;\n\tlocation: WebGLUniformLocation;\n\tarrayLength?: number;\n}\n\ntype GLInternalFormatChannels = 'R' | 'RG' | 'RGB' | 'RGBA';\ntype GLInternalFormatDepth = '8' | '16F' | '32F' | '8UI' | '8I' | '16UI' | '16I' | '32UI' | '32I';\nexport type GLInternalFormatString = `${GLInternalFormatChannels}${GLInternalFormatDepth}`;\n\nexport type GLFormatString =\n\t| 'RED'\n\t| 'RG'\n\t| 'RGB'\n\t| 'RGBA'\n\t| 'RED_INTEGER'\n\t| 'RG_INTEGER'\n\t| 'RGB_INTEGER'\n\t| 'RGBA_INTEGER';\nexport type GLTypeString =\n\t| 'UNSIGNED_BYTE'\n\t| 'BYTE'\n\t| 'FLOAT'\n\t| 'HALF_FLOAT'\n\t| 'UNSIGNED_SHORT'\n\t| 'SHORT'\n\t| 'UNSIGNED_INT'\n\t| 'INT';\nexport type GLFilterString = 'LINEAR' | 'NEAREST';\nexport type GLWrapString = 'CLAMP_TO_EDGE' | 'REPEAT' | 'MIRRORED_REPEAT';\nexport type ColorSpace = PredefinedColorSpace;\n\nconst FORMAT_TYPE_SUFFIXES: [string, GLTypeString][] = [\n\t['8UI', 'UNSIGNED_BYTE'],\n\t['8I', 'BYTE'],\n\t['16UI', 'UNSIGNED_SHORT'],\n\t['16I', 'SHORT'],\n\t['16F', 'HALF_FLOAT'],\n\t['32UI', 'UNSIGNED_INT'],\n\t['32I', 'INT'],\n\t['32F', 'FLOAT'],\n\t['8', 'UNSIGNED_BYTE'],\n];\n\nconst UNIFORM_TYPE_SUFFIXES: Record<Uniform['type'], string> = {\n\tfloat: 'f',\n\tint: 'i',\n\tuint: 'ui',\n};\n\nfunction typeFromInternalFormatString(internalFormatString?: GLInternalFormatString): GLTypeString | undefined {\n\treturn internalFormatString && FORMAT_TYPE_SUFFIXES.find(([suffix]) => internalFormatString.endsWith(suffix))?.[1];\n}\n\ntype GLConstantString = GLInternalFormatString | GLFormatString | GLTypeString | GLFilterString | GLWrapString;\n\nexport interface TextureOptions {\n\tinternalFormat?: GLInternalFormatString;\n\tformat?: GLFormatString;\n\ttype?: GLTypeString;\n\tminFilter?: GLFilterString;\n\tmagFilter?: GLFilterString;\n\twrapS?: GLWrapString;\n\twrapT?: GLWrapString;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n}\ntype ResolvedTextureOptions = {\n\ttype: number;\n\tformat: number;\n\tinternalFormat: number;\n\tminFilter: number;\n\tmagFilter: number;\n\twrapS: number;\n\twrapT: number;\n\tcolorSpace?: ColorSpace;\n\tpreserveY?: boolean;\n\tisIntegerColorFormat: boolean;\n};\n\ninterface Texture {\n\ttexture: WebGLTexture;\n\tunitIndex: number;\n\twidth: number;\n\theight: number;\n\thistory?: {\n\t\tdepth: number;\n\t\twriteIndex: number;\n\t};\n\toptions: ResolvedTextureOptions;\n}\n\nexport interface CustomTexture {\n\tdata: ArrayBufferView | null;\n\twidth: number;\n\theight: number;\n}\n\nexport interface PartialCustomTexture extends CustomTexture {\n\tisPartial?: boolean;\n\tx?: number;\n\ty?: number;\n}\n\nexport interface InitializeTextureOptions extends TextureOptions {\n\thistory?: number;\n}\n\nexport type TextureSource =\n\t| HTMLImageElement\n\t| HTMLVideoElement\n\t| HTMLCanvasElement\n\t| OffscreenCanvas\n\t| ImageBitmap\n\t| WebGLTexture\n\t| CustomTexture\n\t| ShaderPad;\n\n// Custom textures allow partial updates starting from (x, y).\nexport type UpdateTextureSource = Exclude<TextureSource, CustomTexture> | PartialCustomTexture;\n\nexport interface PluginContext {\n\tinjectGLSL: (code: string) => void;\n\temit: (name: ShaderPadEventName, ...args: any[]) => void;\n\tupdateTexture: (name: string, source: UpdateTextureSource, historySlots?: HistorySlots) => void;\n}\n\nexport type Plugin = (shaderPad: ShaderPad, context: PluginContext) => void;\n\nexport type ShaderPadEventName =\n\t| '_init'\n\t| 'initializeTexture'\n\t| 'initializeUniform'\n\t| 'updateTextures'\n\t| 'updateUniforms'\n\t| 'preStep'\n\t| 'postStep'\n\t| 'preDraw'\n\t| 'postDraw'\n\t| 'updateResolution'\n\t| 'play'\n\t| 'pause'\n\t| 'reset'\n\t| 'destroy'\n\t| `${string}:${string}`;\n\nexport type RenderTextureOptions = Omit<TextureOptions, 'preserveY'>;\n\nexport interface Options extends RenderTextureOptions {\n\tcanvas?: HTMLCanvasElement | OffscreenCanvas | { width: number; height: number } | null;\n\tplugins?: Plugin[];\n\thistory?: number;\n\tcursorTarget?: Window | Element;\n}\n\nexport interface StepOptions {\n\tskipClear?: boolean;\n\tskipHistory?: boolean;\n}\n\ntype HistorySlots = number | number[];\n\ntype TextureUnitPool = {\n\tfree: number[];\n\tnext: number;\n\tmax: number;\n};\n\nconst HISTORY_TEXTURE_KEY = Symbol('u_history');\nconst INTERMEDIATE_TEXTURE_KEY = Symbol('__SHADERPAD_BUFFER');\n\nconst canvasRegistry = new WeakMap<\n\tHTMLCanvasElement | OffscreenCanvas,\n\t{ texPool: TextureUnitPool; instances: Set<ShaderPad> }\n>();\n\nfunction combineShaderCode(shader: string, injections: string[]): string {\n\tif (!injections?.length) return shader;\n\tconst lines = shader.split('\\n');\n\tconst insertAt =\n\t\tlines.findLastIndex(line => {\n\t\t\tconst trimmed = line.trimStart();\n\t\t\treturn trimmed.startsWith('precision ') || trimmed.startsWith('#version ');\n\t\t}) + 1;\n\tlines.splice(insertAt, 0, ...injections);\n\treturn lines.join('\\n');\n}\n\nfunction getSourceDimensions(source: TextureSource): {\n\twidth: number;\n\theight: number;\n} {\n\tif (source instanceof WebGLTexture) {\n\t\treturn { width: 0, height: 0 }; // Invalid - dimensions not readable.\n\t}\n\tif (source instanceof ShaderPad) {\n\t\treturn { width: source.canvas.width, height: source.canvas.height };\n\t}\n\tif (source instanceof HTMLVideoElement) {\n\t\treturn { width: source.videoWidth, height: source.videoHeight };\n\t}\n\tif (source instanceof HTMLImageElement) {\n\t\treturn {\n\t\t\twidth: source.naturalWidth ?? source.width,\n\t\t\theight: source.naturalHeight ?? source.height,\n\t\t};\n\t}\n\t// CustomTexture, HTMLCanvasElement, OffscreenCanvas, ImageBitmap.\n\treturn { width: source.width, height: source.height };\n}\n\nfunction stringFrom(name: string | symbol) {\n\treturn typeof name === 'symbol' ? (name.description ?? '') : name;\n}\n\nclass ShaderPad {\n\tprivate isHeadless = false;\n\tprivate isTouch = false;\n\tdeclare public readonly gl: WebGL2RenderingContext;\n\tdeclare private typeArrays: Map<number, new (length: number) => ArrayBufferView>;\n\tdeclare private typeFormats: Map<number, GLInternalFormatString>;\n\tdeclare private uintTypes: Set<number>;\n\tprivate uniforms: Map<string, Uniform> = new Map();\n\tprivate textures: Map<string | symbol, Texture> = new Map();\n\tdeclare private texPool: TextureUnitPool;\n\tprivate buffer: WebGLBuffer | null = null;\n\tprivate vao: WebGLVertexArrayObject | null = null;\n\tprivate program: WebGLProgram | null = null;\n\tdeclare private frameId: number | null;\n\tprivate listeners: Map<string, EventListener> = new Map();\n\tprivate frame = 0;\n\tprivate tElapsed = 0;\n\tprivate tStart = NaN;\n\tprivate cursorPos = [0.5, 0.5];\n\tprivate clickPos = [0.5, 0.5];\n\tprivate isClicked = false;\n\tdeclare public canvas: HTMLCanvasElement | OffscreenCanvas;\n\tprivate resObserver: MutationObserver | null = null;\n\tprivate hooks: Map<ShaderPadEventName, Function[]> = new Map();\n\tprivate historyDepth = 0;\n\tdeclare private texOptions: TextureOptions;\n\tdeclare private cursorTgt: Window | Element | undefined;\n\t// WebGL can’t read from and write to the history texture at the same time.\n\t// We write to an intermediate texture then blit to the history texture.\n\tprivate intermediateFbo: WebGLFramebuffer | null = null;\n\n\tconstructor(fragmentShaderSrc: string, { canvas, plugins, history, cursorTarget, ...texOptions }: Options = {}) {\n\t\tif (canvas && 'getContext' in canvas) {\n\t\t\tthis.canvas = canvas;\n\t\t} else {\n\t\t\tconst { width = 1, height = 1 } = canvas || {};\n\t\t\tthis.canvas = new OffscreenCanvas(width, height);\n\t\t\tthis.isHeadless = true;\n\t\t}\n\n\t\tconst gl = this.canvas.getContext('webgl2', {\n\t\t\tantialias: false,\n\t\t}) as WebGL2RenderingContext;\n\t\tif (!gl) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(0, {\n\t\t\t\t\t\tcanvasType: this.canvas.constructor.name,\n\t\t\t\t\t\tisHeadless: this.isHeadless,\n\t\t\t\t\t\tcanvasWidth: this.canvas.width,\n\t\t\t\t\t\tcanvasHeight: this.canvas.height,\n\t\t\t\t\t})\n\t\t\t\t: spError(0);\n\t\t}\n\t\tthis.gl = gl;\n\t\tthis.typeArrays = new Map<number, new (length: number) => ArrayBufferView>([\n\t\t\t[gl.FLOAT, Float32Array],\n\t\t\t[gl.HALF_FLOAT, Uint16Array],\n\t\t\t[gl.UNSIGNED_SHORT, Uint16Array],\n\t\t\t[gl.SHORT, Int16Array],\n\t\t\t[gl.BYTE, Int8Array],\n\t\t\t[gl.UNSIGNED_INT, Uint32Array],\n\t\t\t[gl.INT, Int32Array],\n\t\t]);\n\t\tthis.typeFormats = new Map<number, GLInternalFormatString>([\n\t\t\t[gl.FLOAT, 'RGBA32F'],\n\t\t\t[gl.HALF_FLOAT, 'RGBA16F'],\n\t\t\t[gl.UNSIGNED_SHORT, 'RGBA32UI'],\n\t\t\t[gl.SHORT, 'RGBA32I'],\n\t\t\t[gl.BYTE, 'RGBA32I'],\n\t\t\t[gl.UNSIGNED_INT, 'RGBA32UI'],\n\t\t\t[gl.INT, 'RGBA32I'],\n\t\t]);\n\t\tthis.uintTypes = new Set([gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT]);\n\n\t\tlet registryEntry = canvasRegistry.get(this.canvas);\n\t\tif (!registryEntry) {\n\t\t\tregistryEntry = {\n\t\t\t\ttexPool: {\n\t\t\t\t\tfree: [],\n\t\t\t\t\tnext: 0,\n\t\t\t\t\tmax: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n\t\t\t\t},\n\t\t\t\tinstances: new Set([this]),\n\t\t\t};\n\t\t\tcanvasRegistry.set(this.canvas, registryEntry);\n\t\t}\n\t\tthis.texPool = registryEntry.texPool;\n\t\tregistryEntry.instances.add(this);\n\n\t\tthis.texOptions = texOptions;\n\n\t\tif (history) this.historyDepth = history;\n\t\tthis.cursorTgt = cursorTarget ?? (this.canvas instanceof HTMLCanvasElement ? this.canvas : undefined);\n\t\tthis.frameId = null;\n\n\t\tconst glslInjections: string[] = [];\n\t\tif (plugins) {\n\t\t\tplugins.forEach(plugin =>\n\t\t\t\tplugin(this, {\n\t\t\t\t\tinjectGLSL: (code: string) => {\n\t\t\t\t\t\tglslInjections.push(code);\n\t\t\t\t\t},\n\t\t\t\t\temit: this.emit.bind(this),\n\t\t\t\t\tupdateTexture: this.updateTex.bind(this),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst program = gl.createProgram();\n\t\tif (!program) {\n\t\t\tthrow spError(1);\n\t\t}\n\t\tthis.program = program;\n\n\t\tconst vertexShader = this.createShader(gl.VERTEX_SHADER, DEFAULT_VERTEX_SHADER_SRC);\n\t\tconst fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tcombineShaderCode(fragmentShaderSrc, glslInjections),\n\t\t);\n\t\tgl.attachShader(program, vertexShader);\n\t\tgl.attachShader(program, fragmentShader);\n\t\tgl.bindAttribLocation(program, 0, 'a_position');\n\t\tgl.linkProgram(program);\n\t\tgl.deleteShader(vertexShader);\n\t\tgl.deleteShader(fragmentShader);\n\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst linkError = __SHADERPAD_DEV__\n\t\t\t\t? spError(2, {\n\t\t\t\t\t\tprogramInfoLog: gl.getProgramInfoLog(program),\n\t\t\t\t\t\tfragmentShaderLength: fragmentShaderSrc.length,\n\t\t\t\t\t\tglslInjectionCount: glslInjections.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(2);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow linkError;\n\t\t}\n\n\t\tthis.vao = gl.createVertexArray();\n\t\tgl.bindVertexArray(this.vao);\n\t\tthis.buffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(0);\n\t\tgl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n\t\tgl.useProgram(program);\n\n\t\tif (this.canvas instanceof HTMLCanvasElement) {\n\t\t\tthis.resObserver = new MutationObserver(() => this.syncRes());\n\t\t\tthis.resObserver.observe(this.canvas, {\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: ['width', 'height'],\n\t\t\t});\n\t\t} else {\n\t\t\tconst wrapDimension = (dimension: 'width' | 'height') => {\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype, dimension)!;\n\t\t\t\tconst canvas = this.canvas;\n\t\t\t\tObject.defineProperty(canvas, dimension, {\n\t\t\t\t\tget: () => descriptor.get!.call(canvas),\n\t\t\t\t\tset: v => {\n\t\t\t\t\t\tdescriptor.set!.call(canvas, v);\n\t\t\t\t\t\tconst entry = canvasRegistry.get(canvas);\n\t\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t\tfor (const instance of entry.instances) {\n\t\t\t\t\t\t\t\tinstance.syncRes();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconfigurable: descriptor.configurable,\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t});\n\t\t\t};\n\t\t\twrapDimension('width');\n\t\t\twrapDimension('height');\n\t\t}\n\t\tthis.syncRes();\n\n\t\tthis.initializeUniform('u_cursor', 'float', this.cursorPos, { allowMissing: true });\n\t\tthis.initializeUniform('u_click', 'float', [...this.clickPos, this.isClicked ? 1.0 : 0.0], {\n\t\t\tallowMissing: true,\n\t\t});\n\t\tthis.initializeUniform('u_time', 'float', 0, { allowMissing: true });\n\t\tthis.initializeUniform('u_frame', 'int', 0, { allowMissing: true });\n\n\t\tthis.initTex(INTERMEDIATE_TEXTURE_KEY, this.canvas, {\n\t\t\t...this.texOptions,\n\t\t});\n\t\tthis.intermediateFbo = gl.createFramebuffer();\n\t\tthis.bindIntermediate();\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.initTex(HISTORY_TEXTURE_KEY, this.canvas, {\n\t\t\t\thistory: this.historyDepth,\n\t\t\t\t...this.texOptions,\n\t\t\t});\n\t\t}\n\t\tthis.addListeners();\n\t\tthis.emit('_init');\n\t}\n\n\tprivate resolveGLConst(value: GLConstantString): number {\n\t\tconst gl = this.gl;\n\t\tconst resolved = gl[value];\n\t\tif (resolved === undefined) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(3, { value }) : spError(3);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\tprivate emit(name: ShaderPadEventName, ...args: any[]) {\n\t\tthis.hooks.get(name)?.forEach(hook => hook.call(this, ...args));\n\t}\n\n\ton(name: ShaderPadEventName, fn: Function) {\n\t\tif (!this.hooks.has(name)) {\n\t\t\tthis.hooks.set(name, []);\n\t\t}\n\t\tthis.hooks.get(name)!.push(fn);\n\t}\n\n\toff(name: ShaderPadEventName, fn: Function) {\n\t\tconst hooks = this.hooks.get(name);\n\t\tif (hooks) {\n\t\t\tconst index = hooks.indexOf(fn);\n\t\t\tif (index >= 0) {\n\t\t\t\thooks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createShader(type: number, source: string): WebGLShader {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type)!;\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tconsole.error(gl.getShaderInfoLog(shader));\n\t\t\tconst compilationError = __SHADERPAD_DEV__\n\t\t\t\t? spError(4, {\n\t\t\t\t\t\tshaderType: type === gl.VERTEX_SHADER ? 'vertex' : 'fragment',\n\t\t\t\t\t\tsource,\n\t\t\t\t\t})\n\t\t\t\t: spError(4);\n\t\t\tgl.deleteShader(shader);\n\t\t\tthrow compilationError;\n\t\t}\n\t\treturn shader;\n\t}\n\n\tprivate getCursorTgtRect(): {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t} {\n\t\tconst target = this.cursorTgt!;\n\t\tif (target === window) {\n\t\t\treturn {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: window.innerWidth,\n\t\t\t\theight: window.innerHeight,\n\t\t\t};\n\t\t}\n\t\treturn (target as Element).getBoundingClientRect();\n\t}\n\n\tprivate addListeners() {\n\t\tif (!this.cursorTgt) return;\n\t\tconst updateCursor = (x: number, y: number) => {\n\t\t\tif (!this.uniforms.has('u_cursor')) return;\n\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\tconst u = (x - rect.left) / rect.width;\n\t\t\tconst v = 1 - (y - rect.top) / rect.height; // Flip Y for WebGL\n\t\t\tthis.cursorPos[0] = Math.max(0, Math.min(1, u));\n\t\t\tthis.cursorPos[1] = Math.max(0, Math.min(1, v));\n\t\t\tthis.updateUniforms({ u_cursor: this.cursorPos });\n\t\t};\n\n\t\tconst updateClick = (isClicked: boolean, x?: number, y?: number) => {\n\t\t\tif (!this.uniforms.has('u_click')) return;\n\t\t\tthis.isClicked = isClicked;\n\t\t\tif (isClicked) {\n\t\t\t\tconst rect = this.getCursorTgtRect();\n\t\t\t\tconst xVal = x as number;\n\t\t\t\tconst yVal = y as number;\n\t\t\t\tthis.clickPos[0] = Math.max(0, Math.min(1, (xVal - rect.left) / rect.width));\n\t\t\t\tthis.clickPos[1] = Math.max(0, Math.min(1, 1 - (yVal - rect.top) / rect.height)); // Flip Y for WebGL\n\t\t\t}\n\t\t\tthis.updateUniforms({\n\t\t\t\tu_click: [...this.clickPos, this.isClicked ? 1.0 : 0.0],\n\t\t\t});\n\t\t};\n\n\t\tthis.listeners.set('mousemove', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tupdateCursor(mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mousedown', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tthis.isClicked = true;\n\t\t\t\t\tupdateClick(true, mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('mouseup', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouch) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tupdateClick(false);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchmove', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchstart', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tthis.isTouch = true;\n\t\t\tif (touchEvent.touches.length > 0) {\n\t\t\t\tupdateCursor(touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t\tupdateClick(true, touchEvent.touches[0].clientX, touchEvent.touches[0].clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.set('touchend', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tif (touchEvent.touches.length === 0) {\n\t\t\t\tupdateClick(false);\n\t\t\t}\n\t\t});\n\n\t\tthis.listeners.forEach((listener, event) => {\n\t\t\tthis.cursorTgt!.addEventListener(event, listener);\n\t\t});\n\t}\n\n\tprivate syncRes() {\n\t\tconst gl = this.gl;\n\t\tconst resolution: [number, number] = [gl.drawingBufferWidth, gl.drawingBufferHeight];\n\t\tgl.viewport(0, 0, ...resolution);\n\t\tif (this.uniforms.has('u_resolution')) {\n\t\t\tthis.updateUniforms({ u_resolution: resolution });\n\t\t} else {\n\t\t\tthis.initializeUniform('u_resolution', 'float', resolution, { allowMissing: true });\n\t\t}\n\t\tthis.resizeTex(INTERMEDIATE_TEXTURE_KEY, ...resolution);\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.resizeTex(HISTORY_TEXTURE_KEY, ...resolution);\n\t\t}\n\t\tthis.emit('updateResolution', ...resolution);\n\t}\n\n\tprivate resizeTex(name: string | symbol, width: number, height: number) {\n\t\tconst info = this.textures.get(name);\n\t\tif (!info || (info.width === width && info.height === height)) return;\n\n\t\tconst gl = this.gl;\n\t\tgl.deleteTexture(info.texture);\n\t\tinfo.width = width;\n\t\tinfo.height = height;\n\t\tconst { texture } = this.createTex(name, info);\n\t\tinfo.texture = texture;\n\t\tthis.resetHist(name, info);\n\t}\n\n\tprivate reserveTex(name: string | symbol) {\n\t\tconst existing = this.textures.get(name);\n\t\tif (existing) return existing.unitIndex;\n\t\tif (this.texPool.free.length > 0) return this.texPool.free.pop()!;\n\t\tif (this.texPool.next >= this.texPool.max) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(5, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\tnextTextureUnit: this.texPool.next,\n\t\t\t\t\t\tmaxTextureUnits: this.texPool.max,\n\t\t\t\t\t\tfreeTextureUnits: this.texPool.free.length,\n\t\t\t\t\t})\n\t\t\t\t: spError(5);\n\t\t}\n\t\treturn this.texPool.next++;\n\t}\n\n\tprivate resolveTexOpts(options?: TextureOptions): ResolvedTextureOptions {\n\t\tconst { gl } = this;\n\t\tconst internalFormatOption = options?.internalFormat;\n\t\tconst typeString = options?.type ?? typeFromInternalFormatString(internalFormatOption) ?? 'UNSIGNED_BYTE';\n\t\tconst type = this.resolveGLConst(typeString);\n\t\tconst internalFormatString = internalFormatOption ?? this.typeFormats.get(type) ?? 'RGBA8';\n\t\tconst isIntegerColorFormat = /^(R|RG|RGB|RGBA)(8|16|32)(UI|I)$/.test(internalFormatString);\n\t\tconst formatString = options?.format ?? (isIntegerColorFormat ? 'RGBA_INTEGER' : 'RGBA');\n\t\tconst result: ResolvedTextureOptions = {\n\t\t\ttype,\n\t\t\tformat: this.resolveGLConst(formatString),\n\t\t\tinternalFormat: this.resolveGLConst(internalFormatString),\n\t\t\tminFilter: this.resolveGLConst(options?.minFilter ?? 'LINEAR'),\n\t\t\tmagFilter: this.resolveGLConst(options?.magFilter ?? 'LINEAR'),\n\t\t\twrapS: this.resolveGLConst(options?.wrapS ?? 'CLAMP_TO_EDGE'),\n\t\t\twrapT: this.resolveGLConst(options?.wrapT ?? 'CLAMP_TO_EDGE'),\n\t\t\tcolorSpace: options?.colorSpace,\n\t\t\tpreserveY: options?.preserveY,\n\t\t\tisIntegerColorFormat,\n\t\t};\n\t\tconst isFloatColorFormat = result.internalFormat === gl.RGBA16F || result.internalFormat === gl.RGBA32F;\n\t\t// gl.getExtension isn’t just a check, it’s a required side-effect to enable floats.\n\t\tif (isFloatColorFormat && !gl.getExtension('EXT_color_buffer_float')) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(6, {\n\t\t\t\t\t\tinternalFormat: internalFormatString,\n\t\t\t\t\t\ttype: typeString,\n\t\t\t\t\t})\n\t\t\t\t: spError(6);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate getPxArray(type: number, size: number): ArrayBufferView {\n\t\tconst ArrayType = this.typeArrays.get(type) ?? Uint8Array;\n\t\treturn new ArrayType(size);\n\t}\n\n\tprivate isRgba(format: number): boolean {\n\t\tconst gl = this.gl;\n\t\treturn format === gl.RGBA || format === gl.RGBA_INTEGER;\n\t}\n\n\tprivate clearHistTexLayers(textureInfo: Texture): void {\n\t\tif (!textureInfo.history) return;\n\n\t\tconst gl = this.gl;\n\t\tconst { type, format } = textureInfo.options;\n\t\tconst transparent = this.getPxArray(type, textureInfo.width * textureInfo.height * 4);\n\t\tgl.activeTexture(gl.TEXTURE0 + textureInfo.unitIndex);\n\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, textureInfo.texture);\n\t\tconst needsAlignmentFix = !this.isRgba(format);\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tfor (let layer = 0; layer < textureInfo.history.depth; ++layer) {\n\t\t\tgl.texSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tlayer,\n\t\t\t\ttextureInfo.width,\n\t\t\t\ttextureInfo.height,\n\t\t\t\t1,\n\t\t\t\tformat,\n\t\t\t\ttype,\n\t\t\t\ttransparent,\n\t\t\t);\n\t\t}\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate updateFrameOffset(\n\t\tname: string | symbol,\n\t\tframeOffset: number,\n\t\toptions?: {\n\t\t\tallowMissing?: boolean;\n\t\t},\n\t) {\n\t\tthis.updateUniforms(\n\t\t\t{\n\t\t\t\t[`${stringFrom(name)}FrameOffset`]: frameOffset,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tprivate resetHist(name: string | symbol, textureInfo: Texture) {\n\t\tif (!textureInfo.history) return;\n\t\ttextureInfo.history.writeIndex = 0;\n\t\tthis.clearHistTexLayers(textureInfo);\n\t\tthis.updateFrameOffset(name, 0, { allowMissing: true });\n\t}\n\n\tinitializeUniform(\n\t\tname: string,\n\t\ttype: Uniform['type'],\n\t\tvalue: number | number[] | (number | number[])[],\n\t\toptions?: { arrayLength?: number; allowMissing?: boolean },\n\t) {\n\t\tconst arrayLength = options?.arrayLength;\n\t\tconst allowMissing = options?.allowMissing ?? false;\n\t\tif (this.uniforms.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(7, { name, arrayLength: arrayLength ?? null }) : spError(7);\n\t\t}\n\t\tif (!UNIFORM_TYPE_SUFFIXES[type]) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(8, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tsupportedTypes: Object.keys(UNIFORM_TYPE_SUFFIXES),\n\t\t\t\t\t})\n\t\t\t\t: spError(8);\n\t\t}\n\t\tif (arrayLength && !(Array.isArray(value) && value.length === arrayLength)) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(9, {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\texpectedLength: arrayLength,\n\t\t\t\t\t\treceivedLength: Array.isArray(value) ? value.length : 1,\n\t\t\t\t\t})\n\t\t\t\t: spError(9);\n\t\t}\n\n\t\tconst gl = this.gl;\n\t\tlet location = gl.getUniformLocation(this.program!, name);\n\t\tif (!location && arrayLength) {\n\t\t\tlocation = gl.getUniformLocation(this.program!, `${name}[0]`);\n\t\t}\n\t\tif (!location) {\n\t\t\tif (allowMissing) return;\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(19, { name, arrayLength: arrayLength ?? null }) : spError(19);\n\t\t}\n\n\t\tconst probeValue = arrayLength ? (value as number[] | number[][])[0] : value;\n\t\tconst length = Array.isArray(probeValue) ? (probeValue.length as 1 | 2 | 3 | 4) : 1;\n\t\tthis.uniforms.set(name, { type, length, location, arrayLength });\n\n\t\ttry {\n\t\t\tthis.updateUniforms({ [name]: value });\n\t\t} catch (error) {\n\t\t\tthis.uniforms.delete(name);\n\t\t\tthrow error;\n\t\t}\n\t\tthis.emit('initializeUniform', ...arguments);\n\t}\n\n\tprivate _updateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tObject.entries(updates).forEach(([name, newValue]) => {\n\t\t\tconst uniform = this.uniforms.get(name);\n\t\t\tif (!uniform) {\n\t\t\t\tif (options?.allowMissing) return;\n\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t? spError(20, {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tstartIndex: options?.startIndex ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: spError(20);\n\t\t\t}\n\t\t\tlet glFunctionName = `uniform${uniform.length}${UNIFORM_TYPE_SUFFIXES[uniform.type]}`;\n\t\t\tif (uniform.arrayLength) {\n\t\t\t\tif (!Array.isArray(newValue)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(10, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedType: typeof newValue,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(10);\n\t\t\t\t}\n\t\t\t\tconst nValues = newValue.length;\n\t\t\t\tif (!nValues) return;\n\t\t\t\tif (nValues > uniform.arrayLength) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(11, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: nValues,\n\t\t\t\t\t\t\t\tmaxLength: uniform.arrayLength,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(11);\n\t\t\t\t}\n\t\t\t\tif (newValue.some(item => (Array.isArray(item) ? item.length : 1) !== uniform.length)) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(12, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\texpectedElementLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(12);\n\t\t\t\t}\n\t\t\t\tconst flat = newValue.flat();\n\t\t\t\tconst typedArray =\n\t\t\t\t\tuniform.type === 'float'\n\t\t\t\t\t\t? new Float32Array(flat)\n\t\t\t\t\t\t: uniform.type === 'uint'\n\t\t\t\t\t\t\t? new Uint32Array(flat)\n\t\t\t\t\t\t\t: new Int32Array(flat);\n\t\t\t\tlet location = uniform.location;\n\t\t\t\tif (options?.startIndex) {\n\t\t\t\t\tconst newLocation = gl.getUniformLocation(this.program!, `${name}[${options.startIndex}]`);\n\t\t\t\t\tif (!newLocation) {\n\t\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t\t? spError(13, {\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tstartIndex: options.startIndex,\n\t\t\t\t\t\t\t\t\tarrayLength: uniform.arrayLength,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: spError(13);\n\t\t\t\t\t}\n\t\t\t\t\tlocation = newLocation;\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName + 'v'](location, typedArray);\n\t\t\t} else {\n\t\t\t\tif (!Array.isArray(newValue)) newValue = [newValue];\n\t\t\t\tconst scalarValue = newValue as number[];\n\t\t\t\tif (scalarValue.length !== uniform.length) {\n\t\t\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t\t\t? spError(14, {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\treceivedLength: scalarValue.length,\n\t\t\t\t\t\t\t\texpectedLength: uniform.length,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: spError(14);\n\t\t\t\t}\n\t\t\t\t(gl as any)[glFunctionName](uniform.location, ...scalarValue);\n\t\t\t}\n\t\t});\n\t\tthis.emit('updateUniforms', ...arguments);\n\t}\n\n\tupdateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tthis._updateUniforms(updates, options);\n\n\t\tif (typeof updates.u_time === 'number') {\n\t\t\tthis.tElapsed = updates.u_time;\n\t\t\tif (!isNaN(this.tStart)) this.tStart = performance.now();\n\t\t}\n\t\tif (typeof updates.u_frame === 'number') this.frame = updates.u_frame;\n\t}\n\n\tprivate createTex(\n\t\tname: string | symbol,\n\t\ttextureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> & { unitIndex?: number },\n\t) {\n\t\tconst gl = this.gl;\n\t\tconst { width, height } = textureInfo;\n\t\tconst historyDepth = textureInfo.history?.depth ?? 0;\n\n\t\tconst texture = gl.createTexture();\n\t\tif (!texture) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(15, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\thistoryDepth,\n\t\t\t\t\t})\n\t\t\t\t: spError(15);\n\t\t}\n\n\t\tlet unitIndex = textureInfo.unitIndex;\n\t\tif (typeof unitIndex !== 'number') {\n\t\t\ttry {\n\t\t\t\tunitIndex = this.reserveTex(name);\n\t\t\t} catch (error) {\n\t\t\t\tgl.deleteTexture(texture);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst hasHistory = historyDepth > 0;\n\t\tconst textureTarget = hasHistory ? gl.TEXTURE_2D_ARRAY : gl.TEXTURE_2D;\n\t\tconst { options } = textureInfo;\n\t\tgl.activeTexture(gl.TEXTURE0 + unitIndex);\n\t\tgl.bindTexture(textureTarget, texture);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_S, options.wrapS);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_WRAP_T, options.wrapT);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MIN_FILTER, options.minFilter);\n\t\tgl.texParameteri(textureTarget, gl.TEXTURE_MAG_FILTER, options.magFilter);\n\t\tif (hasHistory) {\n\t\t\tgl.texStorage3D(textureTarget, 1, options.internalFormat, width, height, historyDepth);\n\t\t} else if (name === INTERMEDIATE_TEXTURE_KEY) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\toptions.internalFormat,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\toptions.format,\n\t\t\t\toptions.type,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\treturn { texture, unitIndex };\n\t}\n\n\tprivate initTex(name: string | symbol, source: TextureSource, options?: InitializeTextureOptions) {\n\t\tconst gl = this.gl;\n\t\tif (this.textures.has(name)) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(16, { name: stringFrom(name) }) : spError(16);\n\t\t}\n\n\t\tconst { history: historyDepth = 0, ...texOptions } = options ?? {};\n\t\tconst { width, height } = getSourceDimensions(source);\n\t\tif (!width || !height) {\n\t\t\tthrow __SHADERPAD_DEV__\n\t\t\t\t? spError(17, {\n\t\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tsourceType: source.constructor.name,\n\t\t\t\t\t})\n\t\t\t\t: spError(17);\n\t\t}\n\t\tconst textureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> = {\n\t\t\twidth,\n\t\t\theight,\n\t\t\toptions:\n\t\t\t\tsource instanceof ShaderPad &&\n\t\t\t\tObject.keys(texOptions).length === 0 &&\n\t\t\t\tsource.textures.has(INTERMEDIATE_TEXTURE_KEY)\n\t\t\t\t\t? source.textures.get(INTERMEDIATE_TEXTURE_KEY)!.options\n\t\t\t\t\t: this.resolveTexOpts(texOptions),\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\ttextureInfo.history = { depth: historyDepth, writeIndex: 0 };\n\t\t}\n\t\tconst { texture, unitIndex } = this.createTex(name, textureInfo);\n\t\tconst completeTextureInfo: Texture = {\n\t\t\ttexture,\n\t\t\tunitIndex,\n\t\t\t...textureInfo,\n\t\t};\n\t\tif (historyDepth > 0) {\n\t\t\tthis.initializeUniform(`${stringFrom(name)}FrameOffset`, 'int', 0, { allowMissing: true });\n\t\t\tthis.clearHistTexLayers(completeTextureInfo);\n\t\t}\n\t\tthis.textures.set(name, completeTextureInfo);\n\t\tif (name !== INTERMEDIATE_TEXTURE_KEY && name !== HISTORY_TEXTURE_KEY) {\n\t\t\tthis.updateTex(name, source);\n\t\t}\n\n\t\t// Set a uniform to access the texture in the fragment shader.\n\t\tgl.useProgram(this.program!);\n\t\tconst uSampler = gl.getUniformLocation(this.program!, stringFrom(name));\n\t\tif (uSampler) {\n\t\t\tgl.uniform1i(uSampler, unitIndex);\n\t\t}\n\t}\n\n\tinitializeTexture(name: string, source: TextureSource, options?: InitializeTextureOptions) {\n\t\t// Since history[0] is the current frame, add 1 to history depth to allow history[maxHistory].\n\t\tconst opts =\n\t\t\toptions?.history != null && options.history > 0 ? { ...options, history: options.history + 1 } : options;\n\t\tthis.initTex(name, source, opts);\n\t\tthis.emit('initializeTexture', ...arguments);\n\t}\n\n\tupdateTextures(updates: Record<string, UpdateTextureSource>) {\n\t\tObject.entries(updates).forEach(([name, source]) => {\n\t\t\tthis.updateTex(name, source);\n\t\t});\n\t\tthis.emit('updateTextures', ...arguments);\n\t}\n\n\tprivate updateTex(name: string | symbol, source: UpdateTextureSource, historySlots?: HistorySlots) {\n\t\tconst gl = this.gl;\n\t\tconst info = this.textures.get(name);\n\t\tif (!info) {\n\t\t\tthrow __SHADERPAD_DEV__ ? spError(18, { name: stringFrom(name) }) : spError(18);\n\t\t}\n\n\t\tif (source instanceof WebGLTexture) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, source);\n\t\t\treturn;\n\t\t}\n\n\t\tlet nonShaderPadSource = source as Exclude<UpdateTextureSource, ShaderPad>;\n\t\tif (source instanceof ShaderPad) {\n\t\t\tconst sourceIntermediateInfo = source.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tconst srcW = sourceIntermediateInfo.width;\n\t\t\tconst srcH = sourceIntermediateInfo.height;\n\n\t\t\tif (source.gl === gl) {\n\t\t\t\tif (!info.history) {\n\t\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, sourceIntermediateInfo.texture);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { depth } = info.history;\n\t\t\t\tconst targetSlots =\n\t\t\t\t\thistorySlots === undefined\n\t\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, source.intermediateFbo);\n\t\t\t\tfor (const slot of targetSlots) {\n\t\t\t\t\tgl.copyTexSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, slot, 0, 0, srcW, srcH);\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1], { allowMissing: true });\n\t\t\t\tif (historySlots === undefined) {\n\t\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Different contexts - transfer via readPixels to preserve precision.\n\t\t\tconst {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\toptions: { format, type },\n\t\t\t} = sourceIntermediateInfo;\n\t\t\tconst pixels = this.getPxArray(type, width * height * 4);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, source.intermediateFbo);\n\t\t\tsource.gl.readPixels(0, 0, width, height, format, type, pixels);\n\t\t\tsource.gl.bindFramebuffer(source.gl.FRAMEBUFFER, null);\n\t\t\tnonShaderPadSource = { data: pixels, width, height };\n\t\t}\n\n\t\t// If dimensions changed, recreate the texture with new dimensions.\n\t\tconst { width, height } = getSourceDimensions(nonShaderPadSource);\n\t\tif (!width || !height) return;\n\n\t\tconst isPartial = 'isPartial' in nonShaderPadSource && nonShaderPadSource.isPartial;\n\t\tif (!isPartial) {\n\t\t\tthis.resizeTex(name, width, height);\n\t\t}\n\n\t\t// UNPACK_FLIP_Y_WEBGL only works for DOM element sources, not typed arrays.\n\t\tconst isCustomTexture = 'data' in nonShaderPadSource && nonShaderPadSource.data;\n\t\tconst shouldFlipY = !isCustomTexture && !info.options?.preserveY;\n\t\tconst previousFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);\n\t\tconst needsAlignmentFix = isCustomTexture && !this.isRgba(info.options.format);\n\t\tconst shouldConvertColorSpace = !isCustomTexture && info.options.colorSpace && 'unpackColorSpace' in gl;\n\t\tconst previousColorSpace = gl.unpackColorSpace;\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = gl.getParameter(gl.UNPACK_ALIGNMENT);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = info.options.colorSpace!;\n\n\t\tif (info.history) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\tconst { depth } = info.history;\n\t\t\tconst targetSlots =\n\t\t\t\thistorySlots === undefined\n\t\t\t\t\t? [info.history.writeIndex]\n\t\t\t\t\t: Array.isArray(historySlots)\n\t\t\t\t\t\t? historySlots.map(i => safeMod(i, depth))\n\t\t\t\t\t\t: [safeMod(historySlots, depth)];\n\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\tconst sourceData =\n\t\t\t\tpartialSource.data ?? (nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>);\n\t\t\tconst xOffset = isPartial ? (partialSource.x ?? 0) : 0;\n\t\t\tconst yOffset = isPartial ? (partialSource.y ?? 0) : 0;\n\n\t\t\tfor (const slot of targetSlots) {\n\t\t\t\tgl.texSubImage3D(\n\t\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t\t0,\n\t\t\t\t\txOffset,\n\t\t\t\t\tyOffset,\n\t\t\t\t\tslot,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t1,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tsourceData as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t\tthis.updateFrameOffset(name, targetSlots[targetSlots.length - 1]);\n\t\t\tif (historySlots === undefined) {\n\t\t\t\tinfo.history.writeIndex = (info.history.writeIndex + 1) % depth;\n\t\t\t}\n\t\t} else {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + info.unitIndex);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, info.texture);\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, shouldFlipY);\n\n\t\t\tif (isPartial) {\n\t\t\t\tconst partialSource = nonShaderPadSource as PartialCustomTexture;\n\t\t\t\tgl.texSubImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tpartialSource.x ?? 0,\n\t\t\t\t\tpartialSource.y ?? 0,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\tpartialSource.data,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.internalFormat,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t0,\n\t\t\t\t\tinfo.options.format,\n\t\t\t\t\tinfo.options.type,\n\t\t\t\t\t((nonShaderPadSource as PartialCustomTexture).data ??\n\t\t\t\t\t\t(nonShaderPadSource as Exclude<TextureSource, CustomTexture | ShaderPad>)) as any,\n\t\t\t\t);\n\t\t\t}\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t}\n\n\t\tif (shouldConvertColorSpace) gl.unpackColorSpace = previousColorSpace;\n\t\tif (needsAlignmentFix) gl.pixelStorei(gl.UNPACK_ALIGNMENT, previousAlignment);\n\t}\n\n\tprivate bindIntermediate() {\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.intermediateFbo);\n\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, intermediateInfo.texture, 0);\n\t}\n\n\tclear() {\n\t\tthis.bindIntermediate();\n\t\tconst gl = this.gl;\n\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\tif (intermediateInfo.options.isIntegerColorFormat) {\n\t\t\tconst t = intermediateInfo.options.type;\n\t\t\tif (this.uintTypes.has(t)) {\n\t\t\t\tgl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(4));\n\t\t\t} else {\n\t\t\t\tgl.clearBufferiv(gl.COLOR, 0, new Int32Array(4));\n\t\t\t}\n\t\t} else {\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t}\n\t}\n\n\tdraw(options?: StepOptions | void) {\n\t\tthis.emit('preDraw', ...arguments);\n\t\tconst gl = this.gl;\n\t\tconst w = gl.drawingBufferWidth;\n\t\tconst h = gl.drawingBufferHeight;\n\n\t\tif (options?.skipClear) {\n\t\t\tthis.bindIntermediate();\n\t\t} else {\n\t\t\tthis.clear();\n\t\t}\n\n\t\tgl.useProgram(this.program);\n\t\tgl.bindVertexArray(this.vao);\n\t\tgl.viewport(0, 0, w, h);\n\t\tgl.drawArrays(gl.TRIANGLES, 0, 3);\n\n\t\tif (!this.isHeadless) {\n\t\t\tconst intermediateInfo = this.textures.get(INTERMEDIATE_TEXTURE_KEY)!;\n\t\t\tif (!intermediateInfo.options.isIntegerColorFormat) {\n\t\t\t\tconst desiredColorSpace = intermediateInfo.options.colorSpace ?? 'srgb';\n\t\t\t\tif ('drawingBufferColorSpace' in gl && gl.drawingBufferColorSpace !== desiredColorSpace) {\n\t\t\t\t\tgl.drawingBufferColorSpace = desiredColorSpace;\n\t\t\t\t}\n\t\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\t\tgl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n\t\t\t\tgl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t}\n\t\t}\n\t\tthis.emit('postDraw', ...arguments);\n\t}\n\n\tstep(options?: StepOptions) {\n\t\tthis._step(performance.now(), options);\n\t}\n\n\tprivate tick() {\n\t\tconst updates: Record<string, number> = {};\n\t\tif (this.uniforms.has('u_time')) updates.u_time = this.tElapsed;\n\t\tif (this.uniforms.has('u_frame')) updates.u_frame = this.frame;\n\t\tif (Object.keys(updates).length) this._updateUniforms(updates);\n\t}\n\n\tprivate _step(now: number, opts?: StepOptions | ((time: number, frame: number) => StepOptions | void)) {\n\t\tconst t = this.getElapsed(now);\n\t\tthis.tElapsed = t;\n\t\tthis.tStart = now;\n\t\tconst options = typeof opts === 'function' ? opts(t, this.frame) : opts;\n\t\tthis.emit('preStep', t, this.frame, options);\n\t\tthis.tick();\n\t\tthis.draw(options);\n\t\tconst historyInfo = this.textures.get(HISTORY_TEXTURE_KEY);\n\t\tif (historyInfo && !options?.skipHistory) {\n\t\t\tconst { writeIndex, depth } = historyInfo.history!;\n\t\t\tconst gl = this.gl;\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, this.intermediateFbo);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D_ARRAY, historyInfo.texture);\n\t\t\tgl.copyTexSubImage3D(\n\t\t\t\tgl.TEXTURE_2D_ARRAY,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\twriteIndex,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tgl.drawingBufferWidth,\n\t\t\t\tgl.drawingBufferHeight,\n\t\t\t);\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n\t\t\tconst nextWriteIndex = (writeIndex + 1) % depth;\n\t\t\tthis.updateFrameOffset(HISTORY_TEXTURE_KEY, nextWriteIndex, { allowMissing: true });\n\t\t\thistoryInfo.history!.writeIndex = nextWriteIndex;\n\t\t}\n\t\t++this.frame;\n\t\tthis.emit('postStep', t, this.frame, options);\n\t}\n\n\tplay(onPreStep?: (time: number, frame: number) => StepOptions | void) {\n\t\tthis._pause();\n\t\tconst loop = (now: number) => {\n\t\t\tthis._step(now, onPreStep);\n\t\t\tif (this.frameId != null) this.frameId = requestAnimationFrame(loop);\n\t\t};\n\t\tthis.frameId = requestAnimationFrame(loop);\n\t\tthis.emit('play');\n\t}\n\n\tprivate getElapsed(time: number) {\n\t\tif (isNaN(this.tStart)) return this.tElapsed;\n\t\treturn this.tElapsed + (time - this.tStart) / 1000;\n\t}\n\n\tprivate _pause() {\n\t\tif (isNaN(this.tStart) && this.frameId == null) return;\n\t\tif (this.frameId != null) {\n\t\t\tcancelAnimationFrame(this.frameId);\n\t\t\tthis.frameId = null;\n\t\t}\n\t\tthis.tElapsed = this.getElapsed(performance.now());\n\t\tthis.tStart = NaN;\n\t\treturn true;\n\t}\n\n\tpause() {\n\t\tif (this._pause()) this.emit('pause');\n\t}\n\n\trewind() {\n\t\tthis.frame = 0;\n\t\tthis.tElapsed = 0;\n\t\tthis.tStart = NaN;\n\t\tthis.tick();\n\t}\n\n\treset() {\n\t\tthis.rewind();\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHist(name, texture);\n\t\t});\n\t\tthis.clear();\n\t\tthis.emit('reset');\n\t}\n\n\tdestroy() {\n\t\tthis.emit('destroy');\n\n\t\tthis._pause();\n\t\tconst gl = this.gl;\n\n\t\tif (this.cursorTgt) {\n\t\t\tthis.listeners.forEach((listener, event) => {\n\t\t\t\tthis.cursorTgt!.removeEventListener(event, listener);\n\t\t\t});\n\t\t\tthis.listeners.clear();\n\t\t}\n\n\t\tif (this.resObserver) {\n\t\t\tthis.resObserver.disconnect();\n\t\t\tthis.resObserver = null;\n\t\t}\n\n\t\tif (this.program) {\n\t\t\tgl.deleteProgram(this.program);\n\t\t\tthis.program = null;\n\t\t}\n\n\t\tif (this.intermediateFbo) {\n\t\t\tgl.deleteFramebuffer(this.intermediateFbo);\n\t\t\tthis.intermediateFbo = null;\n\t\t}\n\n\t\tthis.textures.forEach(texture => {\n\t\t\tthis.texPool.free.push(texture.unitIndex);\n\t\t\tgl.deleteTexture(texture.texture);\n\t\t});\n\t\tthis.textures.clear();\n\t\tconst entry = canvasRegistry.get(this.canvas);\n\t\tif (entry) {\n\t\t\tentry.instances.delete(this);\n\t\t\tif (entry.instances.size === 0) {\n\t\t\t\tcanvasRegistry.delete(this.canvas);\n\t\t\t}\n\t\t}\n\n\t\tif (this.vao) {\n\t\t\tgl.deleteVertexArray(this.vao);\n\t\t\tthis.vao = null;\n\t\t}\n\n\t\tif (this.buffer) {\n\t\t\tgl.deleteBuffer(this.buffer);\n\t\t\tthis.buffer = null;\n\t\t}\n\n\t\tthis.uniforms.clear();\n\t\tthis.hooks.clear();\n\t}\n}\n\nexport default ShaderPad;\n"],"mappings":"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","names":["canvas","width","height"]}