@loaders.gl/tiles 5.0.0-alpha.1 → 5.0.0-alpha.10
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/LICENSE +14 -3
- package/README.md +26 -0
- package/dist/dist.dev.js +20271 -5055
- package/dist/dist.min.js +3 -1
- package/dist/index.cjs +7849 -2081
- package/dist/index.cjs.map +3 -4
- package/dist/index.d.ts +25 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/point-cloud/point-cloud-tile.d.ts.map +1 -1
- package/dist/point-cloud/point-cloud-tile.js +3 -0
- package/dist/point-cloud/point-cloud-tile.js.map +1 -1
- package/dist/point-cloud/point-cloud-tileset.d.ts +4 -0
- package/dist/point-cloud/point-cloud-tileset.d.ts.map +1 -1
- package/dist/point-cloud/point-cloud-tileset.js +54 -12
- package/dist/point-cloud/point-cloud-tileset.js.map +1 -1
- package/dist/point-cloud/types.d.ts +17 -0
- package/dist/point-cloud/types.d.ts.map +1 -1
- package/dist/point-cloud/types.js +3 -0
- package/dist/point-cloud/types.js.map +1 -1
- package/dist/raster-set.d.ts +48 -31
- package/dist/raster-set.d.ts.map +1 -1
- package/dist/raster-set.js +104 -24
- package/dist/raster-set.js.map +1 -1
- package/dist/spatial/format-spatial-reference.d.ts +68 -0
- package/dist/spatial/format-spatial-reference.d.ts.map +1 -0
- package/dist/spatial/format-spatial-reference.js +291 -0
- package/dist/spatial/format-spatial-reference.js.map +1 -0
- package/dist/spatial/get-spatial-coordinate-frame.d.ts +20 -0
- package/dist/spatial/get-spatial-coordinate-frame.d.ts.map +1 -0
- package/dist/spatial/get-spatial-coordinate-frame.js +139 -0
- package/dist/spatial/get-spatial-coordinate-frame.js.map +1 -0
- package/dist/spatial/i3s-elevation.d.ts +20 -0
- package/dist/spatial/i3s-elevation.d.ts.map +1 -0
- package/dist/spatial/i3s-elevation.js +90 -0
- package/dist/spatial/i3s-elevation.js.map +1 -0
- package/dist/spatial/i3s-spatial-transformer.d.ts +189 -0
- package/dist/spatial/i3s-spatial-transformer.d.ts.map +1 -0
- package/dist/spatial/i3s-spatial-transformer.js +686 -0
- package/dist/spatial/i3s-spatial-transformer.js.map +1 -0
- package/dist/spatial/normalize-crs-identifier.d.ts +15 -0
- package/dist/spatial/normalize-crs-identifier.d.ts.map +1 -0
- package/dist/spatial/normalize-crs-identifier.js +22 -0
- package/dist/spatial/normalize-crs-identifier.js.map +1 -0
- package/dist/spatial/spatial-coordinate-transformer.d.ts +52 -0
- package/dist/spatial/spatial-coordinate-transformer.d.ts.map +1 -0
- package/dist/spatial/spatial-coordinate-transformer.js +295 -0
- package/dist/spatial/spatial-coordinate-transformer.js.map +1 -0
- package/dist/spatial/spatial-resource-registry.d.ts +44 -0
- package/dist/spatial/spatial-resource-registry.d.ts.map +1 -0
- package/dist/spatial/spatial-resource-registry.js +67 -0
- package/dist/spatial/spatial-resource-registry.js.map +1 -0
- package/dist/spatial/spatial-types.d.ts +190 -0
- package/dist/spatial/spatial-types.d.ts.map +1 -0
- package/dist/spatial/spatial-types.js +192 -0
- package/dist/spatial/spatial-types.js.map +1 -0
- package/dist/spatial/tiles-3d-spatial-transformer.d.ts +32 -0
- package/dist/spatial/tiles-3d-spatial-transformer.d.ts.map +1 -0
- package/dist/spatial/tiles-3d-spatial-transformer.js +175 -0
- package/dist/spatial/tiles-3d-spatial-transformer.js.map +1 -0
- package/dist/tileset-2d/adapter.d.ts +2 -3
- package/dist/tileset-2d/adapter.d.ts.map +1 -1
- package/dist/tileset-2d/tileset-2d.d.ts +2 -3
- package/dist/tileset-2d/tileset-2d.d.ts.map +1 -1
- package/dist/tileset-2d/tileset-2d.js.map +1 -1
- package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts +3 -3
- package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts.map +1 -1
- package/dist/tileset-3d/common/indexed-archive-tileset-source.js +9 -4
- package/dist/tileset-3d/common/indexed-archive-tileset-source.js.map +1 -1
- package/dist/tileset-3d/common/tile-3d-contracts.d.ts +63 -0
- package/dist/tileset-3d/common/tile-3d-contracts.d.ts.map +1 -0
- package/dist/tileset-3d/common/tile-3d-contracts.js +51 -0
- package/dist/tileset-3d/common/tile-3d-contracts.js.map +1 -0
- package/dist/tileset-3d/common/tile-3d.d.ts +176 -5
- package/dist/tileset-3d/common/tile-3d.d.ts.map +1 -1
- package/dist/tileset-3d/common/tile-3d.js +523 -89
- package/dist/tileset-3d/common/tile-3d.js.map +1 -1
- package/dist/tileset-3d/common/tileset-3d.d.ts +192 -9
- package/dist/tileset-3d/common/tileset-3d.d.ts.map +1 -1
- package/dist/tileset-3d/common/tileset-3d.js +303 -23
- package/dist/tileset-3d/common/tileset-3d.js.map +1 -1
- package/dist/tileset-3d/common/tileset-cache.d.ts +11 -1
- package/dist/tileset-3d/common/tileset-cache.d.ts.map +1 -1
- package/dist/tileset-3d/common/tileset-cache.js +11 -3
- package/dist/tileset-3d/common/tileset-cache.js.map +1 -1
- package/dist/tileset-3d/common/tileset-content-traversal.d.ts +37 -0
- package/dist/tileset-3d/common/tileset-content-traversal.d.ts.map +1 -0
- package/dist/tileset-3d/common/tileset-content-traversal.js +80 -0
- package/dist/tileset-3d/common/tileset-content-traversal.js.map +1 -0
- package/dist/tileset-3d/common/tileset-observability.d.ts +60 -0
- package/dist/tileset-3d/common/tileset-observability.d.ts.map +1 -0
- package/dist/tileset-3d/common/tileset-observability.js +39 -0
- package/dist/tileset-3d/common/tileset-observability.js.map +1 -0
- package/dist/tileset-3d/common/tileset-source.d.ts +51 -9
- package/dist/tileset-3d/common/tileset-source.d.ts.map +1 -1
- package/dist/tileset-3d/common/tileset-source.js.map +1 -1
- package/dist/tileset-3d/common/tileset-traverser.d.ts +33 -1
- package/dist/tileset-3d/common/tileset-traverser.d.ts.map +1 -1
- package/dist/tileset-3d/common/tileset-traverser.js +59 -11
- package/dist/tileset-3d/common/tileset-traverser.js.map +1 -1
- package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts +182 -0
- package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts.map +1 -0
- package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js +681 -0
- package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js.map +1 -0
- package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts +127 -6
- package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts.map +1 -1
- package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js +485 -27
- package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js.map +1 -1
- package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts +103 -0
- package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -1
- package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js +278 -0
- package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.js +3 -0
- package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.js.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-source.d.ts +23 -6
- package/dist/tileset-3d/format-i3s/i3s-source.d.ts.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-source.js +176 -25
- package/dist/tileset-3d/format-i3s/i3s-source.js.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-tile-manager.d.ts.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-tile-manager.js +3 -0
- package/dist/tileset-3d/format-i3s/i3s-tile-manager.js.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.d.ts.map +1 -1
- package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.js +4 -1
- package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.js.map +1 -1
- package/dist/tileset-3d/helpers/3d-tiles-options.d.ts.map +1 -1
- package/dist/tileset-3d/helpers/3d-tiles-options.js +3 -0
- package/dist/tileset-3d/helpers/3d-tiles-options.js.map +1 -1
- package/dist/tileset-3d/helpers/bounding-volume.d.ts +7 -3
- package/dist/tileset-3d/helpers/bounding-volume.d.ts.map +1 -1
- package/dist/tileset-3d/helpers/bounding-volume.js +20 -91
- package/dist/tileset-3d/helpers/bounding-volume.js.map +1 -1
- package/dist/tileset-3d/helpers/frame-state.d.ts +67 -2
- package/dist/tileset-3d/helpers/frame-state.d.ts.map +1 -1
- package/dist/tileset-3d/helpers/frame-state.js +92 -10
- package/dist/tileset-3d/helpers/frame-state.js.map +1 -1
- package/dist/tileset-3d/helpers/i3s-lod.d.ts.map +1 -1
- package/dist/tileset-3d/helpers/i3s-lod.js +20 -8
- package/dist/tileset-3d/helpers/i3s-lod.js.map +1 -1
- package/dist/tileset-3d/helpers/s2-bounding-volume.d.ts +17 -0
- package/dist/tileset-3d/helpers/s2-bounding-volume.d.ts.map +1 -0
- package/dist/tileset-3d/helpers/s2-bounding-volume.js +20 -0
- package/dist/tileset-3d/helpers/s2-bounding-volume.js.map +1 -0
- package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts +61 -9
- package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts.map +1 -1
- package/dist/tileset-3d/helpers/tiles-3d-lod.js +198 -93
- package/dist/tileset-3d/helpers/tiles-3d-lod.js.map +1 -1
- package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts +134 -0
- package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts.map +1 -0
- package/dist/tileset-3d/helpers/tiles-3d-request-priority.js +179 -0
- package/dist/tileset-3d/helpers/tiles-3d-request-priority.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/doubly-linked-list.d.ts.map +1 -1
- package/dist/utils/doubly-linked-list.js +1 -0
- package/dist/utils/doubly-linked-list.js.map +1 -1
- package/dist/utils/managed-array.d.ts.map +1 -1
- package/dist/utils/managed-array.js +1 -0
- package/dist/utils/managed-array.js.map +1 -1
- package/package.json +12 -10
- package/src/index.ts +78 -1
- package/src/point-cloud/point-cloud-tile.ts +4 -0
- package/src/point-cloud/point-cloud-tileset.ts +70 -12
- package/src/point-cloud/types.ts +21 -0
- package/src/raster-set.ts +197 -67
- package/src/spatial/format-spatial-reference.ts +385 -0
- package/src/spatial/get-spatial-coordinate-frame.ts +169 -0
- package/src/spatial/i3s-elevation.ts +96 -0
- package/src/spatial/i3s-spatial-transformer.ts +957 -0
- package/src/spatial/normalize-crs-identifier.ts +26 -0
- package/src/spatial/spatial-coordinate-transformer.ts +376 -0
- package/src/spatial/spatial-resource-registry.ts +79 -0
- package/src/spatial/spatial-types.ts +422 -0
- package/src/spatial/tiles-3d-spatial-transformer.ts +206 -0
- package/src/tileset-2d/adapter.ts +2 -3
- package/src/tileset-2d/tileset-2d.ts +2 -3
- package/src/tileset-3d/common/indexed-archive-tileset-source.ts +13 -13
- package/src/tileset-3d/common/tile-3d-contracts.ts +115 -0
- package/src/tileset-3d/common/tile-3d.ts +629 -98
- package/src/tileset-3d/common/tileset-3d.ts +459 -29
- package/src/tileset-3d/common/tileset-cache.ts +15 -7
- package/src/tileset-3d/common/tileset-content-traversal.ts +114 -0
- package/src/tileset-3d/common/tileset-observability.ts +100 -0
- package/src/tileset-3d/common/tileset-source.ts +63 -13
- package/src/tileset-3d/common/tileset-traverser.ts +71 -11
- package/src/tileset-3d/format-3d-tiles/implicit-tiling.ts +1059 -0
- package/src/tileset-3d/format-3d-tiles/tiles-3d-source.ts +674 -28
- package/src/tileset-3d/format-3d-tiles/tileset-3d-traverser.ts +316 -0
- package/src/tileset-3d/format-i3s/i3s-pending-tiles-register.ts +4 -0
- package/src/tileset-3d/format-i3s/i3s-source.ts +220 -29
- package/src/tileset-3d/format-i3s/i3s-tile-manager.ts +4 -0
- package/src/tileset-3d/format-i3s/i3s-tileset-traverser.ts +6 -1
- package/src/tileset-3d/helpers/3d-tiles-options.ts +4 -0
- package/src/tileset-3d/helpers/bounding-volume.ts +31 -114
- package/src/tileset-3d/helpers/frame-state.ts +152 -13
- package/src/tileset-3d/helpers/i3s-lod.ts +22 -8
- package/src/tileset-3d/helpers/s2-bounding-volume.ts +35 -0
- package/src/tileset-3d/helpers/tiles-3d-lod.ts +291 -112
- package/src/tileset-3d/helpers/tiles-3d-request-priority.ts +301 -0
- package/src/types.ts +11 -0
- package/src/utils/doubly-linked-list.ts +2 -0
- package/src/utils/managed-array.ts +2 -0
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
1
5
|
import type {Tile3D} from '../common/tile-3d';
|
|
2
6
|
import {Vector3} from '@math.gl/core';
|
|
3
7
|
import {CullingVolume, Plane} from '@math.gl/culling';
|
|
@@ -6,20 +10,60 @@ import {GeospatialViewport, Viewport} from '../../types';
|
|
|
6
10
|
|
|
7
11
|
export type FrameState = {
|
|
8
12
|
camera: {
|
|
13
|
+
/** Camera position in WGS84 Cartesian meters. */
|
|
9
14
|
position: number[];
|
|
15
|
+
/** Normalized camera direction in WGS84 Cartesian coordinates. */
|
|
10
16
|
direction: number[];
|
|
17
|
+
/** Normalized camera up direction in WGS84 Cartesian coordinates. */
|
|
11
18
|
up: number[];
|
|
19
|
+
/** Camera position as `[longitude, latitude, height]`, with height in meters. */
|
|
20
|
+
cartographicPosition: [number, number, number];
|
|
21
|
+
/** Perspective vertical field of view in radians. */
|
|
22
|
+
verticalFieldOfView: number;
|
|
23
|
+
/** Elapsed seconds since camera position or direction last changed. */
|
|
24
|
+
timeSinceMovement: number;
|
|
12
25
|
};
|
|
13
26
|
viewport: GeospatialViewport;
|
|
14
27
|
topDownViewport: GeospatialViewport; // Use it to calculate projected radius for a tile
|
|
15
28
|
height: number;
|
|
16
29
|
cullingVolume: CullingVolume;
|
|
30
|
+
/** Optional world-space clipping planes applied to render-content culling. */
|
|
31
|
+
clippingPlanes?: Plane[];
|
|
17
32
|
frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?
|
|
18
|
-
|
|
33
|
+
/** Perspective projection factor: twice the tangent of half the vertical field of view. */
|
|
34
|
+
sseDenominator: number;
|
|
35
|
+
/** View-dependent density used by perspective dynamic screen-space error for this traversal. */
|
|
36
|
+
dynamicScreenSpaceErrorDensity: number;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Optional camera and projection measurements supplied when constructing a frame state. */
|
|
40
|
+
export type GetFrameStateOptions = {
|
|
41
|
+
/** Elapsed seconds since camera position or direction last changed. */
|
|
42
|
+
timeSinceCameraMovement?: number;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Camera pose and timestamp retained between traversal frames. */
|
|
46
|
+
export type CameraMotionState = {
|
|
47
|
+
/** Last observed Earth-centered, Earth-fixed camera position. */
|
|
48
|
+
position: number[];
|
|
49
|
+
/** Last observed normalized Earth-centered, Earth-fixed camera direction. */
|
|
50
|
+
direction: number[];
|
|
51
|
+
/** Timestamp in milliseconds of the last observed pose change. */
|
|
52
|
+
lastMovementTime: number;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** Updated camera state and elapsed stationary time for a traversal frame. */
|
|
56
|
+
export type CameraMotionUpdate = {
|
|
57
|
+
/** Camera pose to retain for the next traversal. */
|
|
58
|
+
state: CameraMotionState;
|
|
59
|
+
/** Elapsed seconds since the camera pose last changed. */
|
|
60
|
+
timeSinceMovement: number;
|
|
19
61
|
};
|
|
20
62
|
|
|
21
63
|
const scratchVector = new Vector3();
|
|
22
64
|
const scratchPosition = new Vector3();
|
|
65
|
+
const CAMERA_POSITION_EPSILON = 1e-5;
|
|
66
|
+
const CAMERA_DIRECTION_EPSILON = 1e-7;
|
|
23
67
|
const cullingVolume = new CullingVolume([
|
|
24
68
|
new Plane(),
|
|
25
69
|
new Plane(),
|
|
@@ -29,12 +73,30 @@ const cullingVolume = new CullingVolume([
|
|
|
29
73
|
new Plane()
|
|
30
74
|
]);
|
|
31
75
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Extracts a frame state appropriate for tile culling from a structural deck.gl viewport.
|
|
78
|
+
*
|
|
79
|
+
* The viewport must describe the render camera, including its elevation. Geographic heights
|
|
80
|
+
* returned by `unprojectPosition` are used directly; adding a terrain offset only to traversal
|
|
81
|
+
* would make visibility, camera distances, and screen-space error disagree with rendering.
|
|
82
|
+
*
|
|
83
|
+
* `options.timeSinceCameraMovement` can be supplied by a caller that retains camera pose across
|
|
84
|
+
* calls. It defaults to a stationary camera so standalone callers do not defer requests.
|
|
85
|
+
*
|
|
86
|
+
* @param viewport - Geospatial viewport supplying camera and projection measurements.
|
|
87
|
+
* @param frameNumber - Current tileset traversal frame number.
|
|
88
|
+
* @param options - Additional camera and projection measurements for traversal.
|
|
89
|
+
* @returns Frame state used for visibility, SSE, and request-priority calculations.
|
|
90
|
+
*/
|
|
91
|
+
export function getFrameState(
|
|
92
|
+
viewport: GeospatialViewport,
|
|
93
|
+
frameNumber: number,
|
|
94
|
+
options: GetFrameStateOptions = {}
|
|
95
|
+
): FrameState {
|
|
35
96
|
// Traverse and and request. Update _selectedTiles so that we know what to render.
|
|
36
97
|
// Traverse and and request. Update _selectedTiles so that we know what to render.
|
|
37
|
-
const {
|
|
98
|
+
const {cameraUp, height} = viewport;
|
|
99
|
+
const cameraDirection = viewport.cameraDirection as number[] | undefined;
|
|
38
100
|
const {metersPerUnit} = viewport.distanceScales;
|
|
39
101
|
|
|
40
102
|
// TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.
|
|
@@ -49,10 +111,26 @@ export function getFrameState(viewport: GeospatialViewport, frameNumber: number)
|
|
|
49
111
|
);
|
|
50
112
|
|
|
51
113
|
// These should still be normalized as the transform has scale 1 (goes from meters to meters)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
114
|
+
let cameraDirectionCartesian: Vector3;
|
|
115
|
+
if (cameraDirection) {
|
|
116
|
+
cameraDirectionCartesian = new Vector3(
|
|
117
|
+
// @ts-ignore
|
|
118
|
+
enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))
|
|
119
|
+
).normalize();
|
|
120
|
+
} else {
|
|
121
|
+
// Concrete deck.gl viewports do not expose the legacy structural cameraDirection field.
|
|
122
|
+
// The near-plane center is on the view axis, so its world-space direction is equivalent and
|
|
123
|
+
// works for perspective foveation without coupling loaders.gl to deck.gl internals.
|
|
124
|
+
// getFrustumPlanes is required by traversal but omitted from the minimal structural Viewport
|
|
125
|
+
// type for compatibility with existing application-side declarations.
|
|
126
|
+
// @ts-expect-error Runtime geospatial viewports provide getFrustumPlanes.
|
|
127
|
+
const nearPlane = viewport.getFrustumPlanes().near;
|
|
128
|
+
const nearCenterCommon = closestPointOnPlane(nearPlane, viewport.cameraPosition);
|
|
129
|
+
const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
|
|
130
|
+
cameraDirectionCartesian = new Vector3(nearCenterCartesian)
|
|
131
|
+
.subtract(cameraPositionCartesian)
|
|
132
|
+
.normalize();
|
|
133
|
+
}
|
|
56
134
|
const cameraUpCartesian = new Vector3(
|
|
57
135
|
// @ts-ignore
|
|
58
136
|
enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))
|
|
@@ -61,7 +139,7 @@ export function getFrameState(viewport: GeospatialViewport, frameNumber: number)
|
|
|
61
139
|
commonSpacePlanesToWGS84(viewport);
|
|
62
140
|
|
|
63
141
|
const ViewportClass = viewport.constructor;
|
|
64
|
-
const {longitude, latitude, width, bearing, zoom} = viewport;
|
|
142
|
+
const {longitude, latitude, width, bearing, zoom, position} = viewport;
|
|
65
143
|
// @ts-ignore
|
|
66
144
|
const topDownViewport = new ViewportClass({
|
|
67
145
|
longitude,
|
|
@@ -70,22 +148,83 @@ export function getFrameState(viewport: GeospatialViewport, frameNumber: number)
|
|
|
70
148
|
width,
|
|
71
149
|
bearing,
|
|
72
150
|
zoom,
|
|
151
|
+
position,
|
|
73
152
|
pitch: 0
|
|
74
153
|
});
|
|
75
154
|
|
|
155
|
+
const verticalFieldOfView =
|
|
156
|
+
Number.isFinite(viewport.fovy) && Number(viewport.fovy) > 0 && Number(viewport.fovy) < 180
|
|
157
|
+
? (Number(viewport.fovy) * Math.PI) / 180
|
|
158
|
+
: Math.PI / 3;
|
|
159
|
+
|
|
76
160
|
// TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function
|
|
77
161
|
return {
|
|
78
162
|
camera: {
|
|
79
163
|
position: cameraPositionCartesian,
|
|
80
164
|
direction: cameraDirectionCartesian,
|
|
81
|
-
up: cameraUpCartesian
|
|
165
|
+
up: cameraUpCartesian,
|
|
166
|
+
cartographicPosition: cameraPositionCartographic,
|
|
167
|
+
verticalFieldOfView,
|
|
168
|
+
timeSinceMovement: options.timeSinceCameraMovement ?? Number.POSITIVE_INFINITY
|
|
82
169
|
},
|
|
83
170
|
viewport,
|
|
84
171
|
topDownViewport,
|
|
85
172
|
height,
|
|
86
173
|
cullingVolume,
|
|
174
|
+
clippingPlanes: viewport.clippingPlanes,
|
|
87
175
|
frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?
|
|
88
|
-
sseDenominator:
|
|
176
|
+
sseDenominator: 2 * Math.tan(verticalFieldOfView / 2),
|
|
177
|
+
// Tileset3D fills this immediately before traversal because it depends on the root volume.
|
|
178
|
+
dynamicScreenSpaceErrorDensity: 0
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Updates retained camera motion state and calculates how long the current pose has been stable.
|
|
184
|
+
*
|
|
185
|
+
* The first observation is treated as stationary so initial tileset loading is never delayed.
|
|
186
|
+
* Position and direction are both compared because orbiting in place changes request relevance
|
|
187
|
+
* without necessarily changing the viewport's camera position.
|
|
188
|
+
*
|
|
189
|
+
* @param previousState - Pose retained from the preceding traversal for this viewport.
|
|
190
|
+
* @param position - Current Earth-centered, Earth-fixed camera position.
|
|
191
|
+
* @param direction - Current normalized Earth-centered, Earth-fixed camera direction.
|
|
192
|
+
* @param currentTime - Current monotonic-enough wall-clock time in milliseconds.
|
|
193
|
+
* @returns Updated pose and elapsed stationary time.
|
|
194
|
+
*/
|
|
195
|
+
export function updateCameraMotionState(
|
|
196
|
+
previousState: CameraMotionState | undefined,
|
|
197
|
+
position: number[] | Vector3,
|
|
198
|
+
direction: number[] | Vector3,
|
|
199
|
+
currentTime: number
|
|
200
|
+
): CameraMotionUpdate {
|
|
201
|
+
const positionArray = Array.from(position);
|
|
202
|
+
const directionArray = Array.from(direction);
|
|
203
|
+
const positionChanged = previousState
|
|
204
|
+
? positionArray.length !== previousState.position.length ||
|
|
205
|
+
positionArray.some(
|
|
206
|
+
(value, index) => Math.abs(value - previousState.position[index]) > CAMERA_POSITION_EPSILON
|
|
207
|
+
)
|
|
208
|
+
: false;
|
|
209
|
+
const directionChanged = previousState
|
|
210
|
+
? directionArray.length !== previousState.direction.length ||
|
|
211
|
+
directionArray.some(
|
|
212
|
+
(value, index) =>
|
|
213
|
+
Math.abs(value - previousState.direction[index]) > CAMERA_DIRECTION_EPSILON
|
|
214
|
+
)
|
|
215
|
+
: false;
|
|
216
|
+
const lastMovementTime =
|
|
217
|
+
positionChanged || directionChanged
|
|
218
|
+
? currentTime
|
|
219
|
+
: (previousState?.lastMovementTime ?? Number.NEGATIVE_INFINITY);
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
state: {
|
|
223
|
+
position: positionArray,
|
|
224
|
+
direction: directionArray,
|
|
225
|
+
lastMovementTime
|
|
226
|
+
},
|
|
227
|
+
timeSinceMovement: Math.max((currentTime - lastMovementTime) / 1000, 0)
|
|
89
228
|
};
|
|
90
229
|
}
|
|
91
230
|
|
|
@@ -162,7 +301,7 @@ function commonSpacePlanesToWGS84(viewport) {
|
|
|
162
301
|
|
|
163
302
|
function closestPointOnPlane(
|
|
164
303
|
plane: {distance: number; normal: Vector3},
|
|
165
|
-
refPoint: [
|
|
304
|
+
refPoint: number[] | Vector3,
|
|
166
305
|
out: Vector3 = new Vector3()
|
|
167
306
|
): Vector3 {
|
|
168
307
|
const distanceToRef = plane.normal.dot(refPoint);
|
|
@@ -32,12 +32,25 @@ export function getLodStatus(tile: Tile3D, frameState: FrameState): 'DIG' | 'OUT
|
|
|
32
32
|
if (screenSize < 2) {
|
|
33
33
|
return 'OUT';
|
|
34
34
|
}
|
|
35
|
-
if (!tile.header.children
|
|
35
|
+
if (!tile.header.children) {
|
|
36
36
|
return 'DRAW';
|
|
37
|
-
} else if (tile.header.children) {
|
|
38
|
-
return 'DIG';
|
|
39
37
|
}
|
|
40
|
-
|
|
38
|
+
|
|
39
|
+
switch (tile.lodMetricType) {
|
|
40
|
+
case 'screenSpaceRelative': {
|
|
41
|
+
const viewportHeight = frameState.topDownViewport.height || 1;
|
|
42
|
+
return screenSize / viewportHeight <= tile.lodMetricValue ? 'DRAW' : 'DIG';
|
|
43
|
+
}
|
|
44
|
+
case 'distanceRangeFromDefaultCamera':
|
|
45
|
+
return tile.distanceToTile(frameState) >= tile.lodMetricValue ? 'DRAW' : 'DIG';
|
|
46
|
+
case 'maxScreenThresholdSQ': {
|
|
47
|
+
const diameterThreshold = Math.sqrt(tile.lodMetricValue / (Math.PI * 0.25));
|
|
48
|
+
return screenSize <= diameterThreshold ? 'DRAW' : 'DIG';
|
|
49
|
+
}
|
|
50
|
+
case 'maxScreenThreshold':
|
|
51
|
+
default:
|
|
52
|
+
return screenSize <= tile.lodMetricValue ? 'DRAW' : 'DIG';
|
|
53
|
+
}
|
|
41
54
|
}
|
|
42
55
|
|
|
43
56
|
/**
|
|
@@ -49,10 +62,11 @@ export function getLodStatus(tile: Tile3D, frameState: FrameState): 'DIG' | 'OUT
|
|
|
49
62
|
// eslint-disable-next-line max-statements
|
|
50
63
|
export function getProjectedRadius(tile: Tile3D, frameState: FrameState): number {
|
|
51
64
|
const {topDownViewport: viewport} = frameState;
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
65
|
+
const mbs = tile.header.i3sLodMbs || tile.header.mbs;
|
|
66
|
+
const mbsLat = mbs[1];
|
|
67
|
+
const mbsLon = mbs[0];
|
|
68
|
+
const mbsZ = mbs[2];
|
|
69
|
+
const mbsR = mbs[3];
|
|
56
70
|
const mbsCenterCartesian = [...tile.boundingVolume.center];
|
|
57
71
|
const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
|
|
58
72
|
Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, cameraPositionCartesian);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright vis.gl contributors
|
|
4
|
+
|
|
5
|
+
// TypeScript's legacy `node` resolution does not inspect package `exports`, but this public
|
|
6
|
+
// subpath is resolved by the package at runtime and avoids loading unrelated DGGS decoders.
|
|
7
|
+
// @ts-expect-error Conditional package subpath exports require a modern module resolver.
|
|
8
|
+
import {getS2Bounds} from '@math.gl/dggs/s2';
|
|
9
|
+
import {Ellipsoid, makeOBBFromRegion} from '@math.gl/geospatial';
|
|
10
|
+
|
|
11
|
+
/** Serialized S2 cell metadata used by 3D Tiles bounding-volume extensions. */
|
|
12
|
+
export type S2VolumeInfo = {
|
|
13
|
+
/** S2 key or token. */
|
|
14
|
+
token: string;
|
|
15
|
+
/** Minimum height in meters. */
|
|
16
|
+
minimumHeight: number;
|
|
17
|
+
/** Maximum height in meters. */
|
|
18
|
+
maximumHeight: number;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Converts an S2 cell and its vertical range to the runtime oriented-box representation.
|
|
23
|
+
*
|
|
24
|
+
* @param s2VolumeInfo - S2 cell token and height range.
|
|
25
|
+
* @returns A twelve-component center/half-axis oriented bounding box.
|
|
26
|
+
*/
|
|
27
|
+
export function convertS2BoundingVolumeToOBB(s2VolumeInfo: S2VolumeInfo): number[] {
|
|
28
|
+
const [[west, south], [east, north]] = getS2Bounds(s2VolumeInfo.token);
|
|
29
|
+
const orientedBoundingBox = makeOBBFromRegion(
|
|
30
|
+
[west, south, east, north, s2VolumeInfo.minimumHeight, s2VolumeInfo.maximumHeight],
|
|
31
|
+
Ellipsoid.WGS84,
|
|
32
|
+
{units: 'degrees'}
|
|
33
|
+
);
|
|
34
|
+
return [...orientedBoundingBox.center, ...orientedBoundingBox.halfAxes];
|
|
35
|
+
}
|