@loaders.gl/tiles 3.3.0-alpha.1 → 3.3.0-alpha.2

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 (70) hide show
  1. package/dist/dist.min.js +96 -50
  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/tile-3d.js +11 -2
  6. package/dist/es5/tileset/tile-3d.js.map +1 -1
  7. package/dist/es5/tileset/tileset-3d.js +11 -11
  8. package/dist/es5/tileset/tileset-3d.js.map +1 -1
  9. package/dist/es5/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +19 -9
  10. package/dist/es5/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
  11. package/dist/es5/tileset/traversers/i3s-tile-manager.js +22 -12
  12. package/dist/es5/tileset/traversers/i3s-tile-manager.js.map +1 -1
  13. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js +4 -5
  14. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  15. package/dist/es5/tileset/traversers/tileset-traverser.js +2 -2
  16. package/dist/es5/tileset/traversers/tileset-traverser.js.map +1 -1
  17. package/dist/esm/tileset/helpers/frame-state.js +25 -9
  18. package/dist/esm/tileset/helpers/frame-state.js.map +1 -1
  19. package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
  20. package/dist/esm/tileset/tile-3d.js +11 -2
  21. package/dist/esm/tileset/tile-3d.js.map +1 -1
  22. package/dist/esm/tileset/tileset-3d.js +12 -9
  23. package/dist/esm/tileset/tileset-3d.js.map +1 -1
  24. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js +33 -0
  25. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
  26. package/dist/esm/tileset/traversers/i3s-tile-manager.js +32 -11
  27. package/dist/esm/tileset/traversers/i3s-tile-manager.js.map +1 -1
  28. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js +4 -5
  29. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  30. package/dist/esm/tileset/traversers/tileset-traverser.js +2 -2
  31. package/dist/esm/tileset/traversers/tileset-traverser.js.map +1 -1
  32. package/dist/tileset/helpers/frame-state.d.ts +4 -7
  33. package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
  34. package/dist/tileset/helpers/frame-state.js +26 -12
  35. package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -1
  36. package/dist/tileset/tile-3d.d.ts +10 -3
  37. package/dist/tileset/tile-3d.d.ts.map +1 -1
  38. package/dist/tileset/tile-3d.js +11 -2
  39. package/dist/tileset/tileset-3d.d.ts +3 -2
  40. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  41. package/dist/tileset/tileset-3d.js +11 -9
  42. package/dist/tileset/traversers/{i3s-frame-counter.d.ts → i3s-pending-tiles-register.d.ts} +7 -4
  43. package/dist/tileset/traversers/i3s-pending-tiles-register.d.ts.map +1 -0
  44. package/dist/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +17 -8
  45. package/dist/tileset/traversers/i3s-tile-manager.d.ts +19 -1
  46. package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +1 -1
  47. package/dist/tileset/traversers/i3s-tile-manager.js +32 -12
  48. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +1 -1
  49. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +1 -1
  50. package/dist/tileset/traversers/i3s-tileset-traverser.js +5 -5
  51. package/dist/tileset/traversers/tileset-traverser.d.ts +1 -1
  52. package/dist/tileset/traversers/tileset-traverser.d.ts.map +1 -1
  53. package/dist/tileset/traversers/tileset-traverser.js +2 -2
  54. package/dist/types.d.ts +21 -0
  55. package/dist/types.d.ts.map +1 -1
  56. package/package.json +4 -4
  57. package/src/tileset/helpers/frame-state.ts +46 -19
  58. package/src/tileset/helpers/i3s-lod.ts +3 -1
  59. package/src/tileset/tile-3d.ts +11 -2
  60. package/src/tileset/tileset-3d.ts +17 -14
  61. package/src/tileset/traversers/i3s-pending-tiles-register.ts +44 -0
  62. package/src/tileset/traversers/i3s-tile-manager.ts +47 -11
  63. package/src/tileset/traversers/i3s-tileset-traverser.ts +5 -5
  64. package/src/tileset/traversers/tileset-traverser.ts +2 -2
  65. package/src/types.ts +23 -0
  66. package/dist/es5/tileset/traversers/i3s-frame-counter.js.map +0 -1
  67. package/dist/esm/tileset/traversers/i3s-frame-counter.js +0 -23
  68. package/dist/esm/tileset/traversers/i3s-frame-counter.js.map +0 -1
  69. package/dist/tileset/traversers/i3s-frame-counter.d.ts.map +0 -1
  70. package/src/tileset/traversers/i3s-frame-counter.ts +0 -35
