shaderpad 1.0.0-beta.40 → 1.0.0-beta.42

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 (52) hide show
  1. package/README.md +323 -41
  2. package/dist/chunk-5CBGNOA3.mjs +10 -0
  3. package/dist/chunk-5CBGNOA3.mjs.map +1 -0
  4. package/dist/chunk-JRSBIGBN.mjs +7 -0
  5. package/dist/chunk-JRSBIGBN.mjs.map +1 -0
  6. package/dist/index.d.mts +7 -30
  7. package/dist/index.d.ts +7 -30
  8. package/dist/index.js +3 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +1 -1
  11. package/dist/plugins/face.d.mts +1 -3
  12. package/dist/plugins/face.d.ts +1 -3
  13. package/dist/plugins/face.js +53 -76
  14. package/dist/plugins/face.js.map +1 -1
  15. package/dist/plugins/face.mjs +51 -79
  16. package/dist/plugins/face.mjs.map +1 -1
  17. package/dist/plugins/hands.d.mts +1 -3
  18. package/dist/plugins/hands.d.ts +1 -3
  19. package/dist/plugins/hands.js +20 -16
  20. package/dist/plugins/hands.js.map +1 -1
  21. package/dist/plugins/hands.mjs +14 -15
  22. package/dist/plugins/hands.mjs.map +1 -1
  23. package/dist/plugins/helpers.js +1 -1
  24. package/dist/plugins/helpers.js.map +1 -1
  25. package/dist/plugins/helpers.mjs +1 -1
  26. package/dist/plugins/helpers.mjs.map +1 -1
  27. package/dist/plugins/mediapipe-common.d.mts +18 -0
  28. package/dist/plugins/mediapipe-common.d.ts +18 -0
  29. package/dist/plugins/mediapipe-common.js +7 -0
  30. package/dist/plugins/mediapipe-common.js.map +1 -0
  31. package/dist/plugins/mediapipe-common.mjs +2 -0
  32. package/dist/plugins/mediapipe-common.mjs.map +1 -0
  33. package/dist/plugins/pose.d.mts +1 -3
  34. package/dist/plugins/pose.d.ts +1 -3
  35. package/dist/plugins/pose.js +53 -49
  36. package/dist/plugins/pose.js.map +1 -1
  37. package/dist/plugins/pose.mjs +30 -30
  38. package/dist/plugins/pose.mjs.map +1 -1
  39. package/dist/plugins/save.d.mts +1 -1
  40. package/dist/plugins/save.d.ts +1 -1
  41. package/dist/plugins/save.js +1 -1
  42. package/dist/plugins/save.js.map +1 -1
  43. package/dist/plugins/save.mjs.map +1 -1
  44. package/dist/plugins/segmenter.d.mts +1 -3
  45. package/dist/plugins/segmenter.d.ts +1 -3
  46. package/dist/plugins/segmenter.js +17 -13
  47. package/dist/plugins/segmenter.js.map +1 -1
  48. package/dist/plugins/segmenter.mjs +11 -11
  49. package/dist/plugins/segmenter.mjs.map +1 -1
  50. package/package.json +1 -1
  51. package/dist/chunk-6C6DVCZI.mjs +0 -11
  52. package/dist/chunk-6C6DVCZI.mjs.map +0 -1
@@ -1,61 +1,65 @@
1
- "use strict";var re=Object.create;var W=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,ae=Object.prototype.hasOwnProperty;var he=(l,t)=>{for(var e in t)W(l,e,{get:t[e],enumerable:!0})},q=(l,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ne(t))!ae.call(l,i)&&i!==e&&W(l,i,{get:()=>t[i],enumerable:!(s=se(t,i))||s.enumerable});return l};var le=(l,t,e)=>(e=l!=null?re(oe(l)):{},q(t||!l||!l.__esModule?W(e,"default",{value:l,enumerable:!0}):e,l)),ue=l=>q(W({},"__esModule",{value:!0}),l);var Le={};he(Le,{default:()=>ve});module.exports=ue(Le);var ce=`#version 300 es
1
+ "use strict";var te=Object.create;var U=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ne=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty;var oe=(o,i)=>{for(var e in i)U(o,e,{get:i[e],enumerable:!0})},Y=(o,i,e,n)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of re(i))!se.call(o,t)&&t!==e&&U(o,t,{get:()=>i[t],enumerable:!(n=ie(i,t))||n.enumerable});return o};var X=(o,i,e)=>(e=o!=null?te(ne(o)):{},Y(i||!o||!o.__esModule?U(e,"default",{value:o,enumerable:!0}):e,o)),ae=o=>Y(U({},"__esModule",{value:!0}),o);var Le={};oe(Le,{default:()=>be});module.exports=ae(Le);var ue=`#version 300 es
2
2
  in vec2 aPosition;
3
3
  out vec2 v_uv;
