@itwin/core-frontend 3.6.0-dev.45 → 3.6.0-dev.47

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 (49) hide show
  1. package/lib/cjs/Viewport.d.ts +32 -1
  2. package/lib/cjs/Viewport.d.ts.map +1 -1
  3. package/lib/cjs/Viewport.js +28 -0
  4. package/lib/cjs/Viewport.js.map +1 -1
  5. package/lib/cjs/tile/RealityTileTree.d.ts +5 -0
  6. package/lib/cjs/tile/RealityTileTree.d.ts.map +1 -1
  7. package/lib/cjs/tile/RealityTileTree.js +8 -1
  8. package/lib/cjs/tile/RealityTileTree.js.map +1 -1
  9. package/lib/cjs/tile/map/ImageryTileTree.d.ts +25 -1
  10. package/lib/cjs/tile/map/ImageryTileTree.d.ts.map +1 -1
  11. package/lib/cjs/tile/map/ImageryTileTree.js +50 -3
  12. package/lib/cjs/tile/map/ImageryTileTree.js.map +1 -1
  13. package/lib/cjs/tile/map/MapTile.d.ts +5 -0
  14. package/lib/cjs/tile/map/MapTile.d.ts.map +1 -1
  15. package/lib/cjs/tile/map/MapTile.js +33 -13
  16. package/lib/cjs/tile/map/MapTile.js.map +1 -1
  17. package/lib/cjs/tile/map/MapTileTree.d.ts +42 -3
  18. package/lib/cjs/tile/map/MapTileTree.d.ts.map +1 -1
  19. package/lib/cjs/tile/map/MapTileTree.js +125 -8
  20. package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
  21. package/lib/cjs/tile/map/MapTiledGraphicsProvider.d.ts +16 -0
  22. package/lib/cjs/tile/map/MapTiledGraphicsProvider.d.ts.map +1 -1
  23. package/lib/cjs/tile/map/MapTiledGraphicsProvider.js +22 -0
  24. package/lib/cjs/tile/map/MapTiledGraphicsProvider.js.map +1 -1
  25. package/lib/esm/Viewport.d.ts +32 -1
  26. package/lib/esm/Viewport.d.ts.map +1 -1
  27. package/lib/esm/Viewport.js +29 -1
  28. package/lib/esm/Viewport.js.map +1 -1
  29. package/lib/esm/tile/RealityTileTree.d.ts +5 -0
  30. package/lib/esm/tile/RealityTileTree.d.ts.map +1 -1
  31. package/lib/esm/tile/RealityTileTree.js +8 -1
  32. package/lib/esm/tile/RealityTileTree.js.map +1 -1
  33. package/lib/esm/tile/map/ImageryTileTree.d.ts +25 -1
  34. package/lib/esm/tile/map/ImageryTileTree.d.ts.map +1 -1
  35. package/lib/esm/tile/map/ImageryTileTree.js +49 -3
  36. package/lib/esm/tile/map/ImageryTileTree.js.map +1 -1
  37. package/lib/esm/tile/map/MapTile.d.ts +5 -0
  38. package/lib/esm/tile/map/MapTile.d.ts.map +1 -1
  39. package/lib/esm/tile/map/MapTile.js +33 -13
  40. package/lib/esm/tile/map/MapTile.js.map +1 -1
  41. package/lib/esm/tile/map/MapTileTree.d.ts +42 -3
  42. package/lib/esm/tile/map/MapTileTree.d.ts.map +1 -1
  43. package/lib/esm/tile/map/MapTileTree.js +125 -8
  44. package/lib/esm/tile/map/MapTileTree.js.map +1 -1
  45. package/lib/esm/tile/map/MapTiledGraphicsProvider.d.ts +16 -0
  46. package/lib/esm/tile/map/MapTiledGraphicsProvider.d.ts.map +1 -1
  47. package/lib/esm/tile/map/MapTiledGraphicsProvider.js +22 -0
  48. package/lib/esm/tile/map/MapTiledGraphicsProvider.js.map +1 -1
  49. package/package.json +20 -20
@@ -12,11 +12,24 @@ import { ApproximateTerrainHeights } from "../../ApproximateTerrainHeights";
12
12
  import { IModelApp } from "../../IModelApp";