package/dist/dist.min.js CHANGED
@@ -3666,7 +3666,7 @@
3666
3666
  this.worker = isBrowser2 ? this._createBrowserWorker() : this._createNodeWorker();
3667
3667
  }
3668
3668
  static isSupported() {
3669
- return typeof Worker !== "undefined" && isBrowser2 || typeof Worker2 !== void 0;
3669
+ return typeof Worker !== "undefined" && isBrowser2 || typeof Worker2 !== "undefined" && !isBrowser2;
3670
3670
  }
3671
3671
  destroy() {
3672
3672
  this.onMessage = NOOP;
@@ -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
  }
@@ -8295,8 +8308,17 @@
8295
8308
  case "i3s":
8296
8309
  return {
8297
8310
  ...this.tileset.options.i3s,
8298
- tile: this.header,
8299
- tileset: this.tileset.tileset,
8311
+ _tileOptions: {
8312
+ textureUrl: this.header.textureUrl,
8313
+ textureFormat: this.header.textureFormat,
8314
+ textureLoaderOptions: this.header.textureLoaderOptions,
8315
+ materialDefinition: this.header.materialDefinition,
8316
+ isDracoGeometry: this.header.isDracoGeometry,
8317
+ mbs: this.header.mbs
8318
+ },
8319
+ _tilesetOptions: {
8320
+ store: this.tileset.tileset.store
8321
+ },
8300
8322
  isTileHeader: false
8301
8323
  };
8302
8324
  case "3d-tiles":
@@ -8355,24 +8377,30 @@
8355
8377
  }
8356
8378
  });
8357
8379
 
8358
- // src/tileset/traversers/i3s-frame-counter.ts
8380
+ // src/tileset/traversers/i3s-pending-tiles-register.ts
8359
8381
  var I3SPendingTilesRegister;