4
4
  void main() {
5
5
  v_uv = aPosition * 0.5 + 0.5;
6
6
  gl_Position = vec4(aPosition, 0.0, 1.0);
7
+ }`,he=33.333333333333336,le=new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),D=Symbol("u_history"),w=Symbol("__SHADERPAD_BUFFER");function ce(o,i){if(!i?.length)return o;let e=o.split(`
8
+ `),n=e.findLastIndex(t=>{let r=t.trimStart();return r.startsWith("precision ")||r.startsWith("#version ")})+1;return e.splice(n,0,...i),e.join(`
9
+ `)}function K(o){return o instanceof WebGLTexture?{width:0,height:0}:o instanceof N?{width:o.canvas.width,height:o.canvas.height}:o instanceof HTMLVideoElement?{width:o.videoWidth,height:o.videoHeight}:o instanceof HTMLImageElement?{width:o.naturalWidth??o.width,height:o.naturalHeight??o.height}:{width:o.width,height:o.height}}function H(o){return typeof o=="symbol"?o.description??"":o}var N=class o{isInternalCanvas=!1;isTouchDevice=!1;gl;uniforms=new Map;textures=new Map;textureUnitPool;buffer=null;program=null;aPositionLocation=0;animationFrameId;resolutionObserver;resizeObserver;resizeTimeout=null;lastResizeTime=-1/0;eventListeners=new Map;frame=0;startTime=0;cursorPosition=[.5,.5];clickPosition=[.5,.5];isMouseDown=!1;canvas;hooks=new Map;historyDepth=0;textureOptions;debug;intermediateFbo=null;constructor(i,{canvas:e,plugins:n,history:t,debug:r,...a}={}){if(this.canvas=e||document.createElement("canvas"),!e){this.isInternalCanvas=!0;let p=this.canvas;p.style.position="fixed",p.style.inset="0",p.style.height="100dvh",p.style.width="100dvw",document.body.appendChild(p)}if(this.canvas instanceof OffscreenCanvas){let p=u=>{let v=Object.getOwnPropertyDescriptor(OffscreenCanvas.prototype,u);Object.defineProperty(this.canvas,u,{get:()=>v.get.call(this.canvas),set:R=>{v.set.call(this.canvas,R),this.updateResolution()},configurable:v.configurable,enumerable:v.enumerable})};p("width"),p("height")}let s=this.canvas.getContext("webgl2",{antialias:!1});if(!s)throw new Error("WebGL2 not supported. Please use a browser that supports WebGL2.");this.gl=s,this.textureUnitPool={free:[],next:0,max:s.getParameter(s.MAX_COMBINED_TEXTURE_IMAGE_UNITS)},this.textureOptions=a;let{internalFormat:h,type:m}=a;(m===s.FLOAT||m===s.HALF_FLOAT||h===s.RGBA16F||h===s.RGBA32F||h===s.R16F||h===s.R32F||h===s.RG16F||h===s.RG32F)&&!s.getExtension("EXT_color_buffer_float")&&(console.warn("EXT_color_buffer_float not supported, falling back to RGBA8"),delete this.textureOptions?.internalFormat,delete this.textureOptions?.format,delete this.textureOptions?.type),t&&(this.historyDepth=t),this.debug=r??(typeof process<"u"&&!1),this.animationFrameId=null,this.resolutionObserver=new MutationObserver(()=>this.updateResolution()),this.resizeObserver=new ResizeObserver(()=>this.throttledHandleResize());let f=[];n&&n.forEach(p=>p(this,{gl:s,canvas:this.canvas,injectGLSL:u=>{f.push(u)},emitHook:this.emitHook.bind(this)}));let c=this.gl.createProgram();if(!c)throw new Error("Failed to create WebGL program");this.program=c;let E=this.createShader(this.gl.VERTEX_SHADER,ue),g=this.createShader(s.FRAGMENT_SHADER,ce(i,f));if(s.attachShader(c,E),s.attachShader(c,g),s.linkProgram(c),s.deleteShader(E),s.deleteShader(g),!s.getProgramParameter(c,s.LINK_STATUS))throw console.error("Program link error:",s.getProgramInfoLog(c)),s.deleteProgram(c),new Error("Failed to link WebGL program");this.aPositionLocation=s.getAttribLocation(c,"aPosition"),this.buffer=s.createBuffer(),s.bindBuffer(s.ARRAY_BUFFER,this.buffer),s.bufferData(s.ARRAY_BUFFER,le,s.STATIC_DRAW),s.viewport(0,0,s.drawingBufferWidth,s.drawingBufferHeight),s.enableVertexAttribArray(this.aPositionLocation),s.vertexAttribPointer(this.aPositionLocation,2,s.FLOAT,!1,0,0),s.useProgram(c),this.canvas instanceof HTMLCanvasElement&&(this.resolutionObserver.observe(this.canvas,{attributes:!0,attributeFilter:["width","height"]}),this.resizeObserver.observe(this.canvas)),this.isInternalCanvas||this.updateResolution(),this.initializeUniform("u_cursor","float",this.cursorPosition),this.initializeUniform("u_click","float",[...this.clickPosition,this.isMouseDown?1:0]),this.initializeUniform("u_time","float",0),this.initializeUniform("u_frame","int",0),this._initializeTexture(w,this.canvas,{...this.textureOptions}),this.intermediateFbo=s.createFramebuffer(),this.historyDepth>0&&this._initializeTexture(D,this.canvas,{history:this.historyDepth,...this.textureOptions}),this.canvas instanceof HTMLCanvasElement&&this.addEventListeners(),this.emitHook("init")}emitHook(i,...e){this.hooks.get(i)?.forEach(n=>n.call(this,...e))}on(i,e){this.hooks.has(i)||this.hooks.set(i,[]),this.hooks.get(i).push(e)}off(i,e){let n=this.hooks.get(i);n&&n.splice(n.indexOf(e),1)}createShader(i,e){let n=this.gl.createShader(i);if(this.gl.shaderSource(n,e),this.gl.compileShader(n),!this.gl.getShaderParameter(n,this.gl.COMPILE_STATUS))throw console.error("Shader compilation failed:",e),console.error(this.gl.getShaderInfoLog(n)),this.gl.deleteShader(n),new Error("Shader compilation failed");return n}throttledHandleResize(){clearTimeout(this.resizeTimeout);let i=performance.now(),e=this.lastResizeTime+he-i;e<=0?(this.lastResizeTime=i,this.handleResize()):this.resizeTimeout=setTimeout(()=>this.throttledHandleResize(),e)}handleResize(){if(!(this.canvas instanceof HTMLCanvasElement))return;let i=window.devicePixelRatio||1,e=this.canvas.clientWidth*i,n=this.canvas.clientHeight*i;this.isInternalCanvas&&(this.canvas.width!==e||this.canvas.height!==n)&&(this.canvas.width=e,this.canvas.height=n),this.emitHook("resize",e,n)}addEventListeners(){let i=this.canvas,e=(t,r)=>{if(!this.uniforms.has("u_cursor"))return;let a=i.getBoundingClientRect();this.cursorPosition[0]=(t-a.left)/a.width,this.cursorPosition[1]=1-(r-a.top)/a.height,this.updateUniforms({u_cursor:this.cursorPosition})},n=(t,r,a)=>{if(this.uniforms.has("u_click")){if(this.isMouseDown=t,t){let s=i.getBoundingClientRect(),h=r,m=a;this.clickPosition[0]=(h-s.left)/s.width,this.clickPosition[1]=1-(m-s.top)/s.height}this.updateUniforms({u_click:[...this.clickPosition,this.isMouseDown?1:0]})}};this.eventListeners.set("mousemove",t=>{let r=t;this.isTouchDevice||e(r.clientX,r.clientY)}),this.eventListeners.set("mousedown",t=>{let r=t;this.isTouchDevice||r.button===0&&(this.isMouseDown=!0,n(!0,r.clientX,r.clientY))}),this.eventListeners.set("mouseup",t=>{let r=t;this.isTouchDevice||r.button===0&&n(!1)}),this.eventListeners.set("touchmove",t=>{let r=t;r.touches.length>0&&e(r.touches[0].clientX,r.touches[0].clientY)}),this.eventListeners.set("touchstart",t=>{let r=t;this.isTouchDevice=!0,r.touches.length>0&&(e(r.touches[0].clientX,r.touches[0].clientY),n(!0,r.touches[0].clientX,r.touches[0].clientY))}),this.eventListeners.set("touchend",t=>{t.touches.length===0&&n(!1)}),this.eventListeners.forEach((t,r)=>{i.addEventListener(r,t)})}updateResolution(){let i=[this.gl.drawingBufferWidth,this.gl.drawingBufferHeight];this.gl.viewport(0,0,...i),this.uniforms.has("u_resolution")?this.updateUniforms({u_resolution:i}):this.initializeUniform("u_resolution","float",i),this.resizeTexture(w,...i),this.historyDepth>0&&this.resizeTexture(D,...i),this.emitHook("updateResolution",...i)}resizeTexture(i,e,n){let t=this.textures.get(i);if(!t||t.width===e&&t.height===n)return;this.gl.deleteTexture(t.texture),t.width=e,t.height=n;let{texture:r}=this.createTexture(i,t);t.texture=r,t.history&&(t.history.writeIndex=0,this.clearHistoryTextureLayers(t))}reserveTextureUnit(i){let e=this.textures.get(i);if(e)return e.unitIndex;if(this.textureUnitPool.free.length>0)return this.textureUnitPool.free.pop();if(this.textureUnitPool.next>=this.textureUnitPool.max)throw new Error("Exceeded the available texture units for this device.");return this.textureUnitPool.next++}releaseTextureUnit(i){let e=this.textures.get(i);e&&this.textureUnitPool.free.push(e.unitIndex)}resolveTextureOptions(i){let{gl:e}=this,n=i?.type??e.UNSIGNED_BYTE;return{type:n,format:i?.format??e.RGBA,internalFormat:i?.internalFormat??(n===e.FLOAT?e.RGBA32F:n===e.HALF_FLOAT?e.RGBA16F:e.RGBA8),minFilter:i?.minFilter??e.LINEAR,magFilter:i?.magFilter??e.LINEAR,wrapS:i?.wrapS??e.CLAMP_TO_EDGE,wrapT:i?.wrapT??e.CLAMP_TO_EDGE,preserveY:i?.preserveY}}getPixelArray(i,e){return i===this.gl.FLOAT?new Float32Array(e):i===this.gl.HALF_FLOAT?new Uint16Array(e):new Uint8Array(e)}clearHistoryTextureLayers(i){if(!i.history)return;let e=this.gl,{type:n,format:t}=i.options,r=this.getPixelArray(n,i.width*i.height*4);e.activeTexture(e.TEXTURE0+i.unitIndex),e.bindTexture(e.TEXTURE_2D_ARRAY,i.texture);for(let a=0;a<i.history.depth;++a)e.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,a,i.width,i.height,1,t,n,r)}initializeUniform(i,e,n,t){let r=t?.arrayLength;if(this.uniforms.has(i))throw new Error(`${i} is already initialized.`);if(e!=="float"&&e!=="int")throw new Error(`Invalid uniform type: ${e}. Expected 'float' or 'int'.`);if(r&&!(Array.isArray(n)&&n.length===r))throw new Error(`${i} array length mismatch: must initialize with ${r} elements.`);let a=this.gl.getUniformLocation(this.program,i);if(!a&&r&&(a=this.gl.getUniformLocation(this.program,`${i}[0]`)),!a){this.log(`${i} not in shader. Skipping initialization.`);return}let s=r?n[0]:n,h=Array.isArray(s)?s.length:1;this.uniforms.set(i,{type:e,length:h,location:a,arrayLength:r});try{this.updateUniforms({[i]:n})}catch(m){throw this.uniforms.delete(i),m}this.emitHook("initializeUniform",...arguments)}log(...i){this.debug&&console.debug(...i)}updateUniforms(i,e){this.gl.useProgram(this.program),Object.entries(i).forEach(([n,t])=>{let r=this.uniforms.get(n);if(!r){this.log(`${n} not in shader. Skipping update.`);return}let a=`uniform${r.length}${r.type.charAt(0)}`;if(r.arrayLength){if(!Array.isArray(t))throw new Error(`${n} is an array, but the value passed to updateUniforms is not an array.`);let s=t.length;if(!s)return;if(s>r.arrayLength)throw new Error(`${n} received ${s} values, but maximum length is ${r.arrayLength}.`);if(t.some(d=>(Array.isArray(d)?d.length:1)!==r.length))throw new Error(`Tried to update ${n} with some elements that are not length ${r.length}.`);let h=new(r.type==="float"?Float32Array:Int32Array)(t.flat()),m=r.location;if(e?.startIndex){let d=this.gl.getUniformLocation(this.program,`${n}[${e.startIndex}]`);if(!d)throw new Error(`${n}[${e.startIndex}] not in shader. Did you pass an invalid startIndex?`);m=d}this.gl[a+"v"](m,h)}else{if(Array.isArray(t)||(t=[t]),t.length!==r.length)throw new Error(`Invalid uniform value length: ${t.length}. Expected ${r.length}.`);this.gl[a](r.location,...t)}}),this.emitHook("updateUniforms",...arguments)}createTexture(i,e){let{width:n,height:t}=e,r=e.history?.depth??0,a=this.gl.createTexture();if(!a)throw new Error("Failed to create texture");let s=e.unitIndex;if(typeof s!="number")try{s=this.reserveTextureUnit(i)}catch(f){throw this.gl.deleteTexture(a),f}let h=r>0,m=h?this.gl.TEXTURE_2D_ARRAY:this.gl.TEXTURE_2D,{options:d}=e;return this.gl.activeTexture(this.gl.TEXTURE0+s),this.gl.bindTexture(m,a),this.gl.texParameteri(m,this.gl.TEXTURE_WRAP_S,d.wrapS),this.gl.texParameteri(m,this.gl.TEXTURE_WRAP_T,d.wrapT),this.gl.texParameteri(m,this.gl.TEXTURE_MIN_FILTER,d.minFilter),this.gl.texParameteri(m,this.gl.TEXTURE_MAG_FILTER,d.magFilter),h?this.gl.texStorage3D(m,1,d.internalFormat,n,t,r):i===w&&this.gl.texImage2D(this.gl.TEXTURE_2D,0,d.internalFormat,n,t,0,d.format,d.type,null),{texture:a,unitIndex:s}}_initializeTexture(i,e,n){if(this.textures.has(i))throw new Error(`Texture '${H(i)}' is already initialized.`);let{history:t=0,...r}=n??{},{width:a,height:s}=K(e);if(!a||!s)throw new Error("Texture source must have valid dimensions");let h={width:a,height:s,options:this.resolveTextureOptions(r)};t>0&&(h.history={depth:t,writeIndex:0});let{texture:m,unitIndex:d}=this.createTexture(i,h),f={texture:m,unitIndex:d,...h};t>0&&(this.initializeUniform(`${H(i)}FrameOffset`,"int",0),this.clearHistoryTextureLayers(f)),this.textures.set(i,f),this.updateTexture(i,e);let c=this.gl.getUniformLocation(this.program,H(i));c&&this.gl.uniform1i(c,d)}initializeTexture(i,e,n){this._initializeTexture(i,e,n),this.emitHook("initializeTexture",...arguments)}updateTextures(i,e){Object.entries(i).forEach(([n,t])=>{this.updateTexture(n,t,e)}),this.emitHook("updateTextures",...arguments)}updateTexture(i,e,n){let t=this.textures.get(i);if(!t)throw new Error(`Texture '${H(i)}' is not initialized.`);if(e instanceof WebGLTexture){this.gl.activeTexture(this.gl.TEXTURE0+t.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D,e);return}let r=e;if(e instanceof o){let c=e.textures.get(w);if(e.gl===this.gl){this.gl.activeTexture(this.gl.TEXTURE0+t.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D,c.texture);return}let{width:E,height:g,options:{format:p,type:u}}=c,v=this.getPixelArray(u,E*g*4);e.gl.bindFramebuffer(e.gl.FRAMEBUFFER,e.intermediateFbo),e.gl.readPixels(0,0,E,g,p,u,v),e.gl.bindFramebuffer(e.gl.FRAMEBUFFER,null),r={data:v,width:E,height:g}}let{width:a,height:s}=K(r);if(!a||!s)return;let h="isPartial"in r&&r.isPartial;h||this.resizeTexture(i,a,s);let d=!("data"in r&&r.data)&&!t.options?.preserveY,f=this.gl.getParameter(this.gl.UNPACK_FLIP_Y_WEBGL);if(t.history){if(this.gl.activeTexture(this.gl.TEXTURE0+t.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY,t.texture),!n?.skipHistoryWrite){this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,d),this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY,0,0,0,t.history.writeIndex,a,s,1,t.options.format,t.options.type,r.data??r),this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,f);let c=`${H(i)}FrameOffset`;this.updateUniforms({[c]:t.history.writeIndex}),t.history.writeIndex=(t.history.writeIndex+1)%t.history.depth}}else{if(this.gl.activeTexture(this.gl.TEXTURE0+t.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D,t.texture),this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,d),h){let c=r;this.gl.texSubImage2D(this.gl.TEXTURE_2D,0,c.x??0,c.y??0,a,s,t.options.format,t.options.type,c.data)}else this.gl.texImage2D(this.gl.TEXTURE_2D,0,t.options.internalFormat,a,s,0,t.options.format,t.options.type,r.data??r);this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,f)}}draw(i){this.emitHook("beforeDraw",...arguments);let e=this.gl,n=e.drawingBufferWidth,t=e.drawingBufferHeight,r=this.textures.get(w);e.bindFramebuffer(e.FRAMEBUFFER,this.intermediateFbo),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r.texture,0),e.useProgram(this.program),e.bindBuffer(e.ARRAY_BUFFER,this.buffer),e.vertexAttribPointer(this.aPositionLocation,2,e.FLOAT,!1,0,0),e.enableVertexAttribArray(this.aPositionLocation),e.viewport(0,0,n,t),i?.skipClear||e.clear(e.COLOR_BUFFER_BIT),e.drawArrays(e.TRIANGLES,0,6);let a=this.textures.get(D);a&&!i?.skipHistoryWrite&&(e.bindTexture(e.TEXTURE_2D_ARRAY,a.texture),e.copyTexSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,a.history.writeIndex,0,0,n,t)),e.bindFramebuffer(e.READ_FRAMEBUFFER,this.intermediateFbo),e.bindFramebuffer(e.DRAW_FRAMEBUFFER,null),e.blitFramebuffer(0,0,n,t,0,0,n,t,e.COLOR_BUFFER_BIT,e.NEAREST),e.bindFramebuffer(e.FRAMEBUFFER,null),this.emitHook("afterDraw",...arguments)}step(i,e){this.emitHook("beforeStep",...arguments);let n={};this.uniforms.has("u_time")&&(n.u_time=i),this.uniforms.has("u_frame")&&(n.u_frame=this.frame),this.updateUniforms(n),this.draw(e);let t=this.textures.get(D);if(t&&!e?.skipHistoryWrite){let{writeIndex:r,depth:a}=t.history;this.updateUniforms({[`${H(D)}FrameOffset`]:r}),t.history.writeIndex=(r+1)%a}++this.frame,this.emitHook("afterStep",...arguments)}play(i,e){this.pause();let n=t=>{t=(t-this.startTime)/1e3;let r=e?.(t,this.frame)??void 0;this.step(t,r),this.animationFrameId=requestAnimationFrame(n),i?.(t,this.frame)};this.animationFrameId=requestAnimationFrame(n),this.emitHook("play")}pause(){this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.emitHook("pause")}reset(){this.frame=0,this.startTime=performance.now(),this.textures.forEach(i=>{i.history&&(i.history.writeIndex=0,this.clearHistoryTextureLayers(i))}),this.emitHook("reset")}destroy(){this.emitHook("destroy"),this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.resolutionObserver.disconnect(),this.resizeObserver.disconnect(),this.canvas instanceof HTMLCanvasElement&&this.eventListeners.forEach((i,e)=>{this.canvas.removeEventListener(e,i)}),this.program&&this.gl.deleteProgram(this.program),this.intermediateFbo&&(this.gl.deleteFramebuffer(this.intermediateFbo),this.intermediateFbo=null),this.textures.forEach(i=>{this.gl.deleteTexture(i.texture)}),this.textureUnitPool.free=[],this.textureUnitPool.next=0,this.buffer&&(this.gl.deleteBuffer(this.buffer),this.buffer=null),this.isInternalCanvas&&this.canvas instanceof HTMLCanvasElement&&this.canvas.remove()}},V=N;var j={data:new Uint8Array(4),width:1,height:1};function $(o){return o instanceof HTMLVideoElement||o instanceof HTMLImageElement||o instanceof HTMLCanvasElement||o instanceof OffscreenCanvas}function q(o){return JSON.stringify(o,Object.keys(o).sort())}function P(o,i,e,n,t=0){let r=1/0,a=-1/0,s=1/0,h=-1/0,m=0,d=0;for(let f of e){let c=(t+i*n+f)*4,E=o[c],g=o[c+1];r=Math.min(r,E),a=Math.max(a,E),s=Math.min(s,g),h=Math.max(h,g),m+=o[c+2],d+=o[c+3]}return[(r+a)/2,(s+h)/2,m/e.length,d/e.length]}var G=null;function Z(){return G||(G=import("@mediapipe/tasks-vision").then(({FilesetResolver:o})=>o.forVisionTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.22-rc.20250304/wasm"))),G}function J(o){return{historyParams:o?", framesAgo":"",fn:o?(n,t,r,a)=>{let s=r.replace(/\w+ /g,""),h=r?`${r}, int framesAgo`:"int framesAgo",m=s?`${s}, 0`:"0";return`${n} ${t}(${h}) {
10
+ ${a}
7
11
  }
