@splnlss/3d-story-viewer 0.8.4 → 0.8.5

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.
@@ -6,6 +6,49 @@ export type ViewerCoords = {
6
6
  yaw?: number;
7
7
  roll?: number;
8
8
  };
9
+ /**
10
+ * WGS84 degrees and ellipsoidal metres.
11
+ */
12
+ export type DesktopGeodeticPosition = {
13
+ longitude: number;
14
+ latitude: number;
15
+ altitude: number;
16
+ };
17
+ /**
18
+ * WGS84 degrees, ellipsoidal metres, and Euler degrees.
19
+ */
20
+ export type DesktopCameraFramePose = {
21
+ lon: number;
22
+ lat: number;
23
+ alt: number;
24
+ pitch: number;
25
+ yaw: number;
26
+ roll: number;
27
+ };
28
+ export type DesktopMovementState = {
29
+ FRONT: boolean;
30
+ BACK: boolean;
31
+ LEFT: boolean;
32
+ RIGHT: boolean;
33
+ UP: boolean;
34
+ DOWN: boolean;
35
+ BOOST: boolean;
36
+ };
37
+ export type DesktopNavigationFrame = {
38
+ timeMs: number;
39
+ deltaSeconds: number;
40
+ pose: DesktopCameraFramePose;
41
+ movement: Readonly<DesktopMovementState>;
42
+ };
43
+ export type DesktopNavigationFrameResult = {
44
+ position: DesktopGeodeticPosition;
45
+ pitch?: number;
46
+ };
47
+ export type DesktopNavigationController = {
48
+ update(frame: DesktopNavigationFrame): DesktopNavigationFrameResult;
49
+ canLook?(): boolean;
50
+ interrupt?(reason: string): void;
51
+ };
9
52
  /**
10
53
  * @typedef {Object} ViewerCoords
11
54
  * @property {number} [lon]
@@ -15,6 +58,12 @@ export type ViewerCoords = {
15
58
  * @property {number} [yaw]
16
59
  * @property {number} [roll]
17
60
  */
