@splnlss/3d-story-viewer 0.8.0 → 0.8.2

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.
@@ -1,5 +1,5 @@
1
- import { V as Vector3, a as Vector2, ak as Euler, M as Matrix4, Q as Quaternion, k as Color, aF as Vector4, bx as DataArrayTexture, by as RGIntegerFormat, bz as UnsignedIntType, bA as RGBAIntegerFormat, bB as WebGLArrayRenderTarget, y as NearestFilter, au as DataTexture, e as Raycaster, aO as RGBAFormat, at as UnsignedByteType, O as Object3D, b as Mesh, c as ShaderMaterial, W as DoubleSide, bC as GLSL3, bD as Timer, az as WebGLRenderTarget, m as SRGBColorSpace, ap as Matrix3, af as ColorManagement, a3 as PerspectiveCamera, a4 as OrthographicCamera, bE as WebGLCubeRenderTarget, l as LinearSRGBColorSpace, x as LinearFilter, av as LinearMipMapLinearFilter, bF as CubeCamera, bG as Camera, bH as PMREMGenerator, U as MeshStandardMaterial, L as Loader, F as FileLoader, ai as Box3, bh as UnsignedShortType, aI as FloatType, S as ShaderChunk, bI as InstancedBufferGeometry, s as BufferAttribute, aE as Matrix2, aK as REVISION, bJ as RawShaderMaterial } from "./index-Hz3jbrou.js";
2
- import { F as FullScreenQuad } from "./main-Bdopx4KL.js";
1
+ import { V as Vector3, a as Vector2, ak as Euler, M as Matrix4, Q as Quaternion, k as Color, bb as Vector4, bz as DataArrayTexture, bA as RGIntegerFormat, bB as UnsignedIntType, bC as RGBAIntegerFormat, bD as WebGLArrayRenderTarget, y as NearestFilter, aX as DataTexture, e as Raycaster, aQ as RGBAFormat, aR as UnsignedByteType, O as Object3D, b as Mesh, c as ShaderMaterial, W as DoubleSide, bE as GLSL3, bF as Timer, b5 as WebGLRenderTarget, m as SRGBColorSpace, ap as Matrix3, af as ColorManagement, a3 as PerspectiveCamera, a4 as OrthographicCamera, bG as WebGLCubeRenderTarget, l as LinearSRGBColorSpace, x as LinearFilter, b1 as LinearMipMapLinearFilter, bH as CubeCamera, bI as Camera, bJ as PMREMGenerator, U as MeshStandardMaterial, L as Loader, F as FileLoader, ai as Box3, aV as UnsignedShortType, aW as FloatType, S as ShaderChunk, bK as InstancedBufferGeometry, s as BufferAttribute, ba as Matrix2, be as REVISION, bL as RawShaderMaterial } from "./index-BgprA821.js";
2
+ import { F as FullScreenQuad } from "./main-BUCkukV4.js";
3
3
  const LN_SCALE_MIN = -12;
4
4
  const LN_SCALE_MAX = 9;
5
5
  const SCALE_MIN = Math.exp(LN_SCALE_MIN);
@@ -4,11 +4,11 @@ export class TilesLayer extends ContentLayer {
4
4
  firstSet: any;
5
5
  camera: any;
6
6
  renderer: any;
7
- dracoLoader: DRACOLoader;
8
- ktx2loader: KTX2Loader;
7
+ ownsDecoders: boolean;
8
+ decoders: any;
9
+ dracoLoader: any;
10
+ ktx2loader: any;
9
11
  tiles: TilesRenderer<import("3d-tiles-renderer").TilesRendererEventMap>;
10
12
  }
11
13
  import { ContentLayer } from '.';
