@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.
- package/dist/dist.min.js +96 -50
- package/dist/es5/tileset/helpers/frame-state.js +26 -11
- package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
- package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/es5/tileset/tile-3d.js +11 -2
- package/dist/es5/tileset/tile-3d.js.map +1 -1
- package/dist/es5/tileset/tileset-3d.js +11 -11
- package/dist/es5/tileset/tileset-3d.js.map +1 -1
- package/dist/es5/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +19 -9
- package/dist/es5/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
- package/dist/es5/tileset/traversers/i3s-tile-manager.js +22 -12
- package/dist/es5/tileset/traversers/i3s-tile-manager.js.map +1 -1
- package/dist/es5/tileset/traversers/i3s-tileset-traverser.js +4 -5
- package/dist/es5/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
- package/dist/es5/tileset/traversers/tileset-traverser.js +2 -2
- package/dist/es5/tileset/traversers/tileset-traverser.js.map +1 -1
- package/dist/esm/tileset/helpers/frame-state.js +25 -9
- package/dist/esm/tileset/helpers/frame-state.js.map +1 -1
- package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/esm/tileset/tile-3d.js +11 -2
- package/dist/esm/tileset/tile-3d.js.map +1 -1
- package/dist/esm/tileset/tileset-3d.js +12 -9
- package/dist/esm/tileset/tileset-3d.js.map +1 -1
- package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js +33 -0
- package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
- package/dist/esm/tileset/traversers/i3s-tile-manager.js +32 -11
- package/dist/esm/tileset/traversers/i3s-tile-manager.js.map +1 -1
- package/dist/esm/tileset/traversers/i3s-tileset-traverser.js +4 -5
- package/dist/esm/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
- package/dist/esm/tileset/traversers/tileset-traverser.js +2 -2
- package/dist/esm/tileset/traversers/tileset-traverser.js.map +1 -1
- package/dist/tileset/helpers/frame-state.d.ts +4 -7
- package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
- package/dist/tileset/helpers/frame-state.js +26 -12
- package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -1
- package/dist/tileset/tile-3d.d.ts +10 -3
- package/dist/tileset/tile-3d.d.ts.map +1 -1
- package/dist/tileset/tile-3d.js +11 -2
- package/dist/tileset/tileset-3d.d.ts +3 -2
- package/dist/tileset/tileset-3d.d.ts.map +1 -1
- package/dist/tileset/tileset-3d.js +11 -9
- package/dist/tileset/traversers/{i3s-frame-counter.d.ts → i3s-pending-tiles-register.d.ts} +7 -4
- package/dist/tileset/traversers/i3s-pending-tiles-register.d.ts.map +1 -0
- package/dist/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +17 -8
- package/dist/tileset/traversers/i3s-tile-manager.d.ts +19 -1
- package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +1 -1
- package/dist/tileset/traversers/i3s-tile-manager.js +32 -12
- package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +1 -1
- package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +1 -1
- package/dist/tileset/traversers/i3s-tileset-traverser.js +5 -5
- package/dist/tileset/traversers/tileset-traverser.d.ts +1 -1
- package/dist/tileset/traversers/tileset-traverser.d.ts.map +1 -1
- package/dist/tileset/traversers/tileset-traverser.js +2 -2
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/tileset/helpers/frame-state.ts +46 -19
- package/src/tileset/helpers/i3s-lod.ts +3 -1
- package/src/tileset/tile-3d.ts +11 -2
- package/src/tileset/tileset-3d.ts +17 -14
- package/src/tileset/traversers/i3s-pending-tiles-register.ts +44 -0
- package/src/tileset/traversers/i3s-tile-manager.ts +47 -11
- package/src/tileset/traversers/i3s-tileset-traverser.ts +5 -5
- package/src/tileset/traversers/tileset-traverser.ts +2 -2
- package/src/types.ts +23 -0
- package/dist/es5/tileset/traversers/i3s-frame-counter.js.map +0 -1
- package/dist/esm/tileset/traversers/i3s-frame-counter.js +0 -23
- package/dist/esm/tileset/traversers/i3s-frame-counter.js.map +0 -1
- package/dist/tileset/traversers/i3s-frame-counter.d.ts.map +0 -1
- package/src/tileset/traversers/i3s-frame-counter.ts +0 -35
package/dist/dist.min.js
CHANGED
|
@@ -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 !==
|
|
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
|
|
5040
|
-
const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(viewportCenterCartographic, new Vector3());
|
|
5039
|
+
const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);
|
|
5041
5040
|
const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
|
|
5042
5041
|
const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
|
|
5043
5042
|
const cameraPositionCartesian2 = Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, new Vector3());
|
|
5044
5043
|
const cameraDirectionCartesian = new Vector3(enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))).normalize();
|
|
5045
5044
|
const cameraUpCartesian = new Vector3(enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))).normalize();
|
|
5046
|
-
commonSpacePlanesToWGS84(viewport
|
|
5045
|
+
commonSpacePlanesToWGS84(viewport);
|
|
5047
5046
|
const ViewportClass = viewport.constructor;
|
|
5048
5047
|
const { longitude, latitude, width, bearing, zoom } = viewport;
|
|
5049
5048
|
const topDownViewport = new ViewportClass({
|
|
@@ -5093,18 +5092,32 @@
|
|
|
5093
5092
|
}
|
|
5094
5093
|
return [selectedTiles, unselectedTiles];
|
|
5095
5094
|
}
|
|
5096
|
-
function commonSpacePlanesToWGS84(viewport
|
|
5095
|
+
function commonSpacePlanesToWGS84(viewport) {
|
|
5097
5096
|
const frustumPlanes = viewport.getFrustumPlanes();
|
|
5097
|
+
const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);
|
|
5098
|
+
const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
|
|
5099
|
+
const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition3);
|
|
5098
5100
|
let i = 0;
|
|
5101
|
+
cullingVolume.planes[i++].fromPointNormal(nearCenterCartesian, scratchVector7.copy(nearCenterCartesian).subtract(cameraCartesian));
|
|
5099
5102
|
for (const dir in frustumPlanes) {
|
|
5103
|
+
if (dir === "near") {
|
|
5104
|
+
continue;
|
|
5105
|
+
}
|
|
5100
5106
|
const plane = frustumPlanes[dir];
|
|
5101
|
-
const
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3());
|
|
5105
|
-
cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector7.copy(viewportCenterCartesian).subtract(cartesianPos));
|
|
5107
|
+
const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition3);
|
|
5108
|
+
const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition3);
|
|
5109
|
+
cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector7.copy(nearCenterCartesian).subtract(cartesianPos));
|
|
5106
5110
|
}
|
|
5107
5111
|
}
|
|
5112
|
+
function closestPointOnPlane(plane, refPoint, out = new Vector3()) {
|
|
5113
|
+
const distanceToRef = plane.normal.dot(refPoint);
|
|
5114
|
+
out.copy(plane.normal).scale(plane.distance - distanceToRef).add(refPoint);
|
|
5115
|
+
return out;
|
|
5116
|
+
}
|
|
5117
|
+
function worldToCartesian(viewport, point, out = new Vector3()) {
|
|
5118
|
+
const cartographicPos = viewport.unprojectPosition(point);
|
|
5119
|
+
return Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);
|
|
5120
|
+
}
|
|
5108
5121
|
var scratchVector7, scratchPosition3, cullingVolume;
|
|
5109
5122
|
var init_frame_state = __esm({
|
|
5110
5123
|
"src/tileset/helpers/frame-state.ts"() {
|
|
@@ -7738,7 +7751,7 @@
|
|
|
7738
7751
|
this.requestedTiles = {};
|
|
7739
7752
|
this.emptyTiles = {};
|
|
7740
7753
|
}
|
|
7741
|
-
|
|
7754
|
+
traversalFinished(frameState) {
|
|
7742
7755
|
return true;
|
|
7743
7756
|
}
|
|
7744
7757
|
traverse(root, frameState, options) {
|
|
@@ -7789,7 +7802,7 @@
|
|
|
7789
7802
|
tile._shouldRefine = shouldRefine && parentRefines;
|
|
7790
7803
|
}
|
|
7791
7804
|
const newTime = new Date().getTime();
|
|
7792
|
-
if (this.traversalFinished || newTime - this.lastUpdate > this.updateDebounceTime) {
|
|
7805
|
+
if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {
|
|
7793
7806
|
this.lastUpdate = newTime;
|
|
7794
7807
|
this.options.onTraversalEnd(frameState);
|
|
7795
7808
|
}
|
|
@@ -8295,8 +8308,17 @@
|
|
|
8295
8308
|
case "i3s":
|
|
8296
8309
|
return {
|
|
8297
8310
|
...this.tileset.options.i3s,
|
|
8298
|
-
|
|
8299
|
-
|
|
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-
|
|
8380
|
+
// src/tileset/traversers/i3s-pending-tiles-register.ts
|
|
8359
8381
|
var I3SPendingTilesRegister;
|
|
8360
|
-
var
|
|
8361
|
-
"src/tileset/traversers/i3s-
|
|
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
|
|
8368
|
-
|
|
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
|
|
8372
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
8405
|
-
|
|
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 {
|
|
8410
|
-
|
|
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
|
-
|
|
8418
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
8691
|
-
viewports = [viewports];
|
|
8692
|
-
}
|
|
8738
|
+
const preparedViewports = viewports instanceof Array ? viewports : [viewports];
|
|
8693
8739
|
this._cache.reset();
|
|
8694
8740
|
this._frameNumber++;
|
|
8695
|
-
this.traverseCounter =
|
|
8741
|
+
this.traverseCounter = preparedViewports.length;
|
|
8696
8742
|
const viewportsToTraverse = [];
|
|
8697
|
-
for (const viewport of
|
|
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
|
|
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
|
|
35
|
-
|
|
36
|
-
var viewportCenterCartesian = _geospatial.Ellipsoid.WGS84.cartographicToCartesian(viewportCenterCartographic, new _core.Vector3());
|
|
34
|
+
var viewportCenterCartesian = worldToCartesian(viewport, viewport.center);
|
|
37
35
|
|
|
38
36
|
var enuToFixedTransform = _geospatial.Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
|
|
39
37
|
|
|
@@ -43,7 +41,7 @@ function getFrameState(viewport, frameNumber) {
|
|
|
43
41
|
|
|
44
42
|
var cameraDirectionCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraDirection).scale(metersPerUnit))).normalize();
|
|
45
43
|
var cameraUpCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraUp).scale(metersPerUnit))).normalize();
|
|
46
|
-
commonSpacePlanesToWGS84(viewport
|
|
44
|
+
commonSpacePlanesToWGS84(viewport);
|
|
47
45
|
var ViewportClass = viewport.constructor;
|
|
48
46
|
var longitude = viewport.longitude,
|
|
49
47
|
latitude = viewport.latitude,
|
|
@@ -126,19 +124,36 @@ function limitSelectedTiles(tiles, frameState, maximumTilesSelected) {
|
|
|
126
124
|
return [selectedTiles, unselectedTiles];
|
|
127
125
|
}
|
|
128
126
|
|
|
129
|
-
function commonSpacePlanesToWGS84(viewport
|
|
127
|
+
function commonSpacePlanesToWGS84(viewport) {
|
|
130
128
|
var frustumPlanes = viewport.getFrustumPlanes();
|
|
129
|
+
var nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);
|
|
130
|
+
var nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
|
|
131
|
+
var cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);
|
|
131
132
|
var i = 0;
|
|
133
|
+
cullingVolume.planes[i++].fromPointNormal(nearCenterCartesian, scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian));
|
|
132
134
|
|
|
133
135
|
for (var dir in frustumPlanes) {
|
|
136
|
+
if (dir === 'near') {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
|
|
134
140
|
var plane = frustumPlanes[dir];
|
|
135
|
-
var
|
|
136
|
-
|
|
137
|
-
|
|
141
|
+
var posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);
|
|
142
|
+
var cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);
|
|
143
|
+
cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector.copy(nearCenterCartesian).subtract(cartesianPos));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
138
146
|
|
|
139
|
-
|
|
147
|
+
function closestPointOnPlane(plane, refPoint) {
|
|
148
|
+
var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
|
|
149
|
+
var distanceToRef = plane.normal.dot(refPoint);
|
|
150
|
+
out.copy(plane.normal).scale(plane.distance - distanceToRef).add(refPoint);
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
140
153
|
|
|
141
|
-
|
|
142
|
-
|
|
154
|
+
function worldToCartesian(viewport, point) {
|
|
155
|
+
var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
|
|
156
|
+
var cartographicPos = viewport.unprojectPosition(point);
|
|
157
|
+
return _geospatial.Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);
|
|
143
158
|
}
|
|
144
159
|
//# sourceMappingURL=frame-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/tileset/helpers/frame-state.ts"],"names":["scratchVector","Vector3","scratchPosition","cullingVolume","CullingVolume","Plane","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartographic","unprojectPosition","center","viewportCenterCartesian","Ellipsoid","WGS84","cartographicToCartesian","enuToFixedTransform","eastNorthUpToFixedFrame","cameraPositionCartographic","cameraPosition","cameraPositionCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","ViewportClass","constructor","longitude","latitude","width","bearing","zoom","topDownViewport","pitch","camera","position","direction","up","sseDenominator","limitSelectedTiles","tiles","frameState","maximumTilesSelected","length","tuples","viewportLongitude","viewportLatitude","entries","index","tile","header","mbs","deltaLon","Math","abs","deltaLat","distance","sqrt","push","tuplesSorted","sort","a","b","selectedTiles","i","unselectedTiles","frustumPlanes","getFrustumPlanes","dir","plane","distanceToCenter","normal","dot","copy","add","cartographicPos","cartesianPos","planes","fromPointNormal","subtract"],"mappings":"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","sourcesContent":["import {Tile3D} from '@loaders.gl/tiles';\nimport {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: {[key: string]: any};\n topDownViewport: {[key: string]: any}; // Use it to calculate projected radius for a tile\n height: number;\n cullingVolume: CullingVolume;\n frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: number; // Assumes fovy = 60 degrees\n};\n\nconst scratchVector = new Vector3();\nconst scratchPosition = new Vector3();\nconst cullingVolume = new CullingVolume([\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane()\n]);\n\n// Extracts a frame state appropriate for tile culling from a deck.gl viewport\n// TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios\nexport function getFrameState(viewport, frameNumber: number): FrameState {\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n const {cameraDirection, cameraUp, height} = viewport;\n const {metersPerUnit} = viewport.distanceScales;\n\n const viewportCenterCartographic = viewport.unprojectPosition(viewport.center);\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n viewportCenterCartographic,\n new Vector3()\n );\n const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);\n\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n cameraPositionCartographic,\n new Vector3()\n );\n\n // These should still be normalized as the transform has scale 1 (goes from meters to meters)\n const cameraDirectionCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))\n ).normalize();\n const cameraUpCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))\n ).normalize();\n\n commonSpacePlanesToWGS84(viewport, viewportCenterCartesian);\n\n const ViewportClass = viewport.constructor;\n const {longitude, latitude, width, bearing, zoom} = viewport;\n // @ts-ignore\n const topDownViewport = new ViewportClass({\n longitude,\n latitude,\n height,\n width,\n bearing,\n zoom,\n pitch: 0\n });\n\n // TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function\n return {\n camera: {\n position: cameraPositionCartesian,\n direction: cameraDirectionCartesian,\n up: cameraUpCartesian\n },\n viewport,\n topDownViewport,\n height,\n cullingVolume,\n frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: 1.15 // Assumes fovy = 60 degrees\n };\n}\n\n/**\n * Limit `tiles` array length with `maximumTilesSelected` number.\n * The criteria for this filtering is distance of a tile center\n * to the `frameState.viewport`'s longitude and latitude\n * @param tiles - tiles array to filter\n * @param frameState - frameState to calculate distances\n * @param maximumTilesSelected - maximal amount of tiles in the output array\n * @returns new tiles array\n */\nexport function limitSelectedTiles(\n tiles: Tile3D[],\n frameState: FrameState,\n maximumTilesSelected: number\n): [Tile3D[], Tile3D[]] {\n if (maximumTilesSelected === 0 || tiles.length <= maximumTilesSelected) {\n return [tiles, []];\n }\n // Accumulate distances in couples array: [tileIndex: number, distanceToViewport: number]\n const tuples: [number, number][] = [];\n const {longitude: viewportLongitude, latitude: viewportLatitude} = frameState.viewport;\n for (const [index, tile] of tiles.entries()) {\n const [longitude, latitude] = tile.header.mbs;\n const deltaLon = Math.abs(viewportLongitude - longitude);\n const deltaLat = Math.abs(viewportLatitude - latitude);\n const distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);\n tuples.push([index, distance]);\n }\n const tuplesSorted = tuples.sort((a, b) => a[1] - b[1]);\n const selectedTiles: Tile3D[] = [];\n for (let i = 0; i < maximumTilesSelected; i++) {\n selectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n const unselectedTiles: Tile3D[] = [];\n for (let i = maximumTilesSelected; i < tuplesSorted.length; i++) {\n unselectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n\n return [selectedTiles, unselectedTiles];\n}\n\nfunction commonSpacePlanesToWGS84(viewport, viewportCenterCartesian) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n let i = 0;\n for (const dir in frustumPlanes) {\n const plane = frustumPlanes[dir];\n const distanceToCenter = plane.normal.dot(viewport.center);\n scratchPosition\n .copy(plane.normal)\n .scale(plane.distance - distanceToCenter)\n .add(viewport.center);\n const cartographicPos = viewport.unprojectPosition(scratchPosition);\n\n const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3());\n\n cullingVolume.planes[i++].fromPointNormal(\n cartesianPos,\n // Want the normal to point into the frustum since that's what culling expects\n scratchVector.copy(viewportCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n"],"file":"frame-state.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/tileset/helpers/frame-state.ts"],"names":["scratchVector","Vector3","scratchPosition","cullingVolume","CullingVolume","Plane","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartesian","worldToCartesian","center","enuToFixedTransform","Ellipsoid","WGS84","eastNorthUpToFixedFrame","cameraPositionCartographic","unprojectPosition","cameraPosition","cameraPositionCartesian","cartographicToCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","ViewportClass","constructor","longitude","latitude","width","bearing","zoom","topDownViewport","pitch","camera","position","direction","up","sseDenominator","limitSelectedTiles","tiles","frameState","maximumTilesSelected","length","tuples","viewportLongitude","viewportLatitude","entries","index","tile","header","mbs","deltaLon","Math","abs","deltaLat","distance","sqrt","push","tuplesSorted","sort","a","b","selectedTiles","i","unselectedTiles","frustumPlanes","getFrustumPlanes","nearCenterCommon","closestPointOnPlane","near","nearCenterCartesian","cameraCartesian","planes","fromPointNormal","copy","subtract","dir","plane","posCommon","cartesianPos","refPoint","out","distanceToRef","normal","dot","add","point","cartographicPos"],"mappings":"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","sourcesContent":["import {Tile3D} from '@loaders.gl/tiles';\nimport {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {Viewport} from '../../types';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: Viewport;\n topDownViewport: Viewport; // Use it to calculate projected radius for a tile\n height: number;\n cullingVolume: CullingVolume;\n frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: number; // Assumes fovy = 60 degrees\n};\n\nconst scratchVector = new Vector3();\nconst scratchPosition = new Vector3();\nconst cullingVolume = new CullingVolume([\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane()\n]);\n\n// Extracts a frame state appropriate for tile culling from a deck.gl viewport\n// TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios\nexport function getFrameState(viewport: Viewport, frameNumber: number): FrameState {\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n const {cameraDirection, cameraUp, height} = viewport;\n const {metersPerUnit} = viewport.distanceScales;\n\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);\n const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);\n\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n cameraPositionCartographic,\n new Vector3()\n );\n\n // These should still be normalized as the transform has scale 1 (goes from meters to meters)\n const cameraDirectionCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))\n ).normalize();\n const cameraUpCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))\n ).normalize();\n\n commonSpacePlanesToWGS84(viewport);\n\n const ViewportClass = viewport.constructor;\n const {longitude, latitude, width, bearing, zoom} = viewport;\n // @ts-ignore\n const topDownViewport = new ViewportClass({\n longitude,\n latitude,\n height,\n width,\n bearing,\n zoom,\n pitch: 0\n });\n\n // TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function\n return {\n camera: {\n position: cameraPositionCartesian,\n direction: cameraDirectionCartesian,\n up: cameraUpCartesian\n },\n viewport,\n topDownViewport,\n height,\n cullingVolume,\n frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: 1.15 // Assumes fovy = 60 degrees\n };\n}\n\n/**\n * Limit `tiles` array length with `maximumTilesSelected` number.\n * The criteria for this filtering is distance of a tile center\n * to the `frameState.viewport`'s longitude and latitude\n * @param tiles - tiles array to filter\n * @param frameState - frameState to calculate distances\n * @param maximumTilesSelected - maximal amount of tiles in the output array\n * @returns new tiles array\n */\nexport function limitSelectedTiles(\n tiles: Tile3D[],\n frameState: FrameState,\n maximumTilesSelected: number\n): [Tile3D[], Tile3D[]] {\n if (maximumTilesSelected === 0 || tiles.length <= maximumTilesSelected) {\n return [tiles, []];\n }\n // Accumulate distances in couples array: [tileIndex: number, distanceToViewport: number]\n const tuples: [number, number][] = [];\n const {longitude: viewportLongitude, latitude: viewportLatitude} = frameState.viewport;\n for (const [index, tile] of tiles.entries()) {\n const [longitude, latitude] = tile.header.mbs;\n const deltaLon = Math.abs(viewportLongitude - longitude);\n const deltaLat = Math.abs(viewportLatitude - latitude);\n const distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);\n tuples.push([index, distance]);\n }\n const tuplesSorted = tuples.sort((a, b) => a[1] - b[1]);\n const selectedTiles: Tile3D[] = [];\n for (let i = 0; i < maximumTilesSelected; i++) {\n selectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n const unselectedTiles: Tile3D[] = [];\n for (let i = maximumTilesSelected; i < tuplesSorted.length; i++) {\n unselectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n\n return [selectedTiles, unselectedTiles];\n}\n\nfunction commonSpacePlanesToWGS84(viewport) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n\n // Get the near/far plane centers\n const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);\n const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);\n const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);\n\n let i = 0;\n cullingVolume.planes[i++].fromPointNormal(\n nearCenterCartesian,\n scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian)\n );\n\n for (const dir in frustumPlanes) {\n if (dir === 'near') {\n continue;\n }\n const plane = frustumPlanes[dir];\n const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);\n const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);\n\n cullingVolume.planes[i++].fromPointNormal(\n cartesianPos,\n // Want the normal to point into the frustum since that's what culling expects\n scratchVector.copy(nearCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n\nfunction closestPointOnPlane(\n plane: {distance: number; normal: Vector3},\n refPoint: [number, number, number] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const distanceToRef = plane.normal.dot(refPoint);\n out\n .copy(plane.normal)\n .scale(plane.distance - distanceToRef)\n .add(refPoint);\n return out;\n}\n\nfunction worldToCartesian(\n viewport: Viewport,\n point: [number, number, number] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const cartographicPos = viewport.unprojectPosition(point);\n return Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);\n}\n"],"file":"frame-state.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/tileset/helpers/i3s-lod.ts"],"names":["cameraPositionCartesian","Vector3","toEye","cameraPositionEnu","extraVertexEnu","projectedOriginVector","enuToCartesianMatrix","Matrix4","cartesianToEnuMatrix","getLodStatus","tile","frameState","lodMetricValue","isNaN","screenSize","getProjectedRadius","header","children","viewport","topDownViewport","mbsLat","mbs","mbsLon","mbsZ","mbsR","mbsCenterCartesian","boundingVolume","center","cameraPositionCartographic","unprojectPosition","cameraPosition","Ellipsoid","WGS84","cartographicToCartesian","copy","subtract","normalize","eastNorthUpToFixedFrame","invert","transform","projection","Math","sqrt","extraZ","extraVertexCartesian","extraVectorCartesian","radiusVector","cross","scale","sphereMbsBorderVertexCartesian","add","sphereMbsBorderVertexCartographic","cartesianToCartographic","projectedOrigin","project","projectedMbsBorderVertex","projectedRadius","magnitude"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../../../../src/tileset/helpers/i3s-lod.ts"],"names":["cameraPositionCartesian","Vector3","toEye","cameraPositionEnu","extraVertexEnu","projectedOriginVector","enuToCartesianMatrix","Matrix4","cartesianToEnuMatrix","getLodStatus","tile","frameState","lodMetricValue","isNaN","screenSize","getProjectedRadius","header","children","viewport","topDownViewport","mbsLat","mbs","mbsLon","mbsZ","mbsR","mbsCenterCartesian","boundingVolume","center","cameraPositionCartographic","unprojectPosition","cameraPosition","Ellipsoid","WGS84","cartographicToCartesian","copy","subtract","normalize","eastNorthUpToFixedFrame","invert","transform","projection","Math","sqrt","extraZ","extraVertexCartesian","extraVectorCartesian","radiusVector","cross","scale","sphereMbsBorderVertexCartesian","add","sphereMbsBorderVertexCartographic","cartesianToCartographic","projectedOrigin","project","projectedMbsBorderVertex","projectedRadius","magnitude"],"mappings":";;;;;;;;;;;;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
|
-
|
|
605
|
-
|
|
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
|
|