8
- `,me=33.333333333333336,M=Symbol("u_history"),Y=Symbol("__SHADERPAD_BUFFER");function fe(l,t){if(!t?.length)return l;let e=l.split(`
9
- `),s=e.findLastIndex(i=>{let r=i.trimStart();return r.startsWith("precision ")||r.startsWith("#version ")})+1;return e.splice(s,0,...t),e.join(`
10
- `)}function Z(l){return l instanceof WebGLTexture?{width:0,height:0}: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 D(l){return typeof l=="symbol"?l.description??"":l}var V=class{isInternalCanvas=!1;isTouchDevice=!1;gl;fragmentShaderSrc;uniforms=new Map;textures=new Map;textureUnitPool;buffer=null;program=null;aPositionLocation=0;animationFrameId;resolutionObserver;resizeObserver;resizeTimeout=null;lastResizeTime=-1/0;eventListeners=new Map;frame=0;startTime=0;cursorPosition=[.5,.5];clickPosition=[.5,.5];isMouseDown=!1;canvas;onResize;hooks=new Map;historyDepth=0;textureOptions;debug;intermediateFbo=null;constructor(t,{canvas:e,plugins:s,history:i,debug:r,...h}={}){if(this.canvas=e||document.createElement("canvas"),!e){this.isInternalCanvas=!0;let g=this.canvas;g.style.position="fixed",g.style.inset="0",g.style.height="100dvh",g.style.width="100dvw",document.body.appendChild(g)}if(this.gl=this.canvas.getContext("webgl2",{antialias:!1}),!this.gl)throw new Error("WebGL2 not supported. Please use a browser that supports WebGL2.");this.textureUnitPool={free:[],next:0,max:this.gl.getParameter(this.gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS)},this.textureOptions=h;let{internalFormat:n,type:f}=h;(f===this.gl.FLOAT||f===this.gl.HALF_FLOAT||n===this.gl.RGBA16F||n===this.gl.RGBA32F||n===this.gl.R16F||n===this.gl.R32F||n===this.gl.RG16F||n===this.gl.RG32F)&&!this.gl.getExtension("EXT_color_buffer_float")&&(console.warn("EXT_color_buffer_float not supported, falling back to RGBA8"),delete this.textureOptions?.internalFormat,delete this.textureOptions?.format,delete this.textureOptions?.type),i&&(this.historyDepth=i),this.debug=r??(typeof process<"u"&&!1),this.animationFrameId=null,this.resolutionObserver=new MutationObserver(()=>this.updateResolution()),this.resizeObserver=new ResizeObserver(()=>this.throttledHandleResize());let c=[];if(s){let g={gl:this.gl,uniforms:this.uniforms,textures:this.textures,canvas:this.canvas,reserveTextureUnit:this.reserveTextureUnit.bind(this),releaseTextureUnit:this.releaseTextureUnit.bind(this),injectGLSL:_=>{c.push(_)}};Object.defineProperty(g,"program",{get:()=>this.program,enumerable:!0,configurable:!0}),s.forEach(_=>_(this,g))}this.fragmentShaderSrc=fe(t,c),this.init(),this.canvas instanceof HTMLCanvasElement&&this.addEventListeners()}registerHook(t,e){this.hooks.has(t)||this.hooks.set(t,[]),this.hooks.get(t).push(e)}init(){let t=ce;if(this.program=this.gl.createProgram(),!this.program)throw new Error("Failed to create WebGL program");let e=this.createShader(this.gl.VERTEX_SHADER,t),s=this.createShader(this.gl.FRAGMENT_SHADER,this.fragmentShaderSrc);if(this.gl.attachShader(this.program,e),this.gl.attachShader(this.program,s),this.gl.linkProgram(this.program),this.gl.deleteShader(e),this.gl.deleteShader(s),!this.gl.getProgramParameter(this.program,this.gl.LINK_STATUS))throw console.error("Program link error:",this.gl.getProgramInfoLog(this.program)),this.gl.deleteProgram(this.program),new Error("Failed to link WebGL program");this.aPositionLocation=this.gl.getAttribLocation(this.program,"aPosition"),this.setupBuffer(),this.gl.useProgram(this.program),this.canvas instanceof HTMLCanvasElement&&(this.resolutionObserver.observe(this.canvas,{attributes:!0,attributeFilter:["width","height"]}),this.resizeObserver.observe(this.canvas)),this.isInternalCanvas||this.updateResolution(),this.initializeUniform("u_cursor","float",this.cursorPosition),this.initializeUniform("u_click","float",[...this.clickPosition,this.isMouseDown?1:0]),this.initializeUniform("u_time","float",0),this.initializeUniform("u_frame","int",0),this.historyDepth>0&&(this._initializeTexture(Y,this.canvas,{...this.textureOptions}),this._initializeTexture(M,this.canvas,{history:this.historyDepth,...this.textureOptions}),this.intermediateFbo=this.gl.createFramebuffer()),this.hooks.get("init")?.forEach(i=>i.call(this))}createShader(t,e){let s=this.gl.createShader(t);if(this.gl.shaderSource(s,e),this.gl.compileShader(s),!this.gl.getShaderParameter(s,this.gl.COMPILE_STATUS))throw console.error("Shader compilation failed:",e),console.error(this.gl.getShaderInfoLog(s)),this.gl.deleteShader(s),new Error("Shader compilation failed");return s}setupBuffer(){let t=new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]);this.buffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.buffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,t,this.gl.STATIC_DRAW),this.gl.viewport(0,0,this.gl.drawingBufferWidth,this.gl.drawingBufferHeight),this.gl.enableVertexAttribArray(this.aPositionLocation),this.gl.vertexAttribPointer(this.aPositionLocation,2,this.gl.FLOAT,!1,0,0)}throttledHandleResize(){clearTimeout(this.resizeTimeout);let t=performance.now(),e=this.lastResizeTime+me-t;e<=0?(this.lastResizeTime=t,this.handleResize()):this.resizeTimeout=setTimeout(()=>this.throttledHandleResize(),e)}handleResize(){if(!(this.canvas instanceof HTMLCanvasElement))return;let t=window.devicePixelRatio||1,e=this.canvas.clientWidth*t,s=this.canvas.clientHeight*t;this.isInternalCanvas&&(this.canvas.width!==e||this.canvas.height!==s)&&(this.canvas.width=e,this.canvas.height=s),this.onResize?.(e,s)}addEventListeners(){let t=this.canvas,e=(i,r)=>{if(!this.uniforms.has("u_cursor"))return;let h=t.getBoundingClientRect();this.cursorPosition[0]=(i-h.left)/h.width,this.cursorPosition[1]=1-(r-h.top)/h.height,this.updateUniforms({u_cursor:this.cursorPosition})},s=(i,r,h)=>{if(this.uniforms.has("u_click")){if(this.isMouseDown=i,i){let n=t.getBoundingClientRect(),f=r,d=h;this.clickPosition[0]=(f-n.left)/n.width,this.clickPosition[1]=1-(d-n.top)/n.height}this.updateUniforms({u_click:[...this.clickPosition,this.isMouseDown?1:0]})}};this.eventListeners.set("mousemove",i=>{let r=i;this.isTouchDevice||e(r.clientX,r.clientY)}),this.eventListeners.set("mousedown",i=>{let r=i;this.isTouchDevice||r.button===0&&(this.isMouseDown=!0,s(!0,r.clientX,r.clientY))}),this.eventListeners.set("mouseup",i=>{let r=i;this.isTouchDevice||r.button===0&&s(!1)}),this.eventListeners.set("touchmove",i=>{let r=i;r.touches.length>0&&e(r.touches[0].clientX,r.touches[0].clientY)}),this.eventListeners.set("touchstart",i=>{let r=i;this.isTouchDevice=!0,r.touches.length>0&&(e(r.touches[0].clientX,r.touches[0].clientY),s(!0,r.touches[0].clientX,r.touches[0].clientY))}),this.eventListeners.set("touchend",i=>{i.touches.length===0&&s(!1)}),this.eventListeners.forEach((i,r)=>{t.addEventListener(r,i)})}updateResolution(){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),this.historyDepth>0&&(this.resizeTexture(M,...t),this.resizeTexture(Y,...t)),this.hooks.get("updateResolution")?.forEach(e=>e.call(this))}resizeTexture(t,e,s){let i=this.textures.get(t);if(!i||i.width===e&&i.height===s)return;this.gl.deleteTexture(i.texture),i.width=e,i.height=s;let{texture:r}=this.createTexture(t,i);i.texture=r,i.history&&(i.history.writeIndex=0,this.clearHistoryTextureLayers(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 new Error("Exceeded the available texture units for this device.");return this.textureUnitPool.next++}releaseTextureUnit(t){let e=this.textures.get(t);e&&this.textureUnitPool.free.push(e.unitIndex)}resolveTextureOptions(t){let{gl:e}=this,s=t?.type??e.UNSIGNED_BYTE;return{type:s,format:t?.format??e.RGBA,internalFormat:t?.internalFormat??(s===e.FLOAT?e.RGBA32F:s===e.HALF_FLOAT?e.RGBA16F:e.RGBA8),minFilter:t?.minFilter??e.LINEAR,magFilter:t?.magFilter??e.LINEAR,wrapS:t?.wrapS??e.CLAMP_TO_EDGE,wrapT:t?.wrapT??e.CLAMP_TO_EDGE,preserveY:t?.preserveY}}clearHistoryTextureLayers(t){if(!t.history)return;let e=this.gl,{type:s,format:i}=t.options,r=t.width*t.height*4,h=s===e.FLOAT?new Float32Array(r):s===e.HALF_FLOAT?new Uint16Array(r):new Uint8Array(r);e.activeTexture(e.TEXTURE0+t.unitIndex),e.bindTexture(e.TEXTURE_2D_ARRAY,t.texture);for(let n=0;n<t.history.depth;++n)e.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,n,t.width,t.height,1,i,s,h)}initializeUniform(t,e,s,i){let r=i?.arrayLength;if(this.uniforms.has(t))throw new Error(`${t} is already initialized.`);if(e!=="float"&&e!=="int")throw new Error(`Invalid uniform type: ${e}. Expected 'float' or 'int'.`);if(r&&!(Array.isArray(s)&&s.length===r))throw new Error(`${t} array length mismatch: must initialize with ${r} elements.`);let h=this.gl.getUniformLocation(this.program,t);if(!h&&r&&(h=this.gl.getUniformLocation(this.program,`${t}[0]`)),!h){this.log(`${t} not found in fragment shader. Skipping initialization.`);return}let n=r?s[0]:s,f=Array.isArray(n)?n.length:1;this.uniforms.set(t,{type:e,length:f,location:h,arrayLength:r});try{this.updateUniforms({[t]:s})}catch(d){throw this.uniforms.delete(t),d}this.hooks.get("initializeUniform")?.forEach(d=>d.call(this,...arguments))}log(...t){this.debug&&console.debug(...t)}updateUniforms(t,e){this.gl.useProgram(this.program),Object.entries(t).forEach(([s,i])=>{let r=this.uniforms.get(s);if(!r){this.log(`${s} not found in fragment shader. Skipping update.`);return}let h=`uniform${r.length}${r.type.charAt(0)}`;if(r.arrayLength){if(!Array.isArray(i))throw new Error(`${s} is an array, but the value passed to updateUniforms is not an array.`);let n=i.length;if(!n)return;if(n>r.arrayLength)throw new Error(`${s} received ${n} values, but maximum length is ${r.arrayLength}.`);if(i.some(c=>(Array.isArray(c)?c.length:1)!==r.length))throw new Error(`Tried to update ${s} with some elements that are not length ${r.length}.`);let f=new(r.type==="float"?Float32Array:Int32Array)(i.flat()),d=r.location;if(e?.startIndex){let c=this.gl.getUniformLocation(this.program,`${s}[${e.startIndex}]`);if(!c)throw new Error(`${s}[${e.startIndex}] not found in fragment shader. Did you pass an invalid startIndex?`);d=c}this.gl[h+"v"](d,f)}else{if(Array.isArray(i)||(i=[i]),i.length!==r.length)throw new Error(`Invalid uniform value length: ${i.length}. Expected ${r.length}.`);this.gl[h](r.location,...i)}}),this.hooks.get("updateUniforms")?.forEach(s=>s.call(this,...arguments))}createTexture(t,e){let{width:s,height:i}=e,r=e.history?.depth??0,h=this.gl.createTexture();if(!h)throw new Error("Failed to create texture");let n=e.unitIndex;if(typeof n!="number")try{n=this.reserveTextureUnit(t)}catch(g){throw this.gl.deleteTexture(h),g}let f=r>0,d=f?this.gl.TEXTURE_2D_ARRAY:this.gl.TEXTURE_2D,{options:c}=e;return this.gl.activeTexture(this.gl.TEXTURE0+n),this.gl.bindTexture(d,h),this.gl.texParameteri(d,this.gl.TEXTURE_WRAP_S,c.wrapS),this.gl.texParameteri(d,this.gl.TEXTURE_WRAP_T,c.wrapT),this.gl.texParameteri(d,this.gl.TEXTURE_MIN_FILTER,c.minFilter),this.gl.texParameteri(d,this.gl.TEXTURE_MAG_FILTER,c.magFilter),f?this.gl.texStorage3D(d,1,c.internalFormat,s,i,r):t===Y&&this.gl.texImage2D(this.gl.TEXTURE_2D,0,c.internalFormat,s,i,0,c.format,c.type,null),{texture:h,unitIndex:n}}_initializeTexture(t,e,s){if(this.textures.has(t))throw new Error(`Texture '${D(t)}' is already initialized.`);let{history:i=0,...r}=s??{},{width:h,height:n}=Z(e);if(!h||!n)throw new Error("Texture source must have valid dimensions");let f={width:h,height:n,options:this.resolveTextureOptions(r)};i>0&&(f.history={depth:i,writeIndex:0});let{texture:d,unitIndex:c}=this.createTexture(t,f),g={texture:d,unitIndex:c,...f};i>0&&(this.initializeUniform(`${D(t)}FrameOffset`,"int",0),this.clearHistoryTextureLayers(g)),this.textures.set(t,g),this.updateTexture(t,e);let _=this.gl.getUniformLocation(this.program,D(t));_&&this.gl.uniform1i(_,c)}initializeTexture(t,e,s){this._initializeTexture(t,e,s),this.hooks.get("initializeTexture")?.forEach(i=>i.call(this,...arguments))}updateTextures(t,e){this.hooks.get("updateTextures")?.forEach(s=>s.call(this,...arguments)),Object.entries(t).forEach(([s,i])=>{this.updateTexture(s,i,e)})}updateTexture(t,e,s){let i=this.textures.get(t);if(!i)throw new Error(`Texture '${D(t)}' is not initialized.`);if(e instanceof WebGLTexture){this.gl.activeTexture(this.gl.TEXTURE0+i.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D,e);return}let{width:r,height:h}=Z(e);if(!r||!h)return;let n="isPartial"in e&&e.isPartial;n||this.resizeTexture(t,r,h);let d=!("data"in e&&e.data)&&!i.options?.preserveY,c=this.gl.getParameter(this.gl.UNPACK_FLIP_Y_WEBGL);if(i.history){if(this.gl.activeTexture(this.gl.TEXTURE0+i.unitIndex),this.gl.bindTexture(this.gl.TEXTURE_2D_ARRAY,i.texture),!s?.skipHistoryWrite){this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,d),this.gl.texSubImage3D(this.gl.TEXTURE_2D_ARRAY,0,0,0,i.history.writeIndex,r,h,1,i.options.format,i.options.type,e.data??e),this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,c);let g=`${D(t)}FrameOffset`;this.updateUniforms({[g]:i.history.writeIndex}),i.history.writeIndex=(i.history.writeIndex+1)%i.history.depth}}else 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,d),n?this.gl.texSubImage2D(this.gl.TEXTURE_2D,0,e.x??0,e.y??0,r,h,i.options.format,i.options.type,e.data):this.gl.texImage2D(this.gl.TEXTURE_2D,0,i.options.internalFormat,r,h,0,i.options.format,i.options.type,e.data??e),this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,c)}draw(t){let e=this.gl,s=e.drawingBufferWidth,i=e.drawingBufferHeight,r=this.textures.get(M),h=this.textures.get(Y),n=r&&!t?.skipHistoryWrite;n&&(e.bindFramebuffer(e.FRAMEBUFFER,this.intermediateFbo),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,h.texture,0)),e.useProgram(this.program),e.bindBuffer(e.ARRAY_BUFFER,this.buffer),e.vertexAttribPointer(this.aPositionLocation,2,e.FLOAT,!1,0,0),e.enableVertexAttribArray(this.aPositionLocation),e.viewport(0,0,s,i),t?.skipClear||e.clear(e.COLOR_BUFFER_BIT),e.drawArrays(e.TRIANGLES,0,6),n&&(e.bindTexture(e.TEXTURE_2D_ARRAY,r.texture),e.copyTexSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,r.history.writeIndex,0,0,s,i),e.bindFramebuffer(e.READ_FRAMEBUFFER,this.intermediateFbo),e.bindFramebuffer(e.DRAW_FRAMEBUFFER,null),e.blitFramebuffer(0,0,s,i,0,0,s,i,e.COLOR_BUFFER_BIT,e.NEAREST),e.bindFramebuffer(e.FRAMEBUFFER,null))}step(t,e){let s={};this.uniforms.has("u_time")&&(s.u_time=t),this.uniforms.has("u_frame")&&(s.u_frame=this.frame),this.updateUniforms(s),this.hooks.get("step")?.forEach(r=>r.call(this,t,this.frame)),this.draw(e);let i=this.textures.get(M);if(i&&!e?.skipHistoryWrite){let{writeIndex:r,depth:h}=i.history;this.updateUniforms({[`${D(M)}FrameOffset`]:r}),i.history.writeIndex=(r+1)%h}this.hooks.get("afterStep")?.forEach(r=>r.call(this,t,this.frame)),++this.frame}play(t,e){this.pause();let s=i=>{i=(i-this.startTime)/1e3;let r=e?.(i,this.frame)??void 0;this.step(i,r),this.animationFrameId=requestAnimationFrame(s),t?.(i,this.frame)};this.animationFrameId=requestAnimationFrame(s)}pause(){this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}reset(){this.frame=0,this.startTime=performance.now(),this.textures.forEach(t=>{t.history&&(t.history.writeIndex=0,this.clearHistoryTextureLayers(t))}),this.hooks.get("reset")?.forEach(t=>t.call(this))}destroy(){this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.resolutionObserver.disconnect(),this.resizeObserver.disconnect(),this.canvas instanceof HTMLCanvasElement&&this.eventListeners.forEach((t,e)=>{this.canvas.removeEventListener(e,t)}),this.program&&this.gl.deleteProgram(this.program),this.intermediateFbo&&(this.gl.deleteFramebuffer(this.intermediateFbo),this.intermediateFbo=null),this.textures.forEach(t=>{this.gl.deleteTexture(t.texture)}),this.textureUnitPool.free=[],this.textureUnitPool.next=0,this.buffer&&(this.gl.deleteBuffer(this.buffer),this.buffer=null),this.hooks.get("destroy")?.forEach(t=>t.call(this)),this.isInternalCanvas&&this.canvas instanceof HTMLCanvasElement&&this.canvas.remove()}},J=V;var L=33,de=6,p=L+de,a={LEFT_EYE:2,RIGHT_EYE:5,LEFT_SHOULDER:11,RIGHT_SHOULDER:12,LEFT_ELBOW:13,RIGHT_ELBOW:14,LEFT_HIP:23,RIGHT_HIP:24,LEFT_KNEE:25,RIGHT_KNEE:26,LEFT_WRIST:15,RIGHT_WRIST:16,LEFT_PINKY:17,RIGHT_PINKY:18,LEFT_INDEX:19,RIGHT_INDEX:20,LEFT_THUMB:21,RIGHT_THUMB:22,LEFT_ANKLE:27,RIGHT_ANKLE:28,LEFT_HEEL:29,RIGHT_HEEL:30,LEFT_FOOT_INDEX:31,RIGHT_FOOT_INDEX:32,BODY_CENTER:L,LEFT_HAND_CENTER:L+1,RIGHT_HAND_CENTER:L+2,LEFT_FOOT_CENTER:L+3,RIGHT_FOOT_CENTER:L+4,TORSO_CENTER:L+5},Te=Array.from({length:L},(l,t)=>t),ge=[a.LEFT_WRIST,a.LEFT_PINKY,a.LEFT_THUMB,a.LEFT_INDEX],Ee=[a.RIGHT_WRIST,a.RIGHT_PINKY,a.RIGHT_THUMB,a.RIGHT_INDEX],pe=[a.LEFT_ANKLE,a.LEFT_HEEL,a.LEFT_FOOT_INDEX],_e=[a.RIGHT_ANKLE,a.RIGHT_HEEL,a.RIGHT_FOOT_INDEX],xe=[a.LEFT_SHOULDER,a.RIGHT_SHOULDER,a.LEFT_HIP,a.RIGHT_HIP],Q={data:new Uint8Array(4),width:1,height:1};function Re(l){let{textureName:t,options:e}=l,s="https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_lite/float16/1/pose_landmarker_lite.task";return function(i,r){let{injectGLSL:h,gl:n}=r,f=null,d=null,c=-1,g="VIDEO",_=new Map,X=e?.maxPoses??1,F=512,$=0,o=null,K=new OffscreenCanvas(1,1),E=null;async function ee(){try{let{FilesetResolver:m,PoseLandmarker:u}=await import("@mediapipe/tasks-vision");d=await m.forVisionTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"),f=await u.createFromOptions(d,{baseOptions:{modelAssetPath:e?.modelPath||s,delegate:"GPU"},canvas:K,runningMode:g,numPoses:e?.maxPoses??1,minPoseDetectionConfidence:e?.minPoseDetectionConfidence??.5,minPosePresenceConfidence:e?.minPosePresenceConfidence??.5,minTrackingConfidence:e?.minTrackingConfidence??.5,outputSegmentationMasks:!0})}catch(m){throw console.error("[Pose Plugin] Failed to initialize:",m),m}}function O(m,u,R){let x=1/0,T=-1/0,N=1/0,b=-1/0,A=0,I=0;for(let U of R){let v=(u*p+U)*4,y=m[v],P=m[v+1];x=Math.min(x,y),T=Math.max(T,y),N=Math.min(N,P),b=Math.max(b,P),A+=m[v+2],I+=m[v+3]}let S=(x+T)/2,w=(N+b)/2,H=A/R.length,C=I/R.length;return[S,w,H,C]}function te(m){if(!(!m||m.length===0||!E)){for(let u=0;u<m.length;++u){let R=m[u];E.updateTextures({u_mask:R.getAsWebGLTexture()}),E.updateUniforms({u_poseIndex:(u+1)/X}),E.draw({skipClear:u>0}),R.close()}i.updateTextures({u_poseMask:K})}}function ie(m){if(!o)return;let u=m.length,R=u*p;for(let T=0;T<u;++T){let N=m[T];for(let G=0;G<L;++G){let B=N[G],z=(T*p+G)*4;o[z]=B.x,o[z+1]=1-B.y,o[z+2]=B.z??0,o[z+3]=B.visibility??1}let b=O(o,T,Te),A=(T*p+a.BODY_CENTER)*4;o[A]=b[0],o[A+1]=b[1],o[A+2]=b[2],o[A+3]=b[3];let I=O(o,T,ge),S=(T*p+a.LEFT_HAND_CENTER)*4;o[S]=I[0],o[S+1]=I[1],o[S+2]=I[2],o[S+3]=I[3];let w=O(o,T,Ee),H=(T*p+a.RIGHT_HAND_CENTER)*4;o[H]=w[0],o[H+1]=w[1],o[H+2]=w[2],o[H+3]=w[3];let C=O(o,T,pe),U=(T*p+a.LEFT_FOOT_CENTER)*4;o[U]=C[0],o[U+1]=C[1],o[U+2]=C[2],o[U+3]=C[3];let v=O(o,T,_e),y=(T*p+a.RIGHT_FOOT_CENTER)*4;o[y]=v[0],o[y+1]=v[1],o[y+2]=v[2],o[y+3]=v[3];let P=O(o,T,xe),k=(T*p+a.TORSO_CENTER)*4;o[k]=P[0],o[k+1]=P[1],o[k+2]=P[2],o[k+3]=P[3]}let x=Math.ceil(R/F);i.updateTextures({u_poseLandmarksTex:{data:o,width:F,height:x,isPartial:!0}})}function j(m){if(!m.landmarks||!o)return;E||(E=new J(`#version 300 es
11
- precision mediump float;
12
- in vec2 v_uv;
13
- out vec4 outColor;
14
- uniform sampler2D u_mask;
15
- uniform float u_poseIndex;
16
- void main() {
17
- ivec2 texCoord = ivec2(v_uv * vec2(textureSize(u_mask, 0)));
18
- float confidence = texelFetch(u_mask, texCoord, 0).r;
19
- if (confidence < 0.01) discard;
20
- outColor = vec4(1.0, confidence, u_poseIndex, 1.0);
21
- }`,{canvas:K}),E.initializeTexture("u_mask",Q),E.initializeUniform("u_poseIndex","float",0));let u=m.landmarks.length;ie(m.landmarks),te(m.segmentationMasks),i.updateUniforms({u_nPoses:u}),e?.onResults?.(m)}i.registerHook("init",async()=>{i.initializeTexture("u_poseMask",Q,{preserveY:!0,minFilter:n.NEAREST,magFilter:n.NEAREST}),i.initializeUniform("u_maxPoses","int",X),i.initializeUniform("u_nPoses","int",0);let m=X*p;$=Math.ceil(m/F);let u=F*$*4;o=new Float32Array(u),i.initializeTexture("u_poseLandmarksTex",{data:o,width:F,height:$},{internalFormat:n.RGBA32F,type:n.FLOAT,minFilter:n.NEAREST,magFilter:n.NEAREST}),await ee(),e?.onReady?.()}),i.registerHook("updateTextures",async m=>{let u=m[t];if(!(!u||(_.get(t)!==u&&(c=-1),_.set(t,u),!f)))try{let x=u instanceof HTMLVideoElement?"VIDEO":"IMAGE";if(g!==x&&(g=x,await f.setOptions({runningMode:g})),u instanceof HTMLVideoElement){if(u.videoWidth===0||u.videoHeight===0||u.readyState<2)return;if(u.currentTime!==c){c=u.currentTime;let T=f.detectForVideo(u,performance.now());j(T)}}else if(u instanceof HTMLImageElement||u instanceof HTMLCanvasElement){if(u.width===0||u.height===0)return;let T=f.detect(u);j(T)}}catch(x){console.error("[Pose Plugin] Detection error:",x)}}),i.registerHook("destroy",()=>{f&&(f.close(),f=null),E&&(E.destroy(),E=null),d=null,_.clear(),o=null}),h(`
12
+ ${n} ${t}(${r}) { return ${t}(${m}); }`}:(n,t,r,a)=>`${n} ${t}(${r}) {
13
+ ${a}
14
+ }`}}var L=33,me=6,x=L+me,l={LEFT_EYE:2,RIGHT_EYE:5,LEFT_SHOULDER:11,RIGHT_SHOULDER:12,LEFT_ELBOW:13,RIGHT_ELBOW:14,LEFT_HIP:23,RIGHT_HIP:24,LEFT_KNEE:25,RIGHT_KNEE:26,LEFT_WRIST:15,RIGHT_WRIST:16,LEFT_PINKY:17,RIGHT_PINKY:18,LEFT_INDEX:19,RIGHT_INDEX:20,LEFT_THUMB:21,RIGHT_THUMB:22,LEFT_ANKLE:27,RIGHT_ANKLE:28,LEFT_HEEL:29,RIGHT_HEEL:30,LEFT_FOOT_INDEX:31,RIGHT_FOOT_INDEX:32,BODY_CENTER:L,LEFT_HAND_CENTER:L+1,RIGHT_HAND_CENTER:L+2,LEFT_FOOT_CENTER:L+3,RIGHT_FOOT_CENTER:L+4,TORSO_CENTER:L+5},de=Array.from({length:L},(o,i)=>i),fe=[l.LEFT_WRIST,l.LEFT_PINKY,l.LEFT_THUMB,l.LEFT_INDEX],Te=[l.RIGHT_WRIST,l.RIGHT_PINKY,l.RIGHT_THUMB,l.RIGHT_INDEX],pe=[l.LEFT_ANKLE,l.LEFT_HEEL,l.LEFT_FOOT_INDEX],Ee=[l.RIGHT_ANKLE,l.RIGHT_HEEL,l.RIGHT_FOOT_INDEX],ge=[l.LEFT_SHOULDER,l.RIGHT_SHOULDER,l.LEFT_HIP,l.RIGHT_HIP],I=512,_=1,xe={modelPath:"https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_lite/float16/1/pose_landmarker_lite.task",maxPoses:1,minPoseDetectionConfidence:.5,minPosePresenceConfidence:.5,minTrackingConfidence:.5},C=new Map;function _e(o,i){let e=o.landmarks.data,n=i.length;e[0]=n;for(let t=0;t<n;++t){let r=i[t];for(let R=0;R<L;++R){let O=r[R],F=(_+t*x+R)*4;e[F]=O.x,e[F+1]=1-O.y,e[F+2]=O.z??0,e[F+3]=O.visibility??1}let a=P(e,t,de,x,_),s=(_+t*x+l.BODY_CENTER)*4;e[s]=a[0],e[s+1]=a[1],e[s+2]=a[2],e[s+3]=a[3];let h=P(e,t,fe,x,_),m=(_+t*x+l.LEFT_HAND_CENTER)*4;e[m]=h[0],e[m+1]=h[1],e[m+2]=h[2],e[m+3]=h[3];let d=P(e,t,Te,x,_),f=(_+t*x+l.RIGHT_HAND_CENTER)*4;e[f]=d[0],e[f+1]=d[1],e[f+2]=d[2],e[f+3]=d[3];let c=P(e,t,pe,x,_),E=(_+t*x+l.LEFT_FOOT_CENTER)*4;e[E]=c[0],e[E+1]=c[1],e[E+2]=c[2],e[E+3]=c[3];let g=P(e,t,Ee,x,_),p=(_+t*x+l.RIGHT_FOOT_CENTER)*4;e[p]=g[0],e[p+1]=g[1],e[p+2]=g[2],e[p+3]=g[3];let u=P(e,t,ge,x,_),v=(_+t*x+l.TORSO_CENTER)*4;e[v]=u[0],e[v+1]=u[1],e[v+2]=u[2],e[v+3]=u[3]}o.state.nPoses=n}function ve(o,i){if(!i||i.length===0)return;let{mask:{shader:e},maxPoses:n}=o;for(let t=0;t<i.length;++t){let r=i[t];e.updateTextures({u_mask:r.getAsWebGLTexture()}),e.updateUniforms({u_poseIndex:(t+1)/n}),e.draw({skipClear:t>0}),r.close()}}function Re(o){let{textureName:i,options:{history:e,...n}={}}=o,t={...xe,...n},r=q({...t,textureName:i}),a=t.maxPoses*x+_,s=Math.ceil(a/I);return function(h,m){let{injectGLSL:d,gl:f,emitHook:c}=m,E=C.get(r),g=E?.landmarks.data??new Float32Array(I*s*4),p=E?.canvas??new OffscreenCanvas(1,1),u=null,v=!1;function R(){if(!u)return;let{nPoses:T}=u.state,b=T*x+_,y=Math.ceil(b/I);h.updateTextures({u_poseLandmarksTex:{data:u.landmarks.data,width:I,height:y,isPartial:!0},u_poseMask:u.canvas},{skipHistoryWrite:v}),h.updateUniforms({u_nPoses:T}),c("pose:result",u.state.result)}async function O(){if(C.has(r))u=C.get(r);else{let[T,{PoseLandmarker:b}]=await Promise.all([Z(),import("@mediapipe/tasks-vision")]),y=await b.createFromOptions(T,{baseOptions:{modelAssetPath:t.modelPath,delegate:"GPU"},canvas:p,runningMode:"VIDEO",numPoses:t.maxPoses,minPoseDetectionConfidence:t.minPoseDetectionConfidence,minPosePresenceConfidence:t.minPosePresenceConfidence,minTrackingConfidence:t.minTrackingConfidence,outputSegmentationMasks:!0}),A=new V(`#version 300 es
15
+ precision mediump float;
16
+ in vec2 v_uv;
17
+ out vec4 outColor;
18
+ uniform sampler2D u_mask;
19
+ uniform float u_poseIndex;
20
+ void main() {
21
+ ivec2 texCoord = ivec2(v_uv * vec2(textureSize(u_mask, 0)));
22
+ float confidence = texelFetch(u_mask, texCoord, 0).r;
23
+ if (confidence < 0.01) discard;
24
+ outColor = vec4(1.0, confidence, u_poseIndex, 1.0);
25
+ }`,{canvas:p});A.initializeTexture("u_mask",j),A.initializeUniform("u_poseIndex","float",0),u={landmarker:y,canvas:p,subscribers:new Map,maxPoses:t.maxPoses,state:{runningMode:"VIDEO",source:null,videoTime:-1,resultTimestamp:0,result:null,pending:Promise.resolve(),nPoses:0},landmarks:{data:g,textureHeight:s},mask:{shader:A}},C.set(r,u)}u.subscribers.set(R,!1)}let F=O();h.on("init",()=>{h.initializeUniform("u_maxPoses","int",t.maxPoses),h.initializeUniform("u_nPoses","int",0),h.initializeTexture("u_poseLandmarksTex",{data:g,width:I,height:s},{internalFormat:f.RGBA32F,type:f.FLOAT,minFilter:f.NEAREST,magFilter:f.NEAREST,history:e}),h.initializeTexture("u_poseMask",p,{preserveY:!0,minFilter:f.NEAREST,magFilter:f.NEAREST,history:e}),F.then(()=>c("pose:ready"))}),h.on("initializeTexture",(T,b)=>{T===i&&$(b)&&z(b)}),h.on("updateTextures",(T,b)=>{let y=T[i];$(y)&&(v=b?.skipHistoryWrite??!1,z(y))});let B=0;async function z(T){let b=performance.now(),y=++B;await F,u&&(u.state.pending=u.state.pending.then(async()=>{if(y!==B||!u)return;let A=T instanceof HTMLVideoElement?"VIDEO":"IMAGE";u.state.runningMode!==A&&(u.state.runningMode=A,await u.landmarker.setOptions({runningMode:A}));let k=!1;if(T!==u.state.source?(u.state.source=T,u.state.videoTime=-1,k=!0):T instanceof HTMLVideoElement?T.currentTime!==u.state.videoTime&&(u.state.videoTime=T.currentTime,k=!0):T instanceof HTMLImageElement||b-u.state.resultTimestamp>2&&(k=!0),k){let S;if(T instanceof HTMLVideoElement){if(T.videoWidth===0||T.videoHeight===0||T.readyState<2)return;S=u.landmarker.detectForVideo(T,b)}else{if(T.width===0||T.height===0)return;S=u.landmarker.detect(T)}if(S){u.state.resultTimestamp=b,u.state.result=S,_e(u,S.landmarks),ve(u,S.segmentationMasks);for(let W of u.subscribers.keys())W(),u.subscribers.set(W,!0)}}else u.state.result&&!u.subscribers.get(R)&&(R(),u.subscribers.set(R,!0))}),await u.state.pending)}h.on("destroy",()=>{u&&(u.subscribers.delete(R),u.subscribers.size===0&&(u.landmarker.close(),u.mask.shader?.destroy(),C.delete(r))),u=null});let{fn:M,historyParams:Q}=J(e),ee=e?`int layer = (u_poseMaskFrameOffset - framesAgo + ${e}) % ${e};
26
+ vec4 mask = texture(u_poseMask, vec3(pos, float(layer)));`:"vec4 mask = texture(u_poseMask, pos);";d(`
22
27
  uniform int u_maxPoses;
