shaderpad 1.0.0-beta.76 → 1.0.0-beta.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/chunk-O3TAD633.mjs +2 -0
  2. package/dist/chunk-O3TAD633.mjs.map +1 -0
  3. package/dist/chunk-PZ4UVAHU.mjs +10 -0
  4. package/dist/chunk-PZ4UVAHU.mjs.map +1 -0
  5. package/dist/dev/{chunk-KRIFZAFR.mjs → chunk-QYD24S7K.mjs} +4 -7
  6. package/dist/dev/chunk-QYD24S7K.mjs.map +1 -0
  7. package/dist/dev/chunk-YN3AO6HP.mjs +195 -0
  8. package/dist/dev/chunk-YN3AO6HP.mjs.map +1 -0
  9. package/dist/dev/index.js +3 -6
  10. package/dist/dev/index.js.map +1 -1
  11. package/dist/dev/index.mjs +1 -1
  12. package/dist/dev/plugins/pose.js +3 -6
  13. package/dist/dev/plugins/pose.js.map +1 -1
  14. package/dist/dev/plugins/pose.mjs +1 -1
  15. package/dist/dev/plugins/segmenter.js +3 -6
  16. package/dist/dev/plugins/segmenter.js.map +1 -1
  17. package/dist/dev/plugins/segmenter.mjs +1 -1
  18. package/dist/dev/react.js +477 -191
  19. package/dist/dev/react.js.map +1 -1
  20. package/dist/dev/react.mjs +306 -187
  21. package/dist/dev/react.mjs.map +1 -1
  22. package/dist/dev/web-component.js +1905 -0
  23. package/dist/dev/web-component.js.map +1 -0
  24. package/dist/dev/web-component.mjs +482 -0
  25. package/dist/dev/web-component.mjs.map +1 -0
  26. package/dist/index.js +2 -2
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1 -1
  29. package/dist/plugins/pose.js +8 -8
  30. package/dist/plugins/pose.js.map +1 -1
  31. package/dist/plugins/pose.mjs +1 -1
  32. package/dist/plugins/segmenter.js +2 -2
  33. package/dist/plugins/segmenter.js.map +1 -1
  34. package/dist/plugins/segmenter.mjs +1 -1
  35. package/dist/react.d.mts +20 -9
  36. package/dist/react.d.ts +20 -9
  37. package/dist/react.js +4 -5
  38. package/dist/react.js.map +1 -1
  39. package/dist/react.mjs +1 -2
  40. package/dist/react.mjs.map +1 -1
  41. package/dist/web-component.d.mts +119 -0
  42. package/dist/web-component.d.ts +119 -0
  43. package/dist/web-component.js +10 -0
  44. package/dist/web-component.js.map +1 -0
  45. package/dist/web-component.mjs +2 -0
  46. package/dist/web-component.mjs.map +1 -0
  47. package/package.json +13 -1
  48. package/dist/chunk-NWUH6TTN.mjs +0 -10
  49. package/dist/chunk-NWUH6TTN.mjs.map +0 -1
  50. package/dist/dev/chunk-KRIFZAFR.mjs.map +0 -1
