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.
- package/dist/getTransferables-C97JPUVf.cjs +1 -0
- package/dist/getTransferables-DrzSmiCR.js +43 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +1549 -1026
- package/dist/modelDecodeProtocol-D1Apm9iG.cjs +1 -0
- package/dist/modelDecodeProtocol-wDB7ksYw.js +56 -0
- package/dist/plugins/u-manager/index.cjs +1 -1
- package/dist/plugins/u-manager/index.js +73 -53
- package/dist/src/loaders/ModelDecodeWorkerClient.d.ts +31 -0
- package/dist/src/loaders/ModelLoaderManager.d.ts +15 -2
- package/dist/src/loaders/buildDecodedGltfModel.d.ts +4 -0
- package/dist/src/loaders/index.d.ts +1 -0
- package/dist/src/objects/Model.d.ts +1 -0
- package/dist/src/worker/decodeGltfModel.d.ts +10 -0
- package/dist/src/worker/getTransferables.d.ts +1 -0
- package/dist/src/worker/index.d.ts +1 -0
- package/dist/src/worker/installWorkerImageLoader.d.ts +3 -0
- package/dist/src/worker/model-decoder.d.ts +13 -0
- package/dist/src/worker/modelDecodeProtocol.d.ts +205 -0
- package/dist/src/worker/workerImageUtils.d.ts +8 -0
- package/dist/worker/index.cjs +1 -1
- package/dist/worker/index.js +8 -6
- package/dist/worker/model-decoder.cjs +1 -0
- package/dist/worker/model-decoder.js +339 -0
- package/dist/worker/runtime.cjs +1 -1
- package/dist/worker/runtime.js +202 -208
- package/dist/workerImageUtils-lmOMyTQN.cjs +1 -0
- package/dist/workerImageUtils-mQD3TQ1N.js +105 -0
- package/docs/api-effects.md +66 -2
- package/docs/api-viewer.md +45 -1
- package/docs/changelog.md +26 -0
- package/docs/examples-guide.md +31 -11
- package/docs/getting-started.md +97 -93
- package/docs/index.md +2 -2
- package/docs/mcp.md +16 -3
- package/docs/release.md +5 -3
- package/package.json +9 -1
package/dist/worker/runtime.cjs
CHANGED
|
@@ -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;
|
package/dist/worker/runtime.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { s as
|
|
2
|
-
import { V as
|
|
3
|
-
import { ImageLoader as
|
|
4
|
-
|
|
5
|
-
|
|
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,
|
|
40
|
-
r !== "type" &&
|
|
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
|
|
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
|
|
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
|
|
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
|
|
83
|
-
const e = (t) => t.toLowerCase() === "canvas" ? new OffscreenCanvas(1, 1) : new
|
|
84
|
+
function I(o) {
|
|
85
|
+
const e = (t) => t.toLowerCase() === "canvas" ? new OffscreenCanvas(1, 1) : new T();
|
|
84
86
|
return {
|
|
85
|
-
body:
|
|
86
|
-
documentElement:
|
|
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:
|
|
92
|
-
removeEventListener:
|
|
93
|
+
addEventListener: o.addEventListener.bind(o),
|
|
94
|
+
removeEventListener: o.removeEventListener.bind(o),
|
|
93
95
|
exitPointerLock() {
|
|
94
96
|
}
|
|
95
97
|
};
|
|
96
98
|
}
|
|
97
|
-
function
|
|
98
|
-
Object.defineProperty(
|
|
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(
|
|
104
|
-
Object.defineProperty(
|
|
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
|
|
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
|
-
|
|
116
|
-
const r =
|
|
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
|
-
},
|
|
123
|
-
if (!
|
|
124
|
-
let
|
|
125
|
-
typeof
|
|
126
|
-
let
|
|
127
|
-
|
|
128
|
-
},
|
|
129
|
-
if (!
|
|
130
|
-
const
|
|
131
|
-
if (
|
|
132
|
-
if (typeof
|
|
133
|
-
|
|
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
|
|
136
|
-
|
|
137
|
+
const u = t.listenerWrappers.get(d);
|
|
138
|
+
u && l.delete(u);
|
|
137
139
|
}
|
|
138
140
|
};
|
|
139
|
-
|
|
140
|
-
}),
|
|
141
|
-
}),
|
|
142
|
-
}),
|
|
143
|
-
}),
|
|
144
|
-
}),
|
|
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),
|
|
146
|
-
const { width:
|
|
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:
|
|
149
|
-
height:
|
|
150
|
-
top:
|
|
151
|
-
left:
|
|
152
|
-
right:
|
|
153
|
-
bottom:
|
|
154
|
-
x:
|
|
155
|
-
y:
|
|
156
|
-
toJSON: () => ({ width:
|
|
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
|
|
160
|
-
return
|
|
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
|
|
163
|
-
const t =
|
|
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 },
|
|
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
|
|
168
|
-
const t =
|
|
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
|
|
171
|
-
for (const
|
|
172
|
-
if (
|
|
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
|
|
177
|
+
function U(o, e) {
|
|
176
178
|
const t = globalThis;
|
|
177
|
-
t.window =
|
|
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
|
|
180
|
-
let
|
|
181
|
-
function
|
|
182
|
-
|
|
183
|
-
let
|
|
184
|
-
this.path !== void 0 && (
|
|
185
|
-
const
|
|
186
|
-
if (this.manager.itemStart(
|
|
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?.(
|
|
189
|
-
}),
|
|
190
|
-
let
|
|
191
|
-
return
|
|
192
|
-
if (!
|
|
193
|
-
return
|
|
194
|
-
}).then(
|
|
195
|
-
(
|
|
196
|
-
|
|
197
|
-
|
|
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
|
|
207
|
-
class
|
|
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 ??
|
|
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:
|
|
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((
|
|
232
|
-
(
|
|
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 /
|
|
237
|
-
average:
|
|
238
|
-
p95: r[
|
|
258
|
+
fps: 1e3 / m,
|
|
259
|
+
average: m,
|
|
260
|
+
p95: r[n],
|
|
239
261
|
max: r[r.length - 1],
|
|
240
|
-
missedFramePercent:
|
|
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
|
|
253
|
-
const { render: t } =
|
|
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
|
|
265
|
-
const
|
|
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(),
|
|
274
|
-
let
|
|
275
|
-
},
|
|
295
|
+
}, t = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), m = /* @__PURE__ */ new WeakSet();
|
|
296
|
+
let n = () => {
|
|
297
|
+
}, f = () => {
|
|
276
298
|
};
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
}),
|
|
280
|
-
e.disposed &&
|
|
281
|
-
},
|
|
282
|
-
if (
|
|
283
|
-
if (
|
|
284
|
-
|
|
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
|
-
|
|
287
|
-
},
|
|
288
|
-
if (t.has(
|
|
289
|
-
throw new Error(`Worker viewer command already exists: ${
|
|
290
|
-
return t.set(
|
|
291
|
-
t.get(
|
|
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
|
-
},
|
|
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 (!
|
|
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
|
-
|
|
300
|
-
const
|
|
321
|
+
X(), e.canvas = i.canvas, e.domTarget = _(i.canvas, i.size);
|
|
322
|
+
const s = new F({
|
|
301
323
|
el: e.domTarget,
|
|
302
|
-
pixelRatio:
|
|
324
|
+
pixelRatio: i.size.pixelRatio,
|
|
303
325
|
rendererOptions: {
|
|
304
|
-
canvas:
|
|
326
|
+
canvas: i.canvas,
|
|
305
327
|
forceWebGL: !1
|
|
306
328
|
}
|
|
307
329
|
});
|
|
308
|
-
e.viewer =
|
|
309
|
-
const
|
|
310
|
-
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
}),
|
|
314
|
-
const
|
|
315
|
-
return await
|
|
316
|
-
}),
|
|
317
|
-
const
|
|
318
|
-
viewer:
|
|
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
|
|
342
|
+
return i.canvas;
|
|
321
343
|
},
|
|
322
344
|
status(w) {
|
|
323
|
-
|
|
345
|
+
a({ type: "status", message: w });
|
|
324
346
|
},
|
|
325
|
-
emit(w,
|
|
326
|
-
|
|
347
|
+
emit(w, y) {
|
|
348
|
+
a({ type: "event", eventType: w, detail: y });
|
|
327
349
|
},
|
|
328
|
-
registerCommand:
|
|
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
|
-
|
|
358
|
+
a({ type: "ready", detail: w }), e.ready = !0;
|
|
337
359
|
}
|
|
338
360
|
};
|
|
339
|
-
if (await
|
|
340
|
-
e.initialized = !0,
|
|
341
|
-
},
|
|
342
|
-
!e.viewer || !e.domTarget || (
|
|
343
|
-
},
|
|
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
|
|
347
|
-
if (!
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
} catch (
|
|
351
|
-
|
|
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
|
-
},
|
|
375
|
+
}, z = async () => {
|
|
354
376
|
if (e.disposed) return;
|
|
355
377
|
e.disposed = !0;
|
|
356
|
-
const
|
|
357
|
-
for (const
|
|
378
|
+
const i = [];
|
|
379
|
+
for (const s of [...r].reverse())
|
|
358
380
|
try {
|
|
359
|
-
await
|
|
360
|
-
} catch (
|
|
361
|
-
|
|
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 (
|
|
367
|
-
|
|
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
|
|
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
|
-
|
|
417
|
-
|
|
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;
|