@liveroom-tech/react-immersive 4.0.2 → 4.1.0

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.
@@ -0,0 +1 @@
1
+ import"./chunk-JR557W27.mjs";import{decompressSync as V}from"fflate";var K=Object.defineProperty,W=Math.pow,h=(i,t)=>K(i,"name",{value:t,configurable:!0}),g=(i,t,e)=>new Promise((r,n)=>{var s=l=>{try{o(e.next(l))}catch(c){n(c)}},a=l=>{try{o(e.throw(l))}catch(c){n(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((e=e.apply(i,t)).next())}),ee=h((i,t)=>{let e=!1,r="",n=L.GridLayer.extend({createTile:h((s,a)=>{let o=document.createElement("img"),l=new AbortController,c=l.signal;return o.cancel=()=>{l.abort()},e||(i.getHeader().then(d=>{d.tileType===1||d.tileType===6?console.error("Error: archive contains vector tiles, but leafletRasterLayer is for displaying raster tiles. See https://github.com/protomaps/PMTiles/tree/main/js for details."):d.tileType===2?r="image/png":d.tileType===3?r="image/jpeg":d.tileType===4?r="image/webp":d.tileType===5&&(r="image/avif")}),e=!0),i.getZxy(s.z,s.x,s.y,c).then(d=>{if(d){let u=new Blob([d.data],{type:r}),f=window.URL.createObjectURL(u);o.src=f}else o.style.display="none";o.cancel=void 0,a(void 0,o)}).catch(d=>{if(d.name!=="AbortError")throw d}),o},"createTile"),_removeTile:h(function(s){let a=this._tiles[s];a&&(a.el.cancel&&a.el.cancel(),a.el.src&&window.URL.revokeObjectURL(a.el.src),a.el.width=0,a.el.height=0,a.el.deleted=!0,L.DomUtil.remove(a.el),delete this._tiles[s],this.fire("tileunload",{tile:a.el,coords:this._keyToTileCoords(s)}))},"_removeTile")});return new n(t)},"leafletRasterLayer"),N=h(i=>(t,e)=>{if(e instanceof AbortController)return i(t,e);let r=new AbortController;return i(t,r).then(n=>e(void 0,n.data,n.cacheControl||"",n.expires||""),n=>e(n)).catch(n=>e(n)),{cancel:h(()=>r.abort(),"cancel")}},"v3compat"),A=class{constructor(t){this.tilev4=h((e,r)=>g(this,null,function*(){if(e.type==="json"){let p=e.url.substr(10),v=this.tiles.get(p);if(v||(v=new M(p),this.tiles.set(p,v)),this.metadata){let F=yield v.getTileJson(e.url);return r.signal.throwIfAborted(),{data:F}}let m=yield v.getHeader();return r.signal.throwIfAborted(),(m.minLon>=m.maxLon||m.minLat>=m.maxLat)&&console.error(`Bounds of PMTiles archive ${m.minLon},${m.minLat},${m.maxLon},${m.maxLat} are not valid.`),{data:{tiles:[`${e.url}/{z}/{x}/{y}`],minzoom:m.minZoom,maxzoom:m.maxZoom,bounds:[m.minLon,m.minLat,m.maxLon,m.maxLat]}}}let n=new RegExp(/pmtiles:\/\/(.+)\/(\d+)\/(\d+)\/(\d+)/),s=e.url.match(n);if(!s)throw new Error("Invalid PMTiles protocol URL");let a=s[1],o=this.tiles.get(a);o||(o=new M(a),this.tiles.set(a,o));let l=s[2],c=s[3],d=s[4],u=yield o?.getZxy(+l,+c,+d,r.signal);if(r.signal.throwIfAborted(),u)return{data:new Uint8Array(u.data),cacheControl:u.cacheControl,expires:u.expires};let f=yield o.getHeader();if(f.tileType===1||f.tileType===6){if(this.errorOnMissingTile)throw new Error("Tile not found.");return{data:new Uint8Array}}return{data:null}}),"tilev4"),this.tile=N(this.tilev4),this.tiles=new Map,this.metadata=t?.metadata||!1,this.errorOnMissingTile=t?.errorOnMissingTile||!1}add(t){this.tiles.set(t.source.getKey(),t)}get(t){return this.tiles.get(t)}};h(A,"Protocol");var re=A;function D(i,t){return(t>>>0)*4294967296+(i>>>0)}h(D,"toNum");function $(i,t){let e=t.buf,r=e[t.pos++],n=(r&112)>>4;if(r<128||(r=e[t.pos++],n|=(r&127)<<3,r<128)||(r=e[t.pos++],n|=(r&127)<<10,r<128)||(r=e[t.pos++],n|=(r&127)<<17,r<128)||(r=e[t.pos++],n|=(r&127)<<24,r<128)||(r=e[t.pos++],n|=(r&1)<<31,r<128))return D(i,n);throw new Error("Expected varint not more than 10 bytes")}h($,"readVarintRemainder");function w(i){let t=i.buf,e=t[i.pos++],r=e&127;return e<128||(e=t[i.pos++],r|=(e&127)<<7,e<128)||(e=t[i.pos++],r|=(e&127)<<14,e<128)||(e=t[i.pos++],r|=(e&127)<<21,e<128)?r:(e=t[i.pos],r|=(e&15)<<28,$(r,i))}h(w,"readVarint");function b(i,t,e,r,n){return n===0?r!==0?[i-1-e,i-1-t]:[e,t]:[t,e]}h(b,"rotate");function H(i,t,e){if(i>26)throw new Error("Tile zoom level exceeds max safe number limit (26)");if(t>=1<<i||e>=1<<i)throw new Error("tile x/y outside zoom level bounds");let r=((1<<i)*(1<<i)-1)/3,n=i-1,[s,a]=[t,e];for(let o=1<<n;o>0;o>>=1){let l=s&o,c=a&o;r+=(3*l^c)*(1<<n),[s,a]=b(o,s,a,l,c),n--}return r}h(H,"zxyToTileId");function z(i){let t=3*i+1;return t<4294967296?31-Math.clz32(t):63-Math.clz32(t/4294967296)}h(z,"tileIdToZ");function _(i){let t=z(i)>>1;if(t>26)throw new Error("Tile zoom level exceeds max safe number limit (26)");let e=((1<<t)*(1<<t)-1)/3,r=i-e,n=0,s=0,a=1<<t;for(let o=1;o<a;o<<=1){let l=o&r/2,c=o&(r^l);[n,s]=b(o,n,s,l,c),r=r/2,n+=l,s+=c}return[t,n,s]}h(_,"tileIdToZxy");var J=(i=>(i[i.Unknown=0]="Unknown",i[i.None=1]="None",i[i.Gzip=2]="Gzip",i[i.Brotli=3]="Brotli",i[i.Zstd=4]="Zstd",i))(J||{});function x(i,t){return g(this,null,function*(){if(t===1||t===0)return i;if(t===2){if(typeof globalThis.DecompressionStream>"u")return V(new Uint8Array(i));let e=new Response(i).body;if(!e)throw new Error("Failed to read response stream");let r=e.pipeThrough(new globalThis.DecompressionStream("gzip"));return new Response(r).arrayBuffer()}throw new Error("Compression method not supported")})}h(x,"defaultDecompress");var G=(i=>(i[i.Unknown=0]="Unknown",i[i.Mvt=1]="Mvt",i[i.Png=2]="Png",i[i.Jpeg=3]="Jpeg",i[i.Webp=4]="Webp",i[i.Avif=5]="Avif",i[i.Mlt=6]="Mlt",i))(G||{});function I(i){return i===1?".mvt":i===2?".png":i===3?".jpg":i===4?".webp":i===5?".avif":i===6?".mlt":""}h(I,"tileTypeExt");var q=127;function P(i,t){let e=0,r=i.length-1;for(;e<=r;){let n=r+e>>1,s=t-i[n].tileId;if(s>0)e=n+1;else if(s<0)r=n-1;else return i[n]}return r>=0&&(i[r].runLength===0||t-i[r].tileId<i[r].runLength)?i[r]:null}h(P,"findTile");var R=class{constructor(t){this.file=t}getKey(){return this.file.name}getBytes(t,e){return g(this,null,function*(){return{data:yield this.file.slice(t,t+e).arrayBuffer()}})}};h(R,"FileSource");var ne=R,Z=class{constructor(t,e=new Headers,r=void 0){var n,s;this.url=t,this.customHeaders=e,this.credentials=r,this.mustReload=!1;let a="";"navigator"in globalThis&&(a=(s=(n=globalThis.navigator)==null?void 0:n.userAgent)!=null?s:"");let o=a.indexOf("Windows")>-1,l=/Chrome|Chromium|Edg|OPR|Brave/.test(a);this.chromeWindowsNoCache=!1,o&&l&&(this.chromeWindowsNoCache=!0)}getKey(){return this.url}setHeaders(t){this.customHeaders=t}getBytes(t,e,r,n){return g(this,null,function*(){let s,a;r?a=r:(s=new AbortController,a=s.signal);let o=new Headers(this.customHeaders);o.set("range",`bytes=${t}-${t+e-1}`);let l;this.mustReload?l="reload":this.chromeWindowsNoCache&&(l="no-store");let c=yield fetch(this.url,{signal:a,cache:l,headers:o,credentials:this.credentials});if(t===0&&c.status===416){let f=c.headers.get("Content-Range");if(!f||!f.startsWith("bytes */"))throw new Error("Missing content-length on 416 response");let p=+f.substr(8);o.set("range",`bytes=0-${p-1}`),c=yield fetch(this.url,{signal:a,cache:"reload",headers:o,credentials:this.credentials})}let d=c.headers.get("Etag");if(d!=null&&d.startsWith("W/")&&(d=null),c.status===416||n&&d&&d!==n)throw this.mustReload=!0,new T(`Server returned non-matching ETag ${n} after one retry. Check browser extensions and servers for issues that may affect correct ETag headers.`);if(c.status>=300)throw new Error(`Bad response code: ${c.status}`);let u=c.headers.get("Content-Length");if(c.status===200&&(!u||+u>e))throw s&&s.abort(),new Error("Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving.");return{data:yield c.arrayBuffer(),etag:d||void 0,cacheControl:c.headers.get("Cache-Control")||void 0,expires:c.headers.get("Expires")||void 0}})}};h(Z,"FetchSource");var Q=Z;function y(i,t){let e=i.getUint32(t+4,!0),r=i.getUint32(t+0,!0);return e*W(2,32)+r}h(y,"getUint64");function O(i,t){let e=new DataView(i),r=e.getUint8(7);if(r>3)throw new Error(`Archive is spec version ${r} but this library supports up to spec version 3`);return{specVersion:r,rootDirectoryOffset:y(e,8),rootDirectoryLength:y(e,16),jsonMetadataOffset:y(e,24),jsonMetadataLength:y(e,32),leafDirectoryOffset:y(e,40),leafDirectoryLength:y(e,48),tileDataOffset:y(e,56),tileDataLength:y(e,64),numAddressedTiles:y(e,72),numTileEntries:y(e,80),numTileContents:y(e,88),clustered:e.getUint8(96)===1,internalCompression:e.getUint8(97),tileCompression:e.getUint8(98),tileType:e.getUint8(99),minZoom:e.getUint8(100),maxZoom:e.getUint8(101),minLon:e.getInt32(102,!0)/1e7,minLat:e.getInt32(106,!0)/1e7,maxLon:e.getInt32(110,!0)/1e7,maxLat:e.getInt32(114,!0)/1e7,centerZoom:e.getUint8(118),centerLon:e.getInt32(119,!0)/1e7,centerLat:e.getInt32(123,!0)/1e7,etag:t}}h(O,"bytesToHeader");function C(i){let t={buf:new Uint8Array(i),pos:0},e=w(t),r=[],n=0;for(let s=0;s<e;s++){let a=w(t);r.push({tileId:n+a,offset:0,length:0,runLength:1}),n+=a}for(let s=0;s<e;s++)r[s].runLength=w(t);for(let s=0;s<e;s++)r[s].length=w(t);for(let s=0;s<e;s++){let a=w(t);a===0&&s>0?r[s].offset=r[s-1].offset+r[s-1].length:r[s].offset=a-1}return r}h(C,"deserializeIndex");var S=class extends Error{};h(S,"EtagMismatch");var T=S;function U(i,t){return g(this,null,function*(){let e=yield i.getBytes(0,16384);if(new DataView(e.data).getUint16(0,!0)!==19792)throw new Error("Wrong magic number for PMTiles archive");let r=e.data.slice(0,q),n=O(r,e.etag),s=e.data.slice(n.rootDirectoryOffset,n.rootDirectoryOffset+n.rootDirectoryLength),a=`${i.getKey()}|${n.etag||""}|${n.rootDirectoryOffset}|${n.rootDirectoryLength}`,o=C(yield t(s,n.internalCompression));return[n,[a,o.length,o]]})}h(U,"getHeaderAndRoot");function E(i,t,e,r,n,s){return g(this,null,function*(){let a=yield i.getBytes(e,r,s,n.etag),o=yield t(a.data,n.internalCompression),l=C(o);if(l.length===0)throw new Error("Empty directory is invalid");return l})}h(E,"getDirectory");var B=class{constructor(t=100,e=!0,r=x){this.cache=new Map,this.maxCacheEntries=t,this.counter=1,this.decompress=r}getHeader(t){return g(this,null,function*(){let e=t.getKey(),r=this.cache.get(e);if(r)return r.lastUsed=this.counter++,r.data;let n=yield U(t,this.decompress);return n[1]&&this.cache.set(n[1][0],{lastUsed:this.counter++,data:n[1][2]}),this.cache.set(e,{lastUsed:this.counter++,data:n[0]}),this.prune(),n[0]})}getDirectory(t,e,r,n,s){return g(this,null,function*(){let a=`${t.getKey()}|${n.etag||""}|${e}|${r}`,o=this.cache.get(a);if(o)return o.lastUsed=this.counter++,o.data;let l=yield E(t,this.decompress,e,r,n,s);return this.cache.set(a,{lastUsed:this.counter++,data:l}),this.prune(),l})}prune(){if(this.cache.size>this.maxCacheEntries){let t=1/0,e;this.cache.forEach((r,n)=>{r.lastUsed<t&&(t=r.lastUsed,e=n)}),e&&this.cache.delete(e)}}invalidate(t){return g(this,null,function*(){this.cache.delete(t.getKey())})}};h(B,"ResolvedValueCache");var le=B,j=class{constructor(t=100,e=!0,r=x){this.cache=new Map,this.invalidations=new Map,this.pendingFetches=new Map,this.maxCacheEntries=t,this.counter=1,this.decompress=r}getHeader(t){return g(this,null,function*(){let e=t.getKey(),r=this.cache.get(e);if(r)return r.lastUsed=this.counter++,yield r.data;let n=new Promise((s,a)=>{U(t,this.decompress).then(o=>{o[1]&&this.cache.set(o[1][0],{lastUsed:this.counter++,data:Promise.resolve(o[1][2])}),s(o[0]),this.prune()}).catch(o=>{a(o)})});return this.cache.set(e,{lastUsed:this.counter++,data:n}),n})}trackSignal(t,e,r){e.refs++,r.addEventListener("abort",()=>{--e.refs<=0&&this.pendingFetches.get(t)===e&&(e.controller.abort(),this.cache.delete(t),this.pendingFetches.delete(t))},{once:!0})}getDirectory(t,e,r,n,s){return g(this,null,function*(){let a=`${t.getKey()}|${n.etag||""}|${e}|${r}`,o=this.cache.get(a);if(o){o.lastUsed=this.counter++;let u=this.pendingFetches.get(a);return u&&this.trackSignal(a,u,s??new AbortController().signal),yield o.data}let l=new AbortController,c={controller:l,refs:0};this.trackSignal(a,c,s??new AbortController().signal),this.pendingFetches.set(a,c);let d=new Promise((u,f)=>{E(t,this.decompress,e,r,n,l.signal).then(p=>{this.pendingFetches.delete(a),u(p),this.prune()}).catch(p=>{f(p)})});return this.cache.set(a,{lastUsed:this.counter++,data:d}),d})}prune(){if(this.cache.size>=this.maxCacheEntries){let t=1/0,e;this.cache.forEach((r,n)=>{r.lastUsed<t&&(t=r.lastUsed,e=n)}),e&&this.cache.delete(e)}}invalidate(t){return g(this,null,function*(){let e=t.getKey();if(this.invalidations.get(e))return yield this.invalidations.get(e);this.cache.delete(t.getKey());let r=new Promise((n,s)=>{this.getHeader(t).then(a=>{n(),this.invalidations.delete(e)}).catch(a=>{s(a)})});this.invalidations.set(e,r)})}};h(j,"SharedPromiseCache");var X=j,k=class{constructor(t,e,r){typeof t=="string"?this.source=new Q(t):this.source=t,r?this.decompress=r:this.decompress=x,e?this.cache=e:this.cache=new X}getHeader(){return g(this,null,function*(){return yield this.cache.getHeader(this.source)})}getZxyAttempt(t,e,r,n){return g(this,null,function*(){let s=H(t,e,r),a=yield this.cache.getHeader(this.source);if(n?.throwIfAborted(),t<a.minZoom||t>a.maxZoom)return;let o=a.rootDirectoryOffset,l=a.rootDirectoryLength;for(let c=0;c<=3;c++){let d=yield this.cache.getDirectory(this.source,o,l,a,n);n?.throwIfAborted();let u=P(d,s);if(u){if(u.runLength>0){let f=yield this.source.getBytes(a.tileDataOffset+u.offset,u.length,n,a.etag);return{data:yield this.decompress(f.data,a.tileCompression),cacheControl:f.cacheControl,expires:f.expires}}o=a.leafDirectoryOffset+u.offset,l=u.length}else return}throw new Error("Maximum directory depth exceeded")})}getZxy(t,e,r,n){return g(this,null,function*(){try{return yield this.getZxyAttempt(t,e,r,n)}catch(s){if(s instanceof T)return this.cache.invalidate(this.source),yield this.getZxyAttempt(t,e,r,n);throw s}})}getMetadataAttempt(){return g(this,null,function*(){let t=yield this.cache.getHeader(this.source),e=yield this.source.getBytes(t.jsonMetadataOffset,t.jsonMetadataLength,void 0,t.etag),r=yield this.decompress(e.data,t.internalCompression),n=new TextDecoder("utf-8");return JSON.parse(n.decode(r))})}getMetadata(){return g(this,null,function*(){try{return yield this.getMetadataAttempt()}catch(t){if(t instanceof T)return this.cache.invalidate(this.source),yield this.getMetadataAttempt();throw t}})}getTileJson(t){return g(this,null,function*(){let e=yield this.getHeader(),r=yield this.getMetadata(),n=I(e.tileType);return{tilejson:"3.0.0",scheme:"xyz",tiles:[`${t}/{z}/{x}/{y}${n}`],vector_layers:r.vector_layers,attribution:r.attribution,description:r.description,name:r.name,version:r.version,bounds:[e.minLon,e.minLat,e.maxLon,e.maxLat],center:[e.centerLon,e.centerLat,e.centerZoom],minzoom:e.minZoom,maxzoom:e.maxZoom}})}};h(k,"PMTiles");var M=k;export{J as Compression,T as EtagMismatch,Q as FetchSource,ne as FileSource,M as PMTiles,re as Protocol,le as ResolvedValueCache,X as SharedPromiseCache,G as TileType,O as bytesToHeader,P as findTile,y as getUint64,ee as leafletRasterLayer,w as readVarint,_ as tileIdToZxy,I as tileTypeExt,H as zxyToTileId};
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ComponentProps, ReactNode, MutableRefObject } from 'react';
3
3
  import { CameraControls } from '@react-three/drei';
4
- import { Object3D, WebGLRenderer, Scene, Camera } from 'three';
4
+ import { Object3D, WebGLRenderer, Scene, Camera, Box3, Material } from 'three';
5
5
  import { XRStore } from '@react-three/xr';
6
6
  import { x as SceneConfig, f as ObjectBinding, V as ViewerCameraState, e as ObjectActionEvent, u as SceneAnnotationMarker, o as ObjectBindingTarget, m as ObjectBindingPatch, B as BindingEdit, j as ObjectBindingMaterial, q as ObjectBindingTextureSlot, p as ObjectBindingTextureChannel, r as ObjectBindingTransform, z as SceneConfigPatch, E as SceneLight, F as SceneLightAttachment, g as ObjectBindingAction } from './utils-BUwXD_DX.mjs';
7
7
  export { A as AnimationAction, a as AnimationActionEffect, b as AnimationLoopMode, C as CameraAction, c as CameraActionEffect, D as DEFAULT_SCENE_CONFIG, M as MATERIAL_BLENDING_MODES, d as MATERIAL_SIDES, O as ObjectActionEffect, h as ObjectBindingActionId, i as ObjectBindingKey, k as ObjectBindingMaterialBlendingMode, l as ObjectBindingMaterialSide, n as ObjectBindingSelector, s as ObjectBindingsActionEffect, S as SceneAnimationClipConfig, t as SceneAnimationConfig, v as SceneCinematicConfig, w as SceneCinematicWaypoint, y as SceneConfigActionEffect, G as SceneLightType, H as SceneModelRenderer, I as VisibilityActionEffect, J as defineObjectBindings, K as material, L as patchBindings, N as patchSceneConfig, P as selectBindingKeys, Q as selectBindings } from './utils-BUwXD_DX.mjs';
@@ -36,6 +36,70 @@ declare function Viewer({ children, camera, backgroundColor, shadows, sceneConfi
36
36
 
37
37
  type PerformanceProfile = "auto" | "high" | "low";
38
38
 
39
+ type GltfDecoderConfig = {
40
+ dracoDecoderPath?: string | false;
41
+ ktx2TranscoderPath?: string | false;
42
+ meshopt?: boolean;
43
+ };
44
+
45
+ /** One entry of the object catalog the processor writes beside `tileset.json`. */
46
+ type TileObjectCatalogEntry = {
47
+ name: string;
48
+ triangles: number;
49
+ minimum: [number, number, number];
50
+ maximum: [number, number, number];
51
+ };
52
+ type StreamingTilesModelProps = {
53
+ url: string;
54
+ rotation?: [number, number, number];
55
+ errorTarget?: number;
56
+ cacheSize?: number;
57
+ /**
58
+ * Ceiling on the geometry and texture the renderer keeps resident, in MB.
59
+ * Reaching it does not degrade quality — it stops content being requested
60
+ * entirely — so it is a limit to stay under, not one to aim at.
61
+ */
62
+ memoryBudgetMB?: number;
63
+ /** Same decoder configuration the monolithic loader uses. */
64
+ decoderConfig?: GltfDecoderConfig;
65
+ /** Bindings keyed the same way as the monolithic viewer's. */
66
+ objectBindings?: Record<string, ObjectBinding>;
67
+ /** Live colour overrides from the editor's picker. */
68
+ itemMaterials?: Record<string, {
69
+ hex?: string;
70
+ }>;
71
+ /** Supplies the shading and renderer modes, as it does for the model path. */
72
+ sceneConfig?: SceneConfig;
73
+ selectedItem?: string | null;
74
+ /** Matches the monolithic viewer: a binding, not a node name. */
75
+ panelHoveredItem?: ObjectBinding | null;
76
+ highlightOnHover?: boolean;
77
+ onItemClick?: (binding: ObjectBinding) => void;
78
+ onItemHover?: (binding: ObjectBinding | null) => void;
79
+ /** Every bindable object in the model, available before any tile loads. */
80
+ onObjectCatalog?: (objects: TileObjectCatalogEntry[]) => void;
81
+ /**
82
+ * The whole model's world-space extent, reported as soon as tileset.json is
83
+ * parsed and long before any content is fetched. The viewer needs it to frame
84
+ * the camera; see the reporting effect below for why waiting is not an option.
85
+ */
86
+ onTilesetBounds?: (box: Box3) => void;
87
+ onModelLoaded?: (scene: Object3D) => void;
88
+ onLoadError?: (error: unknown) => void;
89
+ /**
90
+ * One representative resident mesh per binding, for the transform gizmo and
91
+ * for framing the camera. A streamed object has no single node — it exists
92
+ * once per resolved level of detail, and those come and go — so this is
93
+ * rebuilt as tiles arrive and are evicted rather than being written once.
94
+ */
95
+ nodeRefsOut?: React.MutableRefObject<Record<string, Object3D>>;
96
+ onNodeRefsChange?: () => void;
97
+ materialRefsOut?: React.MutableRefObject<Record<string, Material | Material[]>>;
98
+ /** 0-1. Eased here, so the value can be driven straight from a slider. */
99
+ explodeFactor?: number;
100
+ suspendBindingTransforms?: boolean;
101
+ };
102
+
39
103
  type ModelFormat = "glb" | "gltf" | "obj" | "fbx" | "usdz";
40
104
 
41
105
  type XRScaleMode = "normalized" | "real-world";
@@ -177,6 +241,12 @@ type ModelViewerProps = {
177
241
  tilesErrorTarget?: number;
178
242
  /** Maximum number of parsed tiles retained by the client cache. */
179
243
  tilesCacheSize?: number;
244
+ /**
245
+ * Every bindable object in a streamed model, read from the catalog the
246
+ * processor writes beside `tileset.json`. Reported once, before the tiles
247
+ * that contain those objects have necessarily loaded.
248
+ */
249
+ onObjectCatalog?: (objects: TileObjectCatalogEntry[]) => void;
180
250
  /** Explicit format for extensionless or signed model URLs. */
181
251
  modelFormat?: ModelFormat;
182
252
  licenseKey: string;
@@ -257,7 +327,7 @@ type ModelViewerProps = {
257
327
  onSceneConfigChange?: (config: SceneConfig) => void;
258
328
  showViewGizmo?: boolean;
259
329
  };
260
- declare function ModelViewer({ modelUrl, tilesetUrl, tilesErrorTarget, tilesCacheSize, modelFormat, licenseKey, licenseValidationUrl, objectBindings, selectedObject, panelHoveredObject, onObjectBindingsChange, onObjectSelect, onObjectHover, onObjectEditLeaseChange, onModelLoaded, onLoadError, onAction, onHiddenObjectsChange, onCameraChange, onViewerReady, onTextureUpload, onAnimationsReady, onAnnotationsChange, activeAnnotation: controlledActiveAnnotation, onActiveAnnotationChange, lights, camera, backgroundColor, shadows, showObjectBindingDataPanel, customObjectBindingDataPanel, customSceneObjectsPanel, showSceneObjectsPanel, showDownloadButton, downloadFilename, showResetButton, showLoadingOverlay, showMouseController, mouseControllerPosition, mouseControllerOpacity, moveSensitivity, zoomSensitivity, sceneConfig, onSceneConfigChange, disableZoom, zoomOnSelected, highlightOnHover, enableCameraControls, onAutoFit, refitOnResize, renderMode, maxDpr, preserveDrawingBuffer, performanceProfile, dracoDecoderPath, ktx2TranscoderPath, meshopt, showMeasureTools, showUvCheckerButton, showExplodeControls, cinematic, measurementUnit, enableXR, usdzUrl, arScaleMode, mobileHandoffUrl, showAnnotationNavigation, showAnnotationOnHover, moveModeEnabled, objectTransformSpace, enableKeyboardNavigation, showViewGizmo, }: ModelViewerProps): react_jsx_runtime.JSX.Element;
330
+ declare function ModelViewer({ modelUrl, tilesetUrl, tilesErrorTarget, tilesCacheSize, onObjectCatalog, modelFormat, licenseKey, licenseValidationUrl, objectBindings, selectedObject, panelHoveredObject, onObjectBindingsChange, onObjectSelect, onObjectHover, onObjectEditLeaseChange, onModelLoaded, onLoadError, onAction, onHiddenObjectsChange, onCameraChange, onViewerReady, onTextureUpload, onAnimationsReady, onAnnotationsChange, activeAnnotation: controlledActiveAnnotation, onActiveAnnotationChange, lights, camera, backgroundColor, shadows, showObjectBindingDataPanel, customObjectBindingDataPanel, customSceneObjectsPanel, showSceneObjectsPanel, showDownloadButton, downloadFilename, showResetButton, showLoadingOverlay, showMouseController, mouseControllerPosition, mouseControllerOpacity, moveSensitivity, zoomSensitivity, sceneConfig, onSceneConfigChange, disableZoom, zoomOnSelected, highlightOnHover, enableCameraControls, onAutoFit, refitOnResize, renderMode, maxDpr, preserveDrawingBuffer, performanceProfile, dracoDecoderPath, ktx2TranscoderPath, meshopt, showMeasureTools, showUvCheckerButton, showExplodeControls, cinematic, measurementUnit, enableXR, usdzUrl, arScaleMode, mobileHandoffUrl, showAnnotationNavigation, showAnnotationOnHover, moveModeEnabled, objectTransformSpace, enableKeyboardNavigation, showViewGizmo, }: ModelViewerProps): react_jsx_runtime.JSX.Element;
261
331
 
262
332
  type BindingBuilderProjectModel = {
263
333
  url: string;
@@ -642,4 +712,4 @@ type ShareableViewerStateProps = {
642
712
  };
643
713
  declare function useShareableViewerState({ cameraState, setCameraState, objectBindings, onObjectBindingsChange, selectedObjectBinding, setSelectedObjectBinding, paramKey, debounceMs, autoSync, }: UseShareableViewerStateOptions): ShareableViewerStateProps;
644
714
 
645
- export { type AnimationClipInfo, type AnimationControls, type AnimationPlaybackState, BindingBuilder, type BindingBuilderProject, type BindingBuilderProjectChangeOrigin, type BindingBuilderProjectModel, type BindingBuilderProjectSnapshot, type BindingBuilderProps, BindingEdit, type CaptureImageOptions, type CinematicConfig, type CinematicWaypoint, type CustomObjectBindingDataPanelProps, type CustomSceneObjectsPanelProps, type HiddenObjectsState, type HomeCameraState, type ModelFormat, ModelViewer, type ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type ObjectTransformSpace, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type UseViewerCameraOptions, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, type ViewerAnimationsProps, type ViewerCameraPreset, type ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, type ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, type XRScaleMode, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerAnimations, useViewerCamera, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
715
+ export { type AnimationClipInfo, type AnimationControls, type AnimationPlaybackState, BindingBuilder, type BindingBuilderProject, type BindingBuilderProjectChangeOrigin, type BindingBuilderProjectModel, type BindingBuilderProjectSnapshot, type BindingBuilderProps, BindingEdit, type CaptureImageOptions, type CinematicConfig, type CinematicWaypoint, type CustomObjectBindingDataPanelProps, type CustomSceneObjectsPanelProps, type HiddenObjectsState, type HomeCameraState, type ModelFormat, ModelViewer, type ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type ObjectTransformSpace, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type StreamingTilesModelProps, type TileObjectCatalogEntry, type UseViewerCameraOptions, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, type ViewerAnimationsProps, type ViewerCameraPreset, type ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, type ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, type XRScaleMode, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerAnimations, useViewerCamera, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ComponentProps, ReactNode, MutableRefObject } from 'react';
3
3
  import { CameraControls } from '@react-three/drei';
4
- import { Object3D, WebGLRenderer, Scene, Camera } from 'three';
4
+ import { Object3D, WebGLRenderer, Scene, Camera, Box3, Material } from 'three';
5
5
  import { XRStore } from '@react-three/xr';
6
6
  import { x as SceneConfig, f as ObjectBinding, V as ViewerCameraState, e as ObjectActionEvent, u as SceneAnnotationMarker, o as ObjectBindingTarget, m as ObjectBindingPatch, B as BindingEdit, j as ObjectBindingMaterial, q as ObjectBindingTextureSlot, p as ObjectBindingTextureChannel, r as ObjectBindingTransform, z as SceneConfigPatch, E as SceneLight, F as SceneLightAttachment, g as ObjectBindingAction } from './utils-BUwXD_DX.js';
7
7
  export { A as AnimationAction, a as AnimationActionEffect, b as AnimationLoopMode, C as CameraAction, c as CameraActionEffect, D as DEFAULT_SCENE_CONFIG, M as MATERIAL_BLENDING_MODES, d as MATERIAL_SIDES, O as ObjectActionEffect, h as ObjectBindingActionId, i as ObjectBindingKey, k as ObjectBindingMaterialBlendingMode, l as ObjectBindingMaterialSide, n as ObjectBindingSelector, s as ObjectBindingsActionEffect, S as SceneAnimationClipConfig, t as SceneAnimationConfig, v as SceneCinematicConfig, w as SceneCinematicWaypoint, y as SceneConfigActionEffect, G as SceneLightType, H as SceneModelRenderer, I as VisibilityActionEffect, J as defineObjectBindings, K as material, L as patchBindings, N as patchSceneConfig, P as selectBindingKeys, Q as selectBindings } from './utils-BUwXD_DX.js';
@@ -36,6 +36,70 @@ declare function Viewer({ children, camera, backgroundColor, shadows, sceneConfi
36
36
 
37
37
  type PerformanceProfile = "auto" | "high" | "low";
38
38
 
39
+ type GltfDecoderConfig = {
40
+ dracoDecoderPath?: string | false;
41
+ ktx2TranscoderPath?: string | false;
42
+ meshopt?: boolean;
43
+ };
44
+
45
+ /** One entry of the object catalog the processor writes beside `tileset.json`. */
46
+ type TileObjectCatalogEntry = {
47
+ name: string;
48
+ triangles: number;
49
+ minimum: [number, number, number];
50
+ maximum: [number, number, number];
51
+ };
52
+ type StreamingTilesModelProps = {
53
+ url: string;
54
+ rotation?: [number, number, number];
55
+ errorTarget?: number;
56
+ cacheSize?: number;
57
+ /**
58
+ * Ceiling on the geometry and texture the renderer keeps resident, in MB.
59
+ * Reaching it does not degrade quality — it stops content being requested
60
+ * entirely — so it is a limit to stay under, not one to aim at.
61
+ */
62
+ memoryBudgetMB?: number;
63
+ /** Same decoder configuration the monolithic loader uses. */
64
+ decoderConfig?: GltfDecoderConfig;
65
+ /** Bindings keyed the same way as the monolithic viewer's. */
66
+ objectBindings?: Record<string, ObjectBinding>;
67
+ /** Live colour overrides from the editor's picker. */
68
+ itemMaterials?: Record<string, {
69
+ hex?: string;
70
+ }>;
71
+ /** Supplies the shading and renderer modes, as it does for the model path. */
72
+ sceneConfig?: SceneConfig;
73
+ selectedItem?: string | null;
74
+ /** Matches the monolithic viewer: a binding, not a node name. */
75
+ panelHoveredItem?: ObjectBinding | null;
76
+ highlightOnHover?: boolean;
77
+ onItemClick?: (binding: ObjectBinding) => void;
78
+ onItemHover?: (binding: ObjectBinding | null) => void;
79
+ /** Every bindable object in the model, available before any tile loads. */
80
+ onObjectCatalog?: (objects: TileObjectCatalogEntry[]) => void;
81
+ /**
82
+ * The whole model's world-space extent, reported as soon as tileset.json is
83
+ * parsed and long before any content is fetched. The viewer needs it to frame
84
+ * the camera; see the reporting effect below for why waiting is not an option.
85
+ */
86
+ onTilesetBounds?: (box: Box3) => void;
87
+ onModelLoaded?: (scene: Object3D) => void;
88
+ onLoadError?: (error: unknown) => void;
89
+ /**
90
+ * One representative resident mesh per binding, for the transform gizmo and
91
+ * for framing the camera. A streamed object has no single node — it exists
92
+ * once per resolved level of detail, and those come and go — so this is
93
+ * rebuilt as tiles arrive and are evicted rather than being written once.
94
+ */
95
+ nodeRefsOut?: React.MutableRefObject<Record<string, Object3D>>;
96
+ onNodeRefsChange?: () => void;
97
+ materialRefsOut?: React.MutableRefObject<Record<string, Material | Material[]>>;
98
+ /** 0-1. Eased here, so the value can be driven straight from a slider. */
99
+ explodeFactor?: number;
100
+ suspendBindingTransforms?: boolean;
101
+ };
102
+
39
103
  type ModelFormat = "glb" | "gltf" | "obj" | "fbx" | "usdz";
40
104
 
41
105
  type XRScaleMode = "normalized" | "real-world";
@@ -177,6 +241,12 @@ type ModelViewerProps = {
177
241
  tilesErrorTarget?: number;
178
242
  /** Maximum number of parsed tiles retained by the client cache. */
179
243
  tilesCacheSize?: number;
244
+ /**
245
+ * Every bindable object in a streamed model, read from the catalog the
246
+ * processor writes beside `tileset.json`. Reported once, before the tiles
247
+ * that contain those objects have necessarily loaded.
248
+ */
249
+ onObjectCatalog?: (objects: TileObjectCatalogEntry[]) => void;
180
250
  /** Explicit format for extensionless or signed model URLs. */
181
251
  modelFormat?: ModelFormat;
182
252
  licenseKey: string;
@@ -257,7 +327,7 @@ type ModelViewerProps = {
257
327
  onSceneConfigChange?: (config: SceneConfig) => void;
258
328
  showViewGizmo?: boolean;
259
329
  };
260
- declare function ModelViewer({ modelUrl, tilesetUrl, tilesErrorTarget, tilesCacheSize, modelFormat, licenseKey, licenseValidationUrl, objectBindings, selectedObject, panelHoveredObject, onObjectBindingsChange, onObjectSelect, onObjectHover, onObjectEditLeaseChange, onModelLoaded, onLoadError, onAction, onHiddenObjectsChange, onCameraChange, onViewerReady, onTextureUpload, onAnimationsReady, onAnnotationsChange, activeAnnotation: controlledActiveAnnotation, onActiveAnnotationChange, lights, camera, backgroundColor, shadows, showObjectBindingDataPanel, customObjectBindingDataPanel, customSceneObjectsPanel, showSceneObjectsPanel, showDownloadButton, downloadFilename, showResetButton, showLoadingOverlay, showMouseController, mouseControllerPosition, mouseControllerOpacity, moveSensitivity, zoomSensitivity, sceneConfig, onSceneConfigChange, disableZoom, zoomOnSelected, highlightOnHover, enableCameraControls, onAutoFit, refitOnResize, renderMode, maxDpr, preserveDrawingBuffer, performanceProfile, dracoDecoderPath, ktx2TranscoderPath, meshopt, showMeasureTools, showUvCheckerButton, showExplodeControls, cinematic, measurementUnit, enableXR, usdzUrl, arScaleMode, mobileHandoffUrl, showAnnotationNavigation, showAnnotationOnHover, moveModeEnabled, objectTransformSpace, enableKeyboardNavigation, showViewGizmo, }: ModelViewerProps): react_jsx_runtime.JSX.Element;
330
+ declare function ModelViewer({ modelUrl, tilesetUrl, tilesErrorTarget, tilesCacheSize, onObjectCatalog, modelFormat, licenseKey, licenseValidationUrl, objectBindings, selectedObject, panelHoveredObject, onObjectBindingsChange, onObjectSelect, onObjectHover, onObjectEditLeaseChange, onModelLoaded, onLoadError, onAction, onHiddenObjectsChange, onCameraChange, onViewerReady, onTextureUpload, onAnimationsReady, onAnnotationsChange, activeAnnotation: controlledActiveAnnotation, onActiveAnnotationChange, lights, camera, backgroundColor, shadows, showObjectBindingDataPanel, customObjectBindingDataPanel, customSceneObjectsPanel, showSceneObjectsPanel, showDownloadButton, downloadFilename, showResetButton, showLoadingOverlay, showMouseController, mouseControllerPosition, mouseControllerOpacity, moveSensitivity, zoomSensitivity, sceneConfig, onSceneConfigChange, disableZoom, zoomOnSelected, highlightOnHover, enableCameraControls, onAutoFit, refitOnResize, renderMode, maxDpr, preserveDrawingBuffer, performanceProfile, dracoDecoderPath, ktx2TranscoderPath, meshopt, showMeasureTools, showUvCheckerButton, showExplodeControls, cinematic, measurementUnit, enableXR, usdzUrl, arScaleMode, mobileHandoffUrl, showAnnotationNavigation, showAnnotationOnHover, moveModeEnabled, objectTransformSpace, enableKeyboardNavigation, showViewGizmo, }: ModelViewerProps): react_jsx_runtime.JSX.Element;
261
331
 
262
332
  type BindingBuilderProjectModel = {
263
333
  url: string;
@@ -642,4 +712,4 @@ type ShareableViewerStateProps = {
642
712
  };
643
713
  declare function useShareableViewerState({ cameraState, setCameraState, objectBindings, onObjectBindingsChange, selectedObjectBinding, setSelectedObjectBinding, paramKey, debounceMs, autoSync, }: UseShareableViewerStateOptions): ShareableViewerStateProps;
644
714
 
645
- export { type AnimationClipInfo, type AnimationControls, type AnimationPlaybackState, BindingBuilder, type BindingBuilderProject, type BindingBuilderProjectChangeOrigin, type BindingBuilderProjectModel, type BindingBuilderProjectSnapshot, type BindingBuilderProps, BindingEdit, type CaptureImageOptions, type CinematicConfig, type CinematicWaypoint, type CustomObjectBindingDataPanelProps, type CustomSceneObjectsPanelProps, type HiddenObjectsState, type HomeCameraState, type ModelFormat, ModelViewer, type ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type ObjectTransformSpace, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type UseViewerCameraOptions, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, type ViewerAnimationsProps, type ViewerCameraPreset, type ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, type ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, type XRScaleMode, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerAnimations, useViewerCamera, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
715
+ export { type AnimationClipInfo, type AnimationControls, type AnimationPlaybackState, BindingBuilder, type BindingBuilderProject, type BindingBuilderProjectChangeOrigin, type BindingBuilderProjectModel, type BindingBuilderProjectSnapshot, type BindingBuilderProps, BindingEdit, type CaptureImageOptions, type CinematicConfig, type CinematicWaypoint, type CustomObjectBindingDataPanelProps, type CustomSceneObjectsPanelProps, type HiddenObjectsState, type HomeCameraState, type ModelFormat, ModelViewer, type ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type ObjectTransformSpace, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type StreamingTilesModelProps, type TileObjectCatalogEntry, type UseViewerCameraOptions, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, type ViewerAnimationsProps, type ViewerCameraPreset, type ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, type ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, type XRScaleMode, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerAnimations, useViewerCamera, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };