@loaders.gl/tiles 4.2.0-alpha.5 → 4.2.0-alpha.6
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/dist.dev.js +182 -333
- package/dist/dist.min.js +1 -1
- package/dist/index.cjs +168 -87
- package/dist/index.cjs.map +2 -2
- package/dist/tileset/format-i3s/i3s-pending-tiles-register.js +1 -3
- package/dist/tileset/format-i3s/i3s-tile-manager.js +2 -1
- package/dist/tileset/format-i3s/i3s-tileset-traverser.js +1 -0
- package/dist/tileset/tile-3d.d.ts +2 -1
- package/dist/tileset/tile-3d.d.ts.map +1 -1
- package/dist/tileset/tile-3d.js +63 -50
- package/dist/tileset/tileset-3d.d.ts +2 -1
- package/dist/tileset/tileset-3d.d.ts.map +1 -1
- package/dist/tileset/tileset-3d.js +72 -54
- package/dist/tileset/tileset-cache.js +3 -0
- package/dist/tileset/tileset-traverser.js +16 -15
- package/dist/utils/doubly-linked-list-node.js +3 -0
- package/dist/utils/doubly-linked-list.js +3 -5
- package/dist/utils/managed-array.js +3 -1
- package/package.json +4 -4
- package/src/tileset/tile-3d.ts +1 -1
- package/src/tileset/tileset-3d.ts +1 -1
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
* Until all tiles are loaded we won't call `onTraversalEnd` callback
|
|
4
4
|
*/
|
|
5
5
|
export class I3SPendingTilesRegister {
|
|
6
|
-
|
|
7
|
-
this.frameNumberMap = new Map();
|
|
8
|
-
}
|
|
6
|
+
frameNumberMap = new Map();
|
|
9
7
|
/**
|
|
10
8
|
* Register a new pending tile header for the particular frameNumber
|
|
11
9
|
* @param viewportId
|
|
@@ -6,8 +6,9 @@ const STATUS = {
|
|
|
6
6
|
};
|
|
7
7
|
// A helper class to manage tile metadata fetching
|
|
8
8
|
export class I3STileManager {
|
|
9
|
+
_statusMap;
|
|
10
|
+
pendingTilesRegister = new I3SPendingTilesRegister();
|
|
9
11
|
constructor() {
|
|
10
|
-
this.pendingTilesRegister = new I3SPendingTilesRegister();
|
|
11
12
|
this._statusMap = {};
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
@@ -4,6 +4,7 @@ import { getLodStatus } from "../helpers/i3s-lod.js";
|
|
|
4
4
|
import { Tile3D } from "../tile-3d.js";
|
|
5
5
|
import { I3STileManager } from "./i3s-tile-manager.js";
|
|
6
6
|
export class I3STilesetTraverser extends TilesetTraverser {
|
|
7
|
+
_tileManager;
|
|
7
8
|
constructor(options) {
|
|
8
9
|
super(options);
|
|
9
10
|
this._tileManager = new I3STileManager();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Matrix4 } from '@math.gl/core';
|
|
2
2
|
import type { Tileset3D } from "./tileset-3d.js";
|
|
3
3
|
import type { DoublyLinkedListNode } from "../utils/doubly-linked-list-node.js";
|
|
4
|
+
import { TILE_REFINEMENT } from "../constants.js";
|
|
4
5
|
import { FrameState } from "./helpers/frame-state.js";
|
|
5
6
|
import { CartographicBounds } from "./helpers/bounding-volume.js";
|
|
6
7
|
import { TilesetTraverser } from "./tileset-traverser.js";
|
|
@@ -28,7 +29,7 @@ export declare class Tile3D {
|
|
|
28
29
|
id: string;
|
|
29
30
|
url: string;
|
|
30
31
|
parent: Tile3D;
|
|
31
|
-
refine:
|
|
32
|
+
refine: TILE_REFINEMENT;
|
|
32
33
|
type: string;
|
|
33
34
|
contentUrl: string;
|
|
34
35
|
/** Different refinement algorithms used by I3S and 3D tiles */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-3d.d.ts","sourceRoot":"","sources":["../../src/tileset/tile-3d.ts"],"names":[],"mappings":"AAOA,OAAO,EAAU,OAAO,EAAC,MAAM,eAAe,CAAC;AAM/C,OAAO,KAAK,EAAC,SAAS,EAAC,wBAAqB;AAC5C,OAAO,KAAK,EAAC,oBAAoB,EAAC,4CAAyC;
|
|
1
|
+
{"version":3,"file":"tile-3d.d.ts","sourceRoot":"","sources":["../../src/tileset/tile-3d.ts"],"names":[],"mappings":"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"}
|
package/dist/tileset/tile-3d.js
CHANGED
|
@@ -22,6 +22,69 @@ function defined(x) {
|
|
|
22
22
|
* Do not construct this directly, instead access tiles through {@link Tileset3D#tileVisible}.
|
|
23
23
|
*/
|
|
24
24
|
export class Tile3D {
|
|
25
|
+
tileset;
|
|
26
|
+
header;
|
|
27
|
+
id;
|
|
28
|
+
url;
|
|
29
|
+
parent;
|
|
30
|
+
/* Specifies the type of refine that is used when traversing this tile for rendering. */
|
|
31
|
+
refine;
|
|
32
|
+
type;
|
|
33
|
+
contentUrl;
|
|
34
|
+
/** Different refinement algorithms used by I3S and 3D tiles */
|
|
35
|
+
lodMetricType = 'geometricError';
|
|
36
|
+
/** The error, in meters, introduced if this tile is rendered and its children are not. */
|
|
37
|
+
lodMetricValue = 0;
|
|
38
|
+
/** @todo math.gl is not exporting BoundingVolume base type? */
|
|
39
|
+
boundingVolume = null;
|
|
40
|
+
/**
|
|
41
|
+
* The tile's content. This represents the actual tile's payload,
|
|
42
|
+
* not the content's metadata in the tileset JSON file.
|
|
43
|
+
*/
|
|
44
|
+
content = null;
|
|
45
|
+
contentState = TILE_CONTENT_STATE.UNLOADED;
|
|
46
|
+
gpuMemoryUsageInBytes = 0;
|
|
47
|
+
/** The tile's children - an array of Tile3D objects. */
|
|
48
|
+
children = [];
|
|
49
|
+
depth = 0;
|
|
50
|
+
viewportIds = [];
|
|
51
|
+
transform = new Matrix4();
|
|
52
|
+
extensions = null;
|
|
53
|
+
/** TODO Cesium 3d tiles specific */
|
|
54
|
+
implicitTiling = null;
|
|
55
|
+
/** Container to store application specific data */
|
|
56
|
+
userData = {};
|
|
57
|
+
computedTransform;
|
|
58
|
+
hasEmptyContent = false;
|
|
59
|
+
hasTilesetContent = false;
|
|
60
|
+
traverser = new TilesetTraverser({});
|
|
61
|
+
/** Used by TilesetCache */
|
|
62
|
+
_cacheNode = null;
|
|
63
|
+
_frameNumber = null;
|
|
64
|
+
// TODO Cesium 3d tiles specific
|
|
65
|
+
_expireDate = null;
|
|
66
|
+
_expiredContent = null;
|
|
67
|
+
_boundingBox = undefined;
|
|
68
|
+
/** updated every frame for tree traversal and rendering optimizations: */
|
|
69
|
+
_distanceToCamera = 0;
|
|
70
|
+
_screenSpaceError = 0;
|
|
71
|
+
_visibilityPlaneMask;
|
|
72
|
+
_visible = undefined;
|
|
73
|
+
_contentBoundingVolume;
|
|
74
|
+
_viewerRequestVolume;
|
|
75
|
+
_initialTransform = new Matrix4();
|
|
76
|
+
// Used by traverser, cannot be marked private
|
|
77
|
+
_priority = 0;
|
|
78
|
+
_selectedFrame = 0;
|
|
79
|
+
_requestedFrame = 0;
|
|
80
|
+
_selectionDepth = 0;
|
|
81
|
+
_touchedFrame = 0;
|
|
82
|
+
_centerZDepth = 0;
|
|
83
|
+
_shouldRefine = false;
|
|
84
|
+
_stackLength = 0;
|
|
85
|
+
_visitedFrame = 0;
|
|
86
|
+
_inRequestVolume = false;
|
|
87
|
+
_lodJudge = null; // TODO i3s specific, needs to remove
|
|
25
88
|
/**
|
|
26
89
|
* @constructs
|
|
27
90
|
* Create a Tile3D instance
|
|
@@ -33,56 +96,6 @@ export class Tile3D {
|
|
|
33
96
|
*/
|
|
34
97
|
// eslint-disable-next-line max-statements
|
|
35
98
|
constructor(tileset, header, parentHeader, extendedId = '') {
|
|
36
|
-
/** Different refinement algorithms used by I3S and 3D tiles */
|
|
37
|
-
this.lodMetricType = 'geometricError';
|
|
38
|
-
/** The error, in meters, introduced if this tile is rendered and its children are not. */
|
|
39
|
-
this.lodMetricValue = 0;
|
|
40
|
-
/** @todo math.gl is not exporting BoundingVolume base type? */
|
|
41
|
-
this.boundingVolume = null;
|
|
42
|
-
/**
|
|
43
|
-
* The tile's content. This represents the actual tile's payload,
|
|
44
|
-
* not the content's metadata in the tileset JSON file.
|
|
45
|
-
*/
|
|
46
|
-
this.content = null;
|
|
47
|
-
this.contentState = TILE_CONTENT_STATE.UNLOADED;
|
|
48
|
-
this.gpuMemoryUsageInBytes = 0;
|
|
49
|
-
/** The tile's children - an array of Tile3D objects. */
|
|
50
|
-
this.children = [];
|
|
51
|
-
this.depth = 0;
|
|
52
|
-
this.viewportIds = [];
|
|
53
|
-
this.transform = new Matrix4();
|
|
54
|
-
this.extensions = null;
|
|
55
|
-
/** TODO Cesium 3d tiles specific */
|
|
56
|
-
this.implicitTiling = null;
|
|
57
|
-
/** Container to store application specific data */
|
|
58
|
-
this.userData = {};
|
|
59
|
-
this.hasEmptyContent = false;
|
|
60
|
-
this.hasTilesetContent = false;
|
|
61
|
-
this.traverser = new TilesetTraverser({});
|
|
62
|
-
/** Used by TilesetCache */
|
|
63
|
-
this._cacheNode = null;
|
|
64
|
-
this._frameNumber = null;
|
|
65
|
-
// TODO Cesium 3d tiles specific
|
|
66
|
-
this._expireDate = null;
|
|
67
|
-
this._expiredContent = null;
|
|
68
|
-
this._boundingBox = undefined;
|
|
69
|
-
/** updated every frame for tree traversal and rendering optimizations: */
|
|
70
|
-
this._distanceToCamera = 0;
|
|
71
|
-
this._screenSpaceError = 0;
|
|
72
|
-
this._visible = undefined;
|
|
73
|
-
this._initialTransform = new Matrix4();
|
|
74
|
-
// Used by traverser, cannot be marked private
|
|
75
|
-
this._priority = 0;
|
|
76
|
-
this._selectedFrame = 0;
|
|
77
|
-
this._requestedFrame = 0;
|
|
78
|
-
this._selectionDepth = 0;
|
|
79
|
-
this._touchedFrame = 0;
|
|
80
|
-
this._centerZDepth = 0;
|
|
81
|
-
this._shouldRefine = false;
|
|
82
|
-
this._stackLength = 0;
|
|
83
|
-
this._visitedFrame = 0;
|
|
84
|
-
this._inRequestVolume = false;
|
|
85
|
-
this._lodJudge = null; // TODO i3s specific, needs to remove
|
|
86
99
|
// PUBLIC MEMBERS
|
|
87
100
|
// original tile data
|
|
88
101
|
this.header = header;
|
|
@@ -5,6 +5,7 @@ import { TilesetCache } from "./tileset-cache.js";
|
|
|
5
5
|
import { FrameState } from "./helpers/frame-state.js";
|
|
6
6
|
import type { Viewport } from "../types.js";
|
|
7
7
|
import { Tile3D } from "./tile-3d.js";
|
|
8
|
+
import { TILESET_TYPE } from "../constants.js";
|
|
8
9
|
import { TilesetTraverser } from "./tileset-traverser.js";
|
|
9
10
|
export type TilesetJSON = any;
|
|
10
11
|
export type Tileset3DProps = {
|
|
@@ -108,7 +109,7 @@ type Props = {
|
|
|
108
109
|
export declare class Tileset3D {
|
|
109
110
|
options: Props;
|
|
110
111
|
loadOptions: LoaderOptions;
|
|
111
|
-
type:
|
|
112
|
+
type: TILESET_TYPE;
|
|
112
113
|
tileset: TilesetJSON;
|
|
113
114
|
loader: LoaderWithParser;
|
|
114
115
|
url: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tileset-3d.d.ts","sourceRoot":"","sources":["../../src/tileset/tileset-3d.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAC,gBAAgB,EAAQ,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAE7C,OAAO,EAAC,UAAU,EAAoC,iCAA8B;AAGpF,OAAO,KAAK,EAAqB,QAAQ,EAAC,oBAAiB;AAC3D,OAAO,EAAC,MAAM,EAAC,qBAAkB;
|
|
1
|
+
{"version":3,"file":"tileset-3d.d.ts","sourceRoot":"","sources":["../../src/tileset/tileset-3d.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,6 +89,78 @@ const MAXIMUM_SSE = 'Maximum Screen Space Error';
|
|
|
89
89
|
* tileset.update // trigger another round of update
|
|
90
90
|
*/
|
|
91
91
|
export class Tileset3D {
|
|
92
|
+
// props: Tileset3DProps;
|
|
93
|
+
options;
|
|
94
|
+
loadOptions;
|
|
95
|
+
type;
|
|
96
|
+
tileset;
|
|
97
|
+
loader;
|
|
98
|
+
url;
|
|
99
|
+
basePath;
|
|
100
|
+
modelMatrix;
|
|
101
|
+
ellipsoid;
|
|
102
|
+
lodMetricType;
|
|
103
|
+
lodMetricValue;
|
|
104
|
+
refine;
|
|
105
|
+
root = null;
|
|
106
|
+
roots = {};
|
|
107
|
+
/** @todo any->unknown */
|
|
108
|
+
asset = {};
|
|
109
|
+
// Metadata for the entire tileset
|
|
110
|
+
description = '';
|
|
111
|
+
properties;
|
|
112
|
+
extras = null;
|
|
113
|
+
attributions = {};
|
|
114
|
+
credits = {};
|
|
115
|
+
stats;
|
|
116
|
+
/** flags that contain information about data types in nested tiles */
|
|
117
|
+
contentFormats = { draco: false, meshopt: false, dds: false, ktx2: false };
|
|
118
|
+
// view props
|
|
119
|
+
cartographicCenter = null;
|
|
120
|
+
cartesianCenter = null;
|
|
121
|
+
zoom = 1;
|
|
122
|
+
boundingVolume = null;
|
|
123
|
+
/** Updated based on the camera position and direction */
|
|
124
|
+
dynamicScreenSpaceErrorComputedDensity = 0.0;
|
|
125
|
+
// METRICS
|
|
126
|
+
/**
|
|
127
|
+
* The maximum amount of GPU memory (in MB) that may be used to cache tiles
|
|
128
|
+
* Tiles not in view are unloaded to enforce private
|
|
129
|
+
*/
|
|
130
|
+
maximumMemoryUsage = 32;
|
|
131
|
+
/** The total amount of GPU memory in bytes used by the tileset. */
|
|
132
|
+
gpuMemoryUsageInBytes = 0;
|
|
133
|
+
/**
|
|
134
|
+
* If loading the level of detail required by maximumScreenSpaceError
|
|
135
|
+
* results in the memory usage exceeding maximumMemoryUsage (GPU), level of detail refinement
|
|
136
|
+
* will instead use this (larger) adjusted screen space error to achieve the
|
|
137
|
+
* best possible visual quality within the available memory.
|
|
138
|
+
*/
|
|
139
|
+
memoryAdjustedScreenSpaceError = 0.0;
|
|
140
|
+
_cacheBytes = 0;
|
|
141
|
+
_cacheOverflowBytes = 0;
|
|
142
|
+
/** Update tracker. increase in each update cycle. */
|
|
143
|
+
_frameNumber = 0;
|
|
144
|
+
_queryParams = {};
|
|
145
|
+
_extensionsUsed = [];
|
|
146
|
+
_tiles = {};
|
|
147
|
+
/** counter for tracking tiles requests */
|
|
148
|
+
_pendingCount = 0;
|
|
149
|
+
/** Hold traversal results */
|
|
150
|
+
selectedTiles = [];
|
|
151
|
+
// TRAVERSAL
|
|
152
|
+
traverseCounter = 0;
|
|
153
|
+
geometricError = 0;
|
|
154
|
+
lastUpdatedVieports = null;
|
|
155
|
+
_requestedTiles = [];
|
|
156
|
+
_emptyTiles = [];
|
|
157
|
+
frameStateData = {};
|
|
158
|
+
_traverser;
|
|
159
|
+
_cache = new TilesetCache();
|
|
160
|
+
_requestScheduler;
|
|
161
|
+
// Promise tracking
|
|
162
|
+
updatePromise = null;
|
|
163
|
+
tilesetInitializationPromise;
|
|
92
164
|
/**
|
|
93
165
|
* Create a new Tileset3D
|
|
94
166
|
* @param json
|
|
@@ -96,60 +168,6 @@ export class Tileset3D {
|
|
|
96
168
|
*/
|
|
97
169
|
// eslint-disable-next-line max-statements
|
|
98
170
|
constructor(tileset, options) {
|
|
99
|
-
this.root = null;
|
|
100
|
-
this.roots = {};
|
|
101
|
-
/** @todo any->unknown */
|
|
102
|
-
this.asset = {};
|
|
103
|
-
// Metadata for the entire tileset
|
|
104
|
-
this.description = '';
|
|
105
|
-
this.extras = null;
|
|
106
|
-
this.attributions = {};
|
|
107
|
-
this.credits = {};
|
|
108
|
-
/** flags that contain information about data types in nested tiles */
|
|
109
|
-
this.contentFormats = { draco: false, meshopt: false, dds: false, ktx2: false };
|
|
110
|
-
// view props
|
|
111
|
-
this.cartographicCenter = null;
|
|
112
|
-
this.cartesianCenter = null;
|
|
113
|
-
this.zoom = 1;
|
|
114
|
-
this.boundingVolume = null;
|
|
115
|
-
/** Updated based on the camera position and direction */
|
|
116
|
-
this.dynamicScreenSpaceErrorComputedDensity = 0.0;
|
|
117
|
-
// METRICS
|
|
118
|
-
/**
|
|
119
|
-
* The maximum amount of GPU memory (in MB) that may be used to cache tiles
|
|
120
|
-
* Tiles not in view are unloaded to enforce private
|
|
121
|
-
*/
|
|
122
|
-
this.maximumMemoryUsage = 32;
|
|
123
|
-
/** The total amount of GPU memory in bytes used by the tileset. */
|
|
124
|
-
this.gpuMemoryUsageInBytes = 0;
|
|
125
|
-
/**
|
|
126
|
-
* If loading the level of detail required by maximumScreenSpaceError
|
|
127
|
-
* results in the memory usage exceeding maximumMemoryUsage (GPU), level of detail refinement
|
|
128
|
-
* will instead use this (larger) adjusted screen space error to achieve the
|
|
129
|
-
* best possible visual quality within the available memory.
|
|
130
|
-
*/
|
|
131
|
-
this.memoryAdjustedScreenSpaceError = 0.0;
|
|
132
|
-
this._cacheBytes = 0;
|
|
133
|
-
this._cacheOverflowBytes = 0;
|
|
134
|
-
/** Update tracker. increase in each update cycle. */
|
|
135
|
-
this._frameNumber = 0;
|
|
136
|
-
this._queryParams = {};
|
|
137
|
-
this._extensionsUsed = [];
|
|
138
|
-
this._tiles = {};
|
|
139
|
-
/** counter for tracking tiles requests */
|
|
140
|
-
this._pendingCount = 0;
|
|
141
|
-
/** Hold traversal results */
|
|
142
|
-
this.selectedTiles = [];
|
|
143
|
-
// TRAVERSAL
|
|
144
|
-
this.traverseCounter = 0;
|
|
145
|
-
this.geometricError = 0;
|
|
146
|
-
this.lastUpdatedVieports = null;
|
|
147
|
-
this._requestedTiles = [];
|
|
148
|
-
this._emptyTiles = [];
|
|
149
|
-
this.frameStateData = {};
|
|
150
|
-
this._cache = new TilesetCache();
|
|
151
|
-
// Promise tracking
|
|
152
|
-
this.updatePromise = null;
|
|
153
171
|
// PUBLIC MEMBERS
|
|
154
172
|
this.options = { ...DEFAULT_PROPS, ...options };
|
|
155
173
|
// raw data
|
|
@@ -7,6 +7,9 @@ import { DoublyLinkedList } from "../utils/doubly-linked-list.js";
|
|
|
7
7
|
* @private
|
|
8
8
|
*/
|
|
9
9
|
export class TilesetCache {
|
|
10
|
+
_list;
|
|
11
|
+
_sentinel;
|
|
12
|
+
_trimTiles;
|
|
10
13
|
constructor() {
|
|
11
14
|
// [head, sentinel) -> tiles that weren't selected this frame and may be removed from the cache
|
|
12
15
|
// (sentinel, tail] -> tiles that were selected this frame
|
|
@@ -12,27 +12,28 @@ export const DEFAULT_PROPS = {
|
|
|
12
12
|
basePath: ''
|
|
13
13
|
};
|
|
14
14
|
export class TilesetTraverser {
|
|
15
|
+
options;
|
|
16
|
+
// fulfill in traverse call
|
|
17
|
+
root = null;
|
|
18
|
+
// tiles should be rendered
|
|
19
|
+
selectedTiles = {};
|
|
20
|
+
// tiles should be loaded from server
|
|
21
|
+
requestedTiles = {};
|
|
22
|
+
// tiles does not have render content
|
|
23
|
+
emptyTiles = {};
|
|
24
|
+
lastUpdate = new Date().getTime();
|
|
25
|
+
updateDebounceTime = 1000;
|
|
26
|
+
/** temporary storage to hold the traversed tiles during a traversal */
|
|
27
|
+
_traversalStack = new ManagedArray();
|
|
28
|
+
_emptyTraversalStack = new ManagedArray();
|
|
29
|
+
/** set in every traverse cycle */
|
|
30
|
+
_frameNumber = null;
|
|
15
31
|
// RESULT
|
|
16
32
|
traversalFinished(frameState) {
|
|
17
33
|
return true;
|
|
18
34
|
}
|
|
19
35
|
// TODO nested props
|
|
20
36
|
constructor(options) {
|
|
21
|
-
// fulfill in traverse call
|
|
22
|
-
this.root = null;
|
|
23
|
-
// tiles should be rendered
|
|
24
|
-
this.selectedTiles = {};
|
|
25
|
-
// tiles should be loaded from server
|
|
26
|
-
this.requestedTiles = {};
|
|
27
|
-
// tiles does not have render content
|
|
28
|
-
this.emptyTiles = {};
|
|
29
|
-
this.lastUpdate = new Date().getTime();
|
|
30
|
-
this.updateDebounceTime = 1000;
|
|
31
|
-
/** temporary storage to hold the traversed tiles during a traversal */
|
|
32
|
-
this._traversalStack = new ManagedArray();
|
|
33
|
-
this._emptyTraversalStack = new ManagedArray();
|
|
34
|
-
/** set in every traverse cycle */
|
|
35
|
-
this._frameNumber = null;
|
|
36
37
|
this.options = { ...DEFAULT_PROPS, ...options };
|
|
37
38
|
}
|
|
38
39
|
// tiles should be visible
|
|
@@ -6,11 +6,9 @@ import { DoublyLinkedListNode } from "./doubly-linked-list-node.js";
|
|
|
6
6
|
* @private
|
|
7
7
|
*/
|
|
8
8
|
export class DoublyLinkedList {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this._length = 0;
|
|
13
|
-
}
|
|
9
|
+
head = null;
|
|
10
|
+
tail = null;
|
|
11
|
+
_length = 0;
|
|
14
12
|
get length() {
|
|
15
13
|
return this._length;
|
|
16
14
|
}
|
|
@@ -11,8 +11,10 @@ import { assert } from '@loaders.gl/loader-utils';
|
|
|
11
11
|
* @param {Number} [length=0] The initial length of the array.
|
|
12
12
|
*/
|
|
13
13
|
export class ManagedArray {
|
|
14
|
+
_map = new Map();
|
|
15
|
+
_array;
|
|
16
|
+
_length;
|
|
14
17
|
constructor(length = 0) {
|
|
15
|
-
this._map = new Map();
|
|
16
18
|
this._array = new Array(length);
|
|
17
19
|
this._length = length;
|
|
18
20
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/tiles",
|
|
3
|
-
"version": "4.2.0-alpha.
|
|
3
|
+
"version": "4.2.0-alpha.6",
|
|
4
4
|
"description": "Common components for different tiles loaders.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"build-bundle-dev": "ocular-bundle ./bundle.ts --env=dev --output=dist/dist.dev.js"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@loaders.gl/loader-utils": "4.2.0-alpha.
|
|
46
|
-
"@loaders.gl/math": "4.2.0-alpha.
|
|
45
|
+
"@loaders.gl/loader-utils": "4.2.0-alpha.6",
|
|
46
|
+
"@loaders.gl/math": "4.2.0-alpha.6",
|
|
47
47
|
"@math.gl/core": "^4.0.0",
|
|
48
48
|
"@math.gl/culling": "^4.0.0",
|
|
49
49
|
"@math.gl/geospatial": "^4.0.0",
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"@loaders.gl/core": "^4.0.0"
|
|
58
58
|
},
|
|
59
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "37bd8ca71763529f18727ee4bf29dd176aa914ca"
|
|
60
60
|
}
|
package/src/tileset/tile-3d.ts
CHANGED
|
@@ -58,7 +58,7 @@ export class Tile3D {
|
|
|
58
58
|
url: string;
|
|
59
59
|
parent: Tile3D;
|
|
60
60
|
/* Specifies the type of refine that is used when traversing this tile for rendering. */
|
|
61
|
-
refine:
|
|
61
|
+
refine: TILE_REFINEMENT;
|
|
62
62
|
type: string;
|
|
63
63
|
contentUrl: string;
|
|
64
64
|
/** Different refinement algorithms used by I3S and 3D tiles */
|