@@ -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:s,play:a,pause:i,onVisibilityChange:u}){let o=e.ownerDocument,l=t,f=n,m=o.visibilityState==="visible",p=T(e),c=!1,v=null,h=()=>m&&(typeof IntersectionObserver=="function"?p:T(e))&&e.isConnected,d=()=>{let r=h();if(v!==r&&(v=r,u?.(r)),!l){c&&s()&&i(),c=!1;return}if(!f||r){s()||a(),c=!0;return}c&&s()&&i(),c=!1},E=()=>{m=o.visibilityState==="visible",d()};o.addEventListener("visibilitychange",E);let b=typeof IntersectionObserver=="function"?new IntersectionObserver(r=>{p=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"]];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={},s=y(e(`${t}history`));if(s!=null){let i=Number.parseInt(s,10);Number.isFinite(i)&&i>=0&&(n.history=i)}let a=e(`${t}preserve-y`);a!=null&&(n.preserveY=g(a,!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 O(e){return e instanceof HTMLImageElement||e instanceof HTMLVideoElement||e instanceof HTMLCanvasElement}function S(e){return!(e instanceof HTMLImageElement)}function L(e,t){let n={once:!0};return new Promise((s,a)=>{let i=()=>{e.removeEventListener(t,u),e.removeEventListener("error",o)},u=l=>{i(),s(l)},o=l=>{i(),a(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,O as e,S as f,P as g,k as h,A as i};
2
+ //# sourceMappingURL=chunk-O3TAD633.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] 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"]}
@@ -0,0 +1,10 @@
1
+ import{a as g,b as A}from"./chunk-QROQ7JVO.mjs";var G=`#version 300 es
2
+ in vec2 a_position;
3
+ out vec2 v_uv;
4
+ void main() {
5
+ gl_Position = vec4(a_position, 0.0, 1.0);
6
+ v_uv = a_position * 0.5 + 0.5;
7
+ }`,O=[["8UI","UNSIGNED_BYTE"],["8I","BYTE"],["16UI","UNSIGNED_SHORT"],["16I","SHORT"],["16F","HALF_FLOAT"],["32UI","UNSIGNED_INT"],["32I","INT"],["32F","FLOAT"],["8","UNSIGNED_BYTE"]],D={float:"f",int:"i",uint:"ui"};function N(l){return l&&O.find(([t])=>l.endsWith(t))?.[1]}var R=Symbol("u_history"),T=Symbol("__SHADERPAD_BUFFER"),F=new WeakMap;function M(l,t){if(!t?.length)return l;let e=l.split(`
8
+ `),r=e.findLastIndex(i=>{let s=i.trimStart();return s.startsWith("precision ")||s.startsWith("#version ")})+1;return e.splice(r,0,...t),e.join(`
9
+ `)}function P(l){return l instanceof WebGLTexture?{width:0,height:0}:l instanceof v?{width:l.canvas.width,height:l.canvas.height}:l instanceof HTMLVideoElement?{width:l.videoWidth,height:l.videoHeight}:l instanceof HTMLImageElement?{width:l.naturalWidth??l.width,height:l.naturalHeight??l.height}:{width:l.width,height:l.height}}function U(l){return typeof l=="symbol"?l.description??"":l}var v=class l{isHeadless=!1;isTouchDevice=!1;gl;glHelpers;uniforms=new Map;textures=new Map;textureUnitPool;buffer=null;vao=null;program=null;animationFrameId;eventListeners=new Map;frame=0;startTime=Number.NaN;isPlaying=!1;cursorPosition=[.5,.5];clickPosition=[.5,.5];isMouseDown=!1;canvas;resolutionObserver=null;hooks=new Map;historyDepth=0;textureOptions;cursorTarget;intermediateFbo=null;constructor(t,{canvas:e,plugins:r,history:i,cursorTarget:s,...a}={}){if(e&&"getContext"in e)this.canvas=e;else{let{width:c=1,height:m=1}=e||{};this.canvas=new OffscreenCanvas(c,m),this.isHeadless=!0}let n=this.canvas.getContext("webgl2",{antialias:!1});if(!n)throw g(0,!1);this.gl=n,this.glHelpers={typeToArray: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]]),typeToInternalFormatString: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"]]),unsignedIntTypes:new Set([n.UNSIGNED_BYTE,n.UNSIGNED_SHORT,n.UNSIGNED_INT])};let o=F.get(this.canvas);o||(o={textureUnitPool:{free:[],next:0,max:n.getParameter(n.MAX_COMBINED_TEXTURE_IMAGE_UNITS)},instances:new Set([this])},F.set(this.canvas,o)),this.textureUnitPool=o.textureUnitPool,o.instances.add(this),this.textureOptions=a,i&&(this.historyDepth=i),this.cursorTarget=s??(this.canvas instanceof HTMLCanvasElement?this.canvas:void 0),this.animationFrameId=null;let u=[];r&&r.forEach(c=>c(this,{injectGLSL:m=>{u.push(m)},emit:this.emit.bind(this),updateTexture:this.updateTexture.bind(this)}));let h=this.gl.createProgram();if(!h)throw g(1);this.program=h;let f=this.createShader(this.gl.VERTEX_SHADER,G),E=this.createShader(n.FRAGMENT_SHADER,M(t,u));if(n.attachShader(h,f),n.attachShader(h,E),n.bindAttribLocation(h,0,"a_position"),n.linkProgram(h),n.deleteShader(f),n.deleteShader(E),!n.getProgramParameter(h,n.LINK_STATUS)){let c=g(2,!1);throw n.deleteProgram(h),c}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(h),this.canvas instanceof HTMLCanvasElement)this.resolutionObserver=new MutationObserver(()=>this.syncResolution()),this.resolutionObserver.observe(this.canvas,{attributes:!0,attributeFilter:["width","height"]});else{let c=m=>{let p=Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype,m),d=this.canvas;Object.defineProperty(d,m,{get:()=>p.get.call(d),set:_=>{p.set.call(d,_);let x=F.get(d);if(x)for(let b of x.instances)b.syncResolution()},configurable:p.configurable,enumerable:p.enumerable})};c("width"),c("height")}this.syncResolution(),this.initializeUniform("u_cursor","float",this.cursorPosition,{allowMissing:!0}),this.initializeUniform("u_click","float",[...this.clickPosition,this.isMouseDown?1:0],{allowMissing:!0}),this.initializeUniform("u_time","float",0,{allowMissing:!0}),this.initializeUniform("u_frame","int",0,{allowMissing:!0}),this._initializeTexture(T,this.canvas,{...this.textureOptions}),this.intermediateFbo=n.createFramebuffer(),this.bindIntermediate(),n.bindFramebuffer(n.FRAMEBUFFER,null),this.historyDepth>0&&this._initializeTexture(R,this.canvas,{history:this.historyDepth,...this.textureOptions}),this.addEventListeners(),this.emit("_init")}resolveGLConstant(t){let e=this.gl[t];if(e===void 0)throw g(3,!1);return e}emit(t,...e){this.hooks.get(t)?.forEach(r=>r.call(this,...e))}on(t,e){this.hooks.has(t)||this.hooks.set(t,[]),this.hooks.get(t).push(e)}off(t,e){let r=this.hooks.get(t);if(r){let i=r.indexOf(e);i>=0&&r.splice(i,1)}}createShader(t,e){let r=this.gl.createShader(t);if(this.gl.shaderSource(r,e),this.gl.compileShader(r),!this.gl.getShaderParameter(r,this.gl.COMPILE_STATUS)){console.error(this.gl.getShaderInfoLog(r));let i=g(4,!1);throw this.gl.deleteShader(r),i}return r}getCursorTargetRect(){let t=this.cursorTarget;return t===window?{left:0,top:0,width:window.innerWidth,height:window.innerHeight}:t.getBoundingClientRect()}addEventListeners(){if(!this.cursorTarget)return;let t=(r,i)=>{if(!this.uniforms.has("u_cursor"))return;let s=this.getCursorTargetRect(),a=(r-s.left)/s.width,n=1-(i-s.top)/s.height;this.cursorPosition[0]=Math.max(0,Math.min(1,a)),this.cursorPosition[1]=Math.max(0,Math.min(1,n)),this.updateUniforms({u_cursor:this.cursorPosition})},e=(r,i,s)=>{if(this.uniforms.has("u_click")){if(this.isMouseDown=r,r){let a=this.getCursorTargetRect(),n=i,o=s;this.clickPosition[0]=Math.max(0,Math.min(1,(n-a.left)/a.width)),this.clickPosition[1]=Math.max(0,Math.min(1,1-(o-a.top)/a.height))}this.updateUniforms({u_click:[...this.clickPosition,this.isMouseDown?1:0]})}};this.eventListeners.set("mousemove",r=>{let i=r;this.isTouchDevice||t(i.clientX,i.clientY)}),this.eventListeners.set("mousedown",r=>{let i=r;this.isTouchDevice||i.button===0&&(this.isMouseDown=!0,e(!0,i.clientX,i.clientY))}),this.eventListeners.set("mouseup",r=>{let i=r;this.isTouchDevice||i.button===0&&e(!1)}),this.eventListeners.set("touchmove",r=>{let i=r;i.touches.length>0&&t(i.touches[0].clientX,i.touches[0].clientY)}),this.eventListeners.set("touchstart",r=>{let i=r;this.isTouchDevice=!0,i.touches.length>0&&(t(i.touches[0].clientX,i.touches[0].clientY),e(!0,i.touches[0].clientX,i.touches[0].clientY))}),this.eventListeners.set("touchend",r=>{r.touches.length===0&&e(!1)}),this.eventListeners.forEach((r,i)=>{this.cursorTarget.addEventListener(i,r)})}syncResolution(){let t=[this.gl.drawingBufferWidth,this.gl.drawingBufferHeight];this.gl.viewport(0,0,...t),this.uniforms.has("u_resolution")?this.updateUniforms({u_resolution:t}):this.initializeUniform("u_resolution","float",t,{allowMissing:!0}),this.resizeTexture(T,...t),this.historyDepth>0&&this.resizeTexture(R,...t),this.emit("updateResolution",...t)}resizeTexture(t,e,r){let i=this.textures.get(t);if(!i||i.width===e&&i.height===r)return;this.gl.deleteTexture(i.texture),i.width=e,i.height=r;let{texture:s}=this.createTexture(t,i);i.texture=s,this.resetHistoryTextureState(t,i)}reserveTextureUnit(t){let e=this.textures.get(t);if(e)return e.unitIndex;if(this.textureUnitPool.free.length>0)return this.textureUnitPool.free.pop();if(this.textureUnitPool.next>=this.textureUnitPool.max)throw g(5,!1);return this.textureUnitPool.next++}resolveTextureOptions(t){let{gl:e}=this,r=t?.internalFormat,i=t?.type??N(r)??"UNSIGNED_BYTE",s=this.resolveGLConstant(i),a=r??this.glHelpers.typeToInternalFormatString.get(s)??"RGBA8",n=/^(R|RG|RGB|RGBA)(8|16|32)(UI|I)$/.test(a),o=t?.format??(n?"RGBA_INTEGER":"RGBA"),u={type:s,format:this.resolveGLConstant(o),internalFormat:this.resolveGLConstant(a),minFilter:this.resolveGLConstant(t?.minFilter??"LINEAR"),magFilter:this.resolveGLConstant(t?.magFilter??"LINEAR"),wrapS:this.resolveGLConstant(t?.wrapS??"CLAMP_TO_EDGE"),wrapT:this.resolveGLConstant(t?.wrapT??"CLAMP_TO_EDGE"),preserveY:t?.preserveY,isIntegerColorFormat:n};if((u.internalFormat===e.RGBA16F||u.internalFormat===e.RGBA32F)&&!e.getExtension("EXT_color_buffer_float"))throw g(6,!1);return u}getPixelArray(t,e){let r=this.glHelpers.typeToArray.get(t)??Uint8Array;return new r(e)}isNotRgba(t){return t!==this.gl.RGBA&&t!==this.gl.RGBA_INTEGER}clearHistoryTextureLayers(t){if(!t.history)return;let e=this.gl,{type:r,format:i}=t.options,s=this.getPixelArray(r,t.width*t.height*4);e.activeTexture(e.TEXTURE0+t.unitIndex),e.bindTexture(e.TEXTURE_2D_ARRAY,t.texture);let a=this.isNotRgba(i),n;a&&(n=e.getParameter(e.UNPACK_ALIGNMENT),e.pixelStorei(e.UNPACK_ALIGNMENT,1));for(let o=0;o<t.history.depth;++o)e.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,o,t.width,t.height,1,i,r,s);a&&e.pixelStorei(e.UNPACK_ALIGNMENT,n)}updateTextureFrameOffset(t,e,r){this.updateUniforms({[`${U(t)}FrameOffset`]:e},r)}resetHistoryTextureState(t,e){e.history&&(e.history.writeIndex=0,this.clearHistoryTextureLayers(e),this.updateTextureFrameOffset(t,0,{allowMissing:!0}))}initializeUniform(t,e,r,i){let s=i?.arrayLength,a=i?.allowMissing??!1;if(this.uniforms.has(t))throw g(7,!1);if(!D[e])throw g(8,!1);if(s&&!(Array.isArray(r)&&r.length===s))throw g(9,!1);let n=this.gl.getUniformLocation(this.program,t);if(!n&&s&&(n=this.gl.getUniformLocation(this.program,`${t}[0]`)),!n){if(a)return;throw g(19,!1)}let o=s?r[0]:r,u=Array.isArray(o)?o.length:1;this.uniforms.set(t,{type:e,length:u,location:n,arrayLength:s});try{this.updateUniforms({[t]:r})}catch(h){throw this.uniforms.delete(t),h}this.emit("initializeUniform",...arguments)}updateUniforms(t,e){this.gl.useProgram(this.program),Object.entries(t).forEach(([r,i])=>{let s=this.uniforms.get(r);if(!s){if(e?.allowMissing)return;throw g(20,!1)}let a=`uniform${s.length}${D[s.type]}`;if(s.arrayLength){if(!Array.isArray(i))throw g(10,!1);let n=i.length;if(!n)return;if(n>s.arrayLength)throw g(11,!1);if(i.some(f=>(Array.isArray(f)?f.length:1)!==s.length))throw g(12,!1);let o=i.flat(),u=s.type==="float"?new Float32Array(o):s.type==="uint"?new Uint32Array(o):new Int32Array(o),h=s.location;if(e?.startIndex){let f=this.gl.getUniformLocation(this.program,`${r}[${e.startIndex}]`);if(!f)throw g(13,!1);h=f}this.gl[a+"v"](h,u)}else{Array.isArray(i)||(i=[i]);let n=i;if(n.length!==s.length)throw g(14,!1);this.gl[a](s.location,...n)}}),this.emit("updateUniforms",...arguments)}createTexture(t,e){let{width:r,height:i}=e,s=e.history?.depth??0,a=this.gl.createTexture();if(!a)throw g(15,!1);let n=e.unitIndex;if(typeof n!="number")try{n=this.reserveTextureUnit(t)}catch(f){throw this.gl.deleteTexture(a),f}let o=s>0,u=o?this.gl.TEXTURE_2D_ARRAY:this.gl.TEXTURE_2D,{options:h}=e;return this.gl.activeTexture(this.gl.TEXTURE0+n),this.gl.bindTexture(u,a),this.gl.texParameteri(u,this.gl.TEXTURE_WRAP_S,h.wrapS),this.gl.texParameteri(u,this.gl.TEXTURE_WRAP_T,h.wrapT),this.gl.texParameteri(u,this.gl.TEXTURE_MIN_FILTER,h.minFilter),this.gl.texParameteri(u,this.gl.TEXTURE_MAG_FILTER,h.magFilter),o?this.gl.texStorage3D(u,1,h.internalFormat,r,i,s):t===T&&this.gl.texImage2D(this.gl.TEXTURE_2D,0,h.internalFormat,r,i,0,h.format,h.type,null),{texture:a,unitIndex:n}}_initializeTexture(t,e,r){if(this.textures.has(t))throw g(16,!1);let{history:i=0,...s}=r??{},{width:a,height:n}=P(e);if(!a||!n)throw g(17,!1);let o={width:a,height:n,options:e instanceof l&&Object.keys(s).length===0&&e.textures.has(T)?e.textures.get(T).options:this.resolveTextureOptions(s)};i>0&&(o.history={depth:i,writeIndex:0});let{texture:u,unitIndex:h}=this.createTexture(t,o),f={texture:u,unitIndex:h,...o};i>0&&(this.initializeUniform(`${U(t)}FrameOffset`,"int",0,{allowMissing:!0}),this.clearHistoryTextureLayers(f)),this.textures.set(t,f),t!==T&&t!==R&&this.updateTexture(t,e),this.gl.useProgram(this.program);let E=this.gl.getUniformLocation(this.program,U(t));E&&this.gl.uniform1i(E,h)}initializeTexture(t,e,r){let i=r?.history!=null&&r.history>0?{...r,history:r.history+1}:r;this._initializeTexture(t,e,i),this.emit("initializeTexture",...arguments)}updateTextures(t){Object.entries(t).forEach(([e,r])=>{this.updateTexture(e,r)}),this.emit("updateTextures",...arguments)}updateTexture(t,e,r){let i=this.textures.get(t);if(!i)throw g(18,!1);if(e instanceof WebGLTexture){this.gl.activeTexture(this.gl.TEXTURE0+i.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D,e);return}let s=e;if(e instanceof l){let m=e.textures.get(T),p=m.width,d=m.height;if(e.gl===this.gl){if(!i.history){this.gl.activeTexture(this.gl.TEXTURE0+i.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D,m.texture);return}let{depth:S}=i.history,I=r===void 0?[i.history.writeIndex]:Array.isArray(r)?r.map(L=>A(L,S)):[A(r,S)];this.gl.activeTexture(this.gl.TEXTURE0+i.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY,i.texture),this.gl.bindFramebuffer(this.gl.READ_FRAMEBUFFER,e.intermediateFbo);for(let L of I)this.gl.copyTexSubImage3D(this.gl.TEXTURE_2D_ARRAY,0,0,0,L,0,0,p,d);this.gl.bindFramebuffer(this.gl.READ_FRAMEBUFFER,null),this.updateTextureFrameOffset(t,I[I.length-1],{allowMissing:!0}),r===void 0&&(i.history.writeIndex=(i.history.writeIndex+1)%S);return}let{width:_,height:x,options:{format:b,type:y}}=m,w=this.getPixelArray(y,_*x*4);e.gl.bindFramebuffer(e.gl.FRAMEBUFFER,e.intermediateFbo),e.gl.readPixels(0,0,_,x,b,y,w),e.gl.bindFramebuffer(e.gl.FRAMEBUFFER,null),s={data:w,width:_,height:x}}let{width:a,height:n}=P(s);if(!a||!n)return;let o="isPartial"in s&&s.isPartial;o||this.resizeTexture(t,a,n);let u="data"in s&&s.data,h=!u&&!i.options?.preserveY,f=this.gl.getParameter(this.gl.UNPACK_FLIP_Y_WEBGL),E=u&&this.isNotRgba(i.options.format),c;if(E&&(c=this.gl.getParameter(this.gl.UNPACK_ALIGNMENT),this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT,1)),i.history){this.gl.activeTexture(this.gl.TEXTURE0+i.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY,i.texture);let{depth:m}=i.history,p=r===void 0?[i.history.writeIndex]:Array.isArray(r)?r.map(y=>A(y,m)):[A(r,m)];this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,h);let d=s,_=d.data??s,x=o?d.x??0:0,b=o?d.y??0:0;for(let y of p)this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY,0,x,b,y,a,n,1,i.options.format,i.options.type,_);this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,f),this.updateTextureFrameOffset(t,p[p.length-1]),r===void 0&&(i.history.writeIndex=(i.history.writeIndex+1)%m)}else{if(this.gl.activeTexture(this.gl.TEXTURE0+i.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D,i.texture),this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,h),o){let m=s;this.gl.texSubImage2D(this.gl.TEXTURE_2D,0,m.x??0,m.y??0,a,n,i.options.format,i.options.type,m.data)}else this.gl.texImage2D(this.gl.TEXTURE_2D,0,i.options.internalFormat,a,n,0,i.options.format,i.options.type,s.data??s);this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,f)}E&&this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT,c)}bindIntermediate(){let t=this.gl,e=this.textures.get(T);t.bindFramebuffer(t.FRAMEBUFFER,this.intermediateFbo),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,e.texture,0)}clear(){this.bindIntermediate();let t=this.gl,e=this.textures.get(T);if(e.options.isIntegerColorFormat){let r=e.options.type;this.glHelpers.unsignedIntTypes.has(r)?t.clearBufferuiv(t.COLOR,0,new Uint32Array(4)):t.clearBufferiv(t.COLOR,0,new Int32Array(4))}else t.clear(t.COLOR_BUFFER_BIT)}draw(t){this.emit("beforeDraw",...arguments);let e=this.gl,r=e.drawingBufferWidth,i=e.drawingBufferHeight;t?.skipClear?this.bindIntermediate():this.clear(),e.useProgram(this.program),e.bindVertexArray(this.vao),e.viewport(0,0,r,i),e.drawArrays(e.TRIANGLES,0,3),this.isHeadless||this.textures.get(T).options.isIntegerColorFormat||(e.bindFramebuffer(e.READ_FRAMEBUFFER,this.intermediateFbo),e.bindFramebuffer(e.DRAW_FRAMEBUFFER,null),e.blitFramebuffer(0,0,r,i,0,0,r,i,e.COLOR_BUFFER_BIT,e.NEAREST),e.bindFramebuffer(e.FRAMEBUFFER,null)),this.emit("afterDraw",...arguments)}step(t){Number.isFinite(this.startTime)||(this.startTime=performance.now()),this._step((performance.now()-this.startTime)/1e3,t)}_step(t,e){this.emit("beforeStep",t,this.frame,e);let r={};this.uniforms.has("u_time")&&(r.u_time=t),this.uniforms.has("u_frame")&&(r.u_frame=this.frame),this.updateUniforms(r),this.draw(e);let i=this.textures.get(R);if(i&&!e?.skipHistory){let{writeIndex:s,depth:a}=i.history,n=this.gl;n.bindFramebuffer(n.READ_FRAMEBUFFER,this.intermediateFbo),n.bindTexture(n.TEXTURE_2D_ARRAY,i.texture),n.copyTexSubImage3D(n.TEXTURE_2D_ARRAY,0,0,0,s,0,0,n.drawingBufferWidth,n.drawingBufferHeight),n.bindFramebuffer(n.READ_FRAMEBUFFER,null);let o=(s+1)%a;this.updateTextureFrameOffset(R,o,{allowMissing:!0}),i.history.writeIndex=o}++this.frame,this.emit("afterStep",t,this.frame,e)}play(t){this._pause(),Number.isFinite(this.startTime)||(this.startTime=performance.now()),this.isPlaying=!0;let e=r=>{r=(r-this.startTime)/1e3;let i=t?.(r,this.frame)??void 0;this._step(r,i),this.isPlaying&&(this.animationFrameId=requestAnimationFrame(e))};this.animationFrameId=requestAnimationFrame(e),this.emit("play")}_pause(){let t=this.isPlaying;return this.isPlaying=!1,this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),t}pause(){this._pause()&&this.emit("pause")}resetFrame(){this.frame=0,this.startTime=performance.now()}reset(){this.resetFrame(),this.textures.forEach((t,e)=>{this.resetHistoryTextureState(e,t)}),this.clear(),this.emit("reset")}destroy(){this.emit("destroy"),this._pause(),this.cursorTarget&&(this.eventListeners.forEach((e,r)=>{this.cursorTarget.removeEventListener(r,e)}),this.eventListeners.clear()),this.resolutionObserver&&(this.resolutionObserver.disconnect(),this.resolutionObserver=null),this.program&&(this.gl.deleteProgram(this.program),this.program=null),this.intermediateFbo&&(this.gl.deleteFramebuffer(this.intermediateFbo),this.intermediateFbo=null),this.textures.forEach(e=>{this.textureUnitPool.free.push(e.unitIndex),this.gl.deleteTexture(e.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&&(this.gl.deleteVertexArray(this.vao),this.vao=null),this.buffer&&(this.gl.deleteBuffer(this.buffer),this.buffer=null),this.uniforms.clear(),this.hooks.clear()}},H=v;export{H as a};
10
+ //# sourceMappingURL=chunk-PZ4UVAHU.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;\nout vec2 v_uv;\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_uv = a_position * 0.5 + 0.5;\n}`;\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';\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\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\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| 'beforeStep'\n\t| 'afterStep'\n\t| 'beforeDraw'\n\t| 'afterDraw'\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{ textureUnitPool: 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 isTouchDevice = false;\n\tpublic readonly gl: WebGL2RenderingContext;\n\tprivate glHelpers!: {\n\t\ttypeToArray: Map<number, new (length: number) => ArrayBufferView>;\n\t\ttypeToInternalFormatString: Map<number, GLInternalFormatString>;\n\t\tunsignedIntTypes: Set<number>;\n\t};\n\tprivate uniforms: Map<string, Uniform> = new Map();\n\tprivate textures: Map<string | symbol, Texture> = new Map();\n\tprivate textureUnitPool: TextureUnitPool;\n\tprivate buffer: WebGLBuffer | null = null;\n\tprivate vao: WebGLVertexArrayObject | null = null;\n\tprivate program: WebGLProgram | null = null;\n\tprivate animationFrameId: number | null;\n\tprivate eventListeners: Map<string, EventListener> = new Map();\n\tprivate frame = 0;\n\tprivate startTime = Number.NaN;\n\tprivate isPlaying = false;\n\tprivate cursorPosition = [0.5, 0.5];\n\tprivate clickPosition = [0.5, 0.5];\n\tprivate isMouseDown = false;\n\tpublic canvas: HTMLCanvasElement | OffscreenCanvas;\n\tprivate resolutionObserver: MutationObserver | null = null;\n\tprivate hooks: Map<ShaderPadEventName, Function[]> = new Map();\n\tprivate historyDepth = 0;\n\tprivate textureOptions: TextureOptions;\n\tprivate cursorTarget: 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(\n\t\tfragmentShaderSrc: string,\n\t\t{ canvas, plugins, history, cursorTarget, ...textureOptions }: Options = {},\n\t) {\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 spError(\n\t\t\t\t0,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tcanvasType: this.canvas.constructor.name,\n\t\t\t\t\tisHeadless: this.isHeadless,\n\t\t\t\t\tcanvasWidth: this.canvas.width,\n\t\t\t\t\tcanvasHeight: this.canvas.height,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tthis.gl = gl;\n\t\tthis.glHelpers = {\n\t\t\ttypeToArray: new Map<number, new (length: number) => ArrayBufferView>([\n\t\t\t\t[gl.FLOAT, Float32Array],\n\t\t\t\t[gl.HALF_FLOAT, Uint16Array],\n\t\t\t\t[gl.UNSIGNED_SHORT, Uint16Array],\n\t\t\t\t[gl.SHORT, Int16Array],\n\t\t\t\t[gl.BYTE, Int8Array],\n\t\t\t\t[gl.UNSIGNED_INT, Uint32Array],\n\t\t\t\t[gl.INT, Int32Array],\n\t\t\t]),\n\t\t\ttypeToInternalFormatString: new Map<number, GLInternalFormatString>([\n\t\t\t\t[gl.FLOAT, 'RGBA32F'],\n\t\t\t\t[gl.HALF_FLOAT, 'RGBA16F'],\n\t\t\t\t[gl.UNSIGNED_SHORT, 'RGBA32UI'],\n\t\t\t\t[gl.SHORT, 'RGBA32I'],\n\t\t\t\t[gl.BYTE, 'RGBA32I'],\n\t\t\t\t[gl.UNSIGNED_INT, 'RGBA32UI'],\n\t\t\t\t[gl.INT, 'RGBA32I'],\n\t\t\t]),\n\t\t\tunsignedIntTypes: new Set([gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT]),\n\t\t};\n\n\t\tlet registryEntry = canvasRegistry.get(this.canvas);\n\t\tif (!registryEntry) {\n\t\t\tregistryEntry = {\n\t\t\t\ttextureUnitPool: {\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.textureUnitPool = registryEntry.textureUnitPool;\n\t\tregistryEntry.instances.add(this);\n\n\t\tthis.textureOptions = textureOptions;\n\n\t\tif (history) this.historyDepth = history;\n\t\tthis.cursorTarget = cursorTarget ?? (this.canvas instanceof HTMLCanvasElement ? this.canvas : undefined);\n\t\tthis.animationFrameId = 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.updateTexture.bind(this),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst program = this.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(this.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 = spError(\n\t\t\t\t2,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tprogramInfoLog: gl.getProgramInfoLog(program),\n\t\t\t\t\tfragmentShaderLength: fragmentShaderSrc.length,\n\t\t\t\t\tglslInjectionCount: glslInjections.length,\n\t\t\t\t},\n\t\t\t);\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.resolutionObserver = new MutationObserver(() => this.syncResolution());\n\t\t\tthis.resolutionObserver.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.syncResolution();\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.syncResolution();\n\n\t\tthis.initializeUniform('u_cursor', 'float', this.cursorPosition, { allowMissing: true });\n\t\tthis.initializeUniform('u_click', 'float', [...this.clickPosition, this.isMouseDown ? 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._initializeTexture(INTERMEDIATE_TEXTURE_KEY, this.canvas, {\n\t\t\t...this.textureOptions,\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._initializeTexture(HISTORY_TEXTURE_KEY, this.canvas, {\n\t\t\t\thistory: this.historyDepth,\n\t\t\t\t...this.textureOptions,\n\t\t\t});\n\t\t}\n\t\tthis.addEventListeners();\n\t\tthis.emit('_init');\n\t}\n\n\tprivate resolveGLConstant(value: GLConstantString): number {\n\t\tconst resolved = this.gl[value];\n\t\tif (resolved === undefined) {\n\t\t\tthrow spError(3, __SHADERPAD_DEV__ && { value });\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 shader = this.gl.createShader(type)!;\n\t\tthis.gl.shaderSource(shader, source);\n\t\tthis.gl.compileShader(shader);\n\t\tif (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n\t\t\tconsole.error(this.gl.getShaderInfoLog(shader));\n\t\t\tconst compilationError = spError(\n\t\t\t\t4,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tshaderType: type === this.gl.VERTEX_SHADER ? 'vertex' : 'fragment',\n\t\t\t\t\tsource,\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.gl.deleteShader(shader);\n\t\t\tthrow compilationError;\n\t\t}\n\t\treturn shader;\n\t}\n\n\tprivate getCursorTargetRect(): {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t} {\n\t\tconst target = this.cursorTarget!;\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 addEventListeners() {\n\t\tif (!this.cursorTarget) 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.getCursorTargetRect();\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.cursorPosition[0] = Math.max(0, Math.min(1, u));\n\t\t\tthis.cursorPosition[1] = Math.max(0, Math.min(1, v));\n\t\t\tthis.updateUniforms({ u_cursor: this.cursorPosition });\n\t\t};\n\n\t\tconst updateClick = (isMouseDown: boolean, x?: number, y?: number) => {\n\t\t\tif (!this.uniforms.has('u_click')) return;\n\t\t\tthis.isMouseDown = isMouseDown;\n\t\t\tif (isMouseDown) {\n\t\t\t\tconst rect = this.getCursorTargetRect();\n\t\t\t\tconst xVal = x as number;\n\t\t\t\tconst yVal = y as number;\n\t\t\t\tthis.clickPosition[0] = Math.max(0, Math.min(1, (xVal - rect.left) / rect.width));\n\t\t\t\tthis.clickPosition[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.clickPosition, this.isMouseDown ? 1.0 : 0.0],\n\t\t\t});\n\t\t};\n\n\t\tthis.eventListeners.set('mousemove', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouchDevice) {\n\t\t\t\tupdateCursor(mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.eventListeners.set('mousedown', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouchDevice) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tthis.isMouseDown = 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.eventListeners.set('mouseup', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouchDevice) {\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.eventListeners.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.eventListeners.set('touchstart', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tthis.isTouchDevice = 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.eventListeners.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.eventListeners.forEach((listener, event) => {\n\t\t\tthis.cursorTarget!.addEventListener(event, listener);\n\t\t});\n\t}\n\n\tprivate syncResolution() {\n\t\tconst resolution: [number, number] = [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight];\n\t\tthis.gl.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.resizeTexture(INTERMEDIATE_TEXTURE_KEY, ...resolution);\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.resizeTexture(HISTORY_TEXTURE_KEY, ...resolution);\n\t\t}\n\t\tthis.emit('updateResolution', ...resolution);\n\t}\n\n\tprivate resizeTexture(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\tthis.gl.deleteTexture(info.texture);\n\t\tinfo.width = width;\n\t\tinfo.height = height;\n\t\tconst { texture } = this.createTexture(name, info);\n\t\tinfo.texture = texture;\n\t\tthis.resetHistoryTextureState(name, info);\n\t}\n\n\tprivate reserveTextureUnit(name: string | symbol) {\n\t\tconst existing = this.textures.get(name);\n\t\tif (existing) return existing.unitIndex;\n\t\tif (this.textureUnitPool.free.length > 0) return this.textureUnitPool.free.pop()!;\n\t\tif (this.textureUnitPool.next >= this.textureUnitPool.max) {\n\t\t\tthrow spError(\n\t\t\t\t5,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\tnextTextureUnit: this.textureUnitPool.next,\n\t\t\t\t\tmaxTextureUnits: this.textureUnitPool.max,\n\t\t\t\t\tfreeTextureUnits: this.textureUnitPool.free.length,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn this.textureUnitPool.next++;\n\t}\n\n\tprivate resolveTextureOptions(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.resolveGLConstant(typeString);\n\t\tconst internalFormatString =\n\t\t\tinternalFormatOption ?? this.glHelpers.typeToInternalFormatString.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.resolveGLConstant(formatString),\n\t\t\tinternalFormat: this.resolveGLConstant(internalFormatString),\n\t\t\tminFilter: this.resolveGLConstant(options?.minFilter ?? 'LINEAR'),\n\t\t\tmagFilter: this.resolveGLConstant(options?.magFilter ?? 'LINEAR'),\n\t\t\twrapS: this.resolveGLConstant(options?.wrapS ?? 'CLAMP_TO_EDGE'),\n\t\t\twrapT: this.resolveGLConstant(options?.wrapT ?? 'CLAMP_TO_EDGE'),\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 spError(\n\t\t\t\t6,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tinternalFormat: internalFormatString,\n\t\t\t\t\ttype: typeString,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate getPixelArray(type: number, size: number): ArrayBufferView {\n\t\tconst ArrayType = this.glHelpers.typeToArray.get(type) ?? Uint8Array;\n\t\treturn new ArrayType(size);\n\t}\n\n\tprivate isNotRgba(format: number): boolean {\n\t\treturn format !== this.gl.RGBA && format !== this.gl.RGBA_INTEGER;\n\t}\n\n\tprivate clearHistoryTextureLayers(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.getPixelArray(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.isNotRgba(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 updateTextureFrameOffset(\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 resetHistoryTextureState(name: string | symbol, textureInfo: Texture) {\n\t\tif (!textureInfo.history) return;\n\t\ttextureInfo.history.writeIndex = 0;\n\t\tthis.clearHistoryTextureLayers(textureInfo);\n\t\tthis.updateTextureFrameOffset(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 spError(7, __SHADERPAD_DEV__ && { name, arrayLength: arrayLength ?? null });\n\t\t}\n\t\tif (!UNIFORM_TYPE_SUFFIXES[type]) {\n\t\t\tthrow spError(\n\t\t\t\t8,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname,\n\t\t\t\t\ttype,\n\t\t\t\t\tsupportedTypes: Object.keys(UNIFORM_TYPE_SUFFIXES),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tif (arrayLength && !(Array.isArray(value) && value.length === arrayLength)) {\n\t\t\tthrow spError(\n\t\t\t\t9,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname,\n\t\t\t\t\texpectedLength: arrayLength,\n\t\t\t\t\treceivedLength: Array.isArray(value) ? value.length : 1,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tlet location = this.gl.getUniformLocation(this.program!, name);\n\t\tif (!location && arrayLength) {\n\t\t\tlocation = this.gl.getUniformLocation(this.program!, `${name}[0]`);\n\t\t}\n\t\tif (!location) {\n\t\t\tif (allowMissing) return;\n\t\t\tthrow spError(19, __SHADERPAD_DEV__ && { name, arrayLength: arrayLength ?? null });\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\tupdateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tthis.gl.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 spError(\n\t\t\t\t\t20,\n\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstartIndex: options?.startIndex ?? null,\n\t\t\t\t\t},\n\t\t\t\t);\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 spError(\n\t\t\t\t\t\t10,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\treceivedType: typeof newValue,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\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 spError(\n\t\t\t\t\t\t11,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\treceivedLength: nValues,\n\t\t\t\t\t\t\tmaxLength: uniform.arrayLength,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\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 spError(\n\t\t\t\t\t\t12,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\texpectedElementLength: uniform.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\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 = this.gl.getUniformLocation(this.program!, `${name}[${options.startIndex}]`);\n\t\t\t\t\tif (!newLocation) {\n\t\t\t\t\t\tthrow spError(\n\t\t\t\t\t\t\t13,\n\t\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tstartIndex: options.startIndex,\n\t\t\t\t\t\t\t\tarrayLength: uniform.arrayLength,\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\tlocation = newLocation;\n\t\t\t\t}\n\t\t\t\t(this.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 spError(\n\t\t\t\t\t\t14,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\treceivedLength: scalarValue.length,\n\t\t\t\t\t\t\texpectedLength: uniform.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t(this.gl as any)[glFunctionName](uniform.location, ...scalarValue);\n\t\t\t}\n\t\t});\n\t\tthis.emit('updateUniforms', ...arguments);\n\t}\n\n\tprivate createTexture(\n\t\tname: string | symbol,\n\t\ttextureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> & { unitIndex?: number },\n\t) {\n\t\tconst { width, height } = textureInfo;\n\t\tconst historyDepth = textureInfo.history?.depth ?? 0;\n\n\t\tconst texture = this.gl.createTexture();\n\t\tif (!texture) {\n\t\t\tthrow spError(\n\t\t\t\t15,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\thistoryDepth,\n\t\t\t\t},\n\t\t\t);\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.reserveTextureUnit(name);\n\t\t\t} catch (error) {\n\t\t\t\tthis.gl.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 ? this.gl.TEXTURE_2D_ARRAY : this.gl.TEXTURE_2D;\n\t\tconst { options } = textureInfo;\n\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + unitIndex);\n\t\tthis.gl.bindTexture(textureTarget, texture);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_WRAP_S, options.wrapS);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_WRAP_T, options.wrapT);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_MIN_FILTER, options.minFilter);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_MAG_FILTER, options.magFilter);\n\t\tif (hasHistory) {\n\t\t\tthis.gl.texStorage3D(textureTarget, 1, options.internalFormat, width, height, historyDepth);\n\t\t} else if (name === INTERMEDIATE_TEXTURE_KEY) {\n\t\t\tthis.gl.texImage2D(\n\t\t\t\tthis.gl.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 _initializeTexture(name: string | symbol, source: TextureSource, options?: InitializeTextureOptions) {\n\t\tif (this.textures.has(name)) {\n\t\t\tthrow spError(16, __SHADERPAD_DEV__ && { name: stringFrom(name) });\n\t\t}\n\n\t\tconst { history: historyDepth = 0, ...textureOptions } = options ?? {};\n\t\tconst { width, height } = getSourceDimensions(source);\n\t\tif (!width || !height) {\n\t\t\tthrow spError(\n\t\t\t\t17,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tsourceType: source.constructor.name,\n\t\t\t\t},\n\t\t\t);\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(textureOptions).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.resolveTextureOptions(textureOptions),\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.createTexture(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.clearHistoryTextureLayers(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.updateTexture(name, source);\n\t\t}\n\n\t\t// Set a uniform to access the texture in the fragment shader.\n\t\tthis.gl.useProgram(this.program!);\n\t\tconst uSampler = this.gl.getUniformLocation(this.program!, stringFrom(name));\n\t\tif (uSampler) {\n\t\t\tthis.gl.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._initializeTexture(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.updateTexture(name, source);\n\t\t});\n\t\tthis.emit('updateTextures', ...arguments);\n\t}\n\n\tprivate updateTexture(name: string | symbol, source: UpdateTextureSource, historySlots?: HistorySlots) {\n\t\tconst info = this.textures.get(name);\n\t\tif (!info) {\n\t\t\tthrow spError(18, __SHADERPAD_DEV__ && { name: stringFrom(name) });\n\t\t}\n\n\t\tif (source instanceof WebGLTexture) {\n\t\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\tthis.gl.bindTexture(this.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 === this.gl) {\n\t\t\t\tif (!info.history) {\n\t\t\t\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\t\t\tthis.gl.bindTexture(this.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\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\t\tthis.gl.bindFramebuffer(this.gl.READ_FRAMEBUFFER, source.intermediateFbo);\n\t\t\t\tfor (const slot of targetSlots) {\n\t\t\t\t\tthis.gl.copyTexSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, slot, 0, 0, srcW, srcH);\n\t\t\t\t}\n\t\t\t\tthis.gl.bindFramebuffer(this.gl.READ_FRAMEBUFFER, null);\n\t\t\t\tthis.updateTextureFrameOffset(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.getPixelArray(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.resizeTexture(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 isTypedArray = 'data' in nonShaderPadSource && nonShaderPadSource.data;\n\t\tconst shouldFlipY = !isTypedArray && !info.options?.preserveY;\n\t\tconst previousFlipY = this.gl.getParameter(this.gl.UNPACK_FLIP_Y_WEBGL);\n\t\tconst needsAlignmentFix = isTypedArray && this.isNotRgba(info.options.format);\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = this.gl.getParameter(this.gl.UNPACK_ALIGNMENT);\n\t\t\tthis.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\n\t\tif (info.history) {\n\t\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\tthis.gl.bindTexture(this.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\tthis.gl.pixelStorei(this.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\tthis.gl.texSubImage3D(\n\t\t\t\t\tthis.gl.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\tthis.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t\tthis.updateTextureFrameOffset(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\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, info.texture);\n\t\t\tthis.gl.pixelStorei(this.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\tthis.gl.texSubImage2D(\n\t\t\t\t\tthis.gl.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\tthis.gl.texImage2D(\n\t\t\t\t\tthis.gl.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\tthis.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t}\n\t\tif (needsAlignmentFix) this.gl.pixelStorei(this.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.glHelpers.unsignedIntTypes.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) {\n\t\tthis.emit('beforeDraw', ...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\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('afterDraw', ...arguments);\n\t}\n\n\tstep(options?: StepOptions) {\n\t\tif (!Number.isFinite(this.startTime)) {\n\t\t\tthis.startTime = performance.now();\n\t\t}\n\t\tthis._step((performance.now() - this.startTime) / 1000, options);\n\t}\n\n\tprivate _step(time: number, options?: StepOptions) {\n\t\tthis.emit('beforeStep', time, this.frame, options);\n\t\tconst updates: Record<string, number> = {};\n\t\tif (this.uniforms.has('u_time')) updates.u_time = time;\n\t\tif (this.uniforms.has('u_frame')) updates.u_frame = this.frame;\n\t\tthis.updateUniforms(updates);\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.updateTextureFrameOffset(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('afterStep', time, this.frame, options);\n\t}\n\n\tplay(onBeforeStep?: (time: number, frame: number) => StepOptions | void) {\n\t\tthis._pause();\n\t\tif (!Number.isFinite(this.startTime)) {\n\t\t\tthis.startTime = performance.now();\n\t\t}\n\t\tthis.isPlaying = true;\n\t\tconst loop = (time: number) => {\n\t\t\ttime = (time - this.startTime) / 1000; // Convert from milliseconds to seconds.\n\t\t\tconst options = onBeforeStep?.(time, this.frame) ?? undefined;\n\t\t\tthis._step(time, options);\n\t\t\tif (this.isPlaying) this.animationFrameId = requestAnimationFrame(loop);\n\t\t};\n\t\tthis.animationFrameId = requestAnimationFrame(loop);\n\t\tthis.emit('play');\n\t}\n\n\tprivate _pause() {\n\t\tconst wasPlaying = this.isPlaying;\n\t\tthis.isPlaying = false;\n\t\tif (this.animationFrameId) {\n\t\t\tcancelAnimationFrame(this.animationFrameId);\n\t\t\tthis.animationFrameId = null;\n\t\t}\n\t\treturn wasPlaying;\n\t}\n\n\tpause() {\n\t\tif (this._pause()) {\n\t\t\tthis.emit('pause');\n\t\t}\n\t}\n\n\tresetFrame() {\n\t\tthis.frame = 0;\n\t\tthis.startTime = performance.now();\n\t}\n\n\treset() {\n\t\tthis.resetFrame();\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHistoryTextureState(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\n\t\tif (this.cursorTarget) {\n\t\t\tthis.eventListeners.forEach((listener, event) => {\n\t\t\t\tthis.cursorTarget!.removeEventListener(event, listener);\n\t\t\t});\n\t\t\tthis.eventListeners.clear();\n\t\t}\n\n\t\tif (this.resolutionObserver) {\n\t\t\tthis.resolutionObserver.disconnect();\n\t\t\tthis.resolutionObserver = null;\n\t\t}\n\n\t\tif (this.program) {\n\t\t\tthis.gl.deleteProgram(this.program);\n\t\t\tthis.program = null;\n\t\t}\n\n\t\tif (this.intermediateFbo) {\n\t\t\tthis.gl.deleteFramebuffer(this.intermediateFbo);\n\t\t\tthis.intermediateFbo = null;\n\t\t}\n\n\t\tthis.textures.forEach(texture => {\n\t\t\tthis.textureUnitPool.free.push(texture.unitIndex);\n\t\t\tthis.gl.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\tthis.gl.deleteVertexArray(this.vao);\n\t\t\tthis.vao = null;\n\t\t}\n\n\t\tif (this.buffer) {\n\t\t\tthis.gl.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","textureOptions","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","isMouseDown","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","isTypedArray","shouldFlipY","previousFlipY","partialSource","sourceData","xOffset","yOffset","intermediateInfo","t","w","h","time","historyInfo","writeIndex","nextWriteIndex","onBeforeStep","loop","wasPlaying","index_default"]}
@@ -183,11 +183,10 @@ var ShaderPad = class _ShaderPad {
183
183
  gl.deleteShader(vertexShader);
184
184
  gl.deleteShader(fragmentShader);
185
185
  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
186
- const programInfoLog = gl.getProgramInfoLog(program);
187
186
  const linkError = spError(
188
187
  2,
189
188
  {
190
- programInfoLog,
189
+ programInfoLog: gl.getProgramInfoLog(program),
191
190
  fragmentShaderLength: fragmentShaderSrc.length,
192
191
  glslInjectionCount: glslInjections.length
193
192
  }
@@ -284,13 +283,11 @@ var ShaderPad = class _ShaderPad {
284
283
  this.gl.shaderSource(shader, source);
285
284
  this.gl.compileShader(shader);
286
285
  if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {
287
- const shaderInfoLog = this.gl.getShaderInfoLog(shader);
288
- const shaderType = type === this.gl.VERTEX_SHADER ? "vertex" : "fragment";
286
+ console.error(this.gl.getShaderInfoLog(shader));
289
287
  const compilationError = spError(
290
288
  4,
291
289
  {
292
- shaderType,
293
- shaderInfoLog,
290
+ shaderType: type === this.gl.VERTEX_SHADER ? "vertex" : "fragment",
294
291
  source
295
292
  }
296
293
  );
@@ -1040,4 +1037,4 @@ var index_default = ShaderPad;
1040
1037
  export {
1041
1038
  index_default
1042
1039
  };
1043
- //# sourceMappingURL=chunk-KRIFZAFR.mjs.map
1040
+ //# sourceMappingURL=chunk-QYD24S7K.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;\nout vec2 v_uv;\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_uv = a_position * 0.5 + 0.5;\n}`;\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';\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\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\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| 'beforeStep'\n\t| 'afterStep'\n\t| 'beforeDraw'\n\t| 'afterDraw'\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{ textureUnitPool: 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 isTouchDevice = false;\n\tpublic readonly gl: WebGL2RenderingContext;\n\tprivate glHelpers!: {\n\t\ttypeToArray: Map<number, new (length: number) => ArrayBufferView>;\n\t\ttypeToInternalFormatString: Map<number, GLInternalFormatString>;\n\t\tunsignedIntTypes: Set<number>;\n\t};\n\tprivate uniforms: Map<string, Uniform> = new Map();\n\tprivate textures: Map<string | symbol, Texture> = new Map();\n\tprivate textureUnitPool: TextureUnitPool;\n\tprivate buffer: WebGLBuffer | null = null;\n\tprivate vao: WebGLVertexArrayObject | null = null;\n\tprivate program: WebGLProgram | null = null;\n\tprivate animationFrameId: number | null;\n\tprivate eventListeners: Map<string, EventListener> = new Map();\n\tprivate frame = 0;\n\tprivate startTime = Number.NaN;\n\tprivate isPlaying = false;\n\tprivate cursorPosition = [0.5, 0.5];\n\tprivate clickPosition = [0.5, 0.5];\n\tprivate isMouseDown = false;\n\tpublic canvas: HTMLCanvasElement | OffscreenCanvas;\n\tprivate resolutionObserver: MutationObserver | null = null;\n\tprivate hooks: Map<ShaderPadEventName, Function[]> = new Map();\n\tprivate historyDepth = 0;\n\tprivate textureOptions: TextureOptions;\n\tprivate cursorTarget: 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(\n\t\tfragmentShaderSrc: string,\n\t\t{ canvas, plugins, history, cursorTarget, ...textureOptions }: Options = {},\n\t) {\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 spError(\n\t\t\t\t0,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tcanvasType: this.canvas.constructor.name,\n\t\t\t\t\tisHeadless: this.isHeadless,\n\t\t\t\t\tcanvasWidth: this.canvas.width,\n\t\t\t\t\tcanvasHeight: this.canvas.height,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tthis.gl = gl;\n\t\tthis.glHelpers = {\n\t\t\ttypeToArray: new Map<number, new (length: number) => ArrayBufferView>([\n\t\t\t\t[gl.FLOAT, Float32Array],\n\t\t\t\t[gl.HALF_FLOAT, Uint16Array],\n\t\t\t\t[gl.UNSIGNED_SHORT, Uint16Array],\n\t\t\t\t[gl.SHORT, Int16Array],\n\t\t\t\t[gl.BYTE, Int8Array],\n\t\t\t\t[gl.UNSIGNED_INT, Uint32Array],\n\t\t\t\t[gl.INT, Int32Array],\n\t\t\t]),\n\t\t\ttypeToInternalFormatString: new Map<number, GLInternalFormatString>([\n\t\t\t\t[gl.FLOAT, 'RGBA32F'],\n\t\t\t\t[gl.HALF_FLOAT, 'RGBA16F'],\n\t\t\t\t[gl.UNSIGNED_SHORT, 'RGBA32UI'],\n\t\t\t\t[gl.SHORT, 'RGBA32I'],\n\t\t\t\t[gl.BYTE, 'RGBA32I'],\n\t\t\t\t[gl.UNSIGNED_INT, 'RGBA32UI'],\n\t\t\t\t[gl.INT, 'RGBA32I'],\n\t\t\t]),\n\t\t\tunsignedIntTypes: new Set([gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT]),\n\t\t};\n\n\t\tlet registryEntry = canvasRegistry.get(this.canvas);\n\t\tif (!registryEntry) {\n\t\t\tregistryEntry = {\n\t\t\t\ttextureUnitPool: {\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.textureUnitPool = registryEntry.textureUnitPool;\n\t\tregistryEntry.instances.add(this);\n\n\t\tthis.textureOptions = textureOptions;\n\n\t\tif (history) this.historyDepth = history;\n\t\tthis.cursorTarget = cursorTarget ?? (this.canvas instanceof HTMLCanvasElement ? this.canvas : undefined);\n\t\tthis.animationFrameId = 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.updateTexture.bind(this),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst program = this.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(this.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 = spError(\n\t\t\t\t2,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tprogramInfoLog: gl.getProgramInfoLog(program),\n\t\t\t\t\tfragmentShaderLength: fragmentShaderSrc.length,\n\t\t\t\t\tglslInjectionCount: glslInjections.length,\n\t\t\t\t},\n\t\t\t);\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.resolutionObserver = new MutationObserver(() => this.syncResolution());\n\t\t\tthis.resolutionObserver.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.syncResolution();\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.syncResolution();\n\n\t\tthis.initializeUniform('u_cursor', 'float', this.cursorPosition, { allowMissing: true });\n\t\tthis.initializeUniform('u_click', 'float', [...this.clickPosition, this.isMouseDown ? 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._initializeTexture(INTERMEDIATE_TEXTURE_KEY, this.canvas, {\n\t\t\t...this.textureOptions,\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._initializeTexture(HISTORY_TEXTURE_KEY, this.canvas, {\n\t\t\t\thistory: this.historyDepth,\n\t\t\t\t...this.textureOptions,\n\t\t\t});\n\t\t}\n\t\tthis.addEventListeners();\n\t\tthis.emit('_init');\n\t}\n\n\tprivate resolveGLConstant(value: GLConstantString): number {\n\t\tconst resolved = this.gl[value];\n\t\tif (resolved === undefined) {\n\t\t\tthrow spError(3, __SHADERPAD_DEV__ && { value });\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 shader = this.gl.createShader(type)!;\n\t\tthis.gl.shaderSource(shader, source);\n\t\tthis.gl.compileShader(shader);\n\t\tif (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n\t\t\tconsole.error(this.gl.getShaderInfoLog(shader));\n\t\t\tconst compilationError = spError(\n\t\t\t\t4,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tshaderType: type === this.gl.VERTEX_SHADER ? 'vertex' : 'fragment',\n\t\t\t\t\tsource,\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.gl.deleteShader(shader);\n\t\t\tthrow compilationError;\n\t\t}\n\t\treturn shader;\n\t}\n\n\tprivate getCursorTargetRect(): {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t} {\n\t\tconst target = this.cursorTarget!;\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 addEventListeners() {\n\t\tif (!this.cursorTarget) 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.getCursorTargetRect();\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.cursorPosition[0] = Math.max(0, Math.min(1, u));\n\t\t\tthis.cursorPosition[1] = Math.max(0, Math.min(1, v));\n\t\t\tthis.updateUniforms({ u_cursor: this.cursorPosition });\n\t\t};\n\n\t\tconst updateClick = (isMouseDown: boolean, x?: number, y?: number) => {\n\t\t\tif (!this.uniforms.has('u_click')) return;\n\t\t\tthis.isMouseDown = isMouseDown;\n\t\t\tif (isMouseDown) {\n\t\t\t\tconst rect = this.getCursorTargetRect();\n\t\t\t\tconst xVal = x as number;\n\t\t\t\tconst yVal = y as number;\n\t\t\t\tthis.clickPosition[0] = Math.max(0, Math.min(1, (xVal - rect.left) / rect.width));\n\t\t\t\tthis.clickPosition[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.clickPosition, this.isMouseDown ? 1.0 : 0.0],\n\t\t\t});\n\t\t};\n\n\t\tthis.eventListeners.set('mousemove', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouchDevice) {\n\t\t\t\tupdateCursor(mouseEvent.clientX, mouseEvent.clientY);\n\t\t\t}\n\t\t});\n\n\t\tthis.eventListeners.set('mousedown', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouchDevice) {\n\t\t\t\tif (mouseEvent.button === 0) {\n\t\t\t\t\tthis.isMouseDown = 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.eventListeners.set('mouseup', event => {\n\t\t\tconst mouseEvent = event as MouseEvent;\n\t\t\tif (!this.isTouchDevice) {\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.eventListeners.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.eventListeners.set('touchstart', event => {\n\t\t\tconst touchEvent = event as TouchEvent;\n\t\t\tthis.isTouchDevice = 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.eventListeners.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.eventListeners.forEach((listener, event) => {\n\t\t\tthis.cursorTarget!.addEventListener(event, listener);\n\t\t});\n\t}\n\n\tprivate syncResolution() {\n\t\tconst resolution: [number, number] = [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight];\n\t\tthis.gl.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.resizeTexture(INTERMEDIATE_TEXTURE_KEY, ...resolution);\n\t\tif (this.historyDepth > 0) {\n\t\t\tthis.resizeTexture(HISTORY_TEXTURE_KEY, ...resolution);\n\t\t}\n\t\tthis.emit('updateResolution', ...resolution);\n\t}\n\n\tprivate resizeTexture(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\tthis.gl.deleteTexture(info.texture);\n\t\tinfo.width = width;\n\t\tinfo.height = height;\n\t\tconst { texture } = this.createTexture(name, info);\n\t\tinfo.texture = texture;\n\t\tthis.resetHistoryTextureState(name, info);\n\t}\n\n\tprivate reserveTextureUnit(name: string | symbol) {\n\t\tconst existing = this.textures.get(name);\n\t\tif (existing) return existing.unitIndex;\n\t\tif (this.textureUnitPool.free.length > 0) return this.textureUnitPool.free.pop()!;\n\t\tif (this.textureUnitPool.next >= this.textureUnitPool.max) {\n\t\t\tthrow spError(\n\t\t\t\t5,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\tnextTextureUnit: this.textureUnitPool.next,\n\t\t\t\t\tmaxTextureUnits: this.textureUnitPool.max,\n\t\t\t\t\tfreeTextureUnits: this.textureUnitPool.free.length,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn this.textureUnitPool.next++;\n\t}\n\n\tprivate resolveTextureOptions(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.resolveGLConstant(typeString);\n\t\tconst internalFormatString =\n\t\t\tinternalFormatOption ?? this.glHelpers.typeToInternalFormatString.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.resolveGLConstant(formatString),\n\t\t\tinternalFormat: this.resolveGLConstant(internalFormatString),\n\t\t\tminFilter: this.resolveGLConstant(options?.minFilter ?? 'LINEAR'),\n\t\t\tmagFilter: this.resolveGLConstant(options?.magFilter ?? 'LINEAR'),\n\t\t\twrapS: this.resolveGLConstant(options?.wrapS ?? 'CLAMP_TO_EDGE'),\n\t\t\twrapT: this.resolveGLConstant(options?.wrapT ?? 'CLAMP_TO_EDGE'),\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 spError(\n\t\t\t\t6,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tinternalFormat: internalFormatString,\n\t\t\t\t\ttype: typeString,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate getPixelArray(type: number, size: number): ArrayBufferView {\n\t\tconst ArrayType = this.glHelpers.typeToArray.get(type) ?? Uint8Array;\n\t\treturn new ArrayType(size);\n\t}\n\n\tprivate isNotRgba(format: number): boolean {\n\t\treturn format !== this.gl.RGBA && format !== this.gl.RGBA_INTEGER;\n\t}\n\n\tprivate clearHistoryTextureLayers(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.getPixelArray(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.isNotRgba(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 updateTextureFrameOffset(\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 resetHistoryTextureState(name: string | symbol, textureInfo: Texture) {\n\t\tif (!textureInfo.history) return;\n\t\ttextureInfo.history.writeIndex = 0;\n\t\tthis.clearHistoryTextureLayers(textureInfo);\n\t\tthis.updateTextureFrameOffset(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 spError(7, __SHADERPAD_DEV__ && { name, arrayLength: arrayLength ?? null });\n\t\t}\n\t\tif (!UNIFORM_TYPE_SUFFIXES[type]) {\n\t\t\tthrow spError(\n\t\t\t\t8,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname,\n\t\t\t\t\ttype,\n\t\t\t\t\tsupportedTypes: Object.keys(UNIFORM_TYPE_SUFFIXES),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tif (arrayLength && !(Array.isArray(value) && value.length === arrayLength)) {\n\t\t\tthrow spError(\n\t\t\t\t9,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname,\n\t\t\t\t\texpectedLength: arrayLength,\n\t\t\t\t\treceivedLength: Array.isArray(value) ? value.length : 1,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tlet location = this.gl.getUniformLocation(this.program!, name);\n\t\tif (!location && arrayLength) {\n\t\t\tlocation = this.gl.getUniformLocation(this.program!, `${name}[0]`);\n\t\t}\n\t\tif (!location) {\n\t\t\tif (allowMissing) return;\n\t\t\tthrow spError(19, __SHADERPAD_DEV__ && { name, arrayLength: arrayLength ?? null });\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\tupdateUniforms(\n\t\tupdates: Record<string, number | number[] | (number | number[])[]>,\n\t\toptions?: { startIndex?: number; allowMissing?: boolean },\n\t) {\n\t\tthis.gl.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 spError(\n\t\t\t\t\t20,\n\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstartIndex: options?.startIndex ?? null,\n\t\t\t\t\t},\n\t\t\t\t);\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 spError(\n\t\t\t\t\t\t10,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\treceivedType: typeof newValue,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\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 spError(\n\t\t\t\t\t\t11,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\treceivedLength: nValues,\n\t\t\t\t\t\t\tmaxLength: uniform.arrayLength,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\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 spError(\n\t\t\t\t\t\t12,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\texpectedElementLength: uniform.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\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 = this.gl.getUniformLocation(this.program!, `${name}[${options.startIndex}]`);\n\t\t\t\t\tif (!newLocation) {\n\t\t\t\t\t\tthrow spError(\n\t\t\t\t\t\t\t13,\n\t\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tstartIndex: options.startIndex,\n\t\t\t\t\t\t\t\tarrayLength: uniform.arrayLength,\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\tlocation = newLocation;\n\t\t\t\t}\n\t\t\t\t(this.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 spError(\n\t\t\t\t\t\t14,\n\t\t\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\treceivedLength: scalarValue.length,\n\t\t\t\t\t\t\texpectedLength: uniform.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t(this.gl as any)[glFunctionName](uniform.location, ...scalarValue);\n\t\t\t}\n\t\t});\n\t\tthis.emit('updateUniforms', ...arguments);\n\t}\n\n\tprivate createTexture(\n\t\tname: string | symbol,\n\t\ttextureInfo: Pick<Texture, 'width' | 'height' | 'history' | 'options'> & { unitIndex?: number },\n\t) {\n\t\tconst { width, height } = textureInfo;\n\t\tconst historyDepth = textureInfo.history?.depth ?? 0;\n\n\t\tconst texture = this.gl.createTexture();\n\t\tif (!texture) {\n\t\t\tthrow spError(\n\t\t\t\t15,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\thistoryDepth,\n\t\t\t\t},\n\t\t\t);\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.reserveTextureUnit(name);\n\t\t\t} catch (error) {\n\t\t\t\tthis.gl.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 ? this.gl.TEXTURE_2D_ARRAY : this.gl.TEXTURE_2D;\n\t\tconst { options } = textureInfo;\n\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + unitIndex);\n\t\tthis.gl.bindTexture(textureTarget, texture);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_WRAP_S, options.wrapS);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_WRAP_T, options.wrapT);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_MIN_FILTER, options.minFilter);\n\t\tthis.gl.texParameteri(textureTarget, this.gl.TEXTURE_MAG_FILTER, options.magFilter);\n\t\tif (hasHistory) {\n\t\t\tthis.gl.texStorage3D(textureTarget, 1, options.internalFormat, width, height, historyDepth);\n\t\t} else if (name === INTERMEDIATE_TEXTURE_KEY) {\n\t\t\tthis.gl.texImage2D(\n\t\t\t\tthis.gl.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 _initializeTexture(name: string | symbol, source: TextureSource, options?: InitializeTextureOptions) {\n\t\tif (this.textures.has(name)) {\n\t\t\tthrow spError(16, __SHADERPAD_DEV__ && { name: stringFrom(name) });\n\t\t}\n\n\t\tconst { history: historyDepth = 0, ...textureOptions } = options ?? {};\n\t\tconst { width, height } = getSourceDimensions(source);\n\t\tif (!width || !height) {\n\t\t\tthrow spError(\n\t\t\t\t17,\n\t\t\t\t__SHADERPAD_DEV__ && {\n\t\t\t\t\tname: stringFrom(name),\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tsourceType: source.constructor.name,\n\t\t\t\t},\n\t\t\t);\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(textureOptions).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.resolveTextureOptions(textureOptions),\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.createTexture(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.clearHistoryTextureLayers(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.updateTexture(name, source);\n\t\t}\n\n\t\t// Set a uniform to access the texture in the fragment shader.\n\t\tthis.gl.useProgram(this.program!);\n\t\tconst uSampler = this.gl.getUniformLocation(this.program!, stringFrom(name));\n\t\tif (uSampler) {\n\t\t\tthis.gl.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._initializeTexture(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.updateTexture(name, source);\n\t\t});\n\t\tthis.emit('updateTextures', ...arguments);\n\t}\n\n\tprivate updateTexture(name: string | symbol, source: UpdateTextureSource, historySlots?: HistorySlots) {\n\t\tconst info = this.textures.get(name);\n\t\tif (!info) {\n\t\t\tthrow spError(18, __SHADERPAD_DEV__ && { name: stringFrom(name) });\n\t\t}\n\n\t\tif (source instanceof WebGLTexture) {\n\t\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\tthis.gl.bindTexture(this.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 === this.gl) {\n\t\t\t\tif (!info.history) {\n\t\t\t\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\t\t\tthis.gl.bindTexture(this.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\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY, info.texture);\n\t\t\t\tthis.gl.bindFramebuffer(this.gl.READ_FRAMEBUFFER, source.intermediateFbo);\n\t\t\t\tfor (const slot of targetSlots) {\n\t\t\t\t\tthis.gl.copyTexSubImage3D(this.gl.TEXTURE_2D_ARRAY, 0, 0, 0, slot, 0, 0, srcW, srcH);\n\t\t\t\t}\n\t\t\t\tthis.gl.bindFramebuffer(this.gl.READ_FRAMEBUFFER, null);\n\t\t\t\tthis.updateTextureFrameOffset(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.getPixelArray(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.resizeTexture(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 isTypedArray = 'data' in nonShaderPadSource && nonShaderPadSource.data;\n\t\tconst shouldFlipY = !isTypedArray && !info.options?.preserveY;\n\t\tconst previousFlipY = this.gl.getParameter(this.gl.UNPACK_FLIP_Y_WEBGL);\n\t\tconst needsAlignmentFix = isTypedArray && this.isNotRgba(info.options.format);\n\t\tlet previousAlignment;\n\t\tif (needsAlignmentFix) {\n\t\t\tpreviousAlignment = this.gl.getParameter(this.gl.UNPACK_ALIGNMENT);\n\t\t\tthis.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);\n\t\t}\n\n\t\tif (info.history) {\n\t\t\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\tthis.gl.bindTexture(this.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\tthis.gl.pixelStorei(this.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\tthis.gl.texSubImage3D(\n\t\t\t\t\tthis.gl.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\tthis.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t\tthis.updateTextureFrameOffset(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\tthis.gl.activeTexture(this.gl.TEXTURE0 + info.unitIndex);\n\t\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, info.texture);\n\t\t\tthis.gl.pixelStorei(this.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\tthis.gl.texSubImage2D(\n\t\t\t\t\tthis.gl.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\tthis.gl.texImage2D(\n\t\t\t\t\tthis.gl.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\tthis.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);\n\t\t}\n\t\tif (needsAlignmentFix) this.gl.pixelStorei(this.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.glHelpers.unsignedIntTypes.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) {\n\t\tthis.emit('beforeDraw', ...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\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('afterDraw', ...arguments);\n\t}\n\n\tstep(options?: StepOptions) {\n\t\tif (!Number.isFinite(this.startTime)) {\n\t\t\tthis.startTime = performance.now();\n\t\t}\n\t\tthis._step((performance.now() - this.startTime) / 1000, options);\n\t}\n\n\tprivate _step(time: number, options?: StepOptions) {\n\t\tthis.emit('beforeStep', time, this.frame, options);\n\t\tconst updates: Record<string, number> = {};\n\t\tif (this.uniforms.has('u_time')) updates.u_time = time;\n\t\tif (this.uniforms.has('u_frame')) updates.u_frame = this.frame;\n\t\tthis.updateUniforms(updates);\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.updateTextureFrameOffset(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('afterStep', time, this.frame, options);\n\t}\n\n\tplay(onBeforeStep?: (time: number, frame: number) => StepOptions | void) {\n\t\tthis._pause();\n\t\tif (!Number.isFinite(this.startTime)) {\n\t\t\tthis.startTime = performance.now();\n\t\t}\n\t\tthis.isPlaying = true;\n\t\tconst loop = (time: number) => {\n\t\t\ttime = (time - this.startTime) / 1000; // Convert from milliseconds to seconds.\n\t\t\tconst options = onBeforeStep?.(time, this.frame) ?? undefined;\n\t\t\tthis._step(time, options);\n\t\t\tif (this.isPlaying) this.animationFrameId = requestAnimationFrame(loop);\n\t\t};\n\t\tthis.animationFrameId = requestAnimationFrame(loop);\n\t\tthis.emit('play');\n\t}\n\n\tprivate _pause() {\n\t\tconst wasPlaying = this.isPlaying;\n\t\tthis.isPlaying = false;\n\t\tif (this.animationFrameId) {\n\t\t\tcancelAnimationFrame(this.animationFrameId);\n\t\t\tthis.animationFrameId = null;\n\t\t}\n\t\treturn wasPlaying;\n\t}\n\n\tpause() {\n\t\tif (this._pause()) {\n\t\t\tthis.emit('pause');\n\t\t}\n\t}\n\n\tresetFrame() {\n\t\tthis.frame = 0;\n\t\tthis.startTime = performance.now();\n\t}\n\n\treset() {\n\t\tthis.resetFrame();\n\t\tthis.textures.forEach((texture, name) => {\n\t\t\tthis.resetHistoryTextureState(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\n\t\tif (this.cursorTarget) {\n\t\t\tthis.eventListeners.forEach((listener, event) => {\n\t\t\t\tthis.cursorTarget!.removeEventListener(event, listener);\n\t\t\t});\n\t\t\tthis.eventListeners.clear();\n\t\t}\n\n\t\tif (this.resolutionObserver) {\n\t\t\tthis.resolutionObserver.disconnect();\n\t\t\tthis.resolutionObserver = null;\n\t\t}\n\n\t\tif (this.program) {\n\t\t\tthis.gl.deleteProgram(this.program);\n\t\t\tthis.program = null;\n\t\t}\n\n\t\tif (this.intermediateFbo) {\n\t\t\tthis.gl.deleteFramebuffer(this.intermediateFbo);\n\t\t\tthis.intermediateFbo = null;\n\t\t}\n\n\t\tthis.textures.forEach(texture => {\n\t\t\tthis.textureUnitPool.free.push(texture.unitIndex);\n\t\t\tthis.gl.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\tthis.gl.deleteVertexArray(this.vao);\n\t\t\tthis.vao = null;\n\t\t}\n\n\t\tif (this.buffer) {\n\t\t\tthis.gl.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"]}