13
13
  import { PlanarClipMaskState } from "../../PlanarClipMaskState";
14
14
  import { FeatureSymbology } from "../../render/FeatureSymbology";
15
- import { BingElevationProvider, createDefaultViewFlagOverrides, createMapLayerTreeReference, EllipsoidTerrainProvider, GraphicsCollectorDrawArgs, ImageryMapTileTree, MapCartoRectangle, MapTile, MapTileLoader, ModelMapLayerTileTreeReference, PlanarTilePatch, QuadId, RealityTileDrawArgs, RealityTileTree, TileTreeLoadStatus, TileTreeReference, UpsampledMapTile, WebMercatorTilingScheme, } from "../internal";
15
+ import { BingElevationProvider, createDefaultViewFlagOverrides, createMapLayerTreeReference, EllipsoidTerrainProvider, GraphicsCollectorDrawArgs, ImageryMapTileTree, ImageryTileTreeState, MapCartoRectangle, MapTile, MapTileLoader, ModelMapLayerTileTreeReference, PlanarTilePatch, QuadId, RealityTileDrawArgs, RealityTileTree, TileTreeLoadStatus, TileTreeReference, UpsampledMapTile, WebMercatorTilingScheme, } from "../internal";
16
16
  const scratchPoint = Point3d.create();
17
17
  const scratchCorners = [Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero()];
18
18
  const scratchCorner = Point3d.createZero();
19
19
  const scratchZNormal = Vector3d.create(0, 0, 1);
20
+ /** Map tile tree scale range visibility values.
21
+ * @beta */
22
+ export var MapTileTreeScaleRangeVisibility;
23
+ (function (MapTileTreeScaleRangeVisibility) {
24
+ /** state is currently unknown (i.e. never been displayed) */
25
+ MapTileTreeScaleRangeVisibility[MapTileTreeScaleRangeVisibility["Unknown"] = 0] = "Unknown";
26
+ /** all currently selected tree tiles are visible (i.e within the scale range) */
27
+ MapTileTreeScaleRangeVisibility[MapTileTreeScaleRangeVisibility["Visible"] = 1] = "Visible";
28
+ /** all currently selected tree tiles are hidden (i.e outside the scale range) */
29
+ MapTileTreeScaleRangeVisibility[MapTileTreeScaleRangeVisibility["Hidden"] = 2] = "Hidden";
30
+ /** currently selected tree tiles are partially visible (i.e some tiles are within the scale range, and some are outside.) */
31
+ MapTileTreeScaleRangeVisibility[MapTileTreeScaleRangeVisibility["Partial"] = 3] = "Partial";
32
+ })(MapTileTreeScaleRangeVisibility || (MapTileTreeScaleRangeVisibility = {}));
20
33
  /** A [quad tree](https://en.wikipedia.org/wiki/Quadtree) consisting of [[MapTile]]s representing the map imagery draped onto the surface of the Earth.
21
34
  * A `MapTileTree` enables display of a globe or planar map with [map imagery](https://en.wikipedia.org/wiki/Tiled_web_map) obtained from any number of sources, such as
22
35
  * [Bing](https://learn.microsoft.com/en-us/bingmaps/), [OpenStreetMap](https://wiki.openstreetmap.org/wiki/API), and [GIS servers](https://wiki.openstreetmap.org/wiki/API).
@@ -31,8 +44,9 @@ export class MapTileTree extends RealityTileTree {
31
44
  constructor(params, ecefToDb, bimElevationBias, geodeticOffset, sourceTilingScheme, id, applyTerrain) {
32
45
  super(params);
33
46
  /** @internal */
34
- this.imageryTrees = [];
47
+ this.layerImageryTrees = [];
35
48
  this._layerSettings = new Map();
49
+ this._imageryTreeState = new Map();
36
50
  this._modelIdToIndex = new Map();
37
51
  /** @internal */
38
52
  this.layerClassifiers = new Map();
@@ -81,14 +95,34 @@ export class MapTileTree extends RealityTileTree {
81
95
  // by depth so that painters algorithm will approximate correct depth display.
82
96
  return this.useDepthBuffer ? this.loader.parentsAndChildrenExclusive : false;
83
97
  }
