@loaders.gl/tiles 3.1.0-alpha.4 → 3.1.0-alpha.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.
- package/dist/bundle.d.ts +1 -0
- package/dist/constants.d.ts +31 -0
- package/dist/dist.min.js +1 -1
- package/dist/dist.min.js.map +1 -1
- package/dist/es5/bundle.js +1 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/constants.js +6 -6
- package/dist/es5/constants.js.map +1 -1
- package/dist/es5/index.js +20 -12
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/tileset/helpers/bounding-volume.js +25 -37
- package/dist/es5/tileset/helpers/bounding-volume.js.map +1 -1
- package/dist/es5/tileset/helpers/frame-state.js +29 -25
- package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
- package/dist/es5/tileset/helpers/i3s-lod.js +57 -106
- package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/es5/tileset/helpers/tiles-3d-lod.js +51 -47
- package/dist/es5/tileset/helpers/tiles-3d-lod.js.map +1 -1
- package/dist/es5/tileset/helpers/transform-utils.js +21 -12
- package/dist/es5/tileset/helpers/transform-utils.js.map +1 -1
- package/dist/es5/tileset/helpers/zoom.js +17 -15
- package/dist/es5/tileset/helpers/zoom.js.map +1 -1
- package/dist/es5/tileset/tile-3d.js +328 -421
- package/dist/es5/tileset/tile-3d.js.map +1 -1
- package/dist/es5/tileset/tileset-3d.js +381 -563
- package/dist/es5/tileset/tileset-3d.js.map +1 -1
- package/dist/es5/tileset/tileset-cache.js +50 -63
- package/dist/es5/tileset/tileset-cache.js.map +1 -1
- package/dist/es5/tileset/traversers/i3s-tile-manager.js +32 -44
- package/dist/es5/tileset/traversers/i3s-tile-manager.js.map +1 -1
- package/dist/es5/tileset/traversers/i3s-tileset-traverser.js +53 -143
- package/dist/es5/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
- package/dist/es5/tileset/traversers/tileset-3d-traverser.js +34 -62
- package/dist/es5/tileset/traversers/tileset-3d-traverser.js.map +1 -1
- package/dist/es5/tileset/traversers/tileset-traverser.js +209 -282
- package/dist/es5/tileset/traversers/tileset-traverser.js.map +1 -1
- package/dist/es5/utils/doubly-linked-list-node.js +7 -9
- package/dist/es5/utils/doubly-linked-list-node.js.map +1 -1
- package/dist/es5/utils/doubly-linked-list.js +64 -76
- package/dist/es5/utils/doubly-linked-list.js.map +1 -1
- package/dist/es5/utils/managed-array.js +86 -108
- package/dist/es5/utils/managed-array.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tileset/helpers/i3s-lod.js +45 -86
- package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/esm/tileset/helpers/transform-utils.js +4 -1
- package/dist/esm/tileset/helpers/transform-utils.js.map +1 -1
- package/dist/esm/tileset/tile-3d.js +3 -3
- package/dist/esm/tileset/tile-3d.js.map +1 -1
- package/dist/esm/tileset/tileset-3d.js +5 -5
- package/dist/esm/tileset/tileset-3d.js.map +1 -1
- package/dist/esm/tileset/traversers/i3s-tileset-traverser.js +4 -4
- package/dist/esm/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/tileset/helpers/3d-tiles-options.d.ts +3 -0
- package/dist/tileset/helpers/bounding-volume.d.ts +8 -0
- package/dist/tileset/helpers/frame-state.d.ts +16 -0
- package/dist/tileset/helpers/i3s-lod.d.ts +19 -0
- package/dist/tileset/helpers/tiles-3d-lod.d.ts +7 -0
- package/dist/tileset/helpers/transform-utils.d.ts +1 -0
- package/dist/tileset/helpers/zoom.d.ts +6 -0
- package/dist/tileset/tile-3d.d.ts +173 -0
- package/dist/tileset/tileset-3d.d.ts +171 -0
- package/dist/tileset/tileset-cache.d.ts +17 -0
- package/dist/tileset/traversers/i3s-tile-manager.d.ts +7 -0
- package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +17 -0
- package/dist/tileset/traversers/tileset-3d-traverser.d.ts +6 -0
- package/dist/tileset/traversers/tileset-traverser.d.ts +51 -0
- package/dist/utils/doubly-linked-list-node.d.ts +11 -0
- package/dist/utils/doubly-linked-list.d.ts +30 -0
- package/dist/utils/managed-array.d.ts +84 -0
- package/package.json +9 -6
- package/src/index.ts +1 -0
- package/src/tileset/helpers/i3s-lod.ts +72 -96
- package/src/tileset/helpers/transform-utils.ts +3 -1
- package/src/tileset/tile-3d.ts +2 -2
- package/src/tileset/traversers/i3s-tileset-traverser.ts +2 -3
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Matrix4, Vector3 } from '@math.gl/core';
|
|
2
|
+
import { Stats } from '@probe.gl/stats';
|
|
3
|
+
import { RequestScheduler, LoaderWithParser, LoaderOptions } from '@loaders.gl/loader-utils';
|
|
4
|
+
import { FrameState } from './helpers/frame-state';
|
|
5
|
+
import Tile3D from './tile-3d';
|
|
6
|
+
import TilesetTraverser from './traversers/tileset-traverser';
|
|
7
|
+
export declare type Tileset3DProps = {
|
|
8
|
+
throttleRequests?: boolean;
|
|
9
|
+
maxRequests?: number;
|
|
10
|
+
loadOptions?: LoaderOptions;
|
|
11
|
+
loadTiles?: boolean;
|
|
12
|
+
basePath?: string;
|
|
13
|
+
maximumMemoryUsage?: number;
|
|
14
|
+
description?: string;
|
|
15
|
+
attributions?: string[];
|
|
16
|
+
ellipsoid?: object;
|
|
17
|
+
modelMatrix?: Matrix4;
|
|
18
|
+
maximumScreenSpaceError?: number;
|
|
19
|
+
viewportTraversersMap?: any;
|
|
20
|
+
updateTransforms?: boolean;
|
|
21
|
+
viewDistanceScale?: number;
|
|
22
|
+
onTileLoad?: (tile: Tile3D) => any;
|
|
23
|
+
onTileUnload?: (tile: Tile3D) => any;
|
|
24
|
+
onTileError?: (tile: Tile3D, message: string, url: string) => any;
|
|
25
|
+
contentLoader?: (tile: Tile3D) => Promise<void>;
|
|
26
|
+
onTraversalComplete?: (selectedTiles: Tile3D[]) => Tile3D[];
|
|
27
|
+
};
|
|
28
|
+
declare type Props = {
|
|
29
|
+
description: string;
|
|
30
|
+
ellipsoid: object;
|
|
31
|
+
modelMatrix: Matrix4;
|
|
32
|
+
throttleRequests: boolean;
|
|
33
|
+
maximumMemoryUsage: number;
|
|
34
|
+
onTileLoad: (tile: Tile3D) => any;
|
|
35
|
+
onTileUnload: (tile: Tile3D) => any;
|
|
36
|
+
onTileError: (tile: Tile3D, message: string, url: string) => any;
|
|
37
|
+
onTraversalComplete: (selectedTiles: Tile3D[]) => Tile3D[];
|
|
38
|
+
maximumScreenSpaceError: number;
|
|
39
|
+
viewportTraversersMap: any;
|
|
40
|
+
attributions: string[];
|
|
41
|
+
maxRequests: number;
|
|
42
|
+
loadTiles: boolean;
|
|
43
|
+
loadOptions: LoaderOptions;
|
|
44
|
+
updateTransforms: boolean;
|
|
45
|
+
viewDistanceScale: number;
|
|
46
|
+
basePath: string;
|
|
47
|
+
contentLoader?: (tile: Tile3D) => Promise<void>;
|
|
48
|
+
i3s: {
|
|
49
|
+
[key: string]: any;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export default class Tileset3D {
|
|
53
|
+
options: Props;
|
|
54
|
+
loadOptions: {
|
|
55
|
+
[key: string]: any;
|
|
56
|
+
};
|
|
57
|
+
type: string;
|
|
58
|
+
tileset: {
|
|
59
|
+
[key: string]: any;
|
|
60
|
+
};
|
|
61
|
+
loader: LoaderWithParser;
|
|
62
|
+
url: string;
|
|
63
|
+
basePath: string;
|
|
64
|
+
modelMatrix: Matrix4;
|
|
65
|
+
ellipsoid: any;
|
|
66
|
+
lodMetricType: string;
|
|
67
|
+
lodMetricValue: number;
|
|
68
|
+
refine: string;
|
|
69
|
+
root: Tile3D | null;
|
|
70
|
+
roots: {
|
|
71
|
+
[key: string]: Tile3D;
|
|
72
|
+
};
|
|
73
|
+
asset: {
|
|
74
|
+
[key: string]: any;
|
|
75
|
+
};
|
|
76
|
+
description: string;
|
|
77
|
+
properties: any;
|
|
78
|
+
extras: any;
|
|
79
|
+
attributions: any;
|
|
80
|
+
credits: any;
|
|
81
|
+
stats: Stats;
|
|
82
|
+
traverseCounter: number;
|
|
83
|
+
geometricError: number;
|
|
84
|
+
selectedTiles: Tile3D[];
|
|
85
|
+
cartographicCenter: Vector3 | null;
|
|
86
|
+
cartesianCenter: Vector3 | null;
|
|
87
|
+
zoom: number;
|
|
88
|
+
boundingVolume: any;
|
|
89
|
+
gpuMemoryUsageInBytes: any;
|
|
90
|
+
dynamicScreenSpaceErrorComputedDensity: any;
|
|
91
|
+
_traverser: TilesetTraverser;
|
|
92
|
+
private _cache;
|
|
93
|
+
_requestScheduler: RequestScheduler;
|
|
94
|
+
_frameNumber: number;
|
|
95
|
+
private _queryParamsString;
|
|
96
|
+
private _queryParams;
|
|
97
|
+
private _extensionsUsed;
|
|
98
|
+
private _tiles;
|
|
99
|
+
private _pendingCount;
|
|
100
|
+
private lastUpdatedVieports;
|
|
101
|
+
private _requestedTiles;
|
|
102
|
+
private _emptyTiles;
|
|
103
|
+
private frameStateData;
|
|
104
|
+
maximumMemoryUsage: number;
|
|
105
|
+
/**
|
|
106
|
+
* Create a new Tileset3D
|
|
107
|
+
* @param json
|
|
108
|
+
* @param props
|
|
109
|
+
*/
|
|
110
|
+
constructor(json: any, options?: Tileset3DProps);
|
|
111
|
+
/** Release resources */
|
|
112
|
+
destroy(): void;
|
|
113
|
+
/** Is the tileset loaded (update needs to have been called at least once) */
|
|
114
|
+
isLoaded(): boolean;
|
|
115
|
+
get tiles(): object[];
|
|
116
|
+
get frameNumber(): number;
|
|
117
|
+
get queryParams(): string;
|
|
118
|
+
setProps(props: Tileset3DProps): void;
|
|
119
|
+
/** @deprecated */
|
|
120
|
+
setOptions(options: Tileset3DProps): void;
|
|
121
|
+
/**
|
|
122
|
+
* Return a loadable tile url for a specific tile subpath
|
|
123
|
+
* @param tilePath a tile subpath
|
|
124
|
+
*/
|
|
125
|
+
getTileUrl(tilePath: string): string;
|
|
126
|
+
hasExtension(extensionName: string): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Update visible tiles relying on a list of viewports
|
|
129
|
+
* @param viewports - list of viewports
|
|
130
|
+
*/
|
|
131
|
+
update(viewports: any[]): void;
|
|
132
|
+
/**
|
|
133
|
+
* Check if traversal is needed for particular viewport
|
|
134
|
+
* @param {string} viewportId - id of a viewport
|
|
135
|
+
* @return {boolean}
|
|
136
|
+
*/
|
|
137
|
+
_needTraverse(viewportId: string): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* The callback to post-process tiles after traversal procedure
|
|
140
|
+
* @param frameState - frame state for tile culling
|
|
141
|
+
*/
|
|
142
|
+
_onTraversalEnd(frameState: FrameState): void;
|
|
143
|
+
/**
|
|
144
|
+
* Update tiles relying on data from all traversers
|
|
145
|
+
*/
|
|
146
|
+
_updateTiles(): void;
|
|
147
|
+
_tilesChanged(oldSelectedTiles: any, selectedTiles: any): boolean;
|
|
148
|
+
_loadTiles(): void;
|
|
149
|
+
_unloadTiles(): void;
|
|
150
|
+
_updateStats(): void;
|
|
151
|
+
_initializeTileSet(tilesetJson: any): void;
|
|
152
|
+
_calculateViewProps(): void;
|
|
153
|
+
_initializeStats(): void;
|
|
154
|
+
_initializeTileHeaders(tilesetJson: any, parentTileHeader: any): Tile3D;
|
|
155
|
+
_initializeTraverser(): any;
|
|
156
|
+
_destroyTileHeaders(parentTile: any): void;
|
|
157
|
+
_loadTile(tile: any): Promise<void>;
|
|
158
|
+
_onTileLoadError(tile: any, error: any): void;
|
|
159
|
+
_onTileLoad(tile: any, loaded: any): void;
|
|
160
|
+
_onStartTileLoading(): void;
|
|
161
|
+
_onEndTileLoading(): void;
|
|
162
|
+
_addTileToCache(tile: any): void;
|
|
163
|
+
_updateCacheStats(tile: any): void;
|
|
164
|
+
_unloadTile(tile: any): void;
|
|
165
|
+
_destroy(): void;
|
|
166
|
+
_destroySubtree(tile: any): void;
|
|
167
|
+
_destroyTile(tile: any): void;
|
|
168
|
+
_initializeCesiumTileset(tilesetJson: any): void;
|
|
169
|
+
_initializeI3STileset(): void;
|
|
170
|
+
}
|
|
171
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stores tiles with content loaded.
|
|
3
|
+
*
|
|
4
|
+
* @private
|
|
5
|
+
*/
|
|
6
|
+
export default class TilesetCache {
|
|
7
|
+
private _list;
|
|
8
|
+
private _sentinel;
|
|
9
|
+
private _trimTiles;
|
|
10
|
+
constructor();
|
|
11
|
+
reset(): void;
|
|
12
|
+
touch(tile: any): void;
|
|
13
|
+
add(tileset: any, tile: any, addCallback: any): void;
|
|
14
|
+
unloadTile(tileset: any, tile: any, unloadCallback?: any): void;
|
|
15
|
+
unloadTiles(tileset: any, unloadCallback: any): void;
|
|
16
|
+
trim(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import TilesetTraverser from './tileset-traverser';
|
|
2
|
+
export default class I3STilesetTraverser extends TilesetTraverser {
|
|
3
|
+
private _tileManager;
|
|
4
|
+
constructor(options: any);
|
|
5
|
+
shouldRefine(tile: any, frameState: any): boolean;
|
|
6
|
+
updateChildTiles(tile: any, frameState: any): boolean;
|
|
7
|
+
_loadTile(nodeId: any, tileset: any): Promise<any>;
|
|
8
|
+
/**
|
|
9
|
+
* The callback to init TileHeader instance after loading the tile JSON
|
|
10
|
+
* @param {Object} header - the tile JSON from a dataset
|
|
11
|
+
* @param {TileHeader} tile - the parent TileHeader instance
|
|
12
|
+
* @param {string} extendedId - optional ID to separate copies of a tile for different viewports.
|
|
13
|
+
* const extendedId = `${tile.id}-${frameState.viewport.id}`;
|
|
14
|
+
* @return {void}
|
|
15
|
+
*/
|
|
16
|
+
_onTileLoad(header: any, tile: any, extendedId: any): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import TilesetTraverser from './tileset-traverser';
|
|
2
|
+
export default class Tileset3DTraverser extends TilesetTraverser {
|
|
3
|
+
compareDistanceToCamera(a: any, b: any): number;
|
|
4
|
+
updateTileVisibility(tile: any, frameState: any): void;
|
|
5
|
+
meetsScreenSpaceErrorEarly(tile: any, frameState: any): boolean;
|
|
6
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import ManagedArray from '../../utils/managed-array';
|
|
2
|
+
export declare type TilesetTraverserProps = {
|
|
3
|
+
loadSiblings?: boolean;
|
|
4
|
+
skipLevelOfDetail?: boolean;
|
|
5
|
+
maximumScreenSpaceError?: number;
|
|
6
|
+
onTraversalEnd?: (frameState: any) => any;
|
|
7
|
+
viewportTraversersMap?: {
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
};
|
|
10
|
+
basePath?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare type Props = {
|
|
13
|
+
loadSiblings: boolean;
|
|
14
|
+
skipLevelOfDetail: boolean;
|
|
15
|
+
updateTransforms: boolean;
|
|
16
|
+
maximumScreenSpaceError: number;
|
|
17
|
+
onTraversalEnd: (frameState: any) => any;
|
|
18
|
+
viewportTraversersMap: {
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
};
|
|
21
|
+
basePath: string;
|
|
22
|
+
};
|
|
23
|
+
export declare const DEFAULT_PROPS: Props;
|
|
24
|
+
export default class TilesetTraverser {
|
|
25
|
+
options: Props;
|
|
26
|
+
root: any;
|
|
27
|
+
requestedTiles: object;
|
|
28
|
+
selectedTiles: object;
|
|
29
|
+
emptyTiles: object;
|
|
30
|
+
protected _traversalStack: ManagedArray;
|
|
31
|
+
protected _emptyTraversalStack: ManagedArray;
|
|
32
|
+
protected _frameNumber: number | null;
|
|
33
|
+
constructor(options: TilesetTraverserProps);
|
|
34
|
+
traverse(root: any, frameState: any, options: any): void;
|
|
35
|
+
reset(): void;
|
|
36
|
+
executeTraversal(root: any, frameState: any): void;
|
|
37
|
+
updateChildTiles(tile: any, frameState: any): boolean;
|
|
38
|
+
updateAndPushChildren(tile: any, frameState: any, stack: any, depth: any): boolean;
|
|
39
|
+
updateTile(tile: any, frameState: any): void;
|
|
40
|
+
selectTile(tile: any, frameState: any): void;
|
|
41
|
+
loadTile(tile: any, frameState: any): void;
|
|
42
|
+
touchTile(tile: any, frameState: any): void;
|
|
43
|
+
canTraverse(tile: any, frameState: any, useParentMetric?: boolean, ignoreVisibility?: boolean): boolean;
|
|
44
|
+
shouldLoadTile(tile: any): any;
|
|
45
|
+
shouldSelectTile(tile: any): any;
|
|
46
|
+
shouldRefine(tile: any, frameState: any, useParentMetric: any): boolean;
|
|
47
|
+
updateTileVisibility(tile: any, frameState: any): void;
|
|
48
|
+
compareDistanceToCamera(b: any, a: any): number;
|
|
49
|
+
anyChildrenVisible(tile: any, frameState: any): boolean;
|
|
50
|
+
executeEmptyTraversal(root: any, frameState: any): boolean;
|
|
51
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doubly linked list
|
|
3
|
+
*
|
|
4
|
+
* @private
|
|
5
|
+
*/
|
|
6
|
+
export default class DoublyLinkedList {
|
|
7
|
+
head: any;
|
|
8
|
+
tail: any;
|
|
9
|
+
_length: number;
|
|
10
|
+
get length(): number;
|
|
11
|
+
/**
|
|
12
|
+
* Adds the item to the end of the list
|
|
13
|
+
* @param {*} [item]
|
|
14
|
+
* @return {DoublyLinkedListNode}
|
|
15
|
+
*/
|
|
16
|
+
add(item?: any): DoublyLinkedListNode;
|
|
17
|
+
/**
|
|
18
|
+
* Removes the given node from the list
|
|
19
|
+
* @param {DoublyLinkedListNode} node
|
|
20
|
+
*/
|
|
21
|
+
remove(node: DoublyLinkedListNode): void;
|
|
22
|
+
/**
|
|
23
|
+
* Moves nextNode after node
|
|
24
|
+
* @param {DoublyLinkedListNode} node
|
|
25
|
+
* @param {DoublyLinkedListNode} nextNode
|
|
26
|
+
*/
|
|
27
|
+
splice(node: DoublyLinkedListNode, nextNode: DoublyLinkedListNode): void;
|
|
28
|
+
_insert(node: any, nextNode: any): void;
|
|
29
|
+
}
|
|
30
|
+
import DoublyLinkedListNode from "../utils/doubly-linked-list-node";
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A wrapper around arrays so that the internal length of the array can be manually managed.
|
|
3
|
+
*
|
|
4
|
+
* @alias ManagedArray
|
|
5
|
+
* @constructor
|
|
6
|
+
* @private
|
|
7
|
+
*
|
|
8
|
+
* @param {Number} [length=0] The initial length of the array.
|
|
9
|
+
*/
|
|
10
|
+
export default class ManagedArray {
|
|
11
|
+
constructor(length?: number);
|
|
12
|
+
_array: any[];
|
|
13
|
+
_map: Map<any, any>;
|
|
14
|
+
_length: number;
|
|
15
|
+
set length(arg: number);
|
|
16
|
+
/**
|
|
17
|
+
* Gets or sets the length of the array.
|
|
18
|
+
* If the set length is greater than the length of the internal array, the internal array is resized.
|
|
19
|
+
*
|
|
20
|
+
* @memberof ManagedArray.prototype
|
|
21
|
+
* @type Number
|
|
22
|
+
*/
|
|
23
|
+
get length(): number;
|
|
24
|
+
/**
|
|
25
|
+
* Gets the internal array.
|
|
26
|
+
*
|
|
27
|
+
* @memberof ManagedArray.prototype
|
|
28
|
+
* @type Array
|
|
29
|
+
* @readonly
|
|
30
|
+
*/
|
|
31
|
+
readonly get values(): any[];
|
|
32
|
+
/**
|
|
33
|
+
* Gets the element at an index.
|
|
34
|
+
*
|
|
35
|
+
* @param {Number} index The index to get.
|
|
36
|
+
*/
|
|
37
|
+
get(index: number): any;
|
|
38
|
+
/**
|
|
39
|
+
* Sets the element at an index. Resizes the array if index is greater than the length of the array.
|
|
40
|
+
*
|
|
41
|
+
* @param {Number} index The index to set.
|
|
42
|
+
* @param {*} element The element to set at index.
|
|
43
|
+
*/
|
|
44
|
+
set(index: number, element: any): void;
|
|
45
|
+
delete(element: any): void;
|
|
46
|
+
/**
|
|
47
|
+
* Returns the last element in the array without modifying the array.
|
|
48
|
+
*
|
|
49
|
+
* @returns {*} The last element in the array.
|
|
50
|
+
*/
|
|
51
|
+
peek(): any;
|
|
52
|
+
/**
|
|
53
|
+
* Push an element into the array.
|
|
54
|
+
*
|
|
55
|
+
* @param {*} element The element to push.
|
|
56
|
+
*/
|
|
57
|
+
push(element: any): void;
|
|
58
|
+
/**
|
|
59
|
+
* Pop an element from the array.
|
|
60
|
+
*
|
|
61
|
+
* @returns {*} The last element in the array.
|
|
62
|
+
*/
|
|
63
|
+
pop(): any;
|
|
64
|
+
/**
|
|
65
|
+
* Resize the internal array if length > _array.length.
|
|
66
|
+
*
|
|
67
|
+
* @param {Number} length The length.
|
|
68
|
+
*/
|
|
69
|
+
reserve(length: number): void;
|
|
70
|
+
/**
|
|
71
|
+
* Resize the array.
|
|
72
|
+
*
|
|
73
|
+
* @param {Number} length The length.
|
|
74
|
+
*/
|
|
75
|
+
resize(length: number): void;
|
|
76
|
+
/**
|
|
77
|
+
* Trim the internal array to the specified length. Defaults to the current length.
|
|
78
|
+
*
|
|
79
|
+
* @param {Number} [length] The length.
|
|
80
|
+
*/
|
|
81
|
+
trim(length?: number | undefined): void;
|
|
82
|
+
reset(): void;
|
|
83
|
+
find(target: any): boolean;
|
|
84
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/tiles",
|
|
3
|
-
"version": "3.1.0-alpha.
|
|
3
|
+
"version": "3.1.0-alpha.5",
|
|
4
4
|
"description": "Common components for different tiles loaders.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"point cloud",
|
|
20
20
|
"pointcloud"
|
|
21
21
|
],
|
|
22
|
-
"types": "
|
|
22
|
+
"types": "dist/index.d.ts",
|
|
23
23
|
"main": "dist/es5/index.js",
|
|
24
24
|
"module": "dist/esm/index.js",
|
|
25
25
|
"sideEffects": false,
|
|
@@ -30,17 +30,20 @@
|
|
|
30
30
|
],
|
|
31
31
|
"scripts": {
|
|
32
32
|
"pre-build": "npm run build-bundle",
|
|
33
|
+
"post-build": "tsc",
|
|
33
34
|
"build-bundle": "webpack --display=minimal --config ../../scripts/webpack/bundle.js"
|
|
34
35
|
},
|
|
35
36
|
"dependencies": {
|
|
36
|
-
"@loaders.gl/
|
|
37
|
-
"@loaders.gl/
|
|
38
|
-
"@loaders.gl/math": "3.1.0-alpha.4",
|
|
37
|
+
"@loaders.gl/loader-utils": "3.1.0-alpha.5",
|
|
38
|
+
"@loaders.gl/math": "3.1.0-alpha.5",
|
|
39
39
|
"@math.gl/core": "^3.5.1",
|
|
40
40
|
"@math.gl/culling": "^3.5.1",
|
|
41
41
|
"@math.gl/geospatial": "^3.5.1",
|
|
42
42
|
"@math.gl/web-mercator": "^3.5.1",
|
|
43
43
|
"@probe.gl/stats": "^3.4.0"
|
|
44
44
|
},
|
|
45
|
-
"
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"@loaders.gl/core": "^3.0.0"
|
|
47
|
+
},
|
|
48
|
+
"gitHead": "352241dd910a8c6307a235dadbe154ca915b885b"
|
|
46
49
|
}
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ export {createBoundingVolume} from './tileset/helpers/bounding-volume';
|
|
|
9
9
|
export {calculateTransformProps} from './tileset/helpers/transform-utils';
|
|
10
10
|
|
|
11
11
|
export {getFrameState} from './tileset/helpers/frame-state';
|
|
12
|
+
export {getLodStatus} from './tileset/helpers/i3s-lod';
|
|
12
13
|
|
|
13
14
|
export {
|
|
14
15
|
TILE_CONTENT_STATE,
|
|
@@ -1,52 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const viewportCenter = [longitude, latitude];
|
|
19
|
-
const mbsCenter = [mbsLon, mbsLat, mbsZ];
|
|
20
|
-
const mbsLatProjected = [longitude, mbsLat];
|
|
21
|
-
const mbsLonProjected = [mbsLon, latitude];
|
|
22
|
-
|
|
23
|
-
const diagonalInMeters = Math.sqrt(height * height + width * width) * metersPerPixel[0];
|
|
24
|
-
const distanceInMeters = getDistanceFromLatLon(viewportCenter, mbsCenter);
|
|
25
|
-
|
|
26
|
-
const visibleHeight = height * 0.5 + mbsR / WGS84_RADIUS_X;
|
|
27
|
-
const visibleWidth = width * 0.5 + mbsR / WGS84_RADIUS_X;
|
|
28
|
-
|
|
29
|
-
if (distanceInMeters > diagonalInMeters + mbsR / WGS84_RADIUS_X) {
|
|
30
|
-
return 'OUT';
|
|
31
|
-
}
|
|
32
|
-
if (getDistanceFromLatLon(viewportCenter, mbsLatProjected) > visibleHeight) {
|
|
33
|
-
return 'OUT';
|
|
34
|
-
}
|
|
35
|
-
if (getDistanceFromLatLon(viewportCenter, mbsLonProjected) > visibleWidth) {
|
|
36
|
-
return 'OUT';
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (tile.lodMetricValue === 0) {
|
|
1
|
+
import {Matrix4, Vector3} from '@math.gl/core';
|
|
2
|
+
import {Ellipsoid} from '@math.gl/geospatial';
|
|
3
|
+
import {Tile3D} from '../..';
|
|
4
|
+
import {FrameState} from './frame-state';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* For the maxScreenThreshold error metric, maxError means that you should replace the node with it's children
|
|
8
|
+
as soon as the nodes bounding sphere has a screen radius larger than maxError pixels.
|
|
9
|
+
In this sense a value of 0 means you should always load it's children,
|
|
10
|
+
or if it's a leaf node, you should always display it.
|
|
11
|
+
* @param tile
|
|
12
|
+
* @param frameState
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
export function getLodStatus(tile: Tile3D, frameState: FrameState): 'DIG' | 'OUT' | 'DRAW' {
|
|
16
|
+
if (tile.lodMetricValue === 0 || isNaN(tile.lodMetricValue)) {
|
|
40
17
|
return 'DIG';
|
|
41
18
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
// as soon as the nodes bounding sphere has a screen radius larger than maxError pixels.
|
|
45
|
-
// In this sense a value of 0 means you should always load it's children,
|
|
46
|
-
// or if it's a leaf node, you should always display it.
|
|
47
|
-
let screenSize = getI3ScreenSize(tile, frameState); // in pixels
|
|
48
|
-
screenSize *= qualityFactor;
|
|
49
|
-
if (screenSize < 0.5) {
|
|
19
|
+
const screenSize = 2 * getProjectedRadius(tile, frameState);
|
|
20
|
+
if (screenSize < 2) {
|
|
50
21
|
return 'OUT';
|
|
51
22
|
}
|
|
52
23
|
if (!tile.header.children || screenSize <= tile.lodMetricValue) {
|
|
@@ -57,58 +28,63 @@ export function lodJudge(tile, frameState) {
|
|
|
57
28
|
return 'OUT';
|
|
58
29
|
}
|
|
59
30
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
function getDistanceFromLatLon(observer: number[], center: number[]) {
|
|
74
|
-
const [observerLon, observerLat, observerZ = 0.0] = observer;
|
|
75
|
-
const [centerLon, centerLat, centerZ = 0.0] = center;
|
|
76
|
-
|
|
77
|
-
const projectedCenter = projectVertexToSphere([centerLon, centerLat, centerZ]);
|
|
78
|
-
const projectedObserver = projectVertexToSphere([observerLon, observerLat, observerZ]);
|
|
79
|
-
const dx = projectedObserver[0] - projectedCenter[0];
|
|
80
|
-
const dy = projectedObserver[1] - projectedCenter[1];
|
|
81
|
-
const dz = projectedObserver[2] - projectedCenter[2];
|
|
82
|
-
return dx * dx + dy * dy + dz * dz;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export function getI3ScreenSize(tile, frameState) {
|
|
86
|
-
const viewport = frameState.viewport;
|
|
31
|
+
/**
|
|
32
|
+
* Calculate size of MBS radius projected on the screen plane
|
|
33
|
+
* @param tile
|
|
34
|
+
* @param frameState
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
// eslint-disable-next-line max-statements
|
|
38
|
+
export function getProjectedRadius(tile: Tile3D, frameState: FrameState): number {
|
|
39
|
+
const originalViewport = frameState.viewport;
|
|
40
|
+
const ViewportClass = originalViewport.constructor;
|
|
41
|
+
const {longitude, latitude, height, width, bearing, zoom} = originalViewport;
|
|
42
|
+
// @ts-ignore
|
|
43
|
+
const viewport = new ViewportClass({longitude, latitude, height, width, bearing, zoom, pitch: 0});
|
|
87
44
|
const mbsLat = tile.header.mbs[1];
|
|
88
45
|
const mbsLon = tile.header.mbs[0];
|
|
89
46
|
const mbsZ = tile.header.mbs[2];
|
|
90
47
|
const mbsR = tile.header.mbs[3];
|
|
91
|
-
|
|
92
|
-
const mbsCenter = [mbsLon, mbsLat, mbsZ];
|
|
48
|
+
const mbsCenterCartesian = [...tile.boundingVolume.center];
|
|
93
49
|
const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
//
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
50
|
+
const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(
|
|
51
|
+
cameraPositionCartographic,
|
|
52
|
+
new Vector3()
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// ---------------------------
|
|
56
|
+
// Calculate mbs border vertex
|
|
57
|
+
// ---------------------------
|
|
58
|
+
const toEye = new Vector3(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();
|
|
59
|
+
// Add extra vector to form plane
|
|
60
|
+
const enuToCartesianMatrix = new Matrix4();
|
|
61
|
+
Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian, enuToCartesianMatrix);
|
|
62
|
+
const cartesianToEnuMatrix = new Matrix4(enuToCartesianMatrix).invert();
|
|
63
|
+
const cameraPositionEnu = new Vector3(cameraPositionCartesian).transform(cartesianToEnuMatrix);
|
|
64
|
+
// Mean Proportionals in Right Triangles - Altitude rule
|
|
65
|
+
// https://mathbitsnotebook.com/Geometry/RightTriangles/RTmeanRight.html
|
|
66
|
+
const projection = Math.sqrt(
|
|
67
|
+
cameraPositionEnu[0] * cameraPositionEnu[0] + cameraPositionEnu[1] * cameraPositionEnu[1]
|
|
68
|
+
);
|
|
69
|
+
const extraZ = (projection * projection) / cameraPositionEnu[2];
|
|
70
|
+
const extraVertexEnu = new Vector3([cameraPositionEnu[0], cameraPositionEnu[1], extraZ]);
|
|
71
|
+
const extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);
|
|
72
|
+
const extraVectorCartesian = new Vector3(extraVertexCartesian)
|
|
73
|
+
.subtract(mbsCenterCartesian)
|
|
74
|
+
.normalize();
|
|
75
|
+
// We need radius vector orthogonal to toEye vector
|
|
76
|
+
const radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);
|
|
77
|
+
const sphereMbsBorderVertexCartesian = new Vector3(mbsCenterCartesian).add(radiusVector);
|
|
78
|
+
const sphereMbsBorderVertexCartographic = Ellipsoid.WGS84.cartesianToCartographic(
|
|
79
|
+
sphereMbsBorderVertexCartesian
|
|
80
|
+
);
|
|
81
|
+
// ---------------------------
|
|
82
|
+
|
|
83
|
+
// Project center vertex and border vertex and calculate projected radius of MBS
|
|
84
|
+
const projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);
|
|
85
|
+
const projectedMbsBorderVertex = viewport.project(sphereMbsBorderVertexCartographic);
|
|
86
|
+
const projectedRadius = new Vector3(projectedOrigin)
|
|
87
|
+
.subtract(projectedMbsBorderVertex)
|
|
88
|
+
.magnitude();
|
|
89
|
+
return projectedRadius;
|
|
114
90
|
}
|
|
@@ -59,5 +59,7 @@ export function calculateTransformProps(tileHeader, tile) {
|
|
|
59
59
|
tile.cartographicOrigin = cartographicOrigin;
|
|
60
60
|
|
|
61
61
|
// Deprecated, drop
|
|
62
|
-
tile.
|
|
62
|
+
if (!tile.coordinateSystem) {
|
|
63
|
+
tile.modelMatrix = tile.cartographicModelMatrix;
|
|
64
|
+
}
|
|
63
65
|
}
|
package/src/tileset/tile-3d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {TILE_REFINEMENT, TILE_CONTENT_STATE, TILESET_TYPE} from '../constants';
|
|
|
9
9
|
import {FrameState} from './helpers/frame-state';
|
|
10
10
|
import {createBoundingVolume} from './helpers/bounding-volume';
|
|
11
11
|
import {getTiles3DScreenSpaceError} from './helpers/tiles-3d-lod';
|
|
12
|
-
import {
|
|
12
|
+
import {getProjectedRadius} from './helpers/i3s-lod';
|
|
13
13
|
import {get3dTilesOptions} from './helpers/3d-tiles-options';
|
|
14
14
|
import TilesetTraverser from './traversers/tileset-traverser';
|
|
15
15
|
|
|
@@ -287,7 +287,7 @@ export default class TileHeader {
|
|
|
287
287
|
getScreenSpaceError(frameState, useParentLodMetric) {
|
|
288
288
|
switch (this.tileset.type) {
|
|
289
289
|
case TILESET_TYPE.I3S:
|
|
290
|
-
return
|
|
290
|
+
return getProjectedRadius(this, frameState);
|
|
291
291
|
case TILESET_TYPE.TILES3D:
|
|
292
292
|
return getTiles3DScreenSpaceError(this, frameState, useParentLodMetric);
|
|
293
293
|
default:
|