23
28
  uniform int u_nPoses;
24
- uniform sampler2D u_poseLandmarksTex;
25
- uniform sampler2D u_poseMask;
29
+ uniform highp sampler2D${e?"Array":""} u_poseLandmarksTex;${e?`
30
+ uniform int u_poseLandmarksTexFrameOffset;`:""}
31
+ uniform sampler2D${e?"Array":""} u_poseMask;${e?`
32
+ uniform int u_poseMaskFrameOffset;`:""}
26
33
 
27
- #define POSE_LANDMARK_LEFT_EYE ${a.LEFT_EYE}
28
- #define POSE_LANDMARK_RIGHT_EYE ${a.RIGHT_EYE}
29
- #define POSE_LANDMARK_LEFT_SHOULDER ${a.LEFT_SHOULDER}
30
- #define POSE_LANDMARK_RIGHT_SHOULDER ${a.RIGHT_SHOULDER}
31
- #define POSE_LANDMARK_LEFT_ELBOW ${a.LEFT_ELBOW}
32
- #define POSE_LANDMARK_RIGHT_ELBOW ${a.RIGHT_ELBOW}
33
- #define POSE_LANDMARK_LEFT_HIP ${a.LEFT_HIP}
34
- #define POSE_LANDMARK_RIGHT_HIP ${a.RIGHT_HIP}
35
- #define POSE_LANDMARK_LEFT_KNEE ${a.LEFT_KNEE}
36
- #define POSE_LANDMARK_RIGHT_KNEE ${a.RIGHT_KNEE}
37
- #define POSE_LANDMARK_BODY_CENTER ${a.BODY_CENTER}
38
- #define POSE_LANDMARK_LEFT_HAND_CENTER ${a.LEFT_HAND_CENTER}
39
- #define POSE_LANDMARK_RIGHT_HAND_CENTER ${a.RIGHT_HAND_CENTER}
40
- #define POSE_LANDMARK_LEFT_FOOT_CENTER ${a.LEFT_FOOT_CENTER}
41
- #define POSE_LANDMARK_RIGHT_FOOT_CENTER ${a.RIGHT_FOOT_CENTER}
42
- #define POSE_LANDMARK_TORSO_CENTER ${a.TORSO_CENTER}
34
+ #define POSE_LANDMARK_LEFT_EYE ${l.LEFT_EYE}
35
+ #define POSE_LANDMARK_RIGHT_EYE ${l.RIGHT_EYE}
36
+ #define POSE_LANDMARK_LEFT_SHOULDER ${l.LEFT_SHOULDER}
37
+ #define POSE_LANDMARK_RIGHT_SHOULDER ${l.RIGHT_SHOULDER}
38
+ #define POSE_LANDMARK_LEFT_ELBOW ${l.LEFT_ELBOW}
39
+ #define POSE_LANDMARK_RIGHT_ELBOW ${l.RIGHT_ELBOW}
40
+ #define POSE_LANDMARK_LEFT_HIP ${l.LEFT_HIP}
41
+ #define POSE_LANDMARK_RIGHT_HIP ${l.RIGHT_HIP}
42
+ #define POSE_LANDMARK_LEFT_KNEE ${l.LEFT_KNEE}
43
+ #define POSE_LANDMARK_RIGHT_KNEE ${l.RIGHT_KNEE}
44
+ #define POSE_LANDMARK_BODY_CENTER ${l.BODY_CENTER}
45
+ #define POSE_LANDMARK_LEFT_HAND_CENTER ${l.LEFT_HAND_CENTER}
46
+ #define POSE_LANDMARK_RIGHT_HAND_CENTER ${l.RIGHT_HAND_CENTER}
47
+ #define POSE_LANDMARK_LEFT_FOOT_CENTER ${l.LEFT_FOOT_CENTER}
48
+ #define POSE_LANDMARK_RIGHT_FOOT_CENTER ${l.RIGHT_FOOT_CENTER}
49
+ #define POSE_LANDMARK_TORSO_CENTER ${l.TORSO_CENTER}
43
50
 