12
- import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
13
- import { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';
14
14
  import { TilesRenderer } from '3d-tiles-renderer';
@@ -4,7 +4,9 @@ export class GlobeManager extends EventDispatcher {
4
4
  camera: any;
5
5
  renderer: any;
6
6
  tiles: TilesRenderer<import("3d-tiles-renderer").TilesRendererEventMap>;
7
- dracoLoader: DRACOLoader;
7
+ dracoLoader: any;
8
+ ownsDecoders: boolean;
9
+ decoders: any;
8
10
  apiToken: any;
9
11
  googleMapsToken: any;
10
12
  initTiles(): void;
@@ -13,4 +15,3 @@ export class GlobeManager extends EventDispatcher {
13
15
  }
14
16
  import { EventDispatcher } from '../modules/EventDispatcher';
15
17
  import { TilesRenderer } from '3d-tiles-renderer';
16
- import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
@@ -0,0 +1,11 @@
1
+ /** One lazy decoder owner per Viewer/WebGLRenderer. No tile queue or cache ownership. */
2
+ export class TileDecoders {
3
+ constructor(renderer: any);
4
+ renderer: any;
5
+ draco: any;
6
+ ktx2: any;
7
+ disposed: boolean;
8
+ getDraco(): any;
9
+ getKTX2(): any;
10
+ dispose(): void;
11
+ }
@@ -0,0 +1,75 @@
1
+ /** @typedef {{ lodSplatCount?: number, lodRenderScale?: number }} SparkProfile */
2
+ /** Owns one immersive session for a Viewer, including every desktop restoration path. */
3
+ export class WebXRSession {
4
+ /** @param {import('./index.js').default} viewer @param {{ onFrame?: (input: { time: number, frame: XRFrame, pose: XRViewerPose }) => void, onStateChange?: (active: boolean) => void, showAttribution?: boolean }} [options] */
5
+ constructor(viewer: import("./index.js").default, options?: {
6
+ onFrame?: (input: {
7
+ time: number;
8
+ frame: XRFrame;
9
+ pose: XRViewerPose;
10
+ }) => void;
11
+ onStateChange?: (active: boolean) => void;
12
+ showAttribution?: boolean;
13
+ });
14
+ viewer: import("./index.js").default;
15
+ onFrame: (input: {
16
+ time: number;
17
+ frame: XRFrame;
18
+ pose: XRViewerPose;
19
+ }) => void;
20
+ onStateChange: (active: boolean) => void;
21
+ showAttribution: boolean;
22
+ session: any;
23
+ starting: any;
24
+ bridge: {
25
+ getHeadPose: () => import("./XRPlayerRig.js").XRHeadPose;
26
+ getControllerWorldRay: (controller: any) => {
27
+ origin: import("three").Vector3Tuple;
28
+ direction: import("three").Vector3Tuple;
29
+ };
30
+ setNavigationCue: (cue: any) => void;
31
+ setTerrainCredits: (credits: any) => void;
32
+ setPlayerPose(pose: any): void;
33
+ hasUi(): boolean;
34
+ setNavigationLimit(reason: any): void;
35
+ setComfortMoving(moving: any): void;
36
+ setFade(opacity: any): void;
37
+ updateHeadPose(pose: any): void;
38
+ dispose(): void;
39
+ };
40
+ desktop: {
41
+ cameraWorld: import("three").Matrix4;
42
+ near: number;
43
+ far: number;
44
+ globeEnabled: boolean;
45
+ keysEnabled: boolean;
46
+ xrEnabled: boolean;
47
+ foveation: number;
48
+ referenceSpaceType: any;
49
+ framebufferScaleFactor: any;
50
+ labelRender: (scene: import("three").Scene, camera: import("three").Camera) => void;
51
+ ensureSparkRenderer: () => Promise<any>;
52
+ transitionAnimateTo: (position: any, quaternion: any, duration?: number) => Promise<any>;
53
+ tilesSchedulerSession: any;
54
+ };
55
+ /** @type {Map<object, SparkProfile>} */
56
+ sparkProfiles: Map<object, SparkProfile>;
57
+ disposed: boolean;
58
+ stopping: boolean;
59
+ endRequested: boolean;
60
+ active: boolean;
61
+ handleSessionEnd: () => void;
62
+ handleFrame: (time: any, frame: any) => void;
63
+ start(): any;
64
+ activate(requested: any): Promise<void>;
65
+ frame(time: any, frame: any): void;
66
+ applySparkProfile(spark: any): void;
67
+ cleanup(): void;
68
+ endSessionOnce(session: any): Promise<void>;
69
+ stop(): Promise<void>;
70
+ dispose(): Promise<void>;
71
+ }
72
+ export type SparkProfile = {
73
+ lodSplatCount?: number;
74
+ lodRenderScale?: number;
75
+ };
@@ -0,0 +1,23 @@
1
+ /** The renderer's current tile copyrights and the app's terrain credits. */
2
+ export function attributionText(tileAttributions?: any[], terrainCredits?: any[]): any[];
3
+ export function layoutAttributionLines(ctx: any, values: any): any;
4
+ /** One lightweight head-local texture is composited into both XR eye views. */
5
+ export class XRAttributionPanel {
6
+ canvas: HTMLCanvasElement;
7
+ context: CanvasRenderingContext2D;
8
+ texture: CanvasTexture<HTMLCanvasElement>;
9
+ mesh: Mesh<PlaneGeometry, MeshBasicMaterial, import("three").Object3DEventMap>;
10
+ terrainCredits: any[];
11
+ lastText: string;
12
+ lastTileCheckMs: number;
13
+ tileCredits: any[];
14
+ logos: HTMLImageElement[];
15
+ setTerrainCredits(credits: any): void;
16
+ update(headMatrix: any, tiles: any, timeMs: any): void;
17
+ draw(): void;
18
+ dispose(): void;
19
+ }
20
+ import { CanvasTexture } from 'three';
21
+ import { PlaneGeometry } from 'three';
22
+ import { MeshBasicMaterial } from 'three';
23
+ import { Mesh } from 'three';
@@ -0,0 +1,15 @@
1
+ /** Head-local peripheral motion vignette, drawn after the scene in both eyes. */
2
+ export class XRComfortOverlay {
3
+ material: ShaderMaterial;
4
+ mesh: Mesh<PlaneGeometry, ShaderMaterial, import("three").Object3DEventMap>;
5
+ moving: boolean;
6
+ navigationLimit: any;
7
+ fade: number;
8
+ setNavigationLimit(reason: any): boolean;
9
+ setFade(opacity: any): void;
10
+ update(headMatrix: any): void;
11
+ dispose(): void;
12
+ }
13
+ import { ShaderMaterial } from 'three';
14
+ import { PlaneGeometry } from 'three';
15
+ import { Mesh } from 'three';
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Copy the current WebXR input sample before the browser reuses its frame objects.
3
+ * Positions are local-reference-space metres; orientation is an XR quaternion.
4
+ * @param {XRFrame} frame
5
+ * @param {XRReferenceSpace | null} referenceSpace
6
+ */
7
+ export function readXRFrameInput(frame: XRFrame, referenceSpace: XRReferenceSpace | null): {
8
+ head: {
9
+ position: number[];
10
+ orientation: number[];
11
+ };
12
+ controllers: {
13
+ handedness: XRHandedness;
14
+ mapping: GamepadMappingType;
15
+ axes: number[];
16
+ buttons: {
17
+ pressed: boolean;
18
+ touched: boolean;
19
+ value: number;
20
+ }[];
21
+ ray: {
22
+ position: number[];
23
+ orientation: number[];
24
+ };
25
+ grip: {
26
+ position: number[];
27
+ orientation: number[];
28
+ };
29
+ }[];
30
+ };
@@ -0,0 +1,10 @@
1
+ /** Small, ordinary depth-tested scene geometry; never samples streamed visual layers. */
2
+ export class XRNavigationCue {
3
+ constructor(scene: any);
4
+ scene: any;
5
+ group: Group<import("three").Object3DEventMap>;
6
+ set(cue: any): void;
7
+ clearChildren(): void;
8
+ dispose(): void;
9
+ }
10
+ import { Group } from 'three';
@@ -0,0 +1,48 @@
1
+ /** @typedef {{worldEcef: [number, number, number], geodetic: {longitude: number, latitude: number, altitude: number}, headingDegrees: number, localHeadOffset: [number, number, number]}} XRHeadPose */
2
+ /** Keeps metre-scale tracked poses separate from double-precision WGS84 ECEF positions. */
3
+ export class XRPlayerRig {
4
+ /** @param {Matrix4} initialCameraWorld @param {XRRigidTransform} initialHeadPose */
5
+ constructor(initialCameraWorld: Matrix4, initialHeadPose: XRRigidTransform);
6
+ headLocal: Matrix4;
7
+ worldFromLocal: Matrix4;
8
+ anchor: {
9
+ longitude: number;
10
+ latitude: number;
11
+ altitude: number;
12
+ };
13
+ /** @param {XRRigidTransform} pose */
14
+ updateHeadPose(pose: XRRigidTransform): void;
15
+ getWorldFromLocalMatrix(): Matrix4;
16
+ getWorldHeadMatrix(): Matrix4;
17
+ /** @returns {XRHeadPose} WGS84 degrees, ellipsoidal altitude metres, ECEF metres, local-floor metres. */
18
+ getHeadPose(): XRHeadPose;
19
+ getNavigationFrame(): Matrix4;
20
+ /** Convert the copied WebXR target-ray transform to ECEF metres. */
21
+ getControllerWorldRay(controller: any): {
22
+ origin: import("three").Vector3Tuple;
23
+ direction: import("three").Vector3Tuple;
24
+ };
25
+ /**
26
+ * Places the tracked head at a WGS84 ellipsoidal position plus ENU metres.
27
+ * Heading is clockwise degrees from true north. Physical room-scale motion remains tracked.
28
+ */
29
+ setPose({ anchor, east, north, up, headingDegrees }: {
30
+ anchor: any;
31
+ east?: number;
32
+ north?: number;
33
+ up?: number;
34
+ headingDegrees: any;
35
+ }): void;
36
+ reanchor(headingDegrees: any): void;
37
+ }
38
+ export type XRHeadPose = {
39
+ worldEcef: [number, number, number];
40
+ geodetic: {
41
+ longitude: number;
42
+ latitude: number;
43
+ altitude: number;
44
+ };
45
+ headingDegrees: number;
46
+ localHeadOffset: [number, number, number];
47
+ };
48
+ import { Matrix4 } from 'three';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Places a metre-scale WebXR head under a double-precision ECEF anchor only
3
+ * while Three renders. The viewer's ordinary ECEF camera stays the scene camera.
4
+ * @param {import('./index.js').default} viewer
5
+ * @param {XRRigidTransform} initialHeadPose
6
+ * @param {{ showAttribution?: boolean }} [options]
7
+ */
8
+ export function createXRRenderBridge(viewer: import("./index.js").default, initialHeadPose: XRRigidTransform, { showAttribution }?: {
9
+ showAttribution?: boolean;
10
+ }): {
11
+ getHeadPose: () => import("./XRPlayerRig.js").XRHeadPose;
12
+ getControllerWorldRay: (controller: any) => {
13
+ origin: import("three").Vector3Tuple;
14
+ direction: import("three").Vector3Tuple;
15
+ };
16
+ setNavigationCue: (cue: any) => void;
17
+ setTerrainCredits: (credits: any) => void;
18
+ setPlayerPose(pose: any): void;
19
+ hasUi(): boolean;
20
+ setNavigationLimit(reason: any): void;
21
+ setComfortMoving(moving: any): void;
22
+ setFade(opacity: any): void;
23
+ updateHeadPose(pose: any): void;
24
+ dispose(): void;
25
+ };
@@ -24,6 +24,7 @@ declare class Viewer extends EventDispatcher {
24
24
  isViewer: boolean;
25
25
  type: string;
26
26
  disposed: boolean;
27
+ xrSession: WebXRSession;
27
28
  sparkRenderer: any;
28
29
  transparentBackground: boolean;
29
30
  state: StateDispatcher;
@@ -43,6 +44,7 @@ declare class Viewer extends EventDispatcher {
43
44
  globeControls: GlobeControls;
44
45
  _onGlobeControlsStart: () => void;
45
46
  transitionControls: TransitionControls;
47
+ tileDecoders: TileDecoders;
46
48
  globeManager: GlobeManager;
47
49
  /** @type {ViewerCoords} */
48
50
  cameraCoords: ViewerCoords;
@@ -79,6 +81,86 @@ declare class Viewer extends EventDispatcher {
79
81
  sky: Sky;
80
82
  pointerRaycaster: Raycaster;
81
83
  _onPointerMove: (event: any) => void;
84
+ get xrActive(): boolean;
85
+ /** @param {{ onFrame?: (input: { time: number, frame: XRFrame, pose: XRViewerPose }) => void, onStateChange?: (active: boolean) => void, showAttribution?: boolean }} [options] */
86
+ startXRSession(options?: {
87
+ onFrame?: (input: {
88
+ time: number;
89
+ frame: XRFrame;
90
+ pose: XRViewerPose;
91
+ }) => void;
92
+ onStateChange?: (active: boolean) => void;
93
+ showAttribution?: boolean;
94
+ }): any;
95
+ endXRSession(): Promise<void>;
96
+ /** @param {XRFrame} frame */
97
+ getXRFrameInput(frame: XRFrame): {
98
+ head: {
99
+ position: number[];
100
+ orientation: number[];
101
+ };
102
+ controllers: {
103
+ handedness: XRHandedness;
104
+ mapping: GamepadMappingType;
105
+ axes: number[];
106
+ buttons: {
107
+ pressed: boolean;
108
+ touched: boolean;
109
+ value: number;
110
+ }[];
111
+ ray: {
112
+ position: number[];
113
+ orientation: number[];
114
+ };
115
+ grip: {
116
+ position: number[];
117
+ orientation: number[];
118
+ };
119
+ }[];
120
+ };
121
+ /** @param {{ anchor: { longitude: number, latitude: number, altitude: number }, east?: number, north?: number, up?: number, headingDegrees: number }} pose */
122
+ setXRPlayerPose(pose: {
123
+ anchor: {
124
+ longitude: number;
125
+ latitude: number;
126
+ altitude: number;
127
+ };
128
+ east?: number;
129
+ north?: number;
130
+ up?: number;
131
+ headingDegrees: number;
132
+ }): void;
133
+ /** @returns {import('./XRPlayerRig.js').XRHeadPose | null} */
134
+ getXRHeadPose(): import("./XRPlayerRig.js").XRHeadPose | null;
135
+ /** @param {{ray: {position: number[], orientation: number[]} | null}} controller @returns {{origin: number[], direction: number[]} | null} */
136
+ getXRControllerWorldRay(controller: {
137
+ ray: {
138
+ position: number[];
139
+ orientation: number[];
140
+ } | null;
141
+ }): {
142
+ origin: number[];
143
+ direction: number[];
144
+ } | null;
145
+ /** @param {boolean} moving */
146
+ setXRComfortMoving(moving: boolean): void;
147
+ /** @param {'floor' | 'unknown' | 'loading' | null} reason */
148
+ setXRNavigationLimit(reason: "floor" | "unknown" | "loading" | null): void;
149
+ /** @param {{anchor: {longitude: number, latitude: number, altitude: number}, arc: readonly (readonly [number, number, number])[], marker: readonly [number, number, number] | null, state: 'valid' | 'blocked' | 'unknown'} | null} cue */
150
+ setXRNavigationCue(cue: {
151
+ anchor: {
152
+ longitude: number;
153
+ latitude: number;
154
+ altitude: number;
155
+ };
156
+ arc: readonly (readonly [number, number, number])[];
157
+ marker: readonly [number, number, number] | null;
158
+ state: "valid" | "blocked" | "unknown";
159
+ } | null): void;
160
+ /** @param {readonly string[]} credits Current Cesium World Terrain asset credits. */
161
+ setXRAttribution(credits: readonly string[]): void;
162
+ /** @param {number} opacity Black headset fade, 0 to 1. */
163
+ setXRNavigationFade(opacity: number): void;
82
164
  set keysEnabled(enabled: boolean);
83
165
  get keysEnabled(): boolean;
84
166
  updateMovementState(): void;
@@ -196,6 +278,7 @@ export namespace ViewerEvents {
196
278
  let CONTENT_LAYER_ERROR: "content-layer-error";
197
279
  }
198
280
  import { EventDispatcher } from '../modules/EventDispatcher';
281
+ import { WebXRSession } from './WebXRSession.js';
199
282
  import { StateDispatcher } from '../modules/StateDispatcher';
200
283
  import { WebGLRenderer } from 'three';
201
284
  import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
@@ -206,6 +289,7 @@ import { Scene } from 'three';
206
289
  import { Group } from 'three';
207
290
  import { GlobeControls } from './GlobeControls';
208
291
  import { TransitionControls } from './TransitionControls';
292
+ import { TileDecoders } from './TileDecoders.js';
209
293
  import { GlobeManager } from './GlobeManager';
210
294
  import { Sky } from './Sky';
211
295
  import { Raycaster } from 'three';
@@ -0,0 +1,2 @@
1
+ /** Keep tile screen-space error tied to the current headset eye viewport. */
2
+ export function updateTilesCamera(tiles: any, camera: any, renderer: any): void;
package/build/viewer.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./main-CaYKxosA.cjs"),t=require("./index-D87IZDc6.cjs");exports.Viewer=e.Viewer,exports.ViewerEvents=e.ViewerEvents,exports.computeElevation=t.computeElevation;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./main-yri0wVzb.cjs"),t=require("./index-XZNzHig1.cjs");exports.Viewer=e.Viewer,exports.ViewerEvents=e.ViewerEvents,exports.computeElevation=t.computeElevation;
package/build/viewer.js CHANGED
@@ -1,7 +1,7 @@
1
- import { V, a } from "./main-Bdopx4KL.js";
2
- import { bw } from "./index-Hz3jbrou.js";
1
+ import { V, a } from "./main-BUCkukV4.js";
2
+ import { by } from "./index-BgprA821.js";
3
3
  export {
4
4
  V as Viewer,
5
5
  a as ViewerEvents,
6
- bw as computeElevation
6
+ by as computeElevation
7
7
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splnlss/3d-story-viewer",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"