@loaders.gl/tiles 3.2.3 → 3.2.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.min.js +83 -45
- package/dist/es5/tileset/helpers/frame-state.js +26 -11
- package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
- package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/es5/tileset/tileset-3d.js +11 -11
- package/dist/es5/tileset/tileset-3d.js.map +1 -1
- package/dist/es5/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +19 -9
- package/dist/es5/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
- package/dist/es5/tileset/traversers/i3s-tile-manager.js +22 -12
- package/dist/es5/tileset/traversers/i3s-tile-manager.js.map +1 -1
- package/dist/es5/tileset/traversers/i3s-tileset-traverser.js +3 -3
- package/dist/es5/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
- package/dist/es5/tileset/traversers/tileset-traverser.js +2 -2
- package/dist/es5/tileset/traversers/tileset-traverser.js.map +1 -1
- package/dist/esm/tileset/helpers/frame-state.js +25 -9
- package/dist/esm/tileset/helpers/frame-state.js.map +1 -1
- package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/esm/tileset/tileset-3d.js +12 -9
- package/dist/esm/tileset/tileset-3d.js.map +1 -1
- package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js +33 -0
- package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
- package/dist/esm/tileset/traversers/i3s-tile-manager.js +32 -11
- package/dist/esm/tileset/traversers/i3s-tile-manager.js.map +1 -1
- package/dist/esm/tileset/traversers/i3s-tileset-traverser.js +3 -3
- package/dist/esm/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
- package/dist/esm/tileset/traversers/tileset-traverser.js +2 -2
- package/dist/esm/tileset/traversers/tileset-traverser.js.map +1 -1
- package/dist/tileset/helpers/frame-state.d.ts +4 -7
- package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
- package/dist/tileset/helpers/frame-state.js +26 -12
- package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -1
- package/dist/tileset/tileset-3d.d.ts +3 -2
- package/dist/tileset/tileset-3d.d.ts.map +1 -1
- package/dist/tileset/tileset-3d.js +11 -9
- package/dist/tileset/traversers/{i3s-frame-counter.d.ts → i3s-pending-tiles-register.d.ts} +7 -4
- package/dist/tileset/traversers/i3s-pending-tiles-register.d.ts.map +1 -0
- package/dist/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +17 -8
- package/dist/tileset/traversers/i3s-tile-manager.d.ts +19 -1
- package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +1 -1
- package/dist/tileset/traversers/i3s-tile-manager.js +32 -12
- package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +1 -1
- package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +1 -1
- package/dist/tileset/traversers/i3s-tileset-traverser.js +4 -3
- package/dist/tileset/traversers/tileset-traverser.d.ts +1 -1
- package/dist/tileset/traversers/tileset-traverser.d.ts.map +1 -1
- package/dist/tileset/traversers/tileset-traverser.js +2 -2
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/tileset/helpers/frame-state.ts +46 -19
- package/src/tileset/helpers/i3s-lod.ts +3 -1
- package/src/tileset/tileset-3d.ts +17 -14
- package/src/tileset/traversers/i3s-pending-tiles-register.ts +44 -0
- package/src/tileset/traversers/i3s-tile-manager.ts +47 -11
- package/src/tileset/traversers/i3s-tileset-traverser.ts +4 -3
- package/src/tileset/traversers/tileset-traverser.ts +2 -2
- package/src/types.ts +23 -0
- package/dist/es5/tileset/traversers/i3s-frame-counter.js.map +0 -1
- package/dist/esm/tileset/traversers/i3s-frame-counter.js +0 -23
- package/dist/esm/tileset/traversers/i3s-frame-counter.js.map +0 -1
- package/dist/tileset/traversers/i3s-frame-counter.d.ts.map +0 -1
- package/src/tileset/traversers/i3s-frame-counter.ts +0 -35
package/dist/dist.min.js
CHANGED
|
@@ -5036,14 +5036,13 @@
|
|
|
5036
5036
|
function getFrameState(viewport, frameNumber) {
|
|
5037
5037
|
const { cameraDirection, cameraUp, height } = viewport;
|
|
5038
5038
|
const { metersPerUnit } = viewport.distanceScales;
|
|
5039
|
-
const
|
|
5040
|
-
const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(viewportCenterCartographic, new Vector3());
|
|
5039
|
+
const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);
|
|
5041
5040
|
const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
|
|
5042
5041
|
const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
|
|
5043
5042
|
const cameraPositionCartesian2 = Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, new Vector3());
|
|
5044
5043
|
const cameraDirectionCartesian = new Vector3(enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))).normalize();
|
|
5045
5044
|
const cameraUpCartesian = new Vector3(enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))).normalize();
|
|
5046
|
-
commonSpacePlanesToWGS84(viewport
|
|
5045
|
+
commonSpacePlanesToWGS84(viewport);
|
|
5047
5046
|
const ViewportClass = viewport.constructor;
|
|
5048
5047
|
const { longitude, latitude, width, bearing, zoom } = viewport;
|
|
5049
5048
|
const topDownViewport = new ViewportClass({
|
|
@@ -5093,18 +5092,32 @@
|
|
|
5093
5092
|
}
|
|
5094
5093
|
return [selectedTiles, unselectedTiles];
|
|
5095
5094
|
}
|
|
5096
|
-
function commonSpacePlanesToWGS84(viewport
|
|
5095
|
+
function commonSpacePlanesToWGS84(viewport) {
|
|
5097
5096
|
const frustumPlanes = viewport.getFrustumPlanes();
|
|
5097
|
+
const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);
|
|
5098
|
+
const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
|
|
5099
|
+
const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition3);
|
|
5098
5100
|
let i = 0;
|
|
5101
|
+
cullingVolume.planes[i++].fromPointNormal(nearCenterCartesian, scratchVector7.copy(nearCenterCartesian).subtract(cameraCartesian));
|
|
5099
5102
|
for (const dir in frustumPlanes) {
|
|
5103
|
+
if (dir === "near") {
|
|
5104
|
+
continue;
|
|
5105
|
+
}
|
|
5100
5106
|
const plane = frustumPlanes[dir];
|
|
5101
|
-
const
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3());
|
|
5105
|
-
cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector7.copy(viewportCenterCartesian).subtract(cartesianPos));
|
|
5107
|
+
const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition3);
|
|
5108
|
+
const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition3);
|
|
5109
|
+
cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector7.copy(nearCenterCartesian).subtract(cartesianPos));
|
|
5106
5110
|
}
|
|
5107
5111
|
}
|
|
5112
|
+
function closestPointOnPlane(plane, refPoint, out = new Vector3()) {
|
|
5113
|
+
const distanceToRef = plane.normal.dot(refPoint);
|
|
5114
|
+
out.copy(plane.normal).scale(plane.distance - distanceToRef).add(refPoint);
|
|
5115
|
+
return out;
|
|
5116
|
+
}
|
|
5117
|
+
function worldToCartesian(viewport, point, out = new Vector3()) {
|
|
5118
|
+
const cartographicPos = viewport.unprojectPosition(point);
|
|
5119
|
+
return Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);
|
|
5120
|
+
}
|
|
5108
5121
|
var scratchVector7, scratchPosition3, cullingVolume;
|
|
5109
5122
|
var init_frame_state = __esm({
|
|
5110
5123
|
"src/tileset/helpers/frame-state.ts"() {
|
|
@@ -7738,7 +7751,7 @@
|
|
|
7738
7751
|
this.requestedTiles = {};
|
|
7739
7752
|
this.emptyTiles = {};
|
|
7740
7753
|
}
|
|
7741
|
-
|
|
7754
|
+
traversalFinished(frameState) {
|
|
7742
7755
|
return true;
|
|
7743
7756
|
}
|
|
7744
7757
|
traverse(root, frameState, options) {
|
|
@@ -7789,7 +7802,7 @@
|
|
|
7789
7802
|
tile._shouldRefine = shouldRefine && parentRefines;
|
|
7790
7803
|
}
|
|
7791
7804
|
const newTime = new Date().getTime();
|
|
7792
|
-
if (this.traversalFinished || newTime - this.lastUpdate > this.updateDebounceTime) {
|
|
7805
|
+
if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {
|
|
7793
7806
|
this.lastUpdate = newTime;
|
|
7794
7807
|
this.options.onTraversalEnd(frameState);
|
|
7795
7808
|
}
|
|
@@ -8349,24 +8362,30 @@
|
|
|
8349
8362
|
}
|
|
8350
8363
|
});
|
|
8351
8364
|
|
|
8352
|
-
// src/tileset/traversers/i3s-
|
|
8365
|
+
// src/tileset/traversers/i3s-pending-tiles-register.ts
|
|
8353
8366
|
var I3SPendingTilesRegister;
|
|
8354
|
-
var
|
|
8355
|
-
"src/tileset/traversers/i3s-
|
|
8367
|
+
var init_i3s_pending_tiles_register = __esm({
|
|
8368
|
+
"src/tileset/traversers/i3s-pending-tiles-register.ts"() {
|
|
8356
8369
|
I3SPendingTilesRegister = class {
|
|
8357
8370
|
constructor() {
|
|
8358
8371
|
this.frameNumberMap = new Map();
|
|
8359
8372
|
}
|
|
8360
|
-
register(frameNumber) {
|
|
8361
|
-
const
|
|
8362
|
-
|
|
8373
|
+
register(viewportId, frameNumber) {
|
|
8374
|
+
const viewportMap = this.frameNumberMap.get(viewportId) || new Map();
|
|
8375
|
+
const oldCount = viewportMap.get(frameNumber) || 0;
|
|
8376
|
+
viewportMap.set(frameNumber, oldCount + 1);
|
|
8377
|
+
this.frameNumberMap.set(viewportId, viewportMap);
|
|
8363
8378
|
}
|
|
8364
|
-
deregister(frameNumber) {
|
|
8365
|
-
const
|
|
8366
|
-
|
|
8379
|
+
deregister(viewportId, frameNumber) {
|
|
8380
|
+
const viewportMap = this.frameNumberMap.get(viewportId);
|
|
8381
|
+
if (!viewportMap) {
|
|
8382
|
+
return;
|
|
8383
|
+
}
|
|
8384
|
+
const oldCount = viewportMap.get(frameNumber) || 1;
|
|
8385
|
+
viewportMap.set(frameNumber, oldCount - 1);
|
|
8367
8386
|
}
|
|
8368
|
-
isZero(frameNumber) {
|
|
8369
|
-
const count = this.frameNumberMap.get(frameNumber) || 0;
|
|
8387
|
+
isZero(viewportId, frameNumber) {
|
|
8388
|
+
const count = this.frameNumberMap.get(viewportId)?.get(frameNumber) || 0;
|
|
8370
8389
|
return count === 0;
|
|
8371
8390
|
}
|
|
8372
8391
|
};
|
|
@@ -8377,7 +8396,7 @@
|
|
|
8377
8396
|
var STATUS, I3STileManager;
|
|
8378
8397
|
var init_i3s_tile_manager = __esm({
|
|
8379
8398
|
"src/tileset/traversers/i3s-tile-manager.ts"() {
|
|
8380
|
-
|
|
8399
|
+
init_i3s_pending_tiles_register();
|
|
8381
8400
|
STATUS = {
|
|
8382
8401
|
REQUESTED: "REQUESTED",
|
|
8383
8402
|
COMPLETED: "COMPLETED",
|
|
@@ -8390,34 +8409,51 @@
|
|
|
8390
8409
|
}
|
|
8391
8410
|
add(request, key, callback, frameState) {
|
|
8392
8411
|
if (!this._statusMap[key]) {
|
|
8393
|
-
const {
|
|
8412
|
+
const {
|
|
8413
|
+
frameNumber,
|
|
8414
|
+
viewport: { id }
|
|
8415
|
+
} = frameState;
|
|
8394
8416
|
this._statusMap[key] = { request, callback, key, frameState, status: STATUS.REQUESTED };
|
|
8395
|
-
this.pendingTilesRegister.register(frameNumber);
|
|
8417
|
+
this.pendingTilesRegister.register(id, frameNumber);
|
|
8396
8418
|
request().then((data) => {
|
|
8397
8419
|
this._statusMap[key].status = STATUS.COMPLETED;
|
|
8398
|
-
const {
|
|
8399
|
-
|
|
8420
|
+
const {
|
|
8421
|
+
frameNumber: actualFrameNumber,
|
|
8422
|
+
viewport: { id: id2 }
|
|
8423
|
+
} = this._statusMap[key].frameState;
|
|
8424
|
+
this.pendingTilesRegister.deregister(id2, actualFrameNumber);
|
|
8400
8425
|
this._statusMap[key].callback(data, frameState);
|
|
8401
8426
|
}).catch((error) => {
|
|
8402
8427
|
this._statusMap[key].status = STATUS.ERROR;
|
|
8403
|
-
const {
|
|
8404
|
-
|
|
8428
|
+
const {
|
|
8429
|
+
frameNumber: actualFrameNumber,
|
|
8430
|
+
viewport: { id: id2 }
|
|
8431
|
+
} = this._statusMap[key].frameState;
|
|
8432
|
+
this.pendingTilesRegister.deregister(id2, actualFrameNumber);
|
|
8405
8433
|
callback(error);
|
|
8406
8434
|
});
|
|
8407
8435
|
}
|
|
8408
8436
|
}
|
|
8409
8437
|
update(key, frameState) {
|
|
8410
8438
|
if (this._statusMap[key]) {
|
|
8411
|
-
|
|
8412
|
-
|
|
8439
|
+
const {
|
|
8440
|
+
frameNumber,
|
|
8441
|
+
viewport: { id }
|
|
8442
|
+
} = this._statusMap[key].frameState;
|
|
8443
|
+
this.pendingTilesRegister.deregister(id, frameNumber);
|
|
8444
|
+
const {
|
|
8445
|
+
frameNumber: newFrameNumber,
|
|
8446
|
+
viewport: { id: newViewportId }
|
|
8447
|
+
} = frameState;
|
|
8448
|
+
this.pendingTilesRegister.register(newViewportId, newFrameNumber);
|
|
8413
8449
|
this._statusMap[key].frameState = frameState;
|
|
8414
8450
|
}
|
|
8415
8451
|
}
|
|
8416
8452
|
find(key) {
|
|
8417
8453
|
return this._statusMap[key];
|
|
8418
8454
|
}
|
|
8419
|
-
hasPendingTiles(frameNumber) {
|
|
8420
|
-
return !this.pendingTilesRegister.isZero(frameNumber);
|
|
8455
|
+
hasPendingTiles(viewportId, frameNumber) {
|
|
8456
|
+
return !this.pendingTilesRegister.isZero(viewportId, frameNumber);
|
|
8421
8457
|
}
|
|
8422
8458
|
};
|
|
8423
8459
|
}
|
|
@@ -8433,8 +8469,8 @@
|
|
|
8433
8469
|
init_tile_3d();
|
|
8434
8470
|
init_i3s_tile_manager();
|
|
8435
8471
|
I3STilesetTraverser = class extends TilesetTraverser {
|
|
8436
|
-
|
|
8437
|
-
return !this._tileManager.hasPendingTiles(this._frameNumber || 0);
|
|
8472
|
+
traversalFinished(frameState) {
|
|
8473
|
+
return !this._tileManager.hasPendingTiles(frameState.viewport.id, this._frameNumber || 0);
|
|
8438
8474
|
}
|
|
8439
8475
|
constructor(options) {
|
|
8440
8476
|
super(options);
|
|
@@ -8486,7 +8522,7 @@
|
|
|
8486
8522
|
tile.children.push(childTile);
|
|
8487
8523
|
const frameState = this._tileManager.find(childTile.id).frameState;
|
|
8488
8524
|
this.updateTile(childTile, frameState);
|
|
8489
|
-
if (this._frameNumber === frameState.frameNumber && (this.traversalFinished || new Date().getTime() - this.lastUpdate > this.updateDebounceTime)) {
|
|
8525
|
+
if (this._frameNumber === frameState.frameNumber && (this.traversalFinished(frameState) || new Date().getTime() - this.lastUpdate > this.updateDebounceTime)) {
|
|
8490
8526
|
this.executeTraversal(childTile, frameState);
|
|
8491
8527
|
}
|
|
8492
8528
|
}
|
|
@@ -8655,7 +8691,9 @@
|
|
|
8655
8691
|
} else {
|
|
8656
8692
|
this.lastUpdatedVieports = viewports;
|
|
8657
8693
|
}
|
|
8658
|
-
|
|
8694
|
+
if (viewports) {
|
|
8695
|
+
this.doUpdate(viewports);
|
|
8696
|
+
}
|
|
8659
8697
|
});
|
|
8660
8698
|
}
|
|
8661
8699
|
async selectTiles(viewports = null) {
|
|
@@ -8666,7 +8704,9 @@
|
|
|
8666
8704
|
if (!this.updatePromise) {
|
|
8667
8705
|
this.updatePromise = new Promise((resolve) => {
|
|
8668
8706
|
setTimeout(() => {
|
|
8669
|
-
|
|
8707
|
+
if (this.lastUpdatedVieports) {
|
|
8708
|
+
this.doUpdate(this.lastUpdatedVieports);
|
|
8709
|
+
}
|
|
8670
8710
|
resolve(this._frameNumber);
|
|
8671
8711
|
this.updatePromise = null;
|
|
8672
8712
|
}, this.options.debounceTime);
|
|
@@ -8674,21 +8714,19 @@
|
|
|
8674
8714
|
}
|
|
8675
8715
|
return this.updatePromise;
|
|
8676
8716
|
}
|
|
8677
|
-
doUpdate(viewports
|
|
8717
|
+
doUpdate(viewports) {
|
|
8678
8718
|
if ("loadTiles" in this.options && !this.options.loadTiles) {
|
|
8679
8719
|
return;
|
|
8680
8720
|
}
|
|
8681
8721
|
if (this.traverseCounter > 0) {
|
|
8682
8722
|
return;
|
|
8683
8723
|
}
|
|
8684
|
-
|
|
8685
|
-
viewports = [viewports];
|
|
8686
|
-
}
|
|
8724
|
+
const preparedViewports = viewports instanceof Array ? viewports : [viewports];
|
|
8687
8725
|
this._cache.reset();
|
|
8688
8726
|
this._frameNumber++;
|
|
8689
|
-
this.traverseCounter =
|
|
8727
|
+
this.traverseCounter = preparedViewports.length;
|
|
8690
8728
|
const viewportsToTraverse = [];
|
|
8691
|
-
for (const viewport of
|
|
8729
|
+
for (const viewport of preparedViewports) {
|
|
8692
8730
|
const id = viewport.id;
|
|
8693
8731
|
if (this._needTraverse(id)) {
|
|
8694
8732
|
viewportsToTraverse.push(id);
|
|
@@ -8696,7 +8734,7 @@
|
|
|
8696
8734
|
this.traverseCounter--;
|
|
8697
8735
|
}
|
|
8698
8736
|
}
|
|
8699
|
-
for (const viewport of
|
|
8737
|
+
for (const viewport of preparedViewports) {
|
|
8700
8738
|
const id = viewport.id;
|
|
8701
8739
|
if (!this.roots[id]) {
|
|
8702
8740
|
this.roots[id] = this._initializeTileHeaders(this.tileset, null);
|
|
@@ -31,9 +31,7 @@ function getFrameState(viewport, frameNumber) {
|
|
|
31
31
|
cameraUp = viewport.cameraUp,
|
|
32
32
|
height = viewport.height;
|
|
33
33
|
var metersPerUnit = viewport.distanceScales.metersPerUnit;
|
|
34
|
-
var
|
|
35
|
-
|
|
36
|
-
var viewportCenterCartesian = _geospatial.Ellipsoid.WGS84.cartographicToCartesian(viewportCenterCartographic, new _core.Vector3());
|
|
34
|
+
var viewportCenterCartesian = worldToCartesian(viewport, viewport.center);
|
|
37
35
|
|
|
38
36
|
var enuToFixedTransform = _geospatial.Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
|
|
39
37
|
|
|
@@ -43,7 +41,7 @@ function getFrameState(viewport, frameNumber) {
|
|
|
43
41
|
|
|
44
42
|
var cameraDirectionCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraDirection).scale(metersPerUnit))).normalize();
|
|
45
43
|
var cameraUpCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraUp).scale(metersPerUnit))).normalize();
|
|
46
|
-
commonSpacePlanesToWGS84(viewport
|
|
44
|
+
commonSpacePlanesToWGS84(viewport);
|
|
47
45
|
var ViewportClass = viewport.constructor;
|
|
48
46
|
var longitude = viewport.longitude,
|
|
49
47
|
latitude = viewport.latitude,
|
|
@@ -126,19 +124,36 @@ function limitSelectedTiles(tiles, frameState, maximumTilesSelected) {
|
|
|
126
124
|
return [selectedTiles, unselectedTiles];
|
|
127
125
|
}
|
|
128
126
|
|
|
129
|
-
function commonSpacePlanesToWGS84(viewport
|
|
127
|
+
function commonSpacePlanesToWGS84(viewport) {
|
|
130
128
|
var frustumPlanes = viewport.getFrustumPlanes();
|
|
129
|
+
var nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);
|
|
130
|
+
var nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
|
|
131
|
+
var cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);
|
|
131
132
|
var i = 0;
|
|
133
|
+
cullingVolume.planes[i++].fromPointNormal(nearCenterCartesian, scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian));
|
|
132
134
|
|
|
133
135
|
for (var dir in frustumPlanes) {
|
|
136
|
+
if (dir === 'near') {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
|
|
134
140
|
var plane = frustumPlanes[dir];
|
|
135
|
-
var
|
|
136
|
-
|
|
137
|
-
|
|
141
|
+
var posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);
|
|
142
|
+
var cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);
|
|
143
|
+
cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector.copy(nearCenterCartesian).subtract(cartesianPos));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
138
146
|
|
|
139
|
-
|
|
147
|
+
function closestPointOnPlane(plane, refPoint) {
|
|
148
|
+
var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
|
|
149
|
+
var distanceToRef = plane.normal.dot(refPoint);
|
|
150
|
+
out.copy(plane.normal).scale(plane.distance - distanceToRef).add(refPoint);
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
140
153
|
|
|
141
|
-
|
|
142
|
-
|
|
154
|
+
function worldToCartesian(viewport, point) {
|
|
155
|
+
var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
|
|
156
|
+
var cartographicPos = viewport.unprojectPosition(point);
|
|
157
|
+
return _geospatial.Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);
|
|
143
158
|
}
|
|
144
159
|
//# sourceMappingURL=frame-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/tileset/helpers/frame-state.ts"],"names":["scratchVector","Vector3","scratchPosition","cullingVolume","CullingVolume","Plane","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartographic","unprojectPosition","center","viewportCenterCartesian","Ellipsoid","WGS84","cartographicToCartesian","enuToFixedTransform","eastNorthUpToFixedFrame","cameraPositionCartographic","cameraPosition","cameraPositionCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","ViewportClass","constructor","longitude","latitude","width","bearing","zoom","topDownViewport","pitch","camera","position","direction","up","sseDenominator","limitSelectedTiles","tiles","frameState","maximumTilesSelected","length","tuples","viewportLongitude","viewportLatitude","entries","index","tile","header","mbs","deltaLon","Math","abs","deltaLat","distance","sqrt","push","tuplesSorted","sort","a","b","selectedTiles","i","unselectedTiles","frustumPlanes","getFrustumPlanes","dir","plane","distanceToCenter","normal","dot","copy","add","cartographicPos","cartesianPos","planes","fromPointNormal","subtract"],"mappings":"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","sourcesContent":["import {Tile3D} from '@loaders.gl/tiles';\nimport {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: {[key: string]: any};\n topDownViewport: {[key: string]: any}; // Use it to calculate projected radius for a tile\n height: number;\n cullingVolume: CullingVolume;\n frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: number; // Assumes fovy = 60 degrees\n};\n\nconst scratchVector = new Vector3();\nconst scratchPosition = new Vector3();\nconst cullingVolume = new CullingVolume([\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane()\n]);\n\n// Extracts a frame state appropriate for tile culling from a deck.gl viewport\n// TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios\nexport function getFrameState(viewport, frameNumber: number): FrameState {\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n const {cameraDirection, cameraUp, height} = viewport;\n const {metersPerUnit} = viewport.distanceScales;\n\n const viewportCenterCartographic = viewport.unprojectPosition(viewport.center);\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n viewportCenterCartographic,\n new Vector3()\n );\n const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);\n\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n cameraPositionCartographic,\n new Vector3()\n );\n\n // These should still be normalized as the transform has scale 1 (goes from meters to meters)\n const cameraDirectionCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))\n ).normalize();\n const cameraUpCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))\n ).normalize();\n\n commonSpacePlanesToWGS84(viewport, viewportCenterCartesian);\n\n const ViewportClass = viewport.constructor;\n const {longitude, latitude, width, bearing, zoom} = viewport;\n // @ts-ignore\n const topDownViewport = new ViewportClass({\n longitude,\n latitude,\n height,\n width,\n bearing,\n zoom,\n pitch: 0\n });\n\n // TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function\n return {\n camera: {\n position: cameraPositionCartesian,\n direction: cameraDirectionCartesian,\n up: cameraUpCartesian\n },\n viewport,\n topDownViewport,\n height,\n cullingVolume,\n frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: 1.15 // Assumes fovy = 60 degrees\n };\n}\n\n/**\n * Limit `tiles` array length with `maximumTilesSelected` number.\n * The criteria for this filtering is distance of a tile center\n * to the `frameState.viewport`'s longitude and latitude\n * @param tiles - tiles array to filter\n * @param frameState - frameState to calculate distances\n * @param maximumTilesSelected - maximal amount of tiles in the output array\n * @returns new tiles array\n */\nexport function limitSelectedTiles(\n tiles: Tile3D[],\n frameState: FrameState,\n maximumTilesSelected: number\n): [Tile3D[], Tile3D[]] {\n if (maximumTilesSelected === 0 || tiles.length <= maximumTilesSelected) {\n return [tiles, []];\n }\n // Accumulate distances in couples array: [tileIndex: number, distanceToViewport: number]\n const tuples: [number, number][] = [];\n const {longitude: viewportLongitude, latitude: viewportLatitude} = frameState.viewport;\n for (const [index, tile] of tiles.entries()) {\n const [longitude, latitude] = tile.header.mbs;\n const deltaLon = Math.abs(viewportLongitude - longitude);\n const deltaLat = Math.abs(viewportLatitude - latitude);\n const distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);\n tuples.push([index, distance]);\n }\n const tuplesSorted = tuples.sort((a, b) => a[1] - b[1]);\n const selectedTiles: Tile3D[] = [];\n for (let i = 0; i < maximumTilesSelected; i++) {\n selectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n const unselectedTiles: Tile3D[] = [];\n for (let i = maximumTilesSelected; i < tuplesSorted.length; i++) {\n unselectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n\n return [selectedTiles, unselectedTiles];\n}\n\nfunction commonSpacePlanesToWGS84(viewport, viewportCenterCartesian) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n let i = 0;\n for (const dir in frustumPlanes) {\n const plane = frustumPlanes[dir];\n const distanceToCenter = plane.normal.dot(viewport.center);\n scratchPosition\n .copy(plane.normal)\n .scale(plane.distance - distanceToCenter)\n .add(viewport.center);\n const cartographicPos = viewport.unprojectPosition(scratchPosition);\n\n const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3());\n\n cullingVolume.planes[i++].fromPointNormal(\n cartesianPos,\n // Want the normal to point into the frustum since that's what culling expects\n scratchVector.copy(viewportCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n"],"file":"frame-state.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/tileset/helpers/frame-state.ts"],"names":["scratchVector","Vector3","scratchPosition","cullingVolume","CullingVolume","Plane","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartesian","worldToCartesian","center","enuToFixedTransform","Ellipsoid","WGS84","eastNorthUpToFixedFrame","cameraPositionCartographic","unprojectPosition","cameraPosition","cameraPositionCartesian","cartographicToCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","ViewportClass","constructor","longitude","latitude","width","bearing","zoom","topDownViewport","pitch","camera","position","direction","up","sseDenominator","limitSelectedTiles","tiles","frameState","maximumTilesSelected","length","tuples","viewportLongitude","viewportLatitude","entries","index","tile","header","mbs","deltaLon","Math","abs","deltaLat","distance","sqrt","push","tuplesSorted","sort","a","b","selectedTiles","i","unselectedTiles","frustumPlanes","getFrustumPlanes","nearCenterCommon","closestPointOnPlane","near","nearCenterCartesian","cameraCartesian","planes","fromPointNormal","copy","subtract","dir","plane","posCommon","cartesianPos","refPoint","out","distanceToRef","normal","dot","add","point","cartographicPos"],"mappings":"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","sourcesContent":["import {Tile3D} from '@loaders.gl/tiles';\nimport {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {Viewport} from '../../types';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: Viewport;\n topDownViewport: Viewport; // Use it to calculate projected radius for a tile\n height: number;\n cullingVolume: CullingVolume;\n frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: number; // Assumes fovy = 60 degrees\n};\n\nconst scratchVector = new Vector3();\nconst scratchPosition = new Vector3();\nconst cullingVolume = new CullingVolume([\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane()\n]);\n\n// Extracts a frame state appropriate for tile culling from a deck.gl viewport\n// TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios\nexport function getFrameState(viewport: Viewport, frameNumber: number): FrameState {\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n const {cameraDirection, cameraUp, height} = viewport;\n const {metersPerUnit} = viewport.distanceScales;\n\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);\n const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);\n\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n cameraPositionCartographic,\n new Vector3()\n );\n\n // These should still be normalized as the transform has scale 1 (goes from meters to meters)\n const cameraDirectionCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))\n ).normalize();\n const cameraUpCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))\n ).normalize();\n\n commonSpacePlanesToWGS84(viewport);\n\n const ViewportClass = viewport.constructor;\n const {longitude, latitude, width, bearing, zoom} = viewport;\n // @ts-ignore\n const topDownViewport = new ViewportClass({\n longitude,\n latitude,\n height,\n width,\n bearing,\n zoom,\n pitch: 0\n });\n\n // TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function\n return {\n camera: {\n position: cameraPositionCartesian,\n direction: cameraDirectionCartesian,\n up: cameraUpCartesian\n },\n viewport,\n topDownViewport,\n height,\n cullingVolume,\n frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: 1.15 // Assumes fovy = 60 degrees\n };\n}\n\n/**\n * Limit `tiles` array length with `maximumTilesSelected` number.\n * The criteria for this filtering is distance of a tile center\n * to the `frameState.viewport`'s longitude and latitude\n * @param tiles - tiles array to filter\n * @param frameState - frameState to calculate distances\n * @param maximumTilesSelected - maximal amount of tiles in the output array\n * @returns new tiles array\n */\nexport function limitSelectedTiles(\n tiles: Tile3D[],\n frameState: FrameState,\n maximumTilesSelected: number\n): [Tile3D[], Tile3D[]] {\n if (maximumTilesSelected === 0 || tiles.length <= maximumTilesSelected) {\n return [tiles, []];\n }\n // Accumulate distances in couples array: [tileIndex: number, distanceToViewport: number]\n const tuples: [number, number][] = [];\n const {longitude: viewportLongitude, latitude: viewportLatitude} = frameState.viewport;\n for (const [index, tile] of tiles.entries()) {\n const [longitude, latitude] = tile.header.mbs;\n const deltaLon = Math.abs(viewportLongitude - longitude);\n const deltaLat = Math.abs(viewportLatitude - latitude);\n const distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);\n tuples.push([index, distance]);\n }\n const tuplesSorted = tuples.sort((a, b) => a[1] - b[1]);\n const selectedTiles: Tile3D[] = [];\n for (let i = 0; i < maximumTilesSelected; i++) {\n selectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n const unselectedTiles: Tile3D[] = [];\n for (let i = maximumTilesSelected; i < tuplesSorted.length; i++) {\n unselectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n\n return [selectedTiles, unselectedTiles];\n}\n\nfunction commonSpacePlanesToWGS84(viewport) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n\n // Get the near/far plane centers\n const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);\n const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);\n const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);\n\n let i = 0;\n cullingVolume.planes[i++].fromPointNormal(\n nearCenterCartesian,\n scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian)\n );\n\n for (const dir in frustumPlanes) {\n if (dir === 'near') {\n continue;\n }\n const plane = frustumPlanes[dir];\n const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);\n const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);\n\n cullingVolume.planes[i++].fromPointNormal(\n cartesianPos,\n // Want the normal to point into the frustum since that's what culling expects\n scratchVector.copy(nearCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n\nfunction closestPointOnPlane(\n plane: {distance: number; normal: Vector3},\n refPoint: [number, number, number] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const distanceToRef = plane.normal.dot(refPoint);\n out\n .copy(plane.normal)\n .scale(plane.distance - distanceToRef)\n .add(refPoint);\n return out;\n}\n\nfunction worldToCartesian(\n viewport: Viewport,\n point: [number, number, number] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const cartographicPos = viewport.unprojectPosition(point);\n return Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);\n}\n"],"file":"frame-state.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/tileset/helpers/i3s-lod.ts"],"names":["cameraPositionCartesian","Vector3","toEye","cameraPositionEnu","extraVertexEnu","projectedOriginVector","enuToCartesianMatrix","Matrix4","cartesianToEnuMatrix","getLodStatus","tile","frameState","lodMetricValue","isNaN","screenSize","getProjectedRadius","header","children","viewport","topDownViewport","mbsLat","mbs","mbsLon","mbsZ","mbsR","mbsCenterCartesian","boundingVolume","center","cameraPositionCartographic","unprojectPosition","cameraPosition","Ellipsoid","WGS84","cartographicToCartesian","copy","subtract","normalize","eastNorthUpToFixedFrame","invert","transform","projection","Math","sqrt","extraZ","extraVertexCartesian","extraVectorCartesian","radiusVector","cross","scale","sphereMbsBorderVertexCartesian","add","sphereMbsBorderVertexCartographic","cartesianToCartographic","projectedOrigin","project","projectedMbsBorderVertex","projectedRadius","magnitude"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../../../../src/tileset/helpers/i3s-lod.ts"],"names":["cameraPositionCartesian","Vector3","toEye","cameraPositionEnu","extraVertexEnu","projectedOriginVector","enuToCartesianMatrix","Matrix4","cartesianToEnuMatrix","getLodStatus","tile","frameState","lodMetricValue","isNaN","screenSize","getProjectedRadius","header","children","viewport","topDownViewport","mbsLat","mbs","mbsLon","mbsZ","mbsR","mbsCenterCartesian","boundingVolume","center","cameraPositionCartographic","unprojectPosition","cameraPosition","Ellipsoid","WGS84","cartographicToCartesian","copy","subtract","normalize","eastNorthUpToFixedFrame","invert","transform","projection","Math","sqrt","extraZ","extraVertexCartesian","extraVectorCartesian","radiusVector","cross","scale","sphereMbsBorderVertexCartesian","add","sphereMbsBorderVertexCartographic","cartesianToCartographic","projectedOrigin","project","projectedMbsBorderVertex","projectedRadius","magnitude"],"mappings":"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","sourcesContent":["import {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport Tile3D from '../tile-3d';\nimport {FrameState} from './frame-state';\n\nconst cameraPositionCartesian = new Vector3();\nconst toEye = new Vector3();\nconst cameraPositionEnu = new Vector3();\nconst extraVertexEnu = new Vector3();\nconst projectedOriginVector = new Vector3();\nconst enuToCartesianMatrix = new Matrix4();\nconst cartesianToEnuMatrix = new Matrix4();\n\n/**\n * For the maxScreenThreshold error metric, maxError means that you should replace the node with it's children\n as soon as the nodes bounding sphere has a screen radius larger than maxError pixels.\n In this sense a value of 0 means you should always load it's children,\n or if it's a leaf node, you should always display it.\n * @param tile \n * @param frameState \n * @returns \n */\nexport function getLodStatus(tile: Tile3D, frameState: FrameState): 'DIG' | 'OUT' | 'DRAW' {\n if (tile.lodMetricValue === 0 || isNaN(tile.lodMetricValue)) {\n return 'DIG';\n }\n const screenSize = 2 * getProjectedRadius(tile, frameState);\n if (screenSize < 2) {\n return 'OUT';\n }\n if (!tile.header.children || screenSize <= tile.lodMetricValue) {\n return 'DRAW';\n } else if (tile.header.children) {\n return 'DIG';\n }\n return 'OUT';\n}\n\n/**\n * Calculate size of MBS radius projected on the screen plane\n * @param tile\n * @param frameState\n * @returns\n */\n// eslint-disable-next-line max-statements\nexport function getProjectedRadius(tile: Tile3D, frameState: FrameState): number {\n const {topDownViewport: viewport} = frameState;\n const mbsLat = tile.header.mbs[1];\n const mbsLon = tile.header.mbs[0];\n const mbsZ = tile.header.mbs[2];\n const mbsR = tile.header.mbs[3];\n const mbsCenterCartesian = [...tile.boundingVolume.center];\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, cameraPositionCartesian);\n\n // ---------------------------\n // Calculate mbs border vertex\n // ---------------------------\n toEye.copy(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();\n // Add extra vector to form plane\n Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian, enuToCartesianMatrix);\n cartesianToEnuMatrix.copy(enuToCartesianMatrix).invert();\n cameraPositionEnu.copy(cameraPositionCartesian).transform(cartesianToEnuMatrix);\n // Mean Proportionals in Right Triangles - Altitude rule\n // https://mathbitsnotebook.com/Geometry/RightTriangles/RTmeanRight.html\n const projection = Math.sqrt(\n cameraPositionEnu[0] * cameraPositionEnu[0] + cameraPositionEnu[1] * cameraPositionEnu[1]\n );\n const extraZ = (projection * projection) / cameraPositionEnu[2];\n extraVertexEnu.copy([cameraPositionEnu[0], cameraPositionEnu[1], extraZ]);\n const extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);\n const extraVectorCartesian = extraVertexCartesian.subtract(mbsCenterCartesian).normalize();\n // We need radius vector orthogonal to toEye vector\n const radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);\n const sphereMbsBorderVertexCartesian = radiusVector.add(mbsCenterCartesian);\n const sphereMbsBorderVertexCartographic = Ellipsoid.WGS84.cartesianToCartographic(\n sphereMbsBorderVertexCartesian\n );\n // ---------------------------\n\n // Project center vertex and border vertex and calculate projected radius of MBS\n const projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);\n const projectedMbsBorderVertex = viewport.project(\n sphereMbsBorderVertexCartographic as [number, number, number]\n );\n const projectedRadius = projectedOriginVector\n .copy(projectedOrigin)\n .subtract(projectedMbsBorderVertex)\n .magnitude();\n return projectedRadius;\n}\n"],"file":"i3s-lod.js"}
|
|
@@ -265,7 +265,9 @@ var Tileset3D = function () {
|
|
|
265
265
|
_this.lastUpdatedVieports = viewports;
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
-
|
|
268
|
+
if (viewports) {
|
|
269
|
+
_this.doUpdate(viewports);
|
|
270
|
+
}
|
|
269
271
|
});
|
|
270
272
|
}
|
|
271
273
|
}, {
|
|
@@ -292,7 +294,9 @@ var Tileset3D = function () {
|
|
|
292
294
|
if (!this.updatePromise) {
|
|
293
295
|
this.updatePromise = new Promise(function (resolve) {
|
|
294
296
|
setTimeout(function () {
|
|
295
|
-
|
|
297
|
+
if (_this2.lastUpdatedVieports) {
|
|
298
|
+
_this2.doUpdate(_this2.lastUpdatedVieports);
|
|
299
|
+
}
|
|
296
300
|
|
|
297
301
|
resolve(_this2._frameNumber);
|
|
298
302
|
_this2.updatePromise = null;
|
|
@@ -318,9 +322,7 @@ var Tileset3D = function () {
|
|
|
318
322
|
}()
|
|
319
323
|
}, {
|
|
320
324
|
key: "doUpdate",
|
|
321
|
-
value: function doUpdate() {
|
|
322
|
-
var viewports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
323
|
-
|
|
325
|
+
value: function doUpdate(viewports) {
|
|
324
326
|
if ('loadTiles' in this.options && !this.options.loadTiles) {
|
|
325
327
|
return;
|
|
326
328
|
}
|
|
@@ -329,17 +331,15 @@ var Tileset3D = function () {
|
|
|
329
331
|
return;
|
|
330
332
|
}
|
|
331
333
|
|
|
332
|
-
|
|
333
|
-
viewports = [viewports];
|
|
334
|
-
}
|
|
334
|
+
var preparedViewports = viewports instanceof Array ? viewports : [viewports];
|
|
335
335
|
|
|
336
336
|
this._cache.reset();
|
|
337
337
|
|
|
338
338
|
this._frameNumber++;
|
|
339
|
-
this.traverseCounter =
|
|
339
|
+
this.traverseCounter = preparedViewports.length;
|
|
340
340
|
var viewportsToTraverse = [];
|
|
341
341
|
|
|
342
|
-
var _iterator = _createForOfIteratorHelper(
|
|
342
|
+
var _iterator = _createForOfIteratorHelper(preparedViewports),
|
|
343
343
|
_step;
|
|
344
344
|
|
|
345
345
|
try {
|
|
@@ -359,7 +359,7 @@ var Tileset3D = function () {
|
|
|
359
359
|
_iterator.f();
|
|
360
360
|
}
|
|
361
361
|
|
|
362
|
-
var _iterator2 = _createForOfIteratorHelper(
|
|
362
|
+
var _iterator2 = _createForOfIteratorHelper(preparedViewports),
|
|
363
363
|
_step2;
|
|
364
364
|
|
|
365
365
|
try {
|