bruce-cesium 6.8.0 → 6.8.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 (35) hide show
  1. package/dist/bruce-cesium.es5.js +631 -257
  2. package/dist/bruce-cesium.es5.js.map +1 -1
  3. package/dist/bruce-cesium.umd.js +629 -255
  4. package/dist/bruce-cesium.umd.js.map +1 -1
  5. package/dist/lib/bruce-cesium.js +1 -1
  6. package/dist/lib/rendering/menu-item-manager.js +20 -5
  7. package/dist/lib/rendering/menu-item-manager.js.map +1 -1
  8. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js +60 -1
  9. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js.map +1 -1
  10. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js +126 -42
  11. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js.map +1 -1
  12. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js +18 -13
  13. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js.map +1 -1
  14. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js +9 -8
  15. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js.map +1 -1
  16. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js +39 -23
  17. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js.map +1 -1
  18. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js +149 -73
  19. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js.map +1 -1
  20. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js +30 -0
  21. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js.map +1 -1
  22. package/dist/lib/rendering/visual-register-culler.js +1 -1
  23. package/dist/lib/rendering/visual-register-culler.js.map +1 -1
  24. package/dist/lib/rendering/visuals-register.js +176 -88
  25. package/dist/lib/rendering/visuals-register.js.map +1 -1
  26. package/dist/types/bruce-cesium.d.ts +1 -1
  27. package/dist/types/rendering/render-managers/entities/entities-datalab-render-manager.d.ts +6 -1
  28. package/dist/types/rendering/render-managers/entities/entities-render-manager.d.ts +6 -1
  29. package/dist/types/rendering/render-managers/tilesets/tileset-cad-render-manager.d.ts +1 -1
  30. package/dist/types/rendering/render-managers/tilesets/tileset-entities-render-manager.d.ts +1 -1
  31. package/dist/types/rendering/render-managers/tilesets/tileset-google-photos-render-manager.d.ts +6 -1
  32. package/dist/types/rendering/render-managers/tilesets/tileset-osm-render-manager.d.ts +6 -1
  33. package/dist/types/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.d.ts +5 -1
  34. package/dist/types/rendering/visuals-register.d.ts +17 -12
  35. package/package.json +8 -11
@@ -1,6 +1,6 @@
1
1
  import * as Cesium from 'cesium';
2
- import { Cartographic, ColorMaterialProperty, Entity, Color, ConstantProperty, CallbackProperty, Primitive, Cesium3DTileFeature, Math as Math$1, Cartesian3, JulianDate, Quaternion, Transforms, HeadingPitchRoll, Matrix4, DistanceDisplayCondition, HeightReference, ColorBlendMode, ShadowMode, ClassificationType, Model, HorizontalOrigin, VerticalOrigin, ConstantPositionProperty, PolygonHierarchy, PolylineGraphics, ArcType, CornerType, Cartesian2, SceneTransforms, NearFarScalar, Matrix3, Rectangle, KmlDataSource, GeoJsonDataSource, SceneMode, Cesium3DTileStyle, HeadingPitchRange, Cesium3DTileColorBlendMode, Ion, IonResource, EllipsoidTerrainProvider, IonImageryProvider, createWorldImagery, createWorldImageryAsync, BingMapsImageryProvider, BingMapsStyle, MapboxImageryProvider, MapboxStyleImageryProvider, ArcGisMapServerImageryProvider, OpenStreetMapImageryProvider, UrlTemplateImageryProvider, GridImageryProvider, GeographicTilingScheme, ImageryLayer, TileMapServiceImageryProvider, CesiumTerrainProvider, Cesium3DTileset, OrthographicFrustum, EasingFunction, ModelGraphics, PolygonGraphics, CorridorGraphics, PointGraphics, BillboardGraphics, EllipseGraphics, PolylineDashMaterialProperty, EllipsoidGeodesic, sampleTerrainMostDetailed, defined, BoundingSphere, GeometryInstance, PolygonPipeline, CesiumInspector, ClockRange, ScreenSpaceEventHandler, ScreenSpaceEventType, Intersect, CzmlDataSource, Fullscreen } from 'cesium';
3
- import { Cartes, Entity as Entity$1, ENVIRONMENT, Calculator, ClientFile, EntityLod, EntityTag, EntityType, LRUCache, ObjectUtils, Style, Api, Bounds, Geometry, Carto, MenuItem, ProjectView, ProjectViewBookmark, Tileset, ZoomControl, BruceEvent, EntityCoords, DataLab, DelayQueue, EntityHistoricData, AccountConcept, RecordChangeFeed, BruceApi, EntityRelation, ProgramKey, EntitySource, ProjectViewLegacyTile, ProjectViewTile, Camera, EntityAttachment, EntityAttachmentType, EntityAttribute, MathUtils, Session, EntityRelationType } from 'bruce-models';
2
+ import { Cartographic, ColorMaterialProperty, Entity, Color, ConstantProperty, CallbackProperty, Primitive, Cesium3DTileFeature, DistanceDisplayCondition, HeightReference, HorizontalOrigin, VerticalOrigin, Cartesian3, ClassificationType, ConstantPositionProperty, Math as Math$1, JulianDate, Quaternion, Transforms, HeadingPitchRoll, Matrix4, ArcType, CornerType, ShadowMode, ColorBlendMode, Model, PolygonHierarchy, PolylineGraphics, Cartesian2, SceneTransforms, NearFarScalar, Matrix3, Rectangle, KmlDataSource, GeoJsonDataSource, SceneMode, Ion, IonResource, Cesium3DTileStyle, HeadingPitchRange, Cesium3DTileColorBlendMode, OrthographicFrustum, EasingFunction, EllipsoidTerrainProvider, IonImageryProvider, createWorldImagery, createWorldImageryAsync, BingMapsImageryProvider, BingMapsStyle, MapboxImageryProvider, MapboxStyleImageryProvider, ArcGisMapServerImageryProvider, OpenStreetMapImageryProvider, UrlTemplateImageryProvider, GridImageryProvider, GeographicTilingScheme, ImageryLayer, TileMapServiceImageryProvider, CesiumTerrainProvider, Cesium3DTileset, EllipsoidGeodesic, sampleTerrainMostDetailed, defined, PolygonPipeline, CesiumInspector, ClockRange, BoundingSphere, GeometryInstance, ModelGraphics, PolygonGraphics, CorridorGraphics, PointGraphics, BillboardGraphics, EllipseGraphics, PolylineDashMaterialProperty, ScreenSpaceEventHandler, ScreenSpaceEventType, Intersect, CzmlDataSource, Fullscreen } from 'cesium';
3
+ import { Cartes, Entity as Entity$1, ENVIRONMENT, Api, Calculator, ClientFile, EntityTag, EntityType, LRUCache, ObjectUtils, Style, Carto, Geometry, EntityLod, MenuItem, ProjectView, ProjectViewBookmark, Tileset, ZoomControl, Bounds, BruceEvent, EntityCoords, DataLab, DelayQueue, EntityHistoricData, BruceApi, EntityRelation, AccountConcept, RecordChangeFeed, ProgramKey, EntitySource, Camera, ProjectViewTile, ProjectViewLegacyTile, Session, EntityAttachment, EntityAttachmentType, EntityAttribute, MathUtils, EntityRelationType } from 'bruce-models';
4
4
 