44
- vec4 poseLandmark(int poseIndex, int landmarkIndex) {
45
- int i = poseIndex * ${p} + landmarkIndex;
46
- int x = i % ${F};
47
- int y = i / ${F};
48
- return texelFetch(u_poseLandmarksTex, ivec2(x, y), 0);
49
- }
50
-
51
- vec2 poseAt(vec2 pos) {
52
- vec4 mask = texture(u_poseMask, pos);
51
+ ${M("int","nPosesAt","",e?`
52
+ int layer = (u_poseLandmarksTexFrameOffset - framesAgo + ${e}) % ${e};
53
+ return int(texelFetch(u_poseLandmarksTex, ivec3(0, 0, layer), 0).r + 0.5);`:`
54
+ return int(texelFetch(u_poseLandmarksTex, ivec2(0, 0), 0).r + 0.5);`)}
55
+ ${M("vec4","poseLandmark","int poseIndex, int landmarkIndex",`int i = ${_} + poseIndex * ${x} + landmarkIndex;
56
+ int x = i % ${I};
57
+ int y = i / ${I};${e?`
58
+ int layer = (u_poseLandmarksTexFrameOffset - framesAgo + ${e}) % ${e};
59
+ return texelFetch(u_poseLandmarksTex, ivec3(x, y, layer), 0);`:`
60
+ return texelFetch(u_poseLandmarksTex, ivec2(x, y), 0);`}`)}
61
+ ${M("vec2","poseAt","vec2 pos",`${ee}
53
62
  float poseIndex = floor(mask.b * float(u_maxPoses) + 0.5) - 1.0;
54
- return vec2(mask.g, poseIndex);
55
- }
56
-
57
- float inPose(vec2 pos) {
58
- float pose = poseAt(pos).x;
59
- return step(0.0, pose);
60
- }`)}}var ve=Re;
63
+ return vec2(mask.g, poseIndex);`)}
64
+ ${M("float","inPose","vec2 pos",`return step(0.0, poseAt(pos${Q}).x);`)}`)}}var be=Re;
61
65
  //# sourceMappingURL=pose.js.map