@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.
Files changed (62) hide show
  1. package/dist/dist.min.js +83 -45
  2. package/dist/es5/tileset/helpers/frame-state.js +26 -11
  3. package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
  4. package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
  5. package/dist/es5/tileset/tileset-3d.js +11 -11
  6. package/dist/es5/tileset/tileset-3d.js.map +1 -1
  7. package/dist/es5/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +19 -9
  8. package/dist/es5/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
  9. package/dist/es5/tileset/traversers/i3s-tile-manager.js +22 -12
  10. package/dist/es5/tileset/traversers/i3s-tile-manager.js.map +1 -1
  11. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js +3 -3
  12. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  13. package/dist/es5/tileset/traversers/tileset-traverser.js +2 -2
  14. package/dist/es5/tileset/traversers/tileset-traverser.js.map +1 -1
  15. package/dist/esm/tileset/helpers/frame-state.js +25 -9
  16. package/dist/esm/tileset/helpers/frame-state.js.map +1 -1
  17. package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
  18. package/dist/esm/tileset/tileset-3d.js +12 -9
  19. package/dist/esm/tileset/tileset-3d.js.map +1 -1
  20. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js +33 -0
  21. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
  22. package/dist/esm/tileset/traversers/i3s-tile-manager.js +32 -11
  23. package/dist/esm/tileset/traversers/i3s-tile-manager.js.map +1 -1
  24. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js +3 -3
  25. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  26. package/dist/esm/tileset/traversers/tileset-traverser.js +2 -2
  27. package/dist/esm/tileset/traversers/tileset-traverser.js.map +1 -1
  28. package/dist/tileset/helpers/frame-state.d.ts +4 -7
  29. package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
  30. package/dist/tileset/helpers/frame-state.js +26 -12
  31. package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -1
  32. package/dist/tileset/tileset-3d.d.ts +3 -2
  33. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  34. package/dist/tileset/tileset-3d.js +11 -9
  35. package/dist/tileset/traversers/{i3s-frame-counter.d.ts → i3s-pending-tiles-register.d.ts} +7 -4
  36. package/dist/tileset/traversers/i3s-pending-tiles-register.d.ts.map +1 -0
  37. package/dist/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +17 -8
  38. package/dist/tileset/traversers/i3s-tile-manager.d.ts +19 -1
  39. package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +1 -1
  40. package/dist/tileset/traversers/i3s-tile-manager.js +32 -12
  41. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +1 -1
  42. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +1 -1
  43. package/dist/tileset/traversers/i3s-tileset-traverser.js +4 -3
  44. package/dist/tileset/traversers/tileset-traverser.d.ts +1 -1
  45. package/dist/tileset/traversers/tileset-traverser.d.ts.map +1 -1
  46. package/dist/tileset/traversers/tileset-traverser.js +2 -2
  47. package/dist/types.d.ts +21 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +5 -5
  50. package/src/tileset/helpers/frame-state.ts +46 -19
  51. package/src/tileset/helpers/i3s-lod.ts +3 -1
  52. package/src/tileset/tileset-3d.ts +17 -14
  53. package/src/tileset/traversers/i3s-pending-tiles-register.ts +44 -0
  54. package/src/tileset/traversers/i3s-tile-manager.ts +47 -11
  55. package/src/tileset/traversers/i3s-tileset-traverser.ts +4 -3
  56. package/src/tileset/traversers/tileset-traverser.ts +2 -2
  57. package/src/types.ts +23 -0
  58. package/dist/es5/tileset/traversers/i3s-frame-counter.js.map +0 -1
  59. package/dist/esm/tileset/traversers/i3s-frame-counter.js +0 -23
  60. package/dist/esm/tileset/traversers/i3s-frame-counter.js.map +0 -1
  61. package/dist/tileset/traversers/i3s-frame-counter.d.ts.map +0 -1
  62. 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 viewportCenterCartographic = viewport.unprojectPosition(viewport.center);
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, viewportCenterCartesian);
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, viewportCenterCartesian) {
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 distanceToCenter = plane.normal.dot(viewport.center);
5102
- scratchPosition3.copy(plane.normal).scale(plane.distance - distanceToCenter).add(viewport.center);
5103
- const cartographicPos = viewport.unprojectPosition(scratchPosition3);
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
- get traversalFinished() {
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-frame-counter.ts
8365
+ // src/tileset/traversers/i3s-pending-tiles-register.ts
8353
8366
  var I3SPendingTilesRegister;
8354
- var init_i3s_frame_counter = __esm({
8355
- "src/tileset/traversers/i3s-frame-counter.ts"() {
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 oldCount = this.frameNumberMap.get(frameNumber) || 0;
8362
- this.frameNumberMap.set(frameNumber, oldCount + 1);
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 oldCount = this.frameNumberMap.get(frameNumber) || 1;
8366
- this.frameNumberMap.set(frameNumber, oldCount - 1);
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
- init_i3s_frame_counter();
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 { frameNumber } = frameState;
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 { frameNumber: actualFrameNumber } = this._statusMap[key].frameState;
8399
- this.pendingTilesRegister.deregister(actualFrameNumber);
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 { frameNumber: actualFrameNumber } = this._statusMap[key].frameState;
8404
- this.pendingTilesRegister.deregister(actualFrameNumber);
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
- this.pendingTilesRegister.deregister(this._statusMap[key].frameState.frameNumber);
8412
- this.pendingTilesRegister.register(frameState.frameNumber);
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
- get traversalFinished() {
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
- this.doUpdate(viewports);
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
- this.doUpdate(this.lastUpdatedVieports);
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 = null) {
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
- if (!(viewports instanceof Array)) {
8685
- viewports = [viewports];
8686
- }
8724
+ const preparedViewports = viewports instanceof Array ? viewports : [viewports];
8687
8725
  this._cache.reset();
8688
8726
  this._frameNumber++;
8689
- this.traverseCounter = viewports.length;
8727
+ this.traverseCounter = preparedViewports.length;
8690
8728
  const viewportsToTraverse = [];
8691
- for (const viewport of viewports) {
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 viewports) {
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 viewportCenterCartographic = viewport.unprojectPosition(viewport.center);
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, viewportCenterCartesian);
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, viewportCenterCartesian) {
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 distanceToCenter = plane.normal.dot(viewport.center);
136
- scratchPosition.copy(plane.normal).scale(plane.distance - distanceToCenter).add(viewport.center);
137
- var cartographicPos = viewport.unprojectPosition(scratchPosition);
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
- var cartesianPos = _geospatial.Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new _core.Vector3());
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
- cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector.copy(viewportCenterCartesian).subtract(cartesianPos));
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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","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(sphereMbsBorderVertexCartographic);\n const projectedRadius = projectedOriginVector\n .copy(projectedOrigin)\n .subtract(projectedMbsBorderVertex)\n .magnitude();\n return projectedRadius;\n}\n"],"file":"i3s-lod.js"}
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
- _this.doUpdate(viewports);
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
- _this2.doUpdate(_this2.lastUpdatedVieports);
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
- if (!(viewports instanceof Array)) {
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 = viewports.length;
339
+ this.traverseCounter = preparedViewports.length;
340
340
  var viewportsToTraverse = [];
341
341
 
342
- var _iterator = _createForOfIteratorHelper(viewports),
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(viewports),
362
+ var _iterator2 = _createForOfIteratorHelper(preparedViewports),
363
363
  _step2;
364
364
 
365
365
  try {