5
5
  /**
6
6
  * Ensures a number is returned from a given value.
@@ -6148,7 +6148,7 @@ var VisualRegisterCuller;
6148
6148
  terrChangeRemoval = null;
6149
6149
  clearTimeout(terrChangeTimeout);
6150
6150
  terrChangeTimeout = null;
6151
- checkInterval === null || checkInterval === void 0 ? void 0 : checkInterval();
6151
+ clearInterval(checkInterval);
6152
6152
  checkInterval = null;
6153
6153
  checkWaiting = false;
6154
6154
  checkQueue === null || checkQueue === void 0 ? void 0 : checkQueue.Dispose();
@@ -6548,6 +6548,7 @@ var VisualsRegister;
6548
6548
  // skipped by the applier so a live user action always wins.
6549
6549
  this.lazyOverrideExclusions = new Set();
6550
6550
  this.lazyOverrideInterval = null;
6551
+ this.activeChunkedIntervals = new Set();
6551
6552
  this.onUpdate = null;
6552
6553
  // Entity ID -> Menu Item ID -> State.
6553
6554
  // When no Menu Item ID is set, then the second key is a blank string.
@@ -7144,6 +7145,31 @@ var VisualsRegister;
7144
7145
  }
7145
7146
  this.viewer.scene.requestRender();
7146
7147
  }
7148
+ runChunked(items, perItem, onComplete) {
7149
+ const BATCH_SIZE = 5000;
7150
+ let index = 0;
7151
+ const interval = setInterval(() => {
7152
+ if (this.Disposed) {
7153
+ clearInterval(interval);
7154
+ this.activeChunkedIntervals.delete(interval);
7155
+ return;
7156
+ }
7157
+ const end = Math.min(index + BATCH_SIZE, items.length);
7158
+ for (; index < end; index++) {
7159
+ perItem(items[index]);
7160
+ }
7161
+ this.viewer.scene.requestRender();
7162
+ if (index >= items.length) {
7163
+ clearInterval(interval);
7164
+ this.activeChunkedIntervals.delete(interval);
7165
+ onComplete === null || onComplete === void 0 ? void 0 : onComplete();
7166
+ }
7167
+ }, 10);
7168
+ this.activeChunkedIntervals.add(interval);
7169
+ }
7170
+ startLazyRemoval(entityIds, removeOne, onComplete) {
7171
+ this.runChunked(entityIds, removeOne, onComplete);
7172
+ }
7147
7173
  /**
7148
7174
  * Cancels any in-flight lazy OverrideStates() apply.
7149
7175
  */
@@ -7216,9 +7242,7 @@ var VisualsRegister;
7216
7242
  }, 10);
7217
7243
  }
7218
7244
  /**
7219
- * Returns all states with the first detected Menu Item ID settings included.
7220
- * This is a utility function for returning settings for apps that don't support the newer state settings.
7221
- * @deprecated Use GetStates() or GetState().
7245
+ * Returns all states keyed by entity id, without regard to menu item id.
7222
7246
  * @returns
7223
7247
  */
7224
7248
  GetStatesLegacy() {
@@ -7244,7 +7268,7 @@ var VisualsRegister;
7244
7268
  const entityId = entityIds[i];
7245
7269
  const state = this.GetState({
7246
7270
  entityId: entityId,
7247
- // First known Menu Item.
7271
+ // Most-recently-set Menu Item for this entity, if any.
7248
7272
  menuItemId: entityIdsMenuItem[entityId]
7249
7273
  });
7250
7274
  states[entityId] = state;
@@ -7300,6 +7324,10 @@ var VisualsRegister;
7300
7324
  clearInterval(this.lazyOverrideInterval);
7301
7325
  this.lazyOverrideInterval = null;
7302
7326
  this.lazyOverrideActive = false;
7327
+ for (const interval of this.activeChunkedIntervals) {
7328
+ clearInterval(interval);
7329
+ }
7330
+ this.activeChunkedIntervals.clear();
7303
7331
  this.disposed = true;
7304
7332
  }
7305
7333
  ForceUpdate(params) {
@@ -7390,8 +7418,7 @@ var VisualsRegister;
7390
7418
  }
7391
7419
  }
7392
7420
  /**
7393
- * Returns all labelled entity ids.
7394
- * @deprecated Use GetStates() or GetState().
7421
+ * Returns all labelled entity ids, without regard to menu item id.
7395
7422
  */
7396
7423
  GetLabelled() {
7397
7424
  const labelledIds = [];
@@ -7542,7 +7569,7 @@ var VisualsRegister;
7542
7569
  }
7543
7570
  }
7544
7571
  /**
7545
- * @deprecated Use GetStates() or GetState().
7572
+ * Returns all selected entity ids, without regard to menu item id.
7546
7573
  * @returns
7547
7574
  */
7548
7575
  GetSelected() {
@@ -7677,7 +7704,7 @@ var VisualsRegister;
7677
7704
  }
7678
7705
  }
7679
7706
  /**
7680
- * @deprecated Use GetStates() or GetState().
7707
+ * Returns all highlighted entity ids, without regard to menu item id.
7681
7708
  * @returns
7682
7709
  */
7683
7710
  GetHighlighted() {
@@ -7738,7 +7765,7 @@ var VisualsRegister;
7738
7765
  return this.isolatedAnyCache;
7739
7766
  }
7740
7767
  /**
7741
- * @deprecated Use GetStates() or GetState().
7768
+ * Returns all isolated entity ids, without regard to menu item id.
7742
7769
  * @returns
7743
7770
  */
7744
7771
  GetIsolated() {
@@ -7796,7 +7823,7 @@ var VisualsRegister;
7796
7823
  return state.hidden === true;
7797
7824
  }
7798
7825
  /**
7799
- * @deprecated Use GetStates() or GetState().
7826
+ * Returns all hidden entity ids, without regard to menu item id.
7800
7827
  * @returns
7801
7828
  */