98
+ /** Return the imagery tile tree state of matching the provided imagery tree id.
99
+ * @internal
100
+ */
101
+ getImageryTreeState(imageryTreeId) {
102
+ return this._imageryTreeState.get(imageryTreeId);
103
+ }
104
+ /** Return a cloned dictionary of the imagery tile tree states
105
+ * @internal
106
+ */
107
+ cloneImageryTreeState() {
108
+ const clone = new Map();
109
+ for (const [treeId, state] of this._imageryTreeState) {
110
+ clone.set(treeId, state.clone());
111
+ }
112
+ return clone;
113
+ }
84
114
  /** @internal */
85
115
  tileFromQuadId(quadId) {
86
116
  return this._rootTile.tileFromQuadId(quadId);
87
117
  }
88
- /** @internal */
118
+ /** Add a new imagery tile tree / map-layer settings pair and initialize the imagery tile tree state.
119
+ * @internal
120
+ */
89
121
  addImageryLayer(tree, settings, index) {
90
- this.imageryTrees.push(tree);
122
+ this.layerImageryTrees.push({ tree, settings });
91
123
  this._layerSettings.set(tree.modelId, settings);
124
+ if (!this._imageryTreeState.has(tree.modelId))
125
+ this._imageryTreeState.set(tree.modelId, new ImageryTileTreeState());
92
126
  this._modelIdToIndex.set(tree.modelId, index);
93
127
  }
94
128
  /** @internal */
@@ -107,7 +141,7 @@ export class MapTileTree extends RealityTileTree {
107
141
  }
108
142
  /** @internal */
