u-space 0.0.30 → 0.0.32

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 (37) hide show
  1. package/dist/getTransferables-C97JPUVf.cjs +1 -0
  2. package/dist/getTransferables-DrzSmiCR.js +43 -0
  3. package/dist/index.cjs +3 -3
  4. package/dist/index.js +1549 -1026
  5. package/dist/modelDecodeProtocol-D1Apm9iG.cjs +1 -0
  6. package/dist/modelDecodeProtocol-wDB7ksYw.js +56 -0
  7. package/dist/plugins/u-manager/index.cjs +1 -1
  8. package/dist/plugins/u-manager/index.js +73 -53
  9. package/dist/src/loaders/ModelDecodeWorkerClient.d.ts +31 -0
  10. package/dist/src/loaders/ModelLoaderManager.d.ts +15 -2
  11. package/dist/src/loaders/buildDecodedGltfModel.d.ts +4 -0
  12. package/dist/src/loaders/index.d.ts +1 -0
  13. package/dist/src/objects/Model.d.ts +1 -0
  14. package/dist/src/worker/decodeGltfModel.d.ts +10 -0
  15. package/dist/src/worker/getTransferables.d.ts +1 -0
  16. package/dist/src/worker/index.d.ts +1 -0
  17. package/dist/src/worker/installWorkerImageLoader.d.ts +3 -0
  18. package/dist/src/worker/model-decoder.d.ts +13 -0
  19. package/dist/src/worker/modelDecodeProtocol.d.ts +205 -0
  20. package/dist/src/worker/workerImageUtils.d.ts +8 -0
  21. package/dist/worker/index.cjs +1 -1
  22. package/dist/worker/index.js +8 -6
  23. package/dist/worker/model-decoder.cjs +1 -0
  24. package/dist/worker/model-decoder.js +339 -0
  25. package/dist/worker/runtime.cjs +1 -1
  26. package/dist/worker/runtime.js +202 -208
  27. package/dist/workerImageUtils-lmOMyTQN.cjs +1 -0
  28. package/dist/workerImageUtils-mQD3TQ1N.js +105 -0
  29. package/docs/api-effects.md +66 -2
  30. package/docs/api-viewer.md +45 -1
  31. package/docs/changelog.md +26 -0
  32. package/docs/examples-guide.md +31 -11
  33. package/docs/getting-started.md +97 -93
  34. package/docs/index.md +2 -2
  35. package/docs/mcp.md +16 -3
  36. package/docs/release.md +5 -3
  37. package/package.json +9 -1
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("../protocol-IUAzx0lk.cjs"),D=require("../Viewer-BKNV67Jj.cjs"),M=require("three/webgpu"),x=new WeakMap;class b{type;timeStamp=performance.now();target;currentTarget;cancelable=!0;bubbles=!0;defaultPrevented=!1;cancelBubble=!1;immediatePropagationStopped=!1;pointerId=0;pointerType="mouse";button=0;buttons=0;altKey=!1;ctrlKey=!1;metaKey=!1;shiftKey=!1;movementX=0;movementY=0;clientX=0;clientY=0;offsetX=0;offsetY=0;pageX=0;pageY=0;screenX=0;screenY=0;deltaX=0;deltaY=0;deltaZ=0;deltaMode=0;constructor(e,t){this.type=e.type,this.target=t,this.currentTarget=t;for(const[r,a]of Object.entries(e))r!=="type"&&a!==void 0&&Reflect.set(this,r,a)}preventDefault(){this.defaultPrevented=!0}stopPropagation(){this.cancelBubble=!0}stopImmediatePropagation(){this.cancelBubble=!0,this.immediatePropagationStopped=!0}composedPath(){return[this.target]}}class y{style={cssText:""};innerText="";textContent="";className="";parentElement=null;children=[];appendChild(e){return this.children.push(e),e instanceof y&&(e.parentElement=this),e}removeChild(e){const t=this.children.indexOf(e);return t>=0&&this.children.splice(t,1),e instanceof y&&(e.parentElement=null),e}remove(){this.parentElement?.removeChild(this)}setAttribute(){}addEventListener(){}removeEventListener(){}getContext(){return null}}function A(s){const e=t=>t.toLowerCase()==="canvas"?new OffscreenCanvas(1,1):new y;return{body:s,documentElement:s,pointerLockElement:null,visibilityState:"visible",createElement:e,createElementNS:(t,r)=>e(r),addEventListener:s.addEventListener.bind(s),removeEventListener:s.removeEventListener.bind(s),exitPointerLock(){}}}function c(s,e,t){Object.defineProperty(s,e,{configurable:!0,value:t})}function v(s,e,t){Object.defineProperty(s,e,{configurable:!0,get:t})}function O(s,e){const t={size:{...e},listeners:new Map,listenerWrappers:new WeakMap};x.set(s,t);const r=s,a={cssText:"",position:"relative",touchAction:"none",width:`${e.width}px`,height:`${e.height}px`},l=(i,p)=>{if(!p)return;let d;typeof p=="function"?d=p:(d=t.listenerWrappers.get(p)??(T=>p.handleEvent(T)),t.listenerWrappers.set(p,d));let h=t.listeners.get(i);h||(h=new Set,t.listeners.set(i,h)),h.add(d)},u=(i,p)=>{if(!p)return;const d=t.listeners.get(i);if(d)if(typeof p=="function")d.delete(p);else{const h=t.listenerWrappers.get(p);h&&d.delete(h)}};c(r,"style",a),c(r,"addEventListener",l),c(r,"removeEventListener",u),c(r,"appendChild",i=>i),c(r,"removeChild",i=>i),c(r,"setAttribute",()=>{}),c(r,"removeAttribute",()=>{}),c(r,"setPointerCapture",()=>{}),c(r,"releasePointerCapture",()=>{}),c(r,"hasPointerCapture",()=>!1),c(r,"requestPointerLock",()=>Promise.resolve()),c(r,"focus",()=>{}),c(r,"remove",()=>{}),v(r,"clientWidth",()=>t.size.width),v(r,"clientHeight",()=>t.size.height),v(r,"offsetWidth",()=>t.size.width),v(r,"offsetHeight",()=>t.size.height),v(r,"offsetTop",()=>t.size.top),v(r,"offsetLeft",()=>t.size.left),v(r,"clientTop",()=>t.size.top),v(r,"clientLeft",()=>t.size.left),v(r,"pageXOffset",()=>t.size.left),v(r,"pageYOffset",()=>t.size.top),v(r,"parentElement",()=>r),c(r,"getBoundingClientRect",()=>{const{width:i,height:p,top:d,left:h}=t.size;return{width:i,height:p,top:d,left:h,right:h+i,bottom:d+p,x:h,y:d,toJSON:()=>({width:i,height:p,top:d,left:h})}});const f=A(r);return c(r,"ownerDocument",f),c(r,"documentElement",r),c(r,"devicePixelRatio",e.pixelRatio),V(r,f),r}function F(s,e){const t=x.get(s);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");t.size={...e},s.style.width=`${e.width}px`,s.style.height=`${e.height}px`,c(s,"devicePixelRatio",e.pixelRatio)}function I(s,e){const t=x.get(s);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");const r=new b(e,s),a=[...t.listeners.get(e.type)??[]];for(const l of a)if(l(r),r.immediatePropagationStopped)break;return r}function V(s,e){const t=globalThis;t.window=s,t.document=e,t.getComputedStyle=()=>({position:"relative"}),t.PointerEvent=b,t.MouseEvent=b,t.WheelEvent=b,t.Image=y}const z=new Map;let P=!1;function $(){P||(P=!0,M.ImageLoader.prototype.load=function(e,t,r,a){let l=e;this.path!==void 0&&(l=this.path+l),l=this.manager.resolveURL(l);const u=M.Cache.get(`image:${l}`);if(this.manager.itemStart(l),u)return queueMicrotask(()=>{t?.(u),this.manager.itemEnd(l)}),u;let f=z.get(l);return f||(f=fetch(l).then(i=>{if(!i.ok)throw new Error(`Failed to load image ${l}: ${i.status} ${i.statusText}`);return i.blob()}).then(i=>createImageBitmap(i,{colorSpaceConversion:"none",premultiplyAlpha:"none"})).then(i=>(M.Cache.add(`image:${l}`,i),i)).finally(()=>z.delete(l)),z.set(l,f)),f.then(i=>{t?.(i),this.manager.itemEnd(l)}).catch(i=>{a?.(i),this.manager.itemError(l),this.manager.itemEnd(l)}),{}})}const B=1e3,j=100,_=25;class U{windowMs;idleResetMs;missedFrameThresholdMs;#e=[];#t=null;constructor(e={}){this.windowMs=e.windowMs??B,this.idleResetMs=e.idleResetMs??j,this.missedFrameThresholdMs=e.missedFrameThresholdMs??_}add(e,t=performance.now()){return!Number.isFinite(e)||e<=0||!Number.isFinite(t)?this.snapshot(t):(this.#t!==null&&t-this.#t>=this.idleResetMs&&(this.#e.length=0),this.#t=t,e<this.idleResetMs&&this.#e.push({at:t,duration:e}),this.snapshot(t))}snapshot(e=performance.now()){this.#r(e);const t=this.#e.map(({duration:f})=>f);if(t.length===0)return{samples:0,fps:0,average:0,p95:0,max:0,missedFramePercent:0};const r=[...t].sort((f,i)=>f-i),a=t.reduce((f,i)=>f+i,0)/t.length,l=Math.max(0,Math.ceil(r.length*.95)-1),u=t.filter(f=>f>this.missedFrameThresholdMs).length;return{samples:t.length,fps:1e3/a,average:a,p95:r[l],max:r[r.length-1],missedFramePercent:u/t.length*100}}reset(){this.#e.length=0,this.#t=null}#r(e){const t=e-this.windowMs;for(;this.#e.length>0&&this.#e[0].at<t;)this.#e.shift()}}function C(s,e){const{render:t}=s.renderer.info;return{drawCalls:t.drawCalls,frameCalls:t.frameCalls,triangles:t.triangles,points:t.points,lines:t.lines,frameTime:e.average,frameTiming:e}}function q(){const s=globalThis,e={viewer:null,canvas:null,domTarget:null,initialized:!1,disposed:!1,ready:!1,lastStatsAt:0},t=new Map,r=new Set,a=new WeakSet;let l=()=>{},u=()=>{};const f=new Promise((n,o)=>{l=n,u=o}),i=(n,o)=>{e.disposed&&n.type!=="disposed"||s.postMessage(n,o)},p=n=>{if(n&&typeof n=="object"){if(a.has(n))return;a.add(n)}i({type:"error",error:E.serializeError(n)})},d=(n,o)=>{if(t.has(n))throw new Error(`Worker viewer command already exists: ${n}`);return t.set(n,o),()=>{t.get(n)===o&&t.delete(n)}},h=async n=>{if(e.initialized||e.viewer)throw new Error("The Worker viewer has already initialized.");if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(!s.navigator.gpu)throw new Error("WebGPU is not exposed in this Worker. Use a current Chromium browser or the main-thread Viewer.");$(),e.canvas=n.canvas,e.domTarget=O(n.canvas,n.size);const o=new D.Viewer({el:e.domTarget,pixelRatio:n.size.pixelRatio,rendererOptions:{canvas:n.canvas,forceWebGL:!1}});e.viewer=o;const m=new U;o.addEventListener("afterRender",({delta:w})=>{const g=performance.now(),R=m.add(w*1e3,g);g-e.lastStatsAt<250||(e.lastStatsAt=g,i({type:"stats",stats:C(o,R)}))}),d("getStats",()=>C(o,m.snapshot())),d("getViewpoint",()=>o.controls.getCameraViewpoint()),d("setViewpoint",async w=>{const g=w;return await o.controls.setCameraViewpoint(g.viewpoint,g.enableTransition??!0),o.controls.getCameraViewpoint()}),d("render",async()=>(await o.render(),C(o,m.snapshot())));const W={viewer:o,get canvas(){return n.canvas},status(w){i({type:"status",message:w})},emit(w,g){i({type:"event",eventType:w,detail:g})},registerCommand:d,onDispose(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");return r.add(w),()=>r.delete(w)},ready(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(e.ready)throw new Error("The Worker viewer is already ready.");i({type:"ready",detail:w}),e.ready=!0}};if(await o.init(),e.disposed)throw new Error("The Worker viewer was disposed during initialization.");e.initialized=!0,i({type:"initialized"}),l(W)},T=n=>{!e.viewer||!e.domTarget||(F(e.domTarget,n.size),e.viewer.renderer.setPixelRatio(n.size.pixelRatio),e.viewer.onWindowResize())},S=async n=>{try{if(!e.initialized)throw new Error("The Worker viewer has not initialized.");const o=t.get(n.command);if(!o)throw new Error(`Unknown Worker viewer command: ${n.command}`);const m=await o(n.payload),W=m instanceof ArrayBuffer?[m]:X(m);i({type:"response",id:n.id,result:m},W)}catch(o){i({type:"response",id:n.id,error:E.serializeError(o)})}},L=async()=>{if(e.disposed)return;e.disposed=!0;const n=[];for(const o of[...r].reverse())try{await o()}catch(m){n.push(m)}r.clear();try{e.viewer?.dispose()}catch(o){n.push(o)}e.viewer=null,e.canvas=null,e.domTarget=null,e.initialized||u(new Error("The Worker viewer was disposed before initialization."));for(const o of n)s.postMessage({type:"error",error:E.serializeError(o)});s.postMessage({type:"disposed"}),s.close()},k=n=>{p(n),e.ready||L()};return s.addEventListener("error",n=>{k(n.error??new Error(n.message)),n.preventDefault()}),s.addEventListener("unhandledrejection",n=>{k(n.reason),n.preventDefault()}),s.addEventListener("message",n=>{const o=n.data;o.type==="init"?h(o).catch(m=>{u(m),k(m)}):o.type==="resize"?T(o):o.type==="dom-event"?e.domTarget&&I(e.domTarget,o.event):o.type==="request"?S(o):o.type==="dispose"&&L()}),f}function X(s){const e=new Set,t=new WeakSet,r=a=>{if(!(!a||typeof a!="object")){if(a instanceof ArrayBuffer){e.add(a);return}if(ArrayBuffer.isView(a)){a.buffer instanceof ArrayBuffer&&e.add(a.buffer);return}if(!t.has(a)){if(t.add(a),a instanceof Map){a.forEach((l,u)=>{r(u),r(l)});return}if(a instanceof Set){a.forEach(r);return}Object.values(a).forEach(r)}}};return r(s),[...e]}exports.serializeError=E.serializeError;exports.createWorkerViewer=q;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("../protocol-IUAzx0lk.cjs"),F=require("../Viewer-BKNV67Jj.cjs"),E=require("three/webgpu"),S=require("../workerImageUtils-lmOMyTQN.cjs"),O=require("../getTransferables-C97JPUVf.cjs"),L=new WeakMap;class W{type;timeStamp=performance.now();target;currentTarget;cancelable=!0;bubbles=!0;defaultPrevented=!1;cancelBubble=!1;immediatePropagationStopped=!1;pointerId=0;pointerType="mouse";button=0;buttons=0;altKey=!1;ctrlKey=!1;metaKey=!1;shiftKey=!1;movementX=0;movementY=0;clientX=0;clientY=0;offsetX=0;offsetY=0;pageX=0;pageY=0;screenX=0;screenY=0;deltaX=0;deltaY=0;deltaZ=0;deltaMode=0;constructor(e,t){this.type=e.type,this.target=t,this.currentTarget=t;for(const[r,f]of Object.entries(e))r!=="type"&&f!==void 0&&Reflect.set(this,r,f)}preventDefault(){this.defaultPrevented=!0}stopPropagation(){this.cancelBubble=!0}stopImmediatePropagation(){this.cancelBubble=!0,this.immediatePropagationStopped=!0}composedPath(){return[this.target]}}class T{style={cssText:""};innerText="";textContent="";className="";parentElement=null;children=[];appendChild(e){return this.children.push(e),e instanceof T&&(e.parentElement=this),e}removeChild(e){const t=this.children.indexOf(e);return t>=0&&this.children.splice(t,1),e instanceof T&&(e.parentElement=null),e}remove(){this.parentElement?.removeChild(this)}setAttribute(){}addEventListener(){}removeEventListener(){}getContext(){return null}}function I(o){const e=t=>t.toLowerCase()==="canvas"?new OffscreenCanvas(1,1):new T;return{body:o,documentElement:o,pointerLockElement:null,visibilityState:"visible",createElement:e,createElementNS:(t,r)=>e(r),addEventListener:o.addEventListener.bind(o),removeEventListener:o.removeEventListener.bind(o),exitPointerLock(){}}}function p(o,e,t){Object.defineProperty(o,e,{configurable:!0,value:t})}function v(o,e,t){Object.defineProperty(o,e,{configurable:!0,get:t})}function A(o,e){const t={size:{...e},listeners:new Map,listenerWrappers:new WeakMap};L.set(o,t);const r=o,f={cssText:"",position:"relative",touchAction:"none",width:`${e.width}px`,height:`${e.height}px`},n=(a,d)=>{if(!d)return;let l;typeof d=="function"?l=d:(l=t.listenerWrappers.get(d)??(b=>d.handleEvent(b)),t.listenerWrappers.set(d,l));let u=t.listeners.get(a);u||(u=new Set,t.listeners.set(a,u)),u.add(l)},m=(a,d)=>{if(!d)return;const l=t.listeners.get(a);if(l)if(typeof d=="function")l.delete(d);else{const u=t.listenerWrappers.get(d);u&&l.delete(u)}};p(r,"style",f),p(r,"addEventListener",n),p(r,"removeEventListener",m),p(r,"appendChild",a=>a),p(r,"removeChild",a=>a),p(r,"setAttribute",()=>{}),p(r,"removeAttribute",()=>{}),p(r,"setPointerCapture",()=>{}),p(r,"releasePointerCapture",()=>{}),p(r,"hasPointerCapture",()=>!1),p(r,"requestPointerLock",()=>Promise.resolve()),p(r,"focus",()=>{}),p(r,"remove",()=>{}),v(r,"clientWidth",()=>t.size.width),v(r,"clientHeight",()=>t.size.height),v(r,"offsetWidth",()=>t.size.width),v(r,"offsetHeight",()=>t.size.height),v(r,"offsetTop",()=>t.size.top),v(r,"offsetLeft",()=>t.size.left),v(r,"clientTop",()=>t.size.top),v(r,"clientLeft",()=>t.size.left),v(r,"pageXOffset",()=>t.size.left),v(r,"pageYOffset",()=>t.size.top),v(r,"parentElement",()=>r),p(r,"getBoundingClientRect",()=>{const{width:a,height:d,top:l,left:u}=t.size;return{width:a,height:d,top:l,left:u,right:u+a,bottom:l+d,x:u,y:l,toJSON:()=>({width:a,height:d,top:l,left:u})}});const c=I(r);return p(r,"ownerDocument",c),p(r,"documentElement",r),p(r,"devicePixelRatio",e.pixelRatio),_(r,c),r}function $(o,e){const t=L.get(o);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");t.size={...e},o.style.width=`${e.width}px`,o.style.height=`${e.height}px`,p(o,"devicePixelRatio",e.pixelRatio)}function V(o,e){const t=L.get(o);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");const r=new W(e,o),f=[...t.listeners.get(e.type)??[]];for(const n of f)if(n(r),r.immediatePropagationStopped)break;return r}function _(o,e){const t=globalThis;t.window=o,t.document=e,t.getComputedStyle=()=>({position:"relative"}),t.PointerEvent=W,t.MouseEvent=W,t.WheelEvent=W,t.Image=T}const z=new Map;let R=!1;function q(){R||(R=!0,E.ImageLoader.prototype.load=function(e,t,r,f){let n=e;this.path!==void 0&&(n=this.path+n),n=this.manager.resolveURL(n);const m=E.Cache.get(`image:${n}`);if(this.manager.itemStart(n),m)return queueMicrotask(()=>{t?.(m),this.manager.itemEnd(n)}),m;let c=z.get(n);return c||(c=fetch(n).then(a=>{if(!a.ok)throw new Error(`Failed to load image ${n}: ${a.status} ${a.statusText}`);return a.blob()}).then(S.createWorkerImageBitmap).then(a=>(E.Cache.add(`image:${n}`,a),a)).finally(()=>z.delete(n)),z.set(n,c)),c.then(a=>{t?.(a),this.manager.itemEnd(n)}).catch(a=>{f?.(a),this.manager.itemError(n),this.manager.itemEnd(n)}),{}},E.ImageBitmapLoader.prototype.load=function(e,t,r,f){let n=e??"";this.path!==void 0&&(n=this.path+n),n=this.manager.resolveURL(n);const m=`image-bitmap:${n}`,c=E.Cache.get(m);if(this.manager.itemStart(n),c){Promise.resolve(c).then(h=>{t?.(h),this.manager.itemEnd(n)}).catch(h=>{f?.(h),this.manager.itemError(n),this.manager.itemEnd(n)});return}const d=this._abortController?.signal,l=this.manager.abortController.signal,u=d&&typeof AbortSignal.any=="function"?AbortSignal.any([d,l]):d??l,b=fetch(n,{credentials:this.crossOrigin==="anonymous"?"same-origin":"include",headers:this.requestHeader,signal:u}).then(h=>{if(!h.ok)throw new Error(`Failed to load image ${n}: ${h.status} ${h.statusText}`);return h.blob()}).then(h=>S.createWorkerImageBitmap(h,this.options)).then(h=>(E.Cache.add(m,h),h));E.Cache.add(m,b),b.then(h=>{t?.(h),this.manager.itemEnd(n)}).catch(h=>{E.Cache.remove(m),f?.(h),this.manager.itemError(n),this.manager.itemEnd(n)})})}const B=1e3,U=100,j=25;class X{windowMs;idleResetMs;missedFrameThresholdMs;#e=[];#t=null;constructor(e={}){this.windowMs=e.windowMs??B,this.idleResetMs=e.idleResetMs??U,this.missedFrameThresholdMs=e.missedFrameThresholdMs??j}add(e,t=performance.now()){return!Number.isFinite(e)||e<=0||!Number.isFinite(t)?this.snapshot(t):(this.#t!==null&&t-this.#t>=this.idleResetMs&&(this.#e.length=0),this.#t=t,e<this.idleResetMs&&this.#e.push({at:t,duration:e}),this.snapshot(t))}snapshot(e=performance.now()){this.#r(e);const t=this.#e.map(({duration:c})=>c);if(t.length===0)return{samples:0,fps:0,average:0,p95:0,max:0,missedFramePercent:0};const r=[...t].sort((c,a)=>c-a),f=t.reduce((c,a)=>c+a,0)/t.length,n=Math.max(0,Math.ceil(r.length*.95)-1),m=t.filter(c=>c>this.missedFrameThresholdMs).length;return{samples:t.length,fps:1e3/f,average:f,p95:r[n],max:r[r.length-1],missedFramePercent:m/t.length*100}}reset(){this.#e.length=0,this.#t=null}#r(e){const t=e-this.windowMs;for(;this.#e.length>0&&this.#e[0].at<t;)this.#e.shift()}}function x(o,e){const{render:t}=o.renderer.info;return{drawCalls:t.drawCalls,frameCalls:t.frameCalls,triangles:t.triangles,points:t.points,lines:t.lines,frameTime:e.average,frameTiming:e}}function Y(){const o=globalThis,e={viewer:null,canvas:null,domTarget:null,initialized:!1,disposed:!1,ready:!1,lastStatsAt:0},t=new Map,r=new Set,f=new WeakSet;let n=()=>{},m=()=>{};const c=new Promise((i,s)=>{n=i,m=s}),a=(i,s)=>{e.disposed&&i.type!=="disposed"||o.postMessage(i,s)},d=i=>{if(i&&typeof i=="object"){if(f.has(i))return;f.add(i)}a({type:"error",error:k.serializeError(i)})},l=(i,s)=>{if(t.has(i))throw new Error(`Worker viewer command already exists: ${i}`);return t.set(i,s),()=>{t.get(i)===s&&t.delete(i)}},u=async i=>{if(e.initialized||e.viewer)throw new Error("The Worker viewer has already initialized.");if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(!o.navigator.gpu)throw new Error("WebGPU is not exposed in this Worker. Use a current Chromium browser or the main-thread Viewer.");q(),e.canvas=i.canvas,e.domTarget=A(i.canvas,i.size);const s=new F.Viewer({el:e.domTarget,pixelRatio:i.size.pixelRatio,rendererOptions:{canvas:i.canvas,forceWebGL:!1}});e.viewer=s;const g=new X;s.addEventListener("afterRender",({delta:w})=>{const y=performance.now(),D=g.add(w*1e3,y);y-e.lastStatsAt<250||(e.lastStatsAt=y,a({type:"stats",stats:x(s,D)}))}),l("getStats",()=>x(s,g.snapshot())),l("getViewpoint",()=>s.controls.getCameraViewpoint()),l("setViewpoint",async w=>{const y=w;return await s.controls.setCameraViewpoint(y.viewpoint,y.enableTransition??!0),s.controls.getCameraViewpoint()}),l("render",async()=>(await s.render(),x(s,g.snapshot())));const M={viewer:s,get canvas(){return i.canvas},status(w){a({type:"status",message:w})},emit(w,y){a({type:"event",eventType:w,detail:y})},registerCommand:l,onDispose(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");return r.add(w),()=>r.delete(w)},ready(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(e.ready)throw new Error("The Worker viewer is already ready.");a({type:"ready",detail:w}),e.ready=!0}};if(await s.init(),e.disposed)throw new Error("The Worker viewer was disposed during initialization.");e.initialized=!0,a({type:"initialized"}),n(M)},b=i=>{!e.viewer||!e.domTarget||($(e.domTarget,i.size),e.viewer.renderer.setPixelRatio(i.size.pixelRatio),e.viewer.onWindowResize())},h=async i=>{try{if(!e.initialized)throw new Error("The Worker viewer has not initialized.");const s=t.get(i.command);if(!s)throw new Error(`Unknown Worker viewer command: ${i.command}`);const g=await s(i.payload),M=g instanceof ArrayBuffer?[g]:O.getTransferables(g);a({type:"response",id:i.id,result:g},M)}catch(s){a({type:"response",id:i.id,error:k.serializeError(s)})}},P=async()=>{if(e.disposed)return;e.disposed=!0;const i=[];for(const s of[...r].reverse())try{await s()}catch(g){i.push(g)}r.clear();try{e.viewer?.dispose()}catch(s){i.push(s)}e.viewer=null,e.canvas=null,e.domTarget=null,e.initialized||m(new Error("The Worker viewer was disposed before initialization."));for(const s of i)o.postMessage({type:"error",error:k.serializeError(s)});o.postMessage({type:"disposed"}),o.close()},C=i=>{d(i),e.ready||P()};return o.addEventListener("error",i=>{C(i.error??new Error(i.message)),i.preventDefault()}),o.addEventListener("unhandledrejection",i=>{C(i.reason),i.preventDefault()}),o.addEventListener("message",i=>{const s=i.data;s.type==="init"?u(s).catch(g=>{m(g),C(g)}):s.type==="resize"?b(s):s.type==="dom-event"?e.domTarget&&V(e.domTarget,s.event):s.type==="request"?h(s):s.type==="dispose"&&P()}),c}exports.serializeError=k.serializeError;exports.createWorkerViewer=Y;
@@ -1,8 +1,10 @@
1
- import { s as W } from "../protocol-C-OMPz15.js";
2
- import { V as D } from "../Viewer-Cs_y7IiH.js";
3
- import { ImageLoader as A, Cache as z } from "three/webgpu";
4
- const C = /* @__PURE__ */ new WeakMap();
5
- class E {
1
+ import { s as x } from "../protocol-C-OMPz15.js";
2
+ import { V as F } from "../Viewer-Cs_y7IiH.js";
3
+ import { ImageLoader as O, Cache as b, ImageBitmapLoader as A } from "three/webgpu";
4
+ import { c as S } from "../workerImageUtils-mQD3TQ1N.js";
5
+ import { g as $ } from "../getTransferables-DrzSmiCR.js";
6
+ const P = /* @__PURE__ */ new WeakMap();
7
+ class k {
6
8
  type;
7
9
  timeStamp = performance.now();
8
10
  target;
@@ -36,8 +38,8 @@ class E {
36
38
  deltaMode = 0;
37
39
  constructor(e, t) {
38
40
  this.type = e.type, this.target = t, this.currentTarget = t;
39
- for (const [r, a] of Object.entries(e))
40
- r !== "type" && a !== void 0 && Reflect.set(this, r, a);
41
+ for (const [r, m] of Object.entries(e))
42
+ r !== "type" && m !== void 0 && Reflect.set(this, r, m);
41
43
  }
42
44
  preventDefault() {
43
45
  this.defaultPrevented = !0;
@@ -52,7 +54,7 @@ class E {
52
54
  return [this.target];
53
55
  }
54
56
  }
55
- class y {
57
+ class T {
56
58
  style = { cssText: "" };
57
59
  innerText = "";
58
60
  textContent = "";
@@ -60,11 +62,11 @@ class y {
60
62
  parentElement = null;
61
63
  children = [];
62
64
  appendChild(e) {
63
- return this.children.push(e), e instanceof y && (e.parentElement = this), e;
65
+ return this.children.push(e), e instanceof T && (e.parentElement = this), e;
64
66
  }
65
67
  removeChild(e) {
66
68
  const t = this.children.indexOf(e);
67
- return t >= 0 && this.children.splice(t, 1), e instanceof y && (e.parentElement = null), e;
69
+ return t >= 0 && this.children.splice(t, 1), e instanceof T && (e.parentElement = null), e;
68
70
  }
69
71
  remove() {
70
72
  this.parentElement?.removeChild(this);
@@ -79,146 +81,166 @@ class y {
79
81
  return null;
80
82
  }
81
83
  }
82
- function F(s) {
83
- const e = (t) => t.toLowerCase() === "canvas" ? new OffscreenCanvas(1, 1) : new y();
84
+ function I(o) {
85
+ const e = (t) => t.toLowerCase() === "canvas" ? new OffscreenCanvas(1, 1) : new T();
84
86
  return {
85
- body: s,
86
- documentElement: s,
87
+ body: o,
88
+ documentElement: o,
87
89
  pointerLockElement: null,
88
90
  visibilityState: "visible",
89
91
  createElement: e,
90
92
  createElementNS: (t, r) => e(r),
91
- addEventListener: s.addEventListener.bind(s),
92
- removeEventListener: s.removeEventListener.bind(s),
93
+ addEventListener: o.addEventListener.bind(o),
94
+ removeEventListener: o.removeEventListener.bind(o),
93
95
  exitPointerLock() {
94
96
  }
95
97
  };
96
98
  }
97
- function c(s, e, t) {
98
- Object.defineProperty(s, e, {
99
+ function p(o, e, t) {
100
+ Object.defineProperty(o, e, {
99
101
  configurable: !0,
100
102
  value: t
101
103
  });
102
104
  }
103
- function v(s, e, t) {
104
- Object.defineProperty(s, e, {
105
+ function v(o, e, t) {
106
+ Object.defineProperty(o, e, {
105
107
  configurable: !0,
106
108
  get: t
107
109
  });
108
110
  }
109
- function O(s, e) {
111
+ function _(o, e) {
110
112
  const t = {
111
113
  size: { ...e },
112
114
  listeners: /* @__PURE__ */ new Map(),
113
115
  listenerWrappers: /* @__PURE__ */ new WeakMap()
114
116
  };
115
- C.set(s, t);
116
- const r = s, a = {
117
+ P.set(o, t);
118
+ const r = o, m = {
117
119
  cssText: "",
118
120
  position: "relative",
119
121
  touchAction: "none",
120
122
  width: `${e.width}px`,
121
123
  height: `${e.height}px`
122
- }, l = (i, p) => {
123
- if (!p) return;
124
- let d;
125
- typeof p == "function" ? d = p : (d = t.listenerWrappers.get(p) ?? ((b) => p.handleEvent(b)), t.listenerWrappers.set(p, d));
126
- let h = t.listeners.get(i);
127
- h || (h = /* @__PURE__ */ new Set(), t.listeners.set(i, h)), h.add(d);
128
- }, u = (i, p) => {
129
- if (!p) return;
130
- const d = t.listeners.get(i);
131
- if (d)
132
- if (typeof p == "function")
133
- d.delete(p);
124
+ }, n = (a, d) => {
125
+ if (!d) return;
126
+ let l;
127
+ typeof d == "function" ? l = d : (l = t.listenerWrappers.get(d) ?? ((E) => d.handleEvent(E)), t.listenerWrappers.set(d, l));
128
+ let u = t.listeners.get(a);
129
+ u || (u = /* @__PURE__ */ new Set(), t.listeners.set(a, u)), u.add(l);
130
+ }, f = (a, d) => {
131
+ if (!d) return;
132
+ const l = t.listeners.get(a);
133
+ if (l)
134
+ if (typeof d == "function")
135
+ l.delete(d);
134
136
  else {
135
- const h = t.listenerWrappers.get(p);
136
- h && d.delete(h);
137
+ const u = t.listenerWrappers.get(d);
138
+ u && l.delete(u);
137
139
  }
138
140
  };
139
- c(r, "style", a), c(r, "addEventListener", l), c(r, "removeEventListener", u), c(r, "appendChild", (i) => i), c(r, "removeChild", (i) => i), c(r, "setAttribute", () => {
140
- }), c(r, "removeAttribute", () => {
141
- }), c(r, "setPointerCapture", () => {
142
- }), c(r, "releasePointerCapture", () => {
143
- }), c(r, "hasPointerCapture", () => !1), c(r, "requestPointerLock", () => Promise.resolve()), c(r, "focus", () => {
144
- }), c(r, "remove", () => {
145
- }), v(r, "clientWidth", () => t.size.width), v(r, "clientHeight", () => t.size.height), v(r, "offsetWidth", () => t.size.width), v(r, "offsetHeight", () => t.size.height), v(r, "offsetTop", () => t.size.top), v(r, "offsetLeft", () => t.size.left), v(r, "clientTop", () => t.size.top), v(r, "clientLeft", () => t.size.left), v(r, "pageXOffset", () => t.size.left), v(r, "pageYOffset", () => t.size.top), v(r, "parentElement", () => r), c(r, "getBoundingClientRect", () => {
146
- const { width: i, height: p, top: d, left: h } = t.size;
141
+ p(r, "style", m), p(r, "addEventListener", n), p(r, "removeEventListener", f), p(r, "appendChild", (a) => a), p(r, "removeChild", (a) => a), p(r, "setAttribute", () => {
142
+ }), p(r, "removeAttribute", () => {
143
+ }), p(r, "setPointerCapture", () => {
144
+ }), p(r, "releasePointerCapture", () => {
145
+ }), p(r, "hasPointerCapture", () => !1), p(r, "requestPointerLock", () => Promise.resolve()), p(r, "focus", () => {
146
+ }), p(r, "remove", () => {
147
+ }), v(r, "clientWidth", () => t.size.width), v(r, "clientHeight", () => t.size.height), v(r, "offsetWidth", () => t.size.width), v(r, "offsetHeight", () => t.size.height), v(r, "offsetTop", () => t.size.top), v(r, "offsetLeft", () => t.size.left), v(r, "clientTop", () => t.size.top), v(r, "clientLeft", () => t.size.left), v(r, "pageXOffset", () => t.size.left), v(r, "pageYOffset", () => t.size.top), v(r, "parentElement", () => r), p(r, "getBoundingClientRect", () => {
148
+ const { width: a, height: d, top: l, left: u } = t.size;
147
149
  return {
148
- width: i,
149
- height: p,
150
- top: d,
151
- left: h,
152
- right: h + i,
153
- bottom: d + p,
154
- x: h,
155
- y: d,
156
- toJSON: () => ({ width: i, height: p, top: d, left: h })
150
+ width: a,
151
+ height: d,
152
+ top: l,
153
+ left: u,
154
+ right: u + a,
155
+ bottom: l + d,
156
+ x: u,
157
+ y: l,
158
+ toJSON: () => ({ width: a, height: d, top: l, left: u })
157
159
  };
158
160
  });
159
- const f = F(r);
160
- return c(r, "ownerDocument", f), c(r, "documentElement", r), c(r, "devicePixelRatio", e.pixelRatio), $(r, f), r;
161
+ const c = I(r);
162
+ return p(r, "ownerDocument", c), p(r, "documentElement", r), p(r, "devicePixelRatio", e.pixelRatio), U(r, c), r;
161
163
  }
162
- function I(s, e) {
163
- const t = C.get(s);
164
+ function V(o, e) {
165
+ const t = P.get(o);
164
166
  if (!t) throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");
165
- t.size = { ...e }, s.style.width = `${e.width}px`, s.style.height = `${e.height}px`, c(s, "devicePixelRatio", e.pixelRatio);
167
+ t.size = { ...e }, o.style.width = `${e.width}px`, o.style.height = `${e.height}px`, p(o, "devicePixelRatio", e.pixelRatio);
166
168
  }
167
- function V(s, e) {
168
- const t = C.get(s);
169
+ function B(o, e) {
170
+ const t = P.get(o);
169
171
  if (!t) throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");
170
- const r = new E(e, s), a = [...t.listeners.get(e.type) ?? []];
171
- for (const l of a)
172
- if (l(r), r.immediatePropagationStopped) break;
172
+ const r = new k(e, o), m = [...t.listeners.get(e.type) ?? []];
173
+ for (const n of m)
174
+ if (n(r), r.immediatePropagationStopped) break;
173
175
  return r;
174
176
  }
175
- function $(s, e) {
177
+ function U(o, e) {
176
178
  const t = globalThis;
177
- t.window = s, t.document = e, t.getComputedStyle = () => ({ position: "relative" }), t.PointerEvent = E, t.MouseEvent = E, t.WheelEvent = E, t.Image = y;
179
+ t.window = o, t.document = e, t.getComputedStyle = () => ({ position: "relative" }), t.PointerEvent = k, t.MouseEvent = k, t.WheelEvent = k, t.Image = T;
178
180
  }
179
- const M = /* @__PURE__ */ new Map();
180
- let P = !1;
181
- function B() {
182
- P || (P = !0, A.prototype.load = function(e, t, r, a) {
183
- let l = e;
184
- this.path !== void 0 && (l = this.path + l), l = this.manager.resolveURL(l);
185
- const u = z.get(`image:${l}`);
186
- if (this.manager.itemStart(l), u)
181
+ const C = /* @__PURE__ */ new Map();
182
+ let R = !1;
183
+ function X() {
184
+ R || (R = !0, O.prototype.load = function(e, t, r, m) {
185
+ let n = e;
186
+ this.path !== void 0 && (n = this.path + n), n = this.manager.resolveURL(n);
187
+ const f = b.get(`image:${n}`);
188
+ if (this.manager.itemStart(n), f)
187
189
  return queueMicrotask(() => {
188
- t?.(u), this.manager.itemEnd(l);
189
- }), u;
190
- let f = M.get(l);
191
- return f || (f = fetch(l).then((i) => {
192
- if (!i.ok) throw new Error(`Failed to load image ${l}: ${i.status} ${i.statusText}`);
193
- return i.blob();
194
- }).then(
195
- (i) => createImageBitmap(i, {
196
- colorSpaceConversion: "none",
197
- premultiplyAlpha: "none"
198
- })
199
- ).then((i) => (z.add(`image:${l}`, i), i)).finally(() => M.delete(l)), M.set(l, f)), f.then((i) => {
200
- t?.(i), this.manager.itemEnd(l);
201
- }).catch((i) => {
202
- a?.(i), this.manager.itemError(l), this.manager.itemEnd(l);
190
+ t?.(f), this.manager.itemEnd(n);
191
+ }), f;
192
+ let c = C.get(n);
193
+ return c || (c = fetch(n).then((a) => {
194
+ if (!a.ok) throw new Error(`Failed to load image ${n}: ${a.status} ${a.statusText}`);
195
+ return a.blob();
196
+ }).then(S).then((a) => (b.add(`image:${n}`, a), a)).finally(() => C.delete(n)), C.set(n, c)), c.then((a) => {
197
+ t?.(a), this.manager.itemEnd(n);
198
+ }).catch((a) => {
199
+ m?.(a), this.manager.itemError(n), this.manager.itemEnd(n);
203
200
  }), {};
201
+ }, A.prototype.load = function(e, t, r, m) {
202
+ let n = e ?? "";
203
+ this.path !== void 0 && (n = this.path + n), n = this.manager.resolveURL(n);
204
+ const f = `image-bitmap:${n}`, c = b.get(f);
205
+ if (this.manager.itemStart(n), c) {
206
+ Promise.resolve(c).then((h) => {
207
+ t?.(h), this.manager.itemEnd(n);
208
+ }).catch((h) => {
209
+ m?.(h), this.manager.itemError(n), this.manager.itemEnd(n);
210
+ });
211
+ return;
212
+ }
213
+ const d = this._abortController?.signal, l = this.manager.abortController.signal, u = d && typeof AbortSignal.any == "function" ? AbortSignal.any([d, l]) : d ?? l, E = fetch(n, {
214
+ credentials: this.crossOrigin === "anonymous" ? "same-origin" : "include",
215
+ headers: this.requestHeader,
216
+ signal: u
217
+ }).then((h) => {
218
+ if (!h.ok) throw new Error(`Failed to load image ${n}: ${h.status} ${h.statusText}`);
219
+ return h.blob();
220
+ }).then((h) => S(h, this.options)).then((h) => (b.add(f, h), h));
221
+ b.add(f, E), E.then((h) => {
222
+ t?.(h), this.manager.itemEnd(n);
223
+ }).catch((h) => {
224
+ b.remove(f), m?.(h), this.manager.itemError(n), this.manager.itemEnd(n);
225
+ });
204
226
  });
205
227
  }
206
- const _ = 1e3, j = 100, U = 25;
207
- class X {
228
+ const Y = 1e3, j = 100, N = 25;
229
+ class q {
208
230
  windowMs;
209
231
  idleResetMs;
210
232
  missedFrameThresholdMs;
211
233
  #e = [];
212
234
  #t = null;
213
235
  constructor(e = {}) {
214
- this.windowMs = e.windowMs ?? _, this.idleResetMs = e.idleResetMs ?? j, this.missedFrameThresholdMs = e.missedFrameThresholdMs ?? U;
236
+ this.windowMs = e.windowMs ?? Y, this.idleResetMs = e.idleResetMs ?? j, this.missedFrameThresholdMs = e.missedFrameThresholdMs ?? N;
215
237
  }
216
238
  add(e, t = performance.now()) {
217
239
  return !Number.isFinite(e) || e <= 0 || !Number.isFinite(t) ? this.snapshot(t) : (this.#t !== null && t - this.#t >= this.idleResetMs && (this.#e.length = 0), this.#t = t, e < this.idleResetMs && this.#e.push({ at: t, duration: e }), this.snapshot(t));
218
240
  }
219
241
  snapshot(e = performance.now()) {
220
242
  this.#r(e);
221
- const t = this.#e.map(({ duration: f }) => f);
243
+ const t = this.#e.map(({ duration: c }) => c);
222
244
  if (t.length === 0)
223
245
  return {
224
246
  samples: 0,
@@ -228,16 +250,16 @@ class X {
228
250
  max: 0,
229
251
  missedFramePercent: 0
230
252
  };
231
- const r = [...t].sort((f, i) => f - i), a = t.reduce((f, i) => f + i, 0) / t.length, l = Math.max(0, Math.ceil(r.length * 0.95) - 1), u = t.filter(
232
- (f) => f > this.missedFrameThresholdMs
253
+ const r = [...t].sort((c, a) => c - a), m = t.reduce((c, a) => c + a, 0) / t.length, n = Math.max(0, Math.ceil(r.length * 0.95) - 1), f = t.filter(
254
+ (c) => c > this.missedFrameThresholdMs
233
255
  ).length;
234
256
  return {
235
257
  samples: t.length,
236
- fps: 1e3 / a,
237
- average: a,
238
- p95: r[l],
258
+ fps: 1e3 / m,
259
+ average: m,
260
+ p95: r[n],
239
261
  max: r[r.length - 1],
240
- missedFramePercent: u / t.length * 100
262
+ missedFramePercent: f / t.length * 100
241
263
  };
242
264
  }
243
265
  reset() {
@@ -249,8 +271,8 @@ class X {
249
271
  this.#e.shift();
250
272
  }
251
273
  }
252
- function x(s, e) {
253
- const { render: t } = s.renderer.info;
274
+ function L(o, e) {
275
+ const { render: t } = o.renderer.info;
254
276
  return {
255
277
  drawCalls: t.drawCalls,
256
278
  frameCalls: t.frameCalls,
@@ -261,8 +283,8 @@ function x(s, e) {
261
283
  frameTiming: e
262
284
  };
263
285
  }
264
- function H() {
265
- const s = globalThis, e = {
286
+ function Q() {
287
+ const o = globalThis, e = {
266
288
  viewer: null,
267
289
  canvas: null,
268
290
  domTarget: null,
@@ -270,62 +292,62 @@ function H() {
270
292
  disposed: !1,
271
293
  ready: !1,
272
294
  lastStatsAt: 0
273
- }, t = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new WeakSet();
274
- let l = () => {
275
- }, u = () => {
295
+ }, t = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), m = /* @__PURE__ */ new WeakSet();
296
+ let n = () => {
297
+ }, f = () => {
276
298
  };
277
- const f = new Promise((n, o) => {
278
- l = n, u = o;
279
- }), i = (n, o) => {
280
- e.disposed && n.type !== "disposed" || s.postMessage(n, o);
281
- }, p = (n) => {
282
- if (n && typeof n == "object") {
283
- if (a.has(n)) return;
284
- a.add(n);
299
+ const c = new Promise((i, s) => {
300
+ n = i, f = s;
301
+ }), a = (i, s) => {
302
+ e.disposed && i.type !== "disposed" || o.postMessage(i, s);
303
+ }, d = (i) => {
304
+ if (i && typeof i == "object") {
305
+ if (m.has(i)) return;
306
+ m.add(i);
285
307
  }
286
- i({ type: "error", error: W(n) });
287
- }, d = (n, o) => {
288
- if (t.has(n))
289
- throw new Error(`Worker viewer command already exists: ${n}`);
290
- return t.set(n, o), () => {
291
- t.get(n) === o && t.delete(n);
308
+ a({ type: "error", error: x(i) });
309
+ }, l = (i, s) => {
310
+ if (t.has(i))
311
+ throw new Error(`Worker viewer command already exists: ${i}`);
312
+ return t.set(i, s), () => {
313
+ t.get(i) === s && t.delete(i);
292
314
  };
293
- }, h = async (n) => {
315
+ }, u = async (i) => {
294
316
  if (e.initialized || e.viewer)
295
317
  throw new Error("The Worker viewer has already initialized.");
296
318
  if (e.disposed) throw new Error("The Worker viewer has been disposed.");
297
- if (!s.navigator.gpu)
319
+ if (!o.navigator.gpu)
298
320
  throw new Error("WebGPU is not exposed in this Worker. Use a current Chromium browser or the main-thread Viewer.");
299
- B(), e.canvas = n.canvas, e.domTarget = O(n.canvas, n.size);
300
- const o = new D({
321
+ X(), e.canvas = i.canvas, e.domTarget = _(i.canvas, i.size);
322
+ const s = new F({
301
323
  el: e.domTarget,
302
- pixelRatio: n.size.pixelRatio,
324
+ pixelRatio: i.size.pixelRatio,
303
325
  rendererOptions: {
304
- canvas: n.canvas,
326
+ canvas: i.canvas,
305
327
  forceWebGL: !1
306
328
  }
307
329
  });
308
- e.viewer = o;
309
- const m = new X();
310
- o.addEventListener("afterRender", ({ delta: w }) => {
311
- const g = performance.now(), R = m.add(w * 1e3, g);
312
- g - e.lastStatsAt < 250 || (e.lastStatsAt = g, i({ type: "stats", stats: x(o, R) }));
313
- }), d("getStats", () => x(o, m.snapshot())), d("getViewpoint", () => o.controls.getCameraViewpoint()), d("setViewpoint", async (w) => {
314
- const g = w;
315
- return await o.controls.setCameraViewpoint(g.viewpoint, g.enableTransition ?? !0), o.controls.getCameraViewpoint();
316
- }), d("render", async () => (await o.render(), x(o, m.snapshot())));
317
- const k = {
318
- viewer: o,
330
+ e.viewer = s;
331
+ const g = new q();
332
+ s.addEventListener("afterRender", ({ delta: w }) => {
333
+ const y = performance.now(), D = g.add(w * 1e3, y);
334
+ y - e.lastStatsAt < 250 || (e.lastStatsAt = y, a({ type: "stats", stats: L(s, D) }));
335
+ }), l("getStats", () => L(s, g.snapshot())), l("getViewpoint", () => s.controls.getCameraViewpoint()), l("setViewpoint", async (w) => {
336
+ const y = w;
337
+ return await s.controls.setCameraViewpoint(y.viewpoint, y.enableTransition ?? !0), s.controls.getCameraViewpoint();
338
+ }), l("render", async () => (await s.render(), L(s, g.snapshot())));
339
+ const M = {
340
+ viewer: s,
319
341
  get canvas() {
320
- return n.canvas;
342
+ return i.canvas;
321
343
  },
322
344
  status(w) {
323
- i({ type: "status", message: w });
345
+ a({ type: "status", message: w });
324
346
  },
325
- emit(w, g) {
326
- i({ type: "event", eventType: w, detail: g });
347
+ emit(w, y) {
348
+ a({ type: "event", eventType: w, detail: y });
327
349
  },
328
- registerCommand: d,
350
+ registerCommand: l,
329
351
  onDispose(w) {
330
352
  if (e.disposed) throw new Error("The Worker viewer has been disposed.");
331
353
  return r.add(w), () => r.delete(w);
@@ -333,86 +355,58 @@ function H() {
333
355
  ready(w) {
334
356
  if (e.disposed) throw new Error("The Worker viewer has been disposed.");
335
357
  if (e.ready) throw new Error("The Worker viewer is already ready.");
336
- i({ type: "ready", detail: w }), e.ready = !0;
358
+ a({ type: "ready", detail: w }), e.ready = !0;
337
359
  }
338
360
  };
339
- if (await o.init(), e.disposed) throw new Error("The Worker viewer was disposed during initialization.");
340
- e.initialized = !0, i({ type: "initialized" }), l(k);
341
- }, b = (n) => {
342
- !e.viewer || !e.domTarget || (I(e.domTarget, n.size), e.viewer.renderer.setPixelRatio(n.size.pixelRatio), e.viewer.onWindowResize());
343
- }, S = async (n) => {
361
+ if (await s.init(), e.disposed) throw new Error("The Worker viewer was disposed during initialization.");
362
+ e.initialized = !0, a({ type: "initialized" }), n(M);
363
+ }, E = (i) => {
364
+ !e.viewer || !e.domTarget || (V(e.domTarget, i.size), e.viewer.renderer.setPixelRatio(i.size.pixelRatio), e.viewer.onWindowResize());
365
+ }, h = async (i) => {
344
366
  try {
345
367
  if (!e.initialized) throw new Error("The Worker viewer has not initialized.");
346
- const o = t.get(n.command);
347
- if (!o) throw new Error(`Unknown Worker viewer command: ${n.command}`);
348
- const m = await o(n.payload), k = m instanceof ArrayBuffer ? [m] : Y(m);
349
- i({ type: "response", id: n.id, result: m }, k);
350
- } catch (o) {
351
- i({ type: "response", id: n.id, error: W(o) });
368
+ const s = t.get(i.command);
369
+ if (!s) throw new Error(`Unknown Worker viewer command: ${i.command}`);
370
+ const g = await s(i.payload), M = g instanceof ArrayBuffer ? [g] : $(g);
371
+ a({ type: "response", id: i.id, result: g }, M);
372
+ } catch (s) {
373
+ a({ type: "response", id: i.id, error: x(s) });
352
374
  }
353
- }, L = async () => {
375
+ }, z = async () => {
354
376
  if (e.disposed) return;
355
377
  e.disposed = !0;
356
- const n = [];
357
- for (const o of [...r].reverse())
378
+ const i = [];
379
+ for (const s of [...r].reverse())
358
380
  try {
359
- await o();
360
- } catch (m) {
361
- n.push(m);
381
+ await s();
382
+ } catch (g) {
383
+ i.push(g);
362
384
  }
363
385
  r.clear();
364
386
  try {
365
387
  e.viewer?.dispose();
366
- } catch (o) {
367
- n.push(o);
368
- }
369
- e.viewer = null, e.canvas = null, e.domTarget = null, e.initialized || u(new Error("The Worker viewer was disposed before initialization."));
370
- for (const o of n)
371
- s.postMessage({ type: "error", error: W(o) });
372
- s.postMessage({ type: "disposed" }), s.close();
373
- }, T = (n) => {
374
- p(n), e.ready || L();
375
- };
376
- return s.addEventListener("error", (n) => {
377
- T(n.error ?? new Error(n.message)), n.preventDefault();
378
- }), s.addEventListener("unhandledrejection", (n) => {
379
- T(n.reason), n.preventDefault();
380
- }), s.addEventListener("message", (n) => {
381
- const o = n.data;
382
- o.type === "init" ? h(o).catch((m) => {
383
- u(m), T(m);
384
- }) : o.type === "resize" ? b(o) : o.type === "dom-event" ? e.domTarget && V(e.domTarget, o.event) : o.type === "request" ? S(o) : o.type === "dispose" && L();
385
- }), f;
386
- }
387
- function Y(s) {
388
- const e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new WeakSet(), r = (a) => {
389
- if (!(!a || typeof a != "object")) {
390
- if (a instanceof ArrayBuffer) {
391
- e.add(a);
392
- return;
393
- }
394
- if (ArrayBuffer.isView(a)) {
395
- a.buffer instanceof ArrayBuffer && e.add(a.buffer);
396
- return;
397
- }
398
- if (!t.has(a)) {
399
- if (t.add(a), a instanceof Map) {
400
- a.forEach((l, u) => {
401
- r(u), r(l);
402
- });
403
- return;
404
- }
405
- if (a instanceof Set) {
406
- a.forEach(r);
407
- return;
408
- }
409
- Object.values(a).forEach(r);
410
- }
388
+ } catch (s) {
389
+ i.push(s);
411
390
  }
391
+ e.viewer = null, e.canvas = null, e.domTarget = null, e.initialized || f(new Error("The Worker viewer was disposed before initialization."));
392
+ for (const s of i)
393
+ o.postMessage({ type: "error", error: x(s) });
394
+ o.postMessage({ type: "disposed" }), o.close();
395
+ }, W = (i) => {
396
+ d(i), e.ready || z();
412
397
  };
413
- return r(s), [...e];
398
+ return o.addEventListener("error", (i) => {
399
+ W(i.error ?? new Error(i.message)), i.preventDefault();
400
+ }), o.addEventListener("unhandledrejection", (i) => {
401
+ W(i.reason), i.preventDefault();
402
+ }), o.addEventListener("message", (i) => {
403
+ const s = i.data;
404
+ s.type === "init" ? u(s).catch((g) => {
405
+ f(g), W(g);
406
+ }) : s.type === "resize" ? E(s) : s.type === "dom-event" ? e.domTarget && B(e.domTarget, s.event) : s.type === "request" ? h(s) : s.type === "dispose" && z();
407
+ }), c;
414
408
  }
415
409
  export {
416
- H as createWorkerViewer,
417
- W as serializeError
410
+ Q as createWorkerViewer,
411
+ x as serializeError
418
412
  };
@@ -0,0 +1 @@
1
+ "use strict";const s={colorSpaceConversion:"none",premultiplyAlpha:"none"};function o(n,t){return n[t]|n[t+1]<<8|n[t+2]<<16}function c(n,t){return n[t]|n[t+1]<<8}function d(n,t){return n[t]|n[t+1]<<8|n[t+2]<<16|n[t+3]<<24}function f(n){return n===192||n===193||n===194||n===195||n===197||n===198||n===199||n===201||n===202||n===203||n===205||n===206||n===207}async function l(n,t,e){return new Uint8Array(await n.slice(t,t+e).arrayBuffer())}async function w(n){let t=2;for(;t+4<=n.size;){const e=await l(n,t,Math.min(16,n.size-t));let r=0;for(;r<e.length&&e[r]===255;)r++;if(r===0||r>=e.length)return null;const a=e[r],i=r+1,h=t+i;if(a===216||a===1||a>=208&&a<=215){t=h;continue}if(a===217||a===218||i+1>=e.length)return null;const u=e[i]<<8|e[i+1];if(u<2)return null;if(f(a))return i+6>=e.length?null:{width:e[i+5]<<8|e[i+6],height:e[i+3]<<8|e[i+4]};t=h+u}return null}async function p(n){const t=await l(n,0,Math.min(32,n.size));if(t.length<10)return null;if(t[0]===255&&t[1]===216)return w(n);if(t.length>=24&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71){const i=new DataView(t.buffer,t.byteOffset,t.byteLength);return{width:i.getUint32(16),height:i.getUint32(20)}}if(t[0]===71&&t[1]===73&&t[2]===70&&t[3]===56)return{width:c(t,6),height:c(t,8)};if(t.length>=30&&t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===87&&t[9]===69&&t[10]===66&&t[11]===80){const i=String.fromCharCode(t[12],t[13],t[14],t[15]);if(i==="VP8X")return{width:o(t,24)+1,height:o(t,27)+1};if(i==="VP8 "&&t[23]===157&&t[24]===1&&t[25]===42)return{width:c(t,26)&16383,height:c(t,28)&16383};if(i==="VP8L"&&t[20]===47){const h=d(t,21);return{width:(h&16383)+1,height:(h>>>14&16383)+1}}}return null}function g(n,t,e=8192){if(n<=e&&t<=e)return null;const r=e/Math.max(n,t);return{width:Math.max(1,Math.round(n*r)),height:Math.max(1,Math.round(t*r))}}async function m(n,t={}){const e={...s,...t,colorSpaceConversion:"none"},r=await p(n),a=r?g(r.width,r.height):null;if(a)return createImageBitmap(n,{...e,resizeWidth:a.width,resizeHeight:a.height,resizeQuality:"high"});const i=await createImageBitmap(n,e),h=g(i.width,i.height);if(!h)return i;try{return await createImageBitmap(i,{...s,resizeWidth:h.width,resizeHeight:h.height,resizeQuality:"high"})}finally{i.close()}}exports.createWorkerImageBitmap=m;