7802
7829
  GetHidden() {
@@ -7883,8 +7910,8 @@ var VisualsRegister;
7883
7910
  * Re-parents every rego registered under one menu item id to a different menu item id.
7884
7911
  */
7885
7912
  ReassignMenuItem(params) {
7886
- var _a, _b;
7887
- const { fromMenuItemId, toMenuItemId, toMenuItemType, toPriority, requestRender, source } = params;
7913
+ var _a;
7914
+ const { fromMenuItemId, toMenuItemId, toMenuItemType, toPriority, requestRender, source, lazy, onBatch, onComplete } = params;
7888
7915
  if (!fromMenuItemId || !toMenuItemId || fromMenuItemId === toMenuItemId) {
7889
7916
  return;
7890
7917
  }
@@ -7892,37 +7919,44 @@ var VisualsRegister;
7892
7919
  if (!entityIds) {
7893
7920
  return;
7894
7921
  }
7895
- // Snapshot: unindexMenuItemEntityIfAbsent() below mutates this same set.
7896
- for (const entityId of Array.from(entityIds)) {
7922
+ const idsSnapshot = Array.from(entityIds);
7923
+ const regoSnapshot = new Map();
7924
+ for (const entityId of idsSnapshot) {
7925
+ const snapRego = (_a = this.rego[entityId]) === null || _a === void 0 ? void 0 : _a.find(r => r.menuItemId === fromMenuItemId);
7926
+ if (snapRego) {
7927
+ regoSnapshot.set(entityId, snapRego);
7928
+ }
7929
+ }
7930
+ const reassignOne = (entityId) => {
7931
+ var _a, _b;
7897
7932
  const regos = this.rego[entityId];
7898
7933
  if (!regos) {
7899
- continue;
7934
+ return null;
7900
7935
  }
7901
- for (const rego of regos) {
7902
- if (rego.menuItemId !== fromMenuItemId) {
7903
- continue;
7904
- }
7905
- if (source !== EUpdateSource.TREE_CASCADE) {
7906
- (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger({
7907
- type: EVisualUpdateType.Remove,
7908
- entityId,
7909
- rego: { ...rego, menuItemId: fromMenuItemId },
7910
- source
7911
- });
7912
- }
7913
- rego.menuItemId = toMenuItemId;
7914
- rego.menuItemType = toMenuItemType;
7915
- if (toPriority != null) {
7916
- rego.priority = toPriority;
7917
- }
7918
- if (source !== EUpdateSource.TREE_CASCADE) {
7919
- (_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger({
7920
- type: EVisualUpdateType.Add,
7921
- entityId,
7922
- rego,
7923
- source
7924
- });
7925
- }
7936
+ const rego = regos.find(r => r.menuItemId === fromMenuItemId);
7937
+ if (!rego || rego !== regoSnapshot.get(entityId)) {
7938
+ return null;
7939
+ }
7940
+ if (source !== EUpdateSource.TREE_CASCADE) {
7941
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger({
7942
+ type: EVisualUpdateType.Remove,
7943
+ entityId,
7944
+ rego: { ...rego, menuItemId: fromMenuItemId },
7945
+ source
7946
+ });
7947
+ }
7948
+ rego.menuItemId = toMenuItemId;
7949
+ rego.menuItemType = toMenuItemType;
7950
+ if (toPriority != null) {
7951
+ rego.priority = toPriority;
7952
+ }
7953
+ if (source !== EUpdateSource.TREE_CASCADE) {
7954
+ (_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger({
7955
+ type: EVisualUpdateType.Add,
7956
+ entityId,
7957
+ rego,
7958
+ source
7959
+ });
7926
7960
  }
7927
7961
  const eStates = this.states[entityId];
7928
7962
  const movingState = eStates === null || eStates === void 0 ? void 0 : eStates[fromMenuItemId];
@@ -7942,11 +7976,50 @@ var VisualsRegister;
7942
7976
  entityId,
7943
7977
  refresh: true
7944
7978
  });
7979
+ return rego;
7980
+ };
7981
+ if (lazy) {
7982
+ this.startLazyReassign(idsSnapshot, reassignOne, requestRender, onBatch, onComplete);
7983
+ return;
7984
+ }
7985
+ for (const entityId of idsSnapshot) {
7986
+ reassignOne(entityId);
7945
7987
  }
7946
7988
  if (requestRender != false) {
7947
7989
  this.viewer.scene.requestRender();
7948
7990
  }
7949
7991
  }
7992
+ startLazyReassign(entityIds, reassignOne, requestRender, onBatch, onComplete) {
7993
+ const BATCH_SIZE = 5000;
7994
+ let index = 0;
7995
+ const interval = setInterval(() => {
7996
+ if (this.Disposed) {
7997
+ clearInterval(interval);
7998
+ this.activeChunkedIntervals.delete(interval);
7999
+ return;
8000
+ }
8001
+ const end = Math.min(index + BATCH_SIZE, entityIds.length);
8002
+ const batch = [];
8003
+ for (; index < end; index++) {
8004
+ const rego = reassignOne(entityIds[index]);
8005
+ if (rego) {
8006
+ batch.push(rego);
8007
+ }
8008
+ }
8009
+ if (batch.length) {
8010
+ onBatch === null || onBatch === void 0 ? void 0 : onBatch(batch);
8011
+ }
8012
+ if (requestRender != false) {
8013
+ this.viewer.scene.requestRender();
8014
+ }
8015
+ if (index >= entityIds.length) {
8016
+ clearInterval(interval);
8017
+ this.activeChunkedIntervals.delete(interval);
8018
+ onComplete === null || onComplete === void 0 ? void 0 : onComplete();
8019
+ }
8020
+ }, 10);
8021
+ this.activeChunkedIntervals.add(interval);
8022
+ }
7950
8023
  /**
7951
8024
  * Locates a visual corresponding to a given entity id.
7952
8025
  * If no menu item id is provided, then it will pick the "best" one.
@@ -7989,6 +8062,7 @@ var VisualsRegister;
7989
8062
  GetRegos(params) {
7990
8063
  // TODO: refactor.
7991
8064
  // Currently this was made by merging two functions.
8065
+ var _a;
7992
8066
  const { entityId, menuItemId, styleId, styleEffectiveFilter } = params;
7993
8067
  const matchesStyleFilters = (rego) => {
7994
8068
  if (styleId != null && rego.styleId !== styleId) {
@@ -8012,10 +8086,10 @@ var VisualsRegister;
8012
8086
  }
8013
8087
  else if (menuItemId) {
8014
8088
  const visuals = [];
8015
- for (const eId in this.rego) {
8016
- const entityRegos = this.rego[eId];
8017
- if (entityRegos) {
8018
- const rego = entityRegos.find(r => r.menuItemId === menuItemId);
8089
+ const eIds = this.entityIdsByMenuItem[menuItemId];
8090
+ if (eIds) {
8091
+ for (const eId of eIds) {
8092
+ const rego = (_a = this.rego[eId]) === null || _a === void 0 ? void 0 : _a.find(r => r.menuItemId === menuItemId);
8019
8093
  if (rego && matchesStyleFilters(rego)) {
8020
8094
  visuals.push(rego);
8021
8095
  }
@@ -8047,7 +8121,7 @@ var VisualsRegister;
8047
8121
  */
8048
8122
  RemoveRegos(params) {
8049
8123
  var _a, _b, _c;
8050
- let { entityId, menuItemId, doUpdate, relation, retainTagIds, requestRender, doRemove, source } = params;
8124
+ let { entityId, menuItemId, doUpdate, relation, retainTagIds, requestRender, doRemove, source, lazy, onComplete } = params;
8051
8125
  if (doUpdate == null || doUpdate === undefined) {
8052
8126
  doUpdate = true;
8053
8127
  }
@@ -8058,50 +8132,65 @@ var VisualsRegister;
8058
8132
  // Currently this was made by merging two functions.
8059
8133
  if (menuItemId && !entityId) {
8060
8134
  // Entities registered under this menu item, keyed via entityIdsByMenuItem.
8061
- // Snapshot to an array since removals below mutate the backing set.
8062
8135
  const entityIds = this.entityIdsByMenuItem[menuItemId] ? Array.from(this.entityIdsByMenuItem[menuItemId]) : [];
8063
- for (const entityId of entityIds) {
8136
+ const regoSnapshot = new Map();
8137
+ for (const snapEntityId of entityIds) {
8138
+ const snapRego = (_a = this.rego[snapEntityId]) === null || _a === void 0 ? void 0 : _a.find(r => r.menuItemId === menuItemId);
8139
+ if (snapRego) {
8140
+ regoSnapshot.set(snapEntityId, snapRego);
8141
+ }
8142
+ }
8143
+ const removeOne = (entityId) => {
8144
+ var _a;
8064
8145
  const entityRegos = this.rego[entityId];
8065
- if (entityRegos) {
8066
- const rego = entityRegos.find(r => r.menuItemId === menuItemId);
8067
- if (!rego) {
8068
- continue;
8069
- }
8070
- const regoTagIds = rego.tagIds ? rego.tagIds : [];
8071
- const shouldRetain = regoTagIds.some(tagId => retainTagIds.includes(tagId));
8072
- if (shouldRetain) {
8073
- continue;
8074
- }
8075
- EntityLabel.Detatch({
8076
- rego
8146
+ if (!entityRegos) {
8147
+ return;
8148
+ }
8149
+ const rego = entityRegos.find(r => r.menuItemId === menuItemId);
8150
+ if (!rego || rego !== regoSnapshot.get(entityId)) {
8151
+ return;
8152
+ }
8153
+ const regoTagIds = rego.tagIds ? rego.tagIds : [];
8154
+ const shouldRetain = regoTagIds.some(tagId => retainTagIds.includes(tagId));
8155
+ if (shouldRetain) {
8156
+ return;
8157
+ }
8158
+ EntityLabel.Detatch({
8159
+ rego
8160
+ });
8161
+ if (doRemove != false) {
8162
+ removeEntity(this.viewer, rego.visual);
8163
+ }
8164
+ rego.visual = null;
8165
+ const doesInclude = this.rego[entityId].find(r => r.menuItemId === menuItemId);
8166
+ if (doesInclude) {
8167
+ this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
8168
+ this.unindexMenuItemEntityIfAbsent(menuItemId, entityId);
8169
+ }
8170
+ const update = {
8171
+ type: EVisualUpdateType.Remove,
8172
+ entityId: rego.entityId,
8173
+ rego: rego
8174
+ };
8175
+ if (source) {
8176
+ update.source = source;
8177
+ }
8178
+ if (source !== EUpdateSource.TREE_CASCADE) {
8179
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
8180
+ }
8181
+ if (doesInclude) {
8182
+ this.queueUpdate({
8183
+ entityId: entityId,
8184
+ refresh: false
8077
8185
  });
8078
- if (doRemove != false) {
8079
- removeEntity(this.viewer, rego.visual);
8080
- }
8081
- rego.visual = null;
8082
- const doesInclude = this.rego[entityId].find(r => r.menuItemId === menuItemId);
8083
- if (doesInclude) {
8084
- this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
8085
- this.unindexMenuItemEntityIfAbsent(menuItemId, entityId);
8086
- }
8087
- const update = {
8088
- type: EVisualUpdateType.Remove,
8089
- entityId: rego.entityId,
8090
- rego: rego
8091
- };
8092
- if (source) {
8093
- update.source = source;
8094
- }
8095
- if (source !== EUpdateSource.TREE_CASCADE) {
8096
- (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
8097
- }
8098
- if (doesInclude) {
8099
- this.queueUpdate({
8100
- entityId: entityId,
8101
- refresh: false
8102
- });
8103
- }
8104
8186
  }
8187
+ };
8188
+ if (lazy) {
8189
+ this.startLazyRemoval(entityIds, removeOne, onComplete);
8190
+ return;
8191
+ }
8192
+ for (const entityId of entityIds) {
8193
+ removeOne(entityId);
8105
8194
  }
8106
8195
  }
8107
8196
  else if (entityId) {
@@ -8424,10 +8513,9 @@ var VisualsRegister;
8424
8513
  });
8425
8514
  }
8426
8515
  /**
8427
- * Returns a dictionary containing entityId -> opacity values.
8428
- * Opacity 1 = 100%.
8516
+ * Returns a dictionary containing entityId -> opacity values, without regard to
8517
+ * menu item id. Opacity 1 = 100%.
8429
8518
  * @returns
8430
- * @deprecated Use GetStates() or GetState().
8431
8519
  */
8432
8520
  GetOpacityMap() {
8433
8521
  const map = {};
@@ -9389,7 +9477,7 @@ function colorToCColor$1(color) {
9389
9477
  return new Color(color.red ? color.red / 255 : 0, color.green ? color.green / 255 : 0, color.blue ? color.blue / 255 : 0, color.alpha);
9390
9478
  }
9391
9479
  function getShowDebugBounds() {
9392
- if (!window) {
9480
+ if (typeof window === "undefined") {
9393
9481
  return false;
9394
9482
  }
9395
9483
  let showBounds = window === null || window === void 0 ? void 0 : window.ENTITIES_RENDER_MANAGER_SHOW_BOUNDS;
@@ -9466,52 +9554,17 @@ var EntitiesRenderManager;
9466
9554
  this.item = params.item;
9467
9555
  }
9468
9556
  (async () => {
9469
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
9557
+ var _a, _b, _c, _d;
9470
9558
  if (this.disposed) {
9471
9559
  return;
9472
9560
  }
9473
9561
  try {
9474
- // Reset allowed list if there's change.
9475
- if (((_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a["EntityType.ID"]) && !this.allowedTypeIDs.includes((_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b["EntityType.ID"])) {
9476
- this.allowedTypeIDs = [];
9477
- if ((_c = this.item.BruceEntity) === null || _c === void 0 ? void 0 : _c["EntityType.ID"]) {
9478
- this.allowedTypeIDs.push((_d = this.item.BruceEntity) === null || _d === void 0 ? void 0 : _d["EntityType.ID"]);
9479
- }
9480
- }
9562
+ const { tagsToRender, shouldRender } = this.applyItemSettings();
9481
9563
  if (this.disposed) {
9482
9564
  return;
9483
9565
  }
9484
- this.zoomControl = this.item.CameraZoomSettings;
9485
- if (!((_e = this.zoomControl) === null || _e === void 0 ? void 0 : _e.length)) {
9486
- this.zoomControl = [
9487
- {
9488
- MinZoom: 0,
9489
- MaxZoom: 200000,
9490
- DisplayType: ZoomControl.EDisplayType.Model3D,
9491
- LODCategoryID: "glb",
9492
- LODLevel: 0,
9493
- StyleID: 0
9494
- }
9495
- ];
9496
- }
9497
- this.renderPriority = this.item.renderPriority;
9498
- if (this.renderPriority == null) {
9499
- this.renderPriority = 1;
9500
- }
9501
- if (this.useGeojson && this.zoomControl.length > 1) {
9502
- console.warn("Geojson rendering does not support multiple zoom controls. Only the first one will be used.");
9503
- this.zoomControl = [this.zoomControl[0]];
9504
- }
9505
- this.scenario = (_f = this.item.BruceEntity) === null || _f === void 0 ? void 0 : _f.Scenario;
9506
- const isTagItem = Boolean(this.item.BruceEntity.ExpandLayers);
9507
- let tagsToRender = isTagItem ? this.item.BruceEntity.SelectedExpandLayers : null;
9508
- if (!tagsToRender) {
9509
- tagsToRender = [];
9510
- }
9511
- tagsToRender = [].concat(tagsToRender);
9512
- const shouldRender = !isTagItem || tagsToRender.length > 0;
9513
9566
  this.unsetGetter();
9514
- (_g = this.viewMonitorRemoval) === null || _g === void 0 ? void 0 : _g.call(this);
9567
+ (_a = this.viewMonitorRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
9515
9568
  this.viewMonitorRemoval = null;
9516
9569
  clearInterval(this.renderQueueInterval);
9517
9570
  this.renderQueueInterval = null;
@@ -9523,17 +9576,17 @@ var EntitiesRenderManager;
9523
9576
  menuItemId: this.item.id,
9524
9577
  retainTagIds: tagsToRender
9525
9578
  });
9526
- (_h = this.clustering) === null || _h === void 0 ? void 0 : _h.Dispose();
9579
+ (_b = this.clustering) === null || _b === void 0 ? void 0 : _b.Dispose();
9527
9580
  }
9528
9581
  else {
9529
9582
  this.visualsManager.RemoveRegos({
9530
9583
  menuItemId: this.item.id
9531
9584
  });
9532
- (_j = this.clustering) === null || _j === void 0 ? void 0 : _j.Dispose();
9585
+ (_c = this.clustering) === null || _c === void 0 ? void 0 : _c.Dispose();
9533
9586
  return;
9534
9587
  }
9535
9588
  if (this.item.enableClustering) {
9536
- this.clustering = new PointClustering(this.visualsManager, this.item.id, (_k = this.item) === null || _k === void 0 ? void 0 : _k.clustering);
9589
+ this.clustering = new PointClustering(this.visualsManager, this.item.id, (_d = this.item) === null || _d === void 0 ? void 0 : _d.clustering);
9537
9590
  }
9538
9591
  this.setGetter();
9539
9592
  this.viewMonitorRemoval = this.monitor.Updated().Subscribe(() => {
@@ -9546,6 +9599,46 @@ var EntitiesRenderManager;
9546
9599
  }
9547
9600
  })();
9548
9601
  }
9602
+ applyItemSettings() {
9603
+ var _a, _b, _c, _d, _e, _f;
9604
+ // Reset allowed list if there's change.
9605
+ if (((_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a["EntityType.ID"]) && !this.allowedTypeIDs.includes((_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b["EntityType.ID"])) {
9606
+ this.allowedTypeIDs = [];
9607
+ if ((_c = this.item.BruceEntity) === null || _c === void 0 ? void 0 : _c["EntityType.ID"]) {
9608
+ this.allowedTypeIDs.push((_d = this.item.BruceEntity) === null || _d === void 0 ? void 0 : _d["EntityType.ID"]);
9609
+ }
9610
+ }
9611
+ this.zoomControl = this.item.CameraZoomSettings;
9612
+ if (!((_e = this.zoomControl) === null || _e === void 0 ? void 0 : _e.length)) {
9613
+ this.zoomControl = [
9614
+ {
9615
+ MinZoom: 0,
9616
+ MaxZoom: 200000,
9617
+ DisplayType: ZoomControl.EDisplayType.Model3D,
9618
+ LODCategoryID: "glb",
9619
+ LODLevel: 0,
9620
+ StyleID: 0
9621
+ }
9622
+ ];
9623
+ }
9624
+ this.renderPriority = this.item.renderPriority;
9625
+ if (this.renderPriority == null) {
9626
+ this.renderPriority = 1;
9627
+ }
9628
+ if (this.useGeojson && this.zoomControl.length > 1) {
9629
+ console.warn("Geojson rendering does not support multiple zoom controls. Only the first one will be used.");
9630
+ this.zoomControl = [this.zoomControl[0]];
9631
+ }
9632
+ this.scenario = (_f = this.item.BruceEntity) === null || _f === void 0 ? void 0 : _f.Scenario;
9633
+ const isTagItem = Boolean(this.item.BruceEntity.ExpandLayers);
9634
+ let tagsToRender = isTagItem ? this.item.BruceEntity.SelectedExpandLayers : null;
9635
+ if (!tagsToRender) {
9636
+ tagsToRender = [];
9637
+ }
9638
+ tagsToRender = [].concat(tagsToRender);
9639
+ const shouldRender = !isTagItem || tagsToRender.length > 0;
9640
+ return { isTagItem, tagsToRender, shouldRender };
9641
+ }
9549
9642
  /**
9550
9643
  * Updates allowedTypeIDs values based in incoming data.
9551
9644
  * We might request 'x' Entity Type, but get 'y' Entities due to local Data Sources.
@@ -10530,6 +10623,85 @@ var EntitiesRenderManager;
10530
10623
  this.clustering.Update();
10531
10624
  }
10532
10625
  }
10626
+ get HandoffKey() {
10627
+ return Manager.GetHandoffKey(this.item);
10628
+ }
10629
+ static GetHandoffKey(item) {
10630
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
10631
+ if (item.renderAsGeojson || item.enableClustering) {
10632
+ return null;
10633
+ }
10634
+ const isTagItem = Boolean((_a = item.BruceEntity) === null || _a === void 0 ? void 0 : _a.ExpandLayers);
10635
+ const tags = isTagItem ? [].concat((_c = (_b = item.BruceEntity) === null || _b === void 0 ? void 0 : _b.SelectedExpandLayers) !== null && _c !== void 0 ? _c : []).sort() : [];
10636
+ return JSON.stringify({
10637
+ typeId: ((_d = item.BruceEntity) === null || _d === void 0 ? void 0 : _d["EntityType.ID"]) || "",
10638
+ filter: (_f = (_e = item.BruceEntity) === null || _e === void 0 ? void 0 : _e.Filter) !== null && _f !== void 0 ? _f : {},
10639
+ isTagItem,
10640
+ tags,
10641
+ scenario: (_h = (_g = item.BruceEntity) === null || _g === void 0 ? void 0 : _g.Scenario) !== null && _h !== void 0 ? _h : "",
10642
+ historic: Boolean((_j = item.BruceEntity) === null || _j === void 0 ? void 0 : _j.historic),
10643
+ historicAttrKey: ((_k = item.BruceEntity) === null || _k === void 0 ? void 0 : _k.historicAttrKey) || "",
10644
+ historicInterpolation: Boolean(item.historicInterpolation),
10645
+ schemaId: ((_l = item.BruceEntity) === null || _l === void 0 ? void 0 : _l.schemaId) || "",
10646
+ cdnEnabled: Boolean(item.cdnEnabled),
10647
+ optimizeGeometry: Boolean(item.optimizeGeometry),
10648
+ optimizeMinPoints: (_m = item.optimizeMinPoints) !== null && _m !== void 0 ? _m : "",
10649
+ optimizeTolerance: (_o = item.optimizeTolerance) !== null && _o !== void 0 ? _o : ""
10650
+ });
10651
+ }
10652
+ PrepareHandoff() {
10653
+ var _a;
10654
+ if (this.disposed || this.useGeojson || this.item.enableClustering) {
10655
+ return null;
10656
+ }
10657
+ const payload = {
10658
+ renderedEntities: this.renderedEntities,
10659
+ renderedByInternalId: new Map(this.renderedByInternalId),
10660
+ internalByEntityId: new Map(this.internalByEntityId),
10661
+ allowedTypeIDs: [...this.allowedTypeIDs],
10662
+ renderQueue: [...this.renderQueue],
10663
+ sourceMenuItemId: this.item.id
10664
+ };
10665
+ this.unsetGetter();
10666
+ (_a = this.viewMonitorRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
10667
+ this.viewMonitorRemoval = null;
10668
+ clearInterval(this.renderQueueInterval);
10669
+ this.renderQueueInterval = null;
10670
+ this.renderQueue = [];
10671
+ this.disposed = true;
10672
+ return payload;
10673
+ }
10674
+ AdoptHandoff(payload) {
10675
+ var _a;
10676
+ const { shouldRender } = this.applyItemSettings();
10677
+ this.visualsManager.ReassignMenuItem({
10678
+ fromMenuItemId: payload.sourceMenuItemId,
10679
+ toMenuItemId: this.item.id,
10680
+ toMenuItemType: this.item.Type,
10681
+ toPriority: this.renderPriority,
10682
+ requestRender: false
10683
+ });
10684
+ if (!shouldRender) {
10685
+ this.renderedEntities = payload.renderedEntities;
10686
+ this.renderedByInternalId = payload.renderedByInternalId;
10687
+ this.internalByEntityId = payload.internalByEntityId;
10688
+ this.allowedTypeIDs = payload.allowedTypeIDs;
10689
+ return;
10690
+ }
10691
+ this.setGetter();
10692
+ this.viewMonitorRemoval = this.monitor.Updated().Subscribe(() => {
10693
+ var _a;
10694
+ (_a = this.entityCheckQueue) === null || _a === void 0 ? void 0 : _a.Call();
10695
+ });
10696
+ this.renderedEntities = payload.renderedEntities;
10697
+ this.renderedByInternalId = payload.renderedByInternalId;
10698
+ this.internalByEntityId = payload.internalByEntityId;
10699
+ this.allowedTypeIDs = payload.allowedTypeIDs;
10700
+ if ((_a = payload.renderQueue) === null || _a === void 0 ? void 0 : _a.length) {
10701
+ this.distributeForRender(payload.renderQueue);
10702
+ }
10703
+ this.viewer.scene.requestRender();
10704
+ }
10533
10705
  }
10534
10706
  EntitiesRenderManager.Manager = Manager;
10535
10707
  })(EntitiesRenderManager || (EntitiesRenderManager = {}));
@@ -14361,17 +14533,21 @@ var TilesetCadRenderManager;
14361
14533
  }
14362
14534
  }
14363
14535
  // Two items resolving to the same key are eligible to hand off, regardless of styling.
14536
+ // Model-space vs. geospatial, and historic vs. live, position the tileset via entirely
14537
+ // different code paths (baked in once at Init() time), so either changing must never
14538
+ // match an existing key and must instead force a real reload.
14364
14539
  get HandoffKey() {
14365
- return Manager.GetHandoffKey(this.item);
14540
+ return Manager.GetHandoffKey(this.item, this.modelSpace);
14366
14541
  }
14367
- static GetHandoffKey(item) {
14368
- var _a, _b;
14542
+ static GetHandoffKey(item, modelSpace) {
14543
+ var _a, _b, _c;
14369
14544
  const tilesetId = (_a = item === null || item === void 0 ? void 0 : item.tileset) === null || _a === void 0 ? void 0 : _a.TilesetID;
14370
14545
  if (!tilesetId) {
14371
14546
  return null;
14372
14547
  }
14373
14548
  const accountId = ((_b = item.tileset) === null || _b === void 0 ? void 0 : _b.ClientAccountID) || "";
14374
- return `${accountId}:${tilesetId}`;
14549
+ const historic = Boolean((_c = item.BruceEntity) === null || _c === void 0 ? void 0 : _c.historic);
14550
+ return `${accountId}:${tilesetId}:${Boolean(modelSpace)}:${historic}`;
14375
14551
  }
14376
14552
  // Returns null (fall back to a normal Dispose()) if the tileset hasn't finished loading yet.
14377
14553
  PrepareHandoff() {
@@ -14427,14 +14603,6 @@ var TilesetCadRenderManager;
14427
14603
  if (this.renderPriority == null) {
14428
14604
  this.renderPriority = 0;
14429
14605
  }
14430
- // Same visuals, same registrations - just re-keyed onto this menu item.
14431
- this.visualsManager.ReassignMenuItem({
14432
- fromMenuItemId: payload.sourceMenuItemId,
14433
- toMenuItemId: this.item.id,
14434
- toMenuItemType: this.item.Type,
14435
- toPriority: this.renderPriority,
14436
- requestRender: false
14437
- });
14438
14606
  this.tileLoadRemoval = this.cTileset.tileLoad.addEventListener((tile) => {
14439
14607
  try {
14440
14608
  this.queueTile(tile, true);
@@ -14451,6 +14619,14 @@ var TilesetCadRenderManager;
14451
14619
  console.error(e);
14452
14620
  }
14453
14621
  });
14622
+ // Same visuals, same registrations so just re-keyed onto this menu item.
14623
+ this.visualsManager.ReassignMenuItem({
14624
+ fromMenuItemId: payload.sourceMenuItemId,
14625
+ toMenuItemId: this.item.id,
14626
+ toMenuItemType: this.item.Type,
14627
+ toPriority: this.renderPriority,
14628
+ requestRender: false
14629
+ });
14454
14630
  this.onCTilesetLoad();
14455
14631
  this.styler.Init({
14456
14632
  viewer: this.viewer,
@@ -15058,7 +15234,8 @@ var TilesetCadRenderManager;
15058
15234
  this.visualsManager.RemoveRegos({
15059
15235
  menuItemId: this.item.id,
15060
15236
  doRemove: false,
15061
- source: VisualsRegister.EUpdateSource.TILESET_DISPOSE
15237
+ source: VisualsRegister.EUpdateSource.TILESET_DISPOSE,
15238
+ lazy: true
15062
15239
  });
15063
15240
  this.viewerDateTimeDispose();
15064
15241
  }
@@ -16553,7 +16730,7 @@ var DataLabRenderManager;
16553
16730
  }
16554
16731
  setGetter(queryItems) {
16555
16732
  this.unsetGetter();
16556
- this.getter = new EntityFilterGetter.Getter({
16733
+ const getter = new EntityFilterGetter.Getter({
16557
16734
  api: this.apiGetter.getApi(),
16558
16735
  attrFilter: {},
16559
16736
  batchSize: BATCH_SIZE$3,
@@ -16564,6 +16741,10 @@ var DataLabRenderManager;
16564
16741
  queryItems: queryItems !== null && queryItems !== void 0 ? queryItems : []
16565
16742
  }
16566
16743
  });
16744
+ this.attachGetter(getter);
16745
+ }
16746
+ attachGetter(getter) {
16747
+ this.getter = getter;
16567
16748
  const minMax = RenderManager.GetZoomMinMax({
16568
16749
  zoomControl: this.zoomControl
16569
16750
  });
@@ -16904,6 +17085,61 @@ var DataLabRenderManager;
16904
17085
  console.error("Failed to render DataLab entities:", e);
16905
17086
  }
16906
17087
  }
17088
+ get HandoffKey() {
17089
+ return Manager.GetHandoffKey(this.item);
17090
+ }
17091
+ static GetHandoffKey(item) {
17092
+ const queryId = item === null || item === void 0 ? void 0 : item.DataLabQueryID;
17093
+ if (!queryId) {
17094
+ return null;
17095
+ }
17096
+ return `datalab:${queryId}`;
17097
+ }
17098
+ PrepareHandoff() {
17099
+ var _a, _b, _c;
17100
+ if (this.disposed || !this.getter) {
17101
+ return null;
17102
+ }
17103
+ this.getter.ExcludeMenuItem(this.item.id);
17104
+ (_a = this.getterSub) === null || _a === void 0 ? void 0 : _a.call(this);
17105
+ this.getterSub = null;
17106
+ const getter = this.getter;
17107
+ this.getter = null;
17108
+ (_b = this.viewMonitorRemoval) === null || _b === void 0 ? void 0 : _b.call(this);
17109
+ this.viewMonitorRemoval = null;
17110
+ (_c = this.entityCheckQueue) === null || _c === void 0 ? void 0 : _c.Dispose();
17111
+ this.entityCheckQueue = null;
17112
+ clearInterval(this.renderQueueInterval);
17113
+ this.renderQueueInterval = null;
17114
+ const payload = {
17115
+ getter,
17116
+ renderedEntities: this.renderedEntities,
17117
+ renderQueue: [...this.renderQueue],
17118
+ sourceMenuItemId: this.item.id
17119
+ };
17120
+ this.renderQueue = [];
17121
+ this.queryLoadId += 1;
17122
+ this.disposed = true;
17123
+ return payload;
17124
+ }
17125
+ AdoptHandoff(payload) {
17126
+ var _a;
17127
+ this.ensureSettings();
17128
+ this.renderedEntities = payload.renderedEntities;
17129
+ this.visualsManager.ReassignMenuItem({
17130
+ fromMenuItemId: payload.sourceMenuItemId,
17131
+ toMenuItemId: this.item.id,
17132
+ toMenuItemType: this.item.Type,
17133
+ toPriority: this.renderPriority,
17134
+ requestRender: false
17135
+ });
17136
+ this.attachGetter(payload.getter);
17137
+ this.setEntityCheckQueue();
17138
+ if ((_a = payload.renderQueue) === null || _a === void 0 ? void 0 : _a.length) {
17139
+ this.distributeForRender(payload.renderQueue);
17140
+ }
17141
+ this.viewer.scene.requestRender();
17142
+ }
16907
17143
  }
16908
17144
  DataLabRenderManager.Manager = Manager;
16909
17145
  })(DataLabRenderManager || (DataLabRenderManager = {}));
@@ -17326,6 +17562,7 @@ var TilesetOsmRenderManager;
17326
17562
  this.queueCheckInterval = null;
17327
17563
  this.processingQueue = 0;
17328
17564
  this._osmIdToBruceId = {};
17565
+ this.tileLoadRemoval = null;
17329
17566
  const { viewer, register: visualsManager, getters: apiGetter, monitor, item } = params;
17330
17567
  this.viewer = viewer;
17331
17568
  this.getters = apiGetter;
@@ -17334,11 +17571,14 @@ var TilesetOsmRenderManager;
17334
17571
  this.monitor = monitor;
17335
17572
  }
17336
17573
  Dispose() {
17574
+ var _a;
17337
17575
  if (this.disposed) {
17338
17576
  return;
17339
17577
  }
17340
17578
  this.disposed = true;
17341
17579
  clearInterval(this.queueCheckInterval);
17580
+ (_a = this.tileLoadRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
17581
+ this.tileLoadRemoval = null;
17342
17582
  if (this.cTileset) {
17343
17583
  const viewer = this.viewer;
17344
17584
  if (!(viewer === null || viewer === void 0 ? void 0 : viewer.isDestroyed()) && this.viewer.scene.primitives.contains(this.cTileset)) {
@@ -17352,7 +17592,8 @@ var TilesetOsmRenderManager;
17352
17592
  this.cTileset = null;
17353
17593
  }
17354
17594
  this.visualsManager.RemoveRegos({
17355
- menuItemId: this.item.id
17595
+ menuItemId: this.item.id,
17596
+ lazy: true
17356
17597
  });
17357
17598
  this.featureQueue = [];
17358
17599
  }
@@ -17365,84 +17606,89 @@ var TilesetOsmRenderManager;
17365
17606
  this.sourceId = EnsureNumber((_a = menuItem.BruceEntity) === null || _a === void 0 ? void 0 : _a.SourceId, 0);
17366
17607
  this.entityTypeId = (_b = menuItem.BruceEntity) === null || _b === void 0 ? void 0 : _b["EntityType.ID"];
17367
17608
  (async () => {
17368
- if (this.disposed) {
17369
- return;
17370
- }
17371
- else if (this.cTileset) {
17372
- // Already exists, no need to re-initialize.
17373
- return;
17374
- }
17375
- let validToken;
17376
- if (Ion.defaultServer) {
17377
- // Proxy server was set after verifying Ion availability upstream
17378
- // (including template account fallback) — trust that check.
17379
- validToken = true;
17380
- }
17381
- else {
17382
- // No proxy; validate the legacy access token directly.
17383
- validToken = await ViewerUtils.AssertIonToken(Ion.defaultAccessToken);
17384
- }
17385
- if (!validToken) {
17386
- console.warn("'tileset-osm-render-manager.ts' could not locate a valid Cesium Ion token.");
17387
- return;
17388
- }
17389
- const CESIUM = Cesium;
17390
- let cTileset;
17391
- // Newer versions of Cesium have this function be async.
17392
- if (CESIUM["createOsmBuildingsAsync"]) {
17393
- cTileset = await CESIUM.createOsmBuildingsAsync({});
17394
- }
17395
- // Older versions of Cesium have this function be sync.
17396
- else if (CESIUM["createOsmBuildings"]) {
17397
- cTileset = CESIUM.createOsmBuildings();
17398
- }
17399
- else {
17400
- console.warn("'tileset-osm-render-manager.ts' could not locate a create function for OSM buildings.");
17401
- return;
17402
- }
17403
- // See if we already have a cTileset set.
17404
- // Happens if we re-initialized in quick succession.
17405
- if (this.cTileset) {
17406
- cTileset.destroy();
17407
- return;
17408
- }
17409
- this.cTileset = cTileset;
17410
- if (this.disposed) {
17411
- if (this.cTileset && !this.cTileset.isDestroyed()) {
17412
- this.cTileset.destroy();
17413
- this.cTileset = null;
17609
+ try {
17610
+ if (this.disposed) {
17611
+ return;
17414
17612
  }
17415
- return;
17416
- }
17417
- if (this.sourceId) {
17418
- if (menuItem.ghostLoading == true) {
17419
- this.cTileset.style = new Cesium3DTileStyle({
17420
- color: "rgba(255, 255, 250, 0.98)"
17421
- });
17613
+ else if (this.cTileset) {
17614
+ // Already exists, no need to re-initialize.
17615
+ return;
17422
17616
  }
17423
- this.viewer.scene.primitives.add(this.cTileset);
17424
- this.cTileset.tileLoad.addEventListener((tile) => {
17425
- if (this.disposed) {
17426
- return;
17427
- }
17428
- try {
17429
- this.mapCTile(tile);
17430
- }
17431
- catch (e) {
17432
- console.error(e);
17617
+ let validToken;
17618
+ if (Ion.defaultServer) {
17619
+ // Proxy server was set after verifying Ion availability upstream
17620
+ // (including template account fallback) — trust that check.
17621
+ validToken = true;
17622
+ }
17623
+ else {
17624
+ // No proxy; validate the legacy access token directly.
17625
+ validToken = await ViewerUtils.AssertIonToken(Ion.defaultAccessToken);
17626
+ }
17627
+ if (!validToken) {
17628
+ console.warn("'tileset-osm-render-manager.ts' could not locate a valid Cesium Ion token.");
17629
+ return;
17630
+ }
17631
+ const CESIUM = Cesium;
17632
+ let cTileset;
17633
+ // Newer versions of Cesium have this function be async.
17634
+ if (CESIUM["createOsmBuildingsAsync"]) {
17635
+ cTileset = await CESIUM.createOsmBuildingsAsync({});
17636
+ }
17637
+ // Older versions of Cesium have this function be sync.
17638
+ else if (CESIUM["createOsmBuildings"]) {
17639
+ cTileset = CESIUM.createOsmBuildings();
17640
+ }
17641
+ else {
17642
+ console.warn("'tileset-osm-render-manager.ts' could not locate a create function for OSM buildings.");
17643
+ return;
17644
+ }
17645
+ // See if we already have a cTileset set.
17646
+ // Happens if we re-initialized in quick succession.
17647
+ if (this.cTileset) {
17648
+ cTileset.destroy();
17649
+ return;
17650
+ }
17651
+ this.cTileset = cTileset;
17652
+ if (this.disposed) {
17653
+ if (this.cTileset && !this.cTileset.isDestroyed()) {
17654
+ this.cTileset.destroy();
17655
+ this.cTileset = null;
17433
17656
  }
17434
- });
17435
- this.queueCheckInterval = setInterval(() => {
17436
- if (this.featureQueue.length > 0) {
17437
- this.processQueue();
17657
+ return;
17658
+ }
17659
+ if (this.sourceId) {
17660
+ if (menuItem.ghostLoading == true) {
17661
+ this.cTileset.style = new Cesium3DTileStyle({
17662
+ color: "rgba(255, 255, 250, 0.98)"
17663
+ });
17438
17664
  }
17439
- }, 5000);
17665
+ this.viewer.scene.primitives.add(this.cTileset);
17666
+ this.tileLoadRemoval = this.cTileset.tileLoad.addEventListener((tile) => {
17667
+ if (this.disposed) {
17668
+ return;
17669
+ }
17670
+ try {
17671
+ this.mapCTile(tile);
17672
+ }
17673
+ catch (e) {
17674
+ console.error(e);
17675
+ }
17676
+ });
17677
+ this.queueCheckInterval = setInterval(() => {
17678
+ if (this.featureQueue.length > 0) {
17679
+ this.processQueue();
17680
+ }
17681
+ }, 5000);
17682
+ }
17683
+ else {
17684
+ this.viewer.scene.primitives.add(this.cTileset);
17685
+ }
17686
+ this.cTileset.show = true;
17687
+ this.viewer.scene.requestRender();
17440
17688
  }
17441
- else {
17442
- this.viewer.scene.primitives.add(this.cTileset);
17689
+ catch (e) {
17690
+ console.error("Failed to load OSM Buildings tileset:", e);
17443
17691
  }
17444
- this.cTileset.show = true;
17445
- this.viewer.scene.requestRender();
17446
17692
  })();
17447
17693
  }
17448
17694
  async mapCTile(tile) {
@@ -17677,6 +17923,72 @@ var TilesetOsmRenderManager;
17677
17923
  }
17678
17924
  async ReRender(params) {
17679
17925
  }
17926
+ get HandoffKey() {
17927
+ return Manager.GetHandoffKey(this.item);
17928
+ }
17929
+ static GetHandoffKey(item) {
17930
+ var _a, _b;
17931
+ const sourceId = EnsureNumber((_a = item.BruceEntity) === null || _a === void 0 ? void 0 : _a.SourceId, 0);
17932
+ const entityTypeId = ((_b = item.BruceEntity) === null || _b === void 0 ? void 0 : _b["EntityType.ID"]) || "";
17933
+ return `osm:${sourceId}:${entityTypeId}`;
17934
+ }
17935
+ PrepareHandoff() {
17936
+ var _a;
17937
+ if (this.disposed || !this.cTileset || this.cTileset.isDestroyed()) {
17938
+ return null;
17939
+ }
17940
+ clearInterval(this.queueCheckInterval);
17941
+ this.queueCheckInterval = null;
17942
+ (_a = this.tileLoadRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
17943
+ this.tileLoadRemoval = null;
17944
+ const payload = {
17945
+ cTileset: this.cTileset,
17946
+ loadedCesiumEntities: this._loadedCesiumEntities,
17947
+ featureQueue: this.featureQueue,
17948
+ osmIdToBruceId: this._osmIdToBruceId,
17949
+ totalLoaded: this.totalLoaded,
17950
+ sourceMenuItemId: this.item.id
17951
+ };
17952
+ this.cTileset = null;
17953
+ this.disposed = true;
17954
+ return payload;
17955
+ }
17956
+ AdoptHandoff(payload) {
17957
+ var _a, _b;
17958
+ this.sourceId = EnsureNumber((_a = this.item.BruceEntity) === null || _a === void 0 ? void 0 : _a.SourceId, 0);
17959
+ this.entityTypeId = (_b = this.item.BruceEntity) === null || _b === void 0 ? void 0 : _b["EntityType.ID"];
17960
+ this.cTileset = payload.cTileset;
17961
+ this._loadedCesiumEntities = payload.loadedCesiumEntities;
17962
+ this.featureQueue = payload.featureQueue;
17963
+ this._osmIdToBruceId = payload.osmIdToBruceId;
17964
+ this.totalLoaded = payload.totalLoaded;
17965
+ if (this.sourceId) {
17966
+ this.visualsManager.ReassignMenuItem({
17967
+ fromMenuItemId: payload.sourceMenuItemId,
17968
+ toMenuItemId: this.item.id,
17969
+ toMenuItemType: this.item.Type,
17970
+ requestRender: false
17971
+ });
17972
+ this.tileLoadRemoval = this.cTileset.tileLoad.addEventListener((tile) => {
17973
+ if (this.disposed) {
17974
+ return;
17975
+ }
17976
+ try {
17977
+ this.mapCTile(tile);
17978
+ }
17979
+ catch (e) {
17980
+ console.error(e);
17981
+ }
17982
+ });
17983
+ this.queueCheckInterval = setInterval(() => {
17984
+ if (this.featureQueue.length > 0) {
17985
+ this.processQueue();
17986
+ }
17987
+ }, 5000);
17988
+ }
17989
+ this.cTileset.show = true;
17990
+ this.viewer.scene.requestRender();
17991
+ }
17680
17992
  }
17681
17993
  TilesetOsmRenderManager.Manager = Manager;
17682
17994
  })(TilesetOsmRenderManager || (TilesetOsmRenderManager = {}));
@@ -18025,7 +18337,8 @@ var TilesetEntitiesRenderManager;
18025
18337
  }
18026
18338
  (_b = this.styler) === null || _b === void 0 ? void 0 : _b.Dispose();
18027
18339
  this.visualsManager.RemoveRegos({
18028
- menuItemId: this.item.id
18340
+ menuItemId: this.item.id,
18341
+ lazy: true
18029
18342
  });
18030
18343
  }
18031
18344
  onCTilesetLoad() {
@@ -18092,13 +18405,6 @@ var TilesetEntitiesRenderManager;
18092
18405
  if (this.renderPriority == null) {
18093
18406
  this.renderPriority = 0;
18094
18407
  }
18095
- this.visualsManager.ReassignMenuItem({
18096
- fromMenuItemId: payload.sourceMenuItemId,
18097
- toMenuItemId: this.item.id,
18098
- toMenuItemType: this.item.Type,
18099
- toPriority: this.renderPriority,
18100
- requestRender: false
18101
- });
18102
18408
  this.tileLoadRemoval = this.cTileset.tileLoad.addEventListener((tile) => {
18103
18409
  try {
18104
18410
  this.queueTile(tile, true);
@@ -18115,6 +18421,13 @@ var TilesetEntitiesRenderManager;
18115
18421
  console.error(e);
18116
18422
  }
18117
18423
  });
18424
+ this.visualsManager.ReassignMenuItem({
18425
+ fromMenuItemId: payload.sourceMenuItemId,
18426
+ toMenuItemId: this.item.id,
18427
+ toMenuItemType: this.item.Type,
18428
+ toPriority: this.renderPriority,
18429
+ requestRender: false
18430
+ });
18118
18431
  if (this.item.ApplyStyles) {
18119
18432
  this.styler.Init({
18120
18433
  viewer: this.viewer,
@@ -18400,6 +18713,36 @@ var TilesetPointcloudRenderManager;
18400
18713
  }
18401
18714
  async ReRender(params) {
18402
18715
  }
18716
+ get HandoffKey() {
18717
+ return Manager.GetHandoffKey(this.item);
18718
+ }
18719
+ static GetHandoffKey(item) {
18720
+ var _a, _b;
18721
+ const tilesetId = (_a = item === null || item === void 0 ? void 0 : item.tileset) === null || _a === void 0 ? void 0 : _a.TilesetID;
18722
+ if (!tilesetId) {
18723
+ return null;
18724
+ }
18725
+ const accountId = ((_b = item.tileset) === null || _b === void 0 ? void 0 : _b.ClientAccountID) || "";
18726
+ return `${accountId}:${tilesetId}`;
18727
+ }
18728
+ PrepareHandoff() {
18729
+ var _a;
18730
+ if (this.disposed || !this.cTileset || this.cTileset.isDestroyed()) {
18731
+ return null;
18732
+ }
18733
+ const payload = {
18734
+ cTileset: this.cTileset
18735
+ };
18736
+ (_a = this.initQueue) === null || _a === void 0 ? void 0 : _a.Remove(this);
18737
+ this.cTileset = null;
18738
+ this.disposed = true;
18739
+ return payload;
18740
+ }
18741
+ AdoptHandoff(payload) {
18742
+ this.cTileset = payload.cTileset;
18743
+ this.onCTilesetLoad();
18744
+ this.viewer.scene.requestRender();
18745
+ }
18403
18746
  }
18404
18747
  TilesetPointcloudRenderManager.Manager = Manager;
18405
18748
  })(TilesetPointcloudRenderManager || (TilesetPointcloudRenderManager = {}));
@@ -19702,19 +20045,7 @@ var TilesetGooglePhotosRenderManager;
19702
20045
  var _a, _b, _c;
19703
20046
  // If the tileset already exists then we just need to update the style.
19704
20047
  if (this.cTileset) {
19705
- const colorCss = this.item.colorMask;
19706
- if (colorCss) {
19707
- this.cTileset.style = new Cesium3DTileStyle({
19708
- color: {
19709
- conditions: [
19710
- ["true", `color("${colorCss}")`]
19711
- ]
19712
- }
19713
- });
19714
- }
19715
- else {
19716
- this.cTileset.style = undefined;
19717
- }
20048
+ this.applyColorMask();
19718
20049
  this.viewer.scene.requestRender();
19719
20050
  return;
19720
20051
  }
@@ -19803,21 +20134,49 @@ var TilesetGooglePhotosRenderManager;
19803
20134
  return;
19804
20135
  }
19805
20136
  this.viewer.scene.primitives.add(this.cTileset);
19806
- const colorCss = this.item.colorMask;
19807
- if (colorCss) {
19808
- this.cTileset.style = new Cesium3DTileStyle({
19809
- color: {
19810
- conditions: [
19811
- ["true", `color("${colorCss}")`]
19812
- ]
19813
- }
19814
- });
19815
- }
20137
+ this.applyColorMask();
19816
20138
  this.viewer.scene.requestRender();
19817
20139
  })();
19818
20140
  }
20141
+ applyColorMask() {
20142
+ const colorCss = this.item.colorMask;
20143
+ if (colorCss) {
20144
+ this.cTileset.style = new Cesium3DTileStyle({
20145
+ color: {
20146
+ conditions: [
20147
+ ["true", `color("${colorCss}")`]
20148
+ ]
20149
+ }
20150
+ });
20151
+ }
20152
+ else {
20153
+ this.cTileset.style = undefined;
20154
+ }
20155
+ }
19819
20156
  async ReRender(params) {
19820
20157
  }
20158
+ get HandoffKey() {
20159
+ return Manager.GetHandoffKey();
20160
+ }
20161
+ static GetHandoffKey() {
20162
+ return "google-photorealistic-3d";
20163
+ }
20164
+ PrepareHandoff() {
20165
+ if (this.disposed || !this.cTileset || this.cTileset.isDestroyed()) {
20166
+ return null;
20167
+ }
20168
+ const payload = {
20169
+ cTileset: this.cTileset
20170
+ };
20171
+ this.cTileset = null;
20172
+ this.disposed = true;
20173
+ return payload;
20174
+ }
20175
+ AdoptHandoff(payload) {
20176
+ this.cTileset = payload.cTileset;
20177
+ this.applyColorMask();
20178
+ this.viewer.scene.requestRender();
20179
+ }
19821
20180
  }
19822
20181
  TilesetGooglePhotosRenderManager$$1.Manager = Manager;
19823
20182
  })(TilesetGooglePhotosRenderManager || (TilesetGooglePhotosRenderManager = {}));
@@ -22124,7 +22483,7 @@ var MenuItemManager;
22124
22483
  console.error("Menu item type is not implemented.", params.item.Type);
22125
22484
  }
22126
22485
  if (rItem.renderManager && !rItem.renderManager.Disposed) {
22127
- const handoffPayload = this.tryClaimHandoffPayload(params.item, rItem.renderManager);
22486
+ const handoffPayload = this.tryClaimHandoffPayload(params.item, rItem.renderManager, params.modelSpace);
22128
22487
  try {
22129
22488
  if (handoffPayload) {
22130
22489
  rItem.renderManager.AdoptHandoff(handoffPayload);
@@ -22201,22 +22560,37 @@ var MenuItemManager;
22201
22560
  return Boolean(renderManager) && typeof renderManager.PrepareHandoff === "function";
22202
22561
  }
22203
22562
  // Resolves the hand-off key a menu item's data would have.
22204
- computeHandoffKey(item) {
22563
+ computeHandoffKey(item, modelSpace) {
22205
22564
  if (item.Type === MenuItem.EType.CadTileset) {
22206
- return TilesetCadRenderManager.Manager.GetHandoffKey(item);
22565
+ return TilesetCadRenderManager.Manager.GetHandoffKey(item, modelSpace);
22207
22566
  }
22208
22567
  if (item.Type === MenuItem.EType.EntityTileset) {
22209
22568
  return TilesetEntitiesRenderManager.Manager.GetHandoffKey(item);
22210
22569
  }
22570
+ if (item.Type === MenuItem.EType.PointCloud) {
22571
+ return TilesetPointcloudRenderManager.Manager.GetHandoffKey(item);
22572
+ }
22573
+ if (item.Type === MenuItem.EType.GooglePhotoTileset) {
22574
+ return TilesetGooglePhotosRenderManager.Manager.GetHandoffKey();
22575
+ }
22576
+ if (item.Type === MenuItem.EType.Osm) {
22577
+ return TilesetOsmRenderManager.Manager.GetHandoffKey(item);
22578
+ }
22579
+ if (item.Type === MenuItem.EType.Entities) {
22580
+ return EntitiesRenderManager.Manager.GetHandoffKey(item);
22581
+ }
22582
+ if (item.Type === MenuItem.EType.DataLab) {
22583
+ return DataLabRenderManager.Manager.GetHandoffKey(item);
22584
+ }
22211
22585
  return null;
22212
22586
  }
22213
22587
  // Claims a pooled manager for the same resource, if one exists and both sides opt in.
22214
22588
  // Returns null (meaning: construct normally via Init()) otherwise.
22215
- tryClaimHandoffPayload(item, newManager) {
22589
+ tryClaimHandoffPayload(item, newManager, modelSpace) {
22216
22590
  if (typeof newManager.AdoptHandoff !== "function") {
22217
22591
  return null;
22218
22592
  }
22219
- const key = this.computeHandoffKey(item);
22593
+ const key = this.computeHandoffKey(item, modelSpace);
22220
22594
  if (!key) {
22221
22595
  return null;
22222
22596
  }
@@ -37182,7 +37556,7 @@ var StyleUtils;
37182
37556
  StyleUtils.ApplyTypeStyle = ApplyTypeStyle;
37183
37557
  })(StyleUtils || (StyleUtils = {}));
37184
37558
 
37185
- const VERSION = "6.8.0";
37559
+ const VERSION = "6.8.2";
37186
37560
  /**
37187
37561
  * Updates the environment instance used by bruce-cesium to one specified.
37188
37562
  * This can be used to ensure that the instance a parent is referencing is shared between bruce-cesium, bruce-models, and the parent app.