8360
- var init_i3s_frame_counter = __esm({
8361
- "src/tileset/traversers/i3s-frame-counter.ts"() {
8382
+ var init_i3s_pending_tiles_register = __esm({
8383
+ "src/tileset/traversers/i3s-pending-tiles-register.ts"() {
8362
8384
  I3SPendingTilesRegister = class {
8363
8385
  constructor() {
8364
8386
  this.frameNumberMap = new Map();
8365
8387
  }
8366
- register(frameNumber) {
8367
- const oldCount = this.frameNumberMap.get(frameNumber) || 0;
8368
- this.frameNumberMap.set(frameNumber, oldCount + 1);
8388
+ register(viewportId, frameNumber) {
8389
+ const viewportMap = this.frameNumberMap.get(viewportId) || new Map();
8390
+ const oldCount = viewportMap.get(frameNumber) || 0;
8391
+ viewportMap.set(frameNumber, oldCount + 1);
8392
+ this.frameNumberMap.set(viewportId, viewportMap);
8369
8393
  }
8370
- deregister(frameNumber) {
8371
- const oldCount = this.frameNumberMap.get(frameNumber) || 1;
8372
- this.frameNumberMap.set(frameNumber, oldCount - 1);
8394
+ deregister(viewportId, frameNumber) {
8395
+ const viewportMap = this.frameNumberMap.get(viewportId);
8396
+ if (!viewportMap) {
8397
+ return;
8398
+ }
8399
+ const oldCount = viewportMap.get(frameNumber) || 1;
8400
+ viewportMap.set(frameNumber, oldCount - 1);
8373
8401
  }
8374
- isZero(frameNumber) {
8375
- const count = this.frameNumberMap.get(frameNumber) || 0;
8402
+ isZero(viewportId, frameNumber) {
8403
+ const count = this.frameNumberMap.get(viewportId)?.get(frameNumber) || 0;
8376
8404
  return count === 0;
8377
8405
  }
8378
8406
  };
@@ -8383,7 +8411,7 @@
8383
8411
  var STATUS, I3STileManager;
8384
8412
  var init_i3s_tile_manager = __esm({
8385
8413
  "src/tileset/traversers/i3s-tile-manager.ts"() {
8386
- init_i3s_frame_counter();
8414
+ init_i3s_pending_tiles_register();
8387
8415
  STATUS = {
8388
8416
  REQUESTED: "REQUESTED",
8389
8417
  COMPLETED: "COMPLETED",
@@ -8396,34 +8424,51 @@
8396
8424
  }
8397
8425
  add(request, key, callback, frameState) {
8398
8426
  if (!this._statusMap[key]) {
8399
- const { frameNumber } = frameState;
8427
+ const {
8428
+ frameNumber,
8429
+ viewport: { id }
8430
+ } = frameState;
8400
8431
  this._statusMap[key] = { request, callback, key, frameState, status: STATUS.REQUESTED };
8401
- this.pendingTilesRegister.register(frameNumber);
8432
+ this.pendingTilesRegister.register(id, frameNumber);
8402
8433
  request().then((data) => {
8403
8434
  this._statusMap[key].status = STATUS.COMPLETED;
8404
- const { frameNumber: actualFrameNumber } = this._statusMap[key].frameState;
8405
- this.pendingTilesRegister.deregister(actualFrameNumber);
8435
+ const {
8436
+ frameNumber: actualFrameNumber,
8437
+ viewport: { id: id2 }
8438
+ } = this._statusMap[key].frameState;
8439
+ this.pendingTilesRegister.deregister(id2, actualFrameNumber);
8406
8440
  this._statusMap[key].callback(data, frameState);
8407
8441
  }).catch((error) => {
8408
8442
  this._statusMap[key].status = STATUS.ERROR;
8409
- const { frameNumber: actualFrameNumber } = this._statusMap[key].frameState;
8410
- this.pendingTilesRegister.deregister(actualFrameNumber);
8443
+ const {
8444
+ frameNumber: actualFrameNumber,
8445
+ viewport: { id: id2 }
8446
+ } = this._statusMap[key].frameState;
8447
+ this.pendingTilesRegister.deregister(id2, actualFrameNumber);
8411
8448
  callback(error);
8412
8449
  });
8413
8450
  }
8414
8451
  }
8415
8452
  update(key, frameState) {
8416
8453
  if (this._statusMap[key]) {
8417
- this.pendingTilesRegister.deregister(this._statusMap[key].frameState.frameNumber);
8418
- this.pendingTilesRegister.register(frameState.frameNumber);
8454
+ const {
8455
+ frameNumber,
8456
+ viewport: { id }
8457
+ } = this._statusMap[key].frameState;
8458
+ this.pendingTilesRegister.deregister(id, frameNumber);
8459
+ const {
8460
+ frameNumber: newFrameNumber,
8461
+ viewport: { id: newViewportId }
8462
+ } = frameState;
8463
+ this.pendingTilesRegister.register(newViewportId, newFrameNumber);
8419
8464
  this._statusMap[key].frameState = frameState;
8420
8465
  }
8421
8466
  }
8422
8467
  find(key) {
8423
8468
  return this._statusMap[key];
8424
8469
  }
8425
- hasPendingTiles(frameNumber) {
8426
- return !this.pendingTilesRegister.isZero(frameNumber);
8470
+ hasPendingTiles(viewportId, frameNumber) {
8471
+ return !this.pendingTilesRegister.isZero(viewportId, frameNumber);
8427
8472
  }
8428
8473
  };
8429
8474
  }
@@ -8439,8 +8484,8 @@
8439
8484
  init_tile_3d();
8440
8485
  init_i3s_tile_manager();
8441
8486
  I3STilesetTraverser = class extends TilesetTraverser {
8442
- get traversalFinished() {
8443
- return !this._tileManager.hasPendingTiles(this._frameNumber || 0);
8487
+ traversalFinished(frameState) {
8488
+ return !this._tileManager.hasPendingTiles(frameState.viewport.id, this._frameNumber || 0);
8444
8489
  }
8445
8490
  constructor(options) {
8446
8491
  super(options);
@@ -8481,8 +8526,7 @@
8481
8526
  ...tileset.loadOptions,
8482
8527
  i3s: {
8483
8528
  ...tileset.loadOptions.i3s,
8484
- isTileHeader: true,
8485
- loadContent: false
8529
+ isTileHeader: true
8486
8530
  }
8487
8531
  };
8488
8532
  return await load(nodeUrl, loader, options);
@@ -8492,7 +8536,7 @@
8492
8536
  tile.children.push(childTile);
8493
8537
  const frameState = this._tileManager.find(childTile.id).frameState;
8494
8538
  this.updateTile(childTile, frameState);
8495
- if (this._frameNumber === frameState.frameNumber && (this.traversalFinished || new Date().getTime() - this.lastUpdate > this.updateDebounceTime)) {
8539
+ if (this._frameNumber === frameState.frameNumber && (this.traversalFinished(frameState) || new Date().getTime() - this.lastUpdate > this.updateDebounceTime)) {
8496
8540
  this.executeTraversal(childTile, frameState);
8497
8541
  }
8498
8542
  }
@@ -8661,7 +8705,9 @@
8661
8705
  } else {
8662
8706
  this.lastUpdatedVieports = viewports;
8663
8707
  }
8664
- this.doUpdate(viewports);
8708
+ if (viewports) {
8709
+ this.doUpdate(viewports);
8710
+ }
8665
8711
  });
8666
8712
  }
8667
8713
  async selectTiles(viewports = null) {
@@ -8672,7 +8718,9 @@
8672
8718
  if (!this.updatePromise) {
8673
8719
  this.updatePromise = new Promise((resolve) => {
8674
8720
  setTimeout(() => {
8675
- this.doUpdate(this.lastUpdatedVieports);
8721
+ if (this.lastUpdatedVieports) {
8722
+ this.doUpdate(this.lastUpdatedVieports);
8723
+ }
8676
8724
  resolve(this._frameNumber);
8677
8725
  this.updatePromise = null;
8678
8726
  }, this.options.debounceTime);
@@ -8680,21 +8728,19 @@
8680
8728
  }
8681
8729
  return this.updatePromise;
8682
8730
  }
8683
- doUpdate(viewports = null) {
8731
+ doUpdate(viewports) {
8684
8732
  if ("loadTiles" in this.options && !this.options.loadTiles) {
8685
8733
  return;
8686
8734
  }
8687
8735
  if (this.traverseCounter > 0) {
8688
8736
  return;
8689
8737
  }
8690
- if (!(viewports instanceof Array)) {
8691
- viewports = [viewports];
8692
- }
8738
+ const preparedViewports = viewports instanceof Array ? viewports : [viewports];
8693
8739
  this._cache.reset();
8694
8740
  this._frameNumber++;
8695
- this.traverseCounter = viewports.length;
8741
+ this.traverseCounter = preparedViewports.length;
8696
8742
  const viewportsToTraverse = [];
8697
- for (const viewport of viewports) {
8743
+ for (const viewport of preparedViewports) {
8698
8744
  const id = viewport.id;
8699
8745
  if (this._needTraverse(id)) {
8700
8746
  viewportsToTraverse.push(id);
@@ -8702,7 +8748,7 @@
8702
8748
  this.traverseCounter--;
8703
8749
  }
8704
8750
  }
8705
- for (const viewport of viewports) {
8751
+ for (const viewport of preparedViewports) {
8706
8752
  const id = viewport.id;
8707
8753
  if (!this.roots[id]) {
8708
8754
  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":";;;;;;;;;;;;AAAA;;AACA;;AAIA,IAAMA,uBAAuB,GAAG,IAAIC,aAAJ,EAAhC;AACA,IAAMC,KAAK,GAAG,IAAID,aAAJ,EAAd;AACA,IAAME,iBAAiB,GAAG,IAAIF,aAAJ,EAA1B;AACA,IAAMG,cAAc,GAAG,IAAIH,aAAJ,EAAvB;AACA,IAAMI,qBAAqB,GAAG,IAAIJ,aAAJ,EAA9B;AACA,IAAMK,oBAAoB,GAAG,IAAIC,aAAJ,EAA7B;AACA,IAAMC,oBAAoB,GAAG,IAAID,aAAJ,EAA7B;;AAWO,SAASE,YAAT,CAAsBC,IAAtB,EAAoCC,UAApC,EAAoF;AACzF,MAAID,IAAI,CAACE,cAAL,KAAwB,CAAxB,IAA6BC,KAAK,CAACH,IAAI,CAACE,cAAN,CAAtC,EAA6D;AAC3D,WAAO,KAAP;AACD;;AACD,MAAME,UAAU,GAAG,IAAIC,kBAAkB,CAACL,IAAD,EAAOC,UAAP,CAAzC;;AACA,MAAIG,UAAU,GAAG,CAAjB,EAAoB;AAClB,WAAO,KAAP;AACD;;AACD,MAAI,CAACJ,IAAI,CAACM,MAAL,CAAYC,QAAb,IAAyBH,UAAU,IAAIJ,IAAI,CAACE,cAAhD,EAAgE;AAC9D,WAAO,MAAP;AACD,GAFD,MAEO,IAAIF,IAAI,CAACM,MAAL,CAAYC,QAAhB,EAA0B;AAC/B,WAAO,KAAP;AACD;;AACD,SAAO,KAAP;AACD;;AASM,SAASF,kBAAT,CAA4BL,IAA5B,EAA0CC,UAA1C,EAA0E;AAC/E,MAAwBO,QAAxB,GAAoCP,UAApC,CAAOQ,eAAP;AACA,MAAMC,MAAM,GAAGV,IAAI,CAACM,MAAL,CAAYK,GAAZ,CAAgB,CAAhB,CAAf;AACA,MAAMC,MAAM,GAAGZ,IAAI,CAACM,MAAL,CAAYK,GAAZ,CAAgB,CAAhB,CAAf;AACA,MAAME,IAAI,GAAGb,IAAI,CAACM,MAAL,CAAYK,GAAZ,CAAgB,CAAhB,CAAb;AACA,MAAMG,IAAI,GAAGd,IAAI,CAACM,MAAL,CAAYK,GAAZ,CAAgB,CAAhB,CAAb;AACA,MAAMI,kBAAkB,oCAAOf,IAAI,CAACgB,cAAL,CAAoBC,MAA3B,CAAxB;AACA,MAAMC,0BAA0B,GAAGV,QAAQ,CAACW,iBAAT,CAA2BX,QAAQ,CAACY,cAApC,CAAnC;;AACAC,wBAAUC,KAAV,CAAgBC,uBAAhB,CAAwCL,0BAAxC,EAAoE5B,uBAApE;;AAKAE,EAAAA,KAAK,CAACgC,IAAN,CAAWlC,uBAAX,EAAoCmC,QAApC,CAA6CV,kBAA7C,EAAiEW,SAAjE;;AAEAL,wBAAUC,KAAV,CAAgBK,uBAAhB,CAAwCZ,kBAAxC,EAA4DnB,oBAA5D;;AACAE,EAAAA,oBAAoB,CAAC0B,IAArB,CAA0B5B,oBAA1B,EAAgDgC,MAAhD;AACAnC,EAAAA,iBAAiB,CAAC+B,IAAlB,CAAuBlC,uBAAvB,EAAgDuC,SAAhD,CAA0D/B,oBAA1D;AAGA,MAAMgC,UAAU,GAAGC,IAAI,CAACC,IAAL,CACjBvC,iBAAiB,CAAC,CAAD,CAAjB,GAAuBA,iBAAiB,CAAC,CAAD,CAAxC,GAA8CA,iBAAiB,CAAC,CAAD,CAAjB,GAAuBA,iBAAiB,CAAC,CAAD,CADrE,CAAnB;AAGA,MAAMwC,MAAM,GAAIH,UAAU,GAAGA,UAAd,GAA4BrC,iBAAiB,CAAC,CAAD,CAA5D;AACAC,EAAAA,cAAc,CAAC8B,IAAf,CAAoB,CAAC/B,iBAAiB,CAAC,CAAD,CAAlB,EAAuBA,iBAAiB,CAAC,CAAD,CAAxC,EAA6CwC,MAA7C,CAApB;AACA,MAAMC,oBAAoB,GAAGxC,cAAc,CAACmC,SAAf,CAAyBjC,oBAAzB,CAA7B;AACA,MAAMuC,oBAAoB,GAAGD,oBAAoB,CAACT,QAArB,CAA8BV,kBAA9B,EAAkDW,SAAlD,EAA7B;AAEA,MAAMU,YAAY,GAAG5C,KAAK,CAAC6C,KAAN,CAAYF,oBAAZ,EAAkCT,SAAlC,GAA8CY,KAA9C,CAAoDxB,IAApD,CAArB;AACA,MAAMyB,8BAA8B,GAAGH,YAAY,CAACI,GAAb,CAAiBzB,kBAAjB,CAAvC;;AACA,MAAM0B,iCAAiC,GAAGpB,sBAAUC,KAAV,CAAgBoB,uBAAhB,CACxCH,8BADwC,CAA1C;;AAMA,MAAMI,eAAe,GAAGnC,QAAQ,CAACoC,OAAT,CAAiB,CAAChC,MAAD,EAASF,MAAT,EAAiBG,IAAjB,CAAjB,CAAxB;AACA,MAAMgC,wBAAwB,GAAGrC,QAAQ,CAACoC,OAAT,CAC/BH,iCAD+B,CAAjC;AAGA,MAAMK,eAAe,GAAGnD,qBAAqB,CAC1C6B,IADqB,CAChBmB,eADgB,EAErBlB,QAFqB,CAEZoB,wBAFY,EAGrBE,SAHqB,EAAxB;AAIA,SAAOD,eAAP;AACD","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"}
@@ -601,8 +601,17 @@ var TileHeader = function () {
601
601
  switch (loaderId) {
602
602
  case 'i3s':
603
603
  return _objectSpread(_objectSpread({}, this.tileset.options.i3s), {}, {
604
- tile: this.header,
605
- tileset: this.tileset.tileset,
604
+ _tileOptions: {
605
+ textureUrl: this.header.textureUrl,
606
+ textureFormat: this.header.textureFormat,
607
+ textureLoaderOptions: this.header.textureLoaderOptions,
608
+ materialDefinition: this.header.materialDefinition,
609
+ isDracoGeometry: this.header.isDracoGeometry,
610
+ mbs: this.header.mbs
611
+ },
612
+ _tilesetOptions: {
613
+ store: this.tileset.tileset.store
614
+ },
606
615
  isTileHeader: false
607
616
  });
608
617