109
143
  clearImageryTreesAndClassifiers() {
110
- this.imageryTrees.length = 0;
144
+ this.layerImageryTrees.length = 0;
111
145
  this._layerSettings.clear();
112
146
  this._modelIdToIndex.clear();
113
147
  this.layerClassifiers.clear();
@@ -120,7 +154,7 @@ export class MapTileTree extends RealityTileTree {
120
154
  get maxDepth() {
121
155
  var _a;
122
156
  let maxDepth = this.loader.maxDepth;
123
- (_a = this.imageryTrees) === null || _a === void 0 ? void 0 : _a.forEach((imageryTree) => maxDepth = Math.max(maxDepth, imageryTree.maxDepth));
157
+ (_a = this.layerImageryTrees) === null || _a === void 0 ? void 0 : _a.forEach((layerImageryTree) => maxDepth = Math.max(maxDepth, layerImageryTree.tree.maxDepth));
124
158
  return maxDepth;
125
159
  }
126
160
  /** @internal */
@@ -308,6 +342,69 @@ export class MapTileTree extends RealityTileTree {
308
342
  resolveCorners(gridPoints);
309
343
  }
310
344
  }
345
+ /** Scan the list of currently selected reality tiles, and fire the viewport's 'onMapLayerScaleRangeVisibilityChanged ' event
346
+ * if any scale range visibility change is detected for one more map-layer definition.
347
+ * @internal
348
+ */
349
+ reportTileVisibility(args, selected) {
350
+ const debugControl = args.context.target.debugControl;
351
+ const layersVisibilityBefore = this.cloneImageryTreeState();
352
+ const changes = new Array();
353
+ if (!layersVisibilityBefore)
354
+ return;
355
+ for (const [treeId] of layersVisibilityBefore) {
356
+ const treeVisibility = this.getImageryTreeState(treeId);
357
+ if (treeVisibility) {
358
+ treeVisibility.reset();
359
+ }
360
+ }
361
+ let allTilesRead = true;
362
+ for (const selectedTile of selected) {
363
+ if (selectedTile instanceof MapTile) {
364
+ if (!selectedTile.isReady)
365
+ allTilesRead = false;
366
+ let selectedImageryTiles = selectedTile.imageryTiles;
367
+ if (selectedTile.hiddenImageryTiles) {
368
+ selectedImageryTiles = selectedImageryTiles ? [...selectedImageryTiles, ...selectedTile.hiddenImageryTiles] : selectedTile.hiddenImageryTiles;
369
+ }
370
+ if (selectedImageryTiles) {
371
+ for (const selectedImageryTile of selectedImageryTiles) {
372
+ const treeState = this.getImageryTreeState(selectedImageryTile.tree.id);
373
+ if (treeState) {
374
+ if (selectedImageryTile.isOutOfLodRange) {
375
+ treeState.setScaleRangeVisibility(false);
376
+ }
377
+ else {
378
+ treeState.setScaleRangeVisibility(true);
379
+ }
380
+ }
381
+ }
382
+ }
383
+ }
384
+ }
385
+ if (!allTilesRead)
386
+ changes;
387
+ for (const [treeId, prevState] of layersVisibilityBefore) {
388
+ const newState = this.getImageryTreeState(treeId);
389
+ if (newState) {
390
+ const prevVisibility = prevState.getScaleRangeVisibility();
391
+ const visibility = newState.getScaleRangeVisibility();
392
+ if (prevVisibility !== visibility) {
393
+ if (debugControl && debugControl.logRealityTiles) {
394
+ // eslint-disable-next-line no-console
395
+ console.log(`ImageryTileTree '${treeId}' changed prev state: '${MapTileTreeScaleRangeVisibility[prevVisibility]}' new state: '${MapTileTreeScaleRangeVisibility[visibility]}'`);
396
+ }
397
+ const mapLayersIndexes = args.context.viewport.getMapLayerIndexesFromIds(this.id, treeId);
398
+ for (const index of mapLayersIndexes) {
399
+ changes.push({ index: index.index, isOverlay: index.isOverlay, visibility });
400
+ }
401
+ }
402
+ }
403
+ }
404
+ if (changes.length !== 0) {
405
+ args.context.viewport.onMapLayerScaleRangeVisibilityChanged.raiseEvent(changes);
406
+ }
407
+ }
311
408
  /** @internal */
312
409
  getFractionalTileCorners(quadId) {
313
410
  const corners = [];
@@ -623,11 +720,28 @@ export class MapTileTreeReference extends TileTreeReference {
623
720
  const treeIndex = index + baseLayerIndex;
624
721
  return index < 0 || treeIndex >= this._layerTrees.length ? undefined : this._layerTrees[treeIndex];
625
722
  }
723
+ /** Return the map-layer scale range visibility for the provided map-layer index.
724
+ * @internal
725
+ */
726
+ getMapLayerScaleRangeVisibility(index) {
727
+ var _a;
728
+ const tree = this.treeOwner.tileTree;
729
+ if (undefined !== tree) {
730
+ const tileTreeRef = this.getLayerImageryTreeRef(index);
731
+ const treeId = (_a = tileTreeRef === null || tileTreeRef === void 0 ? void 0 : tileTreeRef.treeOwner.tileTree) === null || _a === void 0 ? void 0 : _a.id;
732
+ if (treeId !== undefined) {
733
+ const treeState = tree.getImageryTreeState(treeId);
734
+ if (treeState !== undefined)
735
+ return treeState.getScaleRangeVisibility();
736
+ }
737
+ }
738
+ return MapTileTreeScaleRangeVisibility.Unknown;
739
+ }
626
740
  initializeLayers(context) {
627
741
  const tree = this.treeOwner.load();
628
742
  if (undefined === tree)
629
743
  return false; // Not loaded yet.
630
- tree.imageryTrees.length = 0;
744
+ tree.layerImageryTrees.length = 0;
631
745
  if (0 === this._layerTrees.length)
632
746
  return !this.isOverlay;
633
747
  let treeIndex = this._layerTrees.length - 1;
@@ -639,7 +753,10 @@ export class MapTileTreeReference extends TileTreeReference {
639
753
  }
640
754
  for (; treeIndex < this._layerTrees.length; treeIndex++) {
641
755
  const layerTreeRef = this._layerTrees[treeIndex];
642
- if (layerTreeRef && TileTreeLoadStatus.NotFound !== layerTreeRef.treeOwner.loadStatus && layerTreeRef.layerSettings.visible && !layerTreeRef.layerSettings.allSubLayersInvisible) {
756
+ // Load tile tree for each configured layer.
757
+ // Note: Non-visible layer are also added to allow proper tile tree scale range visibility reporting.
758
+ if (layerTreeRef && TileTreeLoadStatus.NotFound !== layerTreeRef.treeOwner.loadStatus
759
+ && !layerTreeRef.layerSettings.allSubLayersInvisible) {
643
760
  const layerTree = layerTreeRef.treeOwner.load();
644
761
  if (undefined === layerTree)
645
762
  return false; // Not loaded yet.