61
+ /** @typedef {{longitude:number, latitude:number, altitude:number}} DesktopGeodeticPosition WGS84 degrees and ellipsoidal metres. */
62
+ /** @typedef {{lon:number, lat:number, alt:number, pitch:number, yaw:number, roll:number}} DesktopCameraFramePose WGS84 degrees, ellipsoidal metres, and Euler degrees. */
63
+ /** @typedef {{FRONT:boolean, BACK:boolean, LEFT:boolean, RIGHT:boolean, UP:boolean, DOWN:boolean, BOOST:boolean}} DesktopMovementState */
64
+ /** @typedef {{timeMs:number, deltaSeconds:number, pose:DesktopCameraFramePose, movement:Readonly<DesktopMovementState>}} DesktopNavigationFrame */
65
+ /** @typedef {{position:DesktopGeodeticPosition, pitch?:number}} DesktopNavigationFrameResult */
66
+ /** @typedef {{update(frame:DesktopNavigationFrame):DesktopNavigationFrameResult, canLook?():boolean, interrupt?(reason:string):void}} DesktopNavigationController */
18
67
  declare class Viewer extends EventDispatcher {
19
68
  /**
20
69
  * @param {HTMLElement | null} container
@@ -25,6 +74,11 @@ declare class Viewer extends EventDispatcher {
25
74
  type: string;
26
75
  disposed: boolean;
27
76
  xrSession: WebXRSession;
77
+ xrDiagnosticsRows: string[];
78
+ loadingDiagnosticsEnabled: boolean;
79
+ diagnosticFps: number;
80
+ diagnosticWindowStart: any;
81
+ diagnosticFrameCount: number;
28
82
  sparkRenderer: any;
29
83
  transparentBackground: boolean;
30
84
  state: StateDispatcher;
@@ -37,11 +91,24 @@ declare class Viewer extends EventDispatcher {
37
91
  cameraUp: Vector3;
38
92
  scene: Scene<import("three").Object3DEventMap>;
39
93
  content: Group<import("three").Object3DEventMap>;
94
+ contentLayerRegistry: ContentLayerRegistry;
95
+ splatDestinationPrefetch: SplatDestinationPrefetch;
40
96
  topLayerIndex: number;
41
97
  enabledLayers: any[];
42
98
  labels: Map<any, any>;
43
99
  features: Map<any, any>;
44
100
  globeControls: GlobeControls;
101
+ _viewModeState: {
102
+ version: number;
103
+ confirmedRotationSpeed: number;
104
+ };
105
+ /** @type {DesktopNavigationController | null} */
106
+ desktopNavigationController: DesktopNavigationController | null;
107
+ _desktopControlsBefore: {
108
+ enabled: boolean;
109
+ rotationSpeed: number;
110
+ };
111
+ desktopLookControls: DesktopLookControls;
45
112
  _onGlobeControlsStart: () => void;
46
113
  transitionControls: TransitionControls;
47
114
  tileDecoders: TileDecoders;
@@ -79,6 +146,8 @@ declare class Viewer extends EventDispatcher {
79
146
  _onKeyDown: (event: any) => void;
80
147
  _onKeyUp: (event: any) => void;
81
148
  _onResize: (event: any) => void;
149
+ _onWindowBlur: () => void;
150
+ _onVisibilityChange: () => void;
82
151
  sky: Sky;
83
152
  pointerRaycaster: Raycaster;
84
153
  _onPointerMove: (event: any) => void;
@@ -158,7 +227,16 @@ declare class Viewer extends EventDispatcher {
158
227
  setXRNavigationFade(opacity: number): void;
159
228
  set keysEnabled(enabled: boolean);
160
229
  get keysEnabled(): boolean;
230
+ _clearHeldKeys(): void;
161
231
  updateMovementState(): void;
232
+ /** Install one desktop camera owner. A null controller restores the prior globe controls. @param {DesktopNavigationController | null} controller */
233
+ setDesktopNavigationController(controller: DesktopNavigationController | null): void;
234
+ /** Rotate Walk view around its eye; pointer delta is CSS pixels. */
235
+ _applyDesktopLook(dx: any, dy: any): void;
236
+ /** Turn Walk toward north without moving its eye or leaving Walk. */
237
+ turnDesktopNorth(): boolean;
238
+ /** Invoke the desktop controller after globe input and before tiles/content/render. Invalid results leave the previous eye intact. */
239
+ _applyDesktopNavigationFrame(timeMs: any, deltaSeconds: any): void;
162
240
  /**
163
241
  * @param {number} lon
164
242
  * @param {number} lat
@@ -180,7 +258,6 @@ declare class Viewer extends EventDispatcher {
180
258
  setBackgroundColor(color: any): void;
181
259
  appendTo(container: any): void;
182
260
  container: any;
183
- stats: Stats;
184
261
  updateCameraDirections(): void;
185
262
  setAnimate(bool?: boolean): void;
186
263
  /** @param {Event} [event] */
@@ -190,8 +267,19 @@ declare class Viewer extends EventDispatcher {
190
267
  ensureSparkRenderer(): Promise<any>;
191
268
  disposeSparkRenderer(): void;
192
269
  sparkRendererGeneration: any;
270
+ /** @private @param {import('../main.js').ContentLayerDefinition} sourceLayerData */
271
+ private prepareContentLayerDefinition;
272
+ /** @private @param {import('../main.js').ContentLayerDefinition} layerData */
273
+ private createContentLayer;
274
+ /** @private */
275
+ private reportContentLayerError;
276
+ /** @private */
277
+ private refreshContentLayerDepth;
193
278
  /** @param {import('../main.js').ContentLayerDefinition[]} content */
194
279
  defineContentLayers(content?: import("../main.js").ContentLayerDefinition[]): void;
280
+ /** Replace, add, or remove one content layer without rebuilding its siblings. */
281
+ /** @param {string} id @param {import('../main.js').ContentLayerDefinition | null} definition */
282
+ replaceContentLayer(id: string, definition: import("../main.js").ContentLayerDefinition | null): void;
195
283
  enableContentLayers(labels?: any[]): void;
196
284
  setTimeFrame(start: any, end: any): void;
197
285
  timeFrameStart: Date;
@@ -240,8 +328,9 @@ declare class Viewer extends EventDispatcher {
240
328
  * @param {number} [yaw]
241
329
  * @param {number} [roll]
242
330
  * @param {number} [duration]
331
+ * @returns {Promise<boolean>} Whether the requested transition completed.
243
332
  */
244
- alignCamera(lon: number, lat: number, alt: number, pitch?: number, yaw?: number, roll?: number, duration?: number): Promise<void>;
333
+ alignCamera(lon: number, lat: number, alt: number, pitch?: number, yaw?: number, roll?: number, duration?: number): Promise<boolean>;
245
334
  /**
246
335
  * @param {number} lon
247
336
  * @param {number} lat
@@ -249,12 +338,13 @@ declare class Viewer extends EventDispatcher {
249
338
  * @param {number} [distance]
250
339
  * @param {number} [pitch]
251
340
  * @param {number} [duration]
341
+ * @returns {Promise<boolean>} Whether the requested transition completed.
252
342
  */
253
- focusCamera(lon: number, lat: number, alt: number, distance?: number, pitch?: number, duration?: number): Promise<void>;
343
+ focusCamera(lon: number, lat: number, alt: number, distance?: number, pitch?: number, duration?: number): Promise<boolean>;
254
344
  /**
255
345
  * Temporarily load Google 3D tiles around a WGS84 destination without changing the live view.
256
346
  * Position and altitude use degrees and WGS84 ellipsoidal metres; rotation uses degrees.
257
- * @param {{longitude:number, latitude:number, altitude:number, pitch:number, yaw:number, roll:number, resolutionPixels:128|256} | null} target
347
+ * @param {{longitude:number, latitude:number, altitude:number, pitch:number, yaw:number, roll:number, resolutionPixels:128|256, timeoutMs?:number} | null} target
258
348
  */
259
349
  setDestinationTilePrefetch(target: {
260
350
  longitude: number;
@@ -264,14 +354,50 @@ declare class Viewer extends EventDispatcher {
264
354
  yaw: number;
265
355
  roll: number;
266
356
  resolutionPixels: 128 | 256;
357
+ timeoutMs?: number;
267
358
  } | null): void;
359
+ /**
360
+ * Warm only active RAD layers at a WGS84 destination. This never changes the live camera.
361
+ * @param {{longitude:number, latitude:number, altitude:number, pitch:number, yaw:number, roll:number, layerIds:string[], mode:'desktop'|'xr', timeoutMs:number} | null} target
362
+ * @param {'cancel'|'arrival'} [clearReason]
363
+ */
364
+ setDestinationSplatPrefetch(target: {
365
+ longitude: number;
366
+ latitude: number;
367
+ altitude: number;
368
+ pitch: number;
369
+ yaw: number;
370
+ roll: number;
371
+ layerIds: string[];
372
+ mode: "desktop" | "xr";
373
+ timeoutMs: number;
374
+ } | null, clearReason?: "cancel" | "arrival"): void;
375
+ /** Optional viewer-owned counters, sampled by the app only while its stats setting is on.
376
+ * @param {boolean} enabled
377
+ */
378
+ setLoadingDiagnosticsEnabled(enabled: boolean): void;
379
+ getLoadingDiagnostics(): {
380
+ fps: number;
381
+ tilesVisible: number;
382
+ tilesPending: number;
383
+ tilesFailed: number;
384
+ radPages: number;
385
+ radPending: any;
386
+ gpuTextures: number;
387
+ };
388
+ /** Short numeric rows in a small lower-right panel for both XR eyes.
389
+ * @param {string[] | null} rows
390
+ */
391
+ setXRDiagnosticsPanel(rows: string[] | null): void;
268
392
  /**
269
393
  * @param {number} [pitch]
270
394
  * @param {number} [yaw]
271
395
  * @param {number} [duration]
396
+ * @returns {Promise<boolean>} Whether the requested transition completed.
272
397
  */
273
- angleCamera(pitch?: number, yaw?: number, duration?: number): Promise<void>;
274
- setViewMode(mode?: string): Promise<void>;
398
+ angleCamera(pitch?: number, yaw?: number, duration?: number): Promise<boolean>;
399
+ /** @param {'2d' | '3d'} [mode] @returns {Promise<boolean>} Whether the camera orientation transition completed. */
400
+ setViewMode(mode?: "2d" | "3d"): Promise<boolean>;
275
401
  exportScene(): void;
276
402
  saveScreenshot(name?: string): void;
277
403
  dispose(): void;
@@ -297,11 +423,13 @@ import { PerspectiveCamera } from 'three';
297
423
  import { Vector3 } from 'three';
298
424
  import { Scene } from 'three';
299
425
  import { Group } from 'three';
426
+ import { ContentLayerRegistry } from './ContentLayer/ContentLayerRegistry.js';
427
+ import { SplatDestinationPrefetch } from './SplatDestinationPrefetch.js';
300
428
  import { GlobeControls } from './GlobeControls';
429
+ import { DesktopLookControls } from './DesktopLookControls.js';
301
430
  import { TransitionControls } from './TransitionControls';
302
431
  import { TileDecoders } from './TileDecoders.js';
303
432
  import { GlobeManager } from './GlobeManager';
304
433
  import { Sky } from './Sky';
305
434
  import { Raycaster } from 'three';
306
- import Stats from 'stats.js';
307
435
  export { Viewer as default };
@@ -0,0 +1,10 @@
1
+ /** Counts are viewer-owned snapshots, not a percentage or total device memory. */
2
+ export function readLoadingDiagnostics(viewer: any): {
3
+ fps: number;
4
+ tilesVisible: number;
5
+ tilesPending: number;
6
+ tilesFailed: number;
7
+ radPages: number;
8
+ radPending: any;
9
+ gpuTextures: number;
10
+ };
@@ -3,14 +3,20 @@ export class WorkerPool {
3
3
  limit: number;
4
4
  queue: any[];
5
5
  workers: any[];
6
- workersResolve: any[];
6
+ active: any[];
7
7
  workerStatus: number;
8
8
  workerCreator: any;
9
+ disposed: boolean;
9
10
  initWorker(workerId: any): void;
10
11
  getIdleWorker(): number;
11
- onMessage(workerId: any, msg: any): void;
12
+ finishJob(workerId: any, job: any): boolean;
13
+ onMessage(workerId: any, worker: any, event: any): void;
14
+ onError(workerId: any, worker: any, event: any): void;
15
+ cancelJob(job: any): void;
16
+ startJob(workerId: any, job: any): void;
17
+ drain(): void;
12
18
  setWorkerCreator(workerCreator: any): void;
13
19
  setWorkerLimit(limit: any): void;
14
- postMessage(msg: any, transfer: any): Promise<any>;
20
+ postMessage(msg: any, transfer: any, { signal }?: {}): Promise<any>;
15
21
  dispose(): void;
16
22
  }
package/build/viewer.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./main-CNVle6K1.cjs"),t=require("./index-XZNzHig1.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-DXC7nIw_.cjs"),t=require("./index-XZNzHig1.cjs");exports.Viewer=e.Viewer,exports.ViewerEvents=e.ViewerEvents,exports.computeElevation=t.computeElevation;
package/build/viewer.js CHANGED
@@ -1,4 +1,4 @@
1
- import { V, a } from "./main-DZ2oJmQ9.js";
1
+ import { V, a } from "./main-DCLbtFn7.js";
2
2
  import { by } from "./index-a8PLKOvo.js";
3
3
  export {
4
4
  V as Viewer,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splnlss/3d-story-viewer",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"