@splnlss/3d-story-viewer 0.8.1 → 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.
- package/build/computeElevation.cjs +1 -1
- package/build/computeElevation.js +2 -2
- package/build/{index-DaqGSC4W.js → index-BgprA821.js} +107 -18
- package/build/index-XZNzHig1.cjs +1 -0
- package/build/{main-CY1MzgxV.js → main-BUCkukV4.js} +757 -12
- package/build/main-yri0wVzb.cjs +1 -0
- package/build/{spark.module-Y1ABc5im.cjs → spark.module-CKmN4uMZ.cjs} +1 -1
- package/build/{spark.module-BGYmUUum.js → spark.module-T7c-X7OV.js} +2 -2
- package/build/types/src/viewer/WebXRSession.d.ts +75 -0
- package/build/types/src/viewer/XRAttributionPanel.d.ts +23 -0
- package/build/types/src/viewer/XRComfortOverlay.d.ts +15 -0
- package/build/types/src/viewer/XRFrameInput.d.ts +30 -0
- package/build/types/src/viewer/XRNavigationCue.d.ts +10 -0
- package/build/types/src/viewer/XRPlayerRig.d.ts +48 -0
- package/build/types/src/viewer/XRRenderBridge.d.ts +25 -0
- package/build/types/src/viewer/index.d.ts +82 -0
- package/build/types/src/viewer/updateTilesCamera.d.ts +2 -0
- package/build/viewer.cjs +1 -1
- package/build/viewer.js +3 -3
- package/package.json +1 -1
- package/build/index-D87IZDc6.cjs +0 -1
- package/build/main-DFAyOsl5.cjs +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { V as Vector3, a as Vector2, ak as Euler, M as Matrix4, Q as Quaternion, k as Color, bb as Vector4,
|
|
2
|
-
import { F as FullScreenQuad } from "./main-
|
|
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);
|
|
@@ -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;
|
|
@@ -80,6 +81,86 @@ declare class Viewer extends EventDispatcher {
|
|
|
80
81
|
sky: Sky;
|
|
81
82
|
pointerRaycaster: Raycaster;
|
|
82
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;
|
|
83
164
|
set keysEnabled(enabled: boolean);
|
|
84
165
|
get keysEnabled(): boolean;
|
|
85
166
|
updateMovementState(): void;
|
|
@@ -197,6 +278,7 @@ export namespace ViewerEvents {
|
|
|
197
278
|
let CONTENT_LAYER_ERROR: "content-layer-error";
|
|
198
279
|
}
|
|
199
280
|
import { EventDispatcher } from '../modules/EventDispatcher';
|
|
281
|
+
import { WebXRSession } from './WebXRSession.js';
|
|
200
282
|
import { StateDispatcher } from '../modules/StateDispatcher';
|
|
201
283
|
import { WebGLRenderer } from 'three';
|
|
202
284
|
import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
|
package/build/viewer.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./main-
|
|
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-
|
|
2
|
-
import {
|
|
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
|
-
|
|
6
|
+
by as computeElevation
|
|
7
7
|
};
|