bruce-cesium 2.9.7 → 2.9.9

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 (40) hide show
  1. package/dist/bruce-cesium.es5.js +797 -183
  2. package/dist/bruce-cesium.es5.js.map +1 -1
  3. package/dist/bruce-cesium.umd.js +798 -186
  4. package/dist/bruce-cesium.umd.js.map +1 -1
  5. package/dist/lib/bruce-cesium.js +1 -1
  6. package/dist/lib/rendering/getters/batched-data-getter.js +92 -0
  7. package/dist/lib/rendering/getters/batched-data-getter.js.map +1 -0
  8. package/dist/lib/rendering/getters/entity-filter-getter.js +394 -0
  9. package/dist/lib/rendering/getters/entity-filter-getter.js.map +1 -0
  10. package/dist/lib/rendering/getters/entity-globe.js +195 -0
  11. package/dist/lib/rendering/getters/entity-globe.js.map +1 -0
  12. package/dist/lib/rendering/menu-item-manager.js +1 -1
  13. package/dist/lib/rendering/menu-item-manager.js.map +1 -1
  14. package/dist/lib/rendering/render-managers/common/entity-label.js.map +1 -1
  15. package/dist/lib/rendering/render-managers/common/shared-getters.js +2 -2
  16. package/dist/lib/rendering/render-managers/common/shared-getters.js.map +1 -1
  17. package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js +2 -1
  18. package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js.map +1 -1
  19. package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js +2 -1
  20. package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js.map +1 -1
  21. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js.map +1 -1
  22. package/dist/lib/rendering/render-managers/entities/entity-render-manager.js +2 -1
  23. package/dist/lib/rendering/render-managers/entities/entity-render-manager.js.map +1 -1
  24. package/dist/lib/rendering/visual-register-culler.js +12 -5
  25. package/dist/lib/rendering/visual-register-culler.js.map +1 -1
  26. package/dist/lib/viewer/cesium-view-monitor.js +177 -174
  27. package/dist/lib/viewer/cesium-view-monitor.js.map +1 -1
  28. package/dist/types/bruce-cesium.d.ts +1 -1
  29. package/dist/types/rendering/getters/batched-data-getter.d.ts +26 -0
  30. package/dist/types/rendering/getters/entity-filter-getter.d.ts +58 -0
  31. package/dist/types/rendering/getters/entity-globe.d.ts +20 -0
  32. package/dist/types/rendering/menu-item-manager.d.ts +1 -1
  33. package/dist/types/rendering/render-managers/common/shared-getters.d.ts +3 -4
  34. package/dist/types/rendering/render-managers/entities/entities-ids-render-manager.d.ts +1 -1
  35. package/dist/types/rendering/render-managers/entities/entities-loaded-render-manager.d.ts +1 -1
  36. package/dist/types/rendering/render-managers/entities/entities-render-manager.d.ts +1 -1
  37. package/dist/types/rendering/render-managers/entities/entity-render-manager.d.ts +1 -1
  38. package/dist/types/rendering/render-managers/tilesets/tileset-osm-render-manager.d.ts +1 -1
  39. package/dist/types/viewer/cesium-view-monitor.d.ts +32 -26
  40. package/package.json +2 -2
@@ -75,191 +75,194 @@
75
75
  function arePosEqual(a, b) {
76
76
  return a.latitude == b.latitude && a.longitude == b.longitude;
77
77
  }
78
- /**
79
- * Monitors and emits events when the Cesium view changes.
80
- */
81
- var CesiumViewMonitor = /** @class */ (function () {
82
- function CesiumViewMonitor(viewer) {
83
- var _this = this;
84
- this.target = null;
85
- this.bounds = null;
86
- this.disposed = false;
87
- this.updatedEvent = null;
88
- this.entity = null;
89
- this.viewer = viewer;
90
- this.tryEmitUpdate();
91
- this.checkInterval = setInterval(function () {
92
- _this.updateQueue();
93
- }, POSITION_CHECK_TIMER);
94
- }
95
- Object.defineProperty(CesiumViewMonitor.prototype, "Disposed", {
96
- get: function () {
97
- return this.disposed;
98
- },
99
- enumerable: false,
100
- configurable: true
101
- });
102
- CesiumViewMonitor.prototype.createEntity = function () {
103
- var _this = this;
104
- if (this.entity) {
105
- return;
78
+ (function (CesiumViewMonitor) {
79
+ /**
80
+ * Monitors and emits events when the Cesium view changes.
81
+ */
82
+ var Monitor = /** @class */ (function () {
83
+ function Monitor(viewer) {
84
+ var _this = this;
85
+ this.target = null;
86
+ this.bounds = null;
87
+ this.disposed = false;
88
+ this.updatedEvent = null;
89
+ this.entity = null;
90
+ this.viewer = viewer;
91
+ this.tryEmitUpdate();
92
+ this.checkInterval = setInterval(function () {
93
+ _this.updateQueue();
94
+ }, POSITION_CHECK_TIMER);
106
95
  }
107
- this.entity = this.viewer.entities.add({
108
- position: new Cesium.CallbackProperty(function () {
109
- return _this.target ? Cesium.Cartesian3.fromDegrees(_this.target.longitude, _this.target.latitude) : null;
110
- }, false),
111
- point: {
112
- pixelSize: 8,
113
- color: Cesium.Color.ORANGE
96
+ Object.defineProperty(Monitor.prototype, "Disposed", {
97
+ get: function () {
98
+ return this.disposed;
114
99
  },
115
- rectangle: {
116
- coordinates: new Cesium.CallbackProperty(function () {
117
- return _this.bounds ? Cesium.Rectangle.fromDegrees(_this.bounds.west, _this.bounds.south, _this.bounds.east, _this.bounds.north) : null;
118
- }, false),
119
- material: Cesium.Color.fromCssColorString('#ff0000').withAlpha(0.4),
120
- zIndex: 1
121
- }
100
+ enumerable: false,
101
+ configurable: true
122
102
  });
123
- };
124
- CesiumViewMonitor.prototype.destroyEntity = function () {
125
- if (this.entity && this.viewer.entities.contains(this.entity)) {
126
- this.viewer.entities.remove(this.entity);
127
- }
128
- this.entity = null;
129
- };
130
- CesiumViewMonitor.prototype.Updated = function () {
131
- if (!this.updatedEvent) {
132
- this.updatedEvent = new bruceModels.BruceEvent();
133
- }
134
- return this.updatedEvent;
135
- };
136
- CesiumViewMonitor.prototype.GetBounds = function () {
137
- return this.bounds;
138
- };
139
- CesiumViewMonitor.prototype.GetTarget = function () {
140
- return this.target;
141
- };
142
- CesiumViewMonitor.prototype.DoUpdate = function () {
143
- this.tryEmitUpdate();
144
- };
145
- CesiumViewMonitor.prototype.Dispose = function () {
146
- if (this.disposed) {
147
- return;
148
- }
149
- this.disposed = true;
150
- clearInterval(this.checkInterval);
151
- this.destroyEntity();
152
- };
153
- CesiumViewMonitor.prototype.tryDoUpdate = function () {
154
- var _a;
155
- if (!this.viewer || this.viewer.isDestroyed()) {
156
- this.Dispose();
157
- return ESearchStatus.LocationMissing;
158
- }
159
- var viewRect = null;
160
- var center = null;
161
- var camera = this.viewer.camera;
162
- var terrainHeight = this.viewer.scene.globe.getHeight(camera.positionCartographic);
163
- var cameraPosition = this.viewer.camera.positionCartographic;
164
- // We are almost at the ground, screw horizon, just load around.
165
- if (terrainHeight && ((cameraPosition.height - terrainHeight) < DEFAULT_GROUNDED_HEIGHT)) {
166
- // View area calculation.
167
- viewRect = {};
168
- var viewRectRad = netScanViewForBoundaries(this.viewer);
169
- if (viewRectRad &&
170
- viewRectRad.east &&
171
- viewRectRad.west &&
172
- viewRectRad.north &&
173
- viewRectRad.south) {
174
- viewRect.east = Cesium.Math.toDegrees(Math.max(viewRectRad.east, cameraPosition.longitude));
175
- viewRect.west = Cesium.Math.toDegrees(Math.min(viewRectRad.west, cameraPosition.longitude));
176
- viewRect.south = Cesium.Math.toDegrees(Math.min(viewRectRad.south, cameraPosition.latitude));
177
- viewRect.north = Cesium.Math.toDegrees(Math.max(viewRectRad.north, cameraPosition.latitude));
103
+ Monitor.prototype.createEntity = function () {
104
+ var _this = this;
105
+ if (this.entity) {
106
+ return;
178
107
  }
179
- else {
180
- viewRect.east = cameraPosition.longitude;
181
- viewRect.west = cameraPosition.longitude;
182
- viewRect.south = cameraPosition.latitude;
183
- viewRect.north = cameraPosition.latitude;
108
+ this.entity = this.viewer.entities.add({
109
+ position: new Cesium.CallbackProperty(function () {
110
+ return _this.target ? Cesium.Cartesian3.fromDegrees(_this.target.longitude, _this.target.latitude) : null;
111
+ }, false),
112
+ point: {
113
+ pixelSize: 8,
114
+ color: Cesium.Color.ORANGE
115
+ },
116
+ rectangle: {
117
+ coordinates: new Cesium.CallbackProperty(function () {
118
+ return _this.bounds ? Cesium.Rectangle.fromDegrees(_this.bounds.west, _this.bounds.south, _this.bounds.east, _this.bounds.north) : null;
119
+ }, false),
120
+ material: Cesium.Color.fromCssColorString('#ff0000').withAlpha(0.4),
121
+ zIndex: 1
122
+ }
123
+ });
124
+ };
125
+ Monitor.prototype.destroyEntity = function () {
126
+ if (this.entity && this.viewer.entities.contains(this.entity)) {
127
+ this.viewer.entities.remove(this.entity);
184
128
  }
185
- center = {};
186
- center.latitude = Cesium.Math.toDegrees(camera.positionCartographic.latitude);
187
- center.longitude = Cesium.Math.toDegrees(camera.positionCartographic.longitude);
188
- }
189
- else {
190
- // View area calculation.
191
- var windowPosition = new Cesium.Cartesian2(this.viewer.container.clientWidth / 2, this.viewer.container.clientHeight / 2);
192
- var intersection = getAdjustedGroundIntersectionOfCameraRay(this.viewer, windowPosition);
193
- var point = null;
194
- if (intersection) {
195
- point = Cesium.Cartographic.fromCartesian(intersection, this.viewer.scene.globe.ellipsoid);
129
+ this.entity = null;
130
+ };
131
+ Monitor.prototype.Updated = function () {
132
+ if (!this.updatedEvent) {
133
+ this.updatedEvent = new bruceModels.BruceEvent();
196
134
  }
197
- if (point) {
198
- center = {};
199
- center.latitude = Cesium.Math.toDegrees(point.latitude);
200
- center.longitude = Cesium.Math.toDegrees(point.longitude);
135
+ return this.updatedEvent;
136
+ };
137
+ Monitor.prototype.GetBounds = function () {
138
+ return this.bounds;
139
+ };
140
+ Monitor.prototype.GetTarget = function () {
141
+ return this.target;
142
+ };
143
+ Monitor.prototype.DoUpdate = function () {
144
+ this.tryEmitUpdate();
145
+ };
146
+ Monitor.prototype.Dispose = function () {
147
+ if (this.disposed) {
148
+ return;
149
+ }
150
+ this.disposed = true;
151
+ clearInterval(this.checkInterval);
152
+ this.destroyEntity();
153
+ };
154
+ Monitor.prototype.tryDoUpdate = function () {
155
+ var _a;
156
+ if (!this.viewer || this.viewer.isDestroyed()) {
157
+ this.Dispose();
158
+ return ESearchStatus.LocationMissing;
159
+ }
160
+ var viewRect = null;
161
+ var center = null;
162
+ var camera = this.viewer.camera;
163
+ var terrainHeight = this.viewer.scene.globe.getHeight(camera.positionCartographic);
164
+ var cameraPosition = this.viewer.camera.positionCartographic;
165
+ // We are almost at the ground, screw horizon, just load around.
166
+ if (terrainHeight && ((cameraPosition.height - terrainHeight) < DEFAULT_GROUNDED_HEIGHT)) {
167
+ // View area calculation.
168
+ viewRect = {};
201
169
  var viewRectRad = netScanViewForBoundaries(this.viewer);
202
- if (viewRectRad) {
203
- viewRect = {};
204
- viewRect.east = Cesium.Math.toDegrees(viewRectRad.east);
205
- viewRect.west = Cesium.Math.toDegrees(viewRectRad.west);
206
- viewRect.south = Cesium.Math.toDegrees(viewRectRad.south);
207
- viewRect.north = Cesium.Math.toDegrees(viewRectRad.north);
170
+ if (viewRectRad &&
171
+ viewRectRad.east &&
172
+ viewRectRad.west &&
173
+ viewRectRad.north &&
174
+ viewRectRad.south) {
175
+ viewRect.east = Cesium.Math.toDegrees(Math.max(viewRectRad.east, cameraPosition.longitude));
176
+ viewRect.west = Cesium.Math.toDegrees(Math.min(viewRectRad.west, cameraPosition.longitude));
177
+ viewRect.south = Cesium.Math.toDegrees(Math.min(viewRectRad.south, cameraPosition.latitude));
178
+ viewRect.north = Cesium.Math.toDegrees(Math.max(viewRectRad.north, cameraPosition.latitude));
179
+ }
180
+ else {
181
+ viewRect.east = cameraPosition.longitude;
182
+ viewRect.west = cameraPosition.longitude;
183
+ viewRect.south = cameraPosition.latitude;
184
+ viewRect.north = cameraPosition.latitude;
208
185
  }
186
+ center = {};
187
+ center.latitude = Cesium.Math.toDegrees(camera.positionCartographic.latitude);
188
+ center.longitude = Cesium.Math.toDegrees(camera.positionCartographic.longitude);
209
189
  }
210
- }
211
- // Minimal field of view.
212
- if (viewRect) {
213
- var centerLong = (viewRect.east + viewRect.west) / 2;
214
- var centerLat = (viewRect.north + viewRect.south) / 2;
215
- viewRect.east = Math.max(viewRect.east, centerLong + (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
216
- viewRect.west = Math.min(viewRect.west, centerLong - (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
217
- viewRect.south = Math.min(viewRect.south, centerLat - (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
218
- viewRect.north = Math.max(viewRect.north, centerLat + (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
219
- viewRect.alt = (_a = this.viewer.scene.camera.positionCartographic) === null || _a === void 0 ? void 0 : _a.height;
220
- }
221
- if (center && viewRect) {
222
- if ((!this.target || (this.target && !arePosEqual(this.target, center))) ||
223
- (!this.bounds || (this.bounds && !areBoundsEqual(this.bounds, viewRect)))) {
224
- this.target = center;
225
- this.bounds = viewRect;
226
- return ESearchStatus.LocationChanged;
190
+ else {
191
+ // View area calculation.
192
+ var windowPosition = new Cesium.Cartesian2(this.viewer.container.clientWidth / 2, this.viewer.container.clientHeight / 2);
193
+ var intersection = getAdjustedGroundIntersectionOfCameraRay(this.viewer, windowPosition);
194
+ var point = null;
195
+ if (intersection) {
196
+ point = Cesium.Cartographic.fromCartesian(intersection, this.viewer.scene.globe.ellipsoid);
197
+ }
198
+ if (point) {
199
+ center = {};
200
+ center.latitude = Cesium.Math.toDegrees(point.latitude);
201
+ center.longitude = Cesium.Math.toDegrees(point.longitude);
202
+ var viewRectRad = netScanViewForBoundaries(this.viewer);
203
+ if (viewRectRad) {
204
+ viewRect = {};
205
+ viewRect.east = Cesium.Math.toDegrees(viewRectRad.east);
206
+ viewRect.west = Cesium.Math.toDegrees(viewRectRad.west);
207
+ viewRect.south = Cesium.Math.toDegrees(viewRectRad.south);
208
+ viewRect.north = Cesium.Math.toDegrees(viewRectRad.north);
209
+ }
210
+ }
227
211
  }
228
- return ESearchStatus.LocationFound;
229
- }
230
- return ESearchStatus.LocationMissing;
231
- };
232
- CesiumViewMonitor.prototype.tryEmitUpdate = function () {
233
- var _a;
234
- var searchResult = this.tryDoUpdate();
235
- if (searchResult == ESearchStatus.LocationChanged) {
236
- var interest = {
237
- bounds: this.bounds,
238
- target: this.target
239
- };
240
- //this.createEntity();
241
- (_a = this.updatedEvent) === null || _a === void 0 ? void 0 : _a.Trigger(interest);
242
- }
243
- else if (searchResult == ESearchStatus.LocationMissing) {
244
- this.updateQueue();
245
- }
246
- };
247
- CesiumViewMonitor.prototype.queuePosition = function (lag) {
248
- var _this = this;
249
- if (this.pendingTimeout) {
250
- clearTimeout(this.pendingTimeout);
251
- }
252
- this.pendingTimeout = setTimeout(function () {
253
- if (!_this.disposed) {
254
- _this.tryEmitUpdate();
212
+ // Minimal field of view.
213
+ if (viewRect) {
214
+ var centerLong = (viewRect.east + viewRect.west) / 2;
215
+ var centerLat = (viewRect.north + viewRect.south) / 2;
216
+ viewRect.east = Math.max(viewRect.east, centerLong + (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
217
+ viewRect.west = Math.min(viewRect.west, centerLong - (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
218
+ viewRect.south = Math.min(viewRect.south, centerLat - (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
219
+ viewRect.north = Math.max(viewRect.north, centerLat + (MINIMUM_VIEW_AREA_SIZE_DEGREES / 2));
220
+ viewRect.alt = (_a = this.viewer.scene.camera.positionCartographic) === null || _a === void 0 ? void 0 : _a.height;
221
+ }
222
+ if (center && viewRect) {
223
+ if ((!this.target || (this.target && !arePosEqual(this.target, center))) ||
224
+ (!this.bounds || (this.bounds && !areBoundsEqual(this.bounds, viewRect)))) {
225
+ this.target = center;
226
+ this.bounds = viewRect;
227
+ return ESearchStatus.LocationChanged;
228
+ }
229
+ return ESearchStatus.LocationFound;
255
230
  }
256
- }, lag);
257
- };
258
- CesiumViewMonitor.prototype.updateQueue = function () {
259
- this.queuePosition(TIME_LAG);
260
- };
261
- return CesiumViewMonitor;
262
- }());
231
+ return ESearchStatus.LocationMissing;
232
+ };
233
+ Monitor.prototype.tryEmitUpdate = function () {
234
+ var _a;
235
+ var searchResult = this.tryDoUpdate();
236
+ if (searchResult == ESearchStatus.LocationChanged) {
237
+ var interest = {
238
+ bounds: this.bounds,
239
+ target: this.target
240
+ };
241
+ //this.createEntity();
242
+ (_a = this.updatedEvent) === null || _a === void 0 ? void 0 : _a.Trigger(interest);
243
+ }
244
+ else if (searchResult == ESearchStatus.LocationMissing) {
245
+ this.updateQueue();
246
+ }
247
+ };
248
+ Monitor.prototype.queuePosition = function (lag) {
249
+ var _this = this;
250
+ if (this.pendingTimeout) {
251
+ clearTimeout(this.pendingTimeout);
252
+ }
253
+ this.pendingTimeout = setTimeout(function () {
254
+ if (!_this.disposed) {
255
+ _this.tryEmitUpdate();
256
+ }
257
+ }, lag);
258
+ };
259
+ Monitor.prototype.updateQueue = function () {
260
+ this.queuePosition(TIME_LAG);
261
+ };
262
+ return Monitor;
263
+ }());
264
+ CesiumViewMonitor.Monitor = Monitor;
265
+ })(exports.CesiumViewMonitor || (exports.CesiumViewMonitor = {}));
263
266
 
264
267
  /*! *****************************************************************************
265
268
  Copyright (c) Microsoft Corporation. All rights reserved.
@@ -5044,7 +5047,7 @@
5044
5047
  var semiMinorAxis = getValue$2(viewer, entity.ellipse.semiMinorAxis);
5045
5048
  var rotation = getValue$2(viewer, entity.ellipse.rotation);
5046
5049
  // More subdivisions means a more accurate ellipse but worse performance.
5047
- var numberOfSubdivisions = 100;
5050
+ var numberOfSubdivisions = 5;
5048
5051
  var positions = [];
5049
5052
  for (var i = 0; i < numberOfSubdivisions; i++) {
5050
5053
  var theta = i * (2 * Math.PI / numberOfSubdivisions);
@@ -5089,7 +5092,7 @@
5089
5092
  if (positions) {
5090
5093
  boundingSphere = computeBoundingSphereFromPositions(positions);
5091
5094
  if (cEntity.model) {
5092
- // Expand the bounding sphere for models due to our tolerance
5095
+ // We don't know how large models are so we'll just add a tolerance.
5093
5096
  boundingSphere.radius += Math.sqrt(MODEL_SIZE_TOLERANCE);
5094
5097
  }
5095
5098
  boundingSphereCache[cEntity.id] = boundingSphere;
@@ -5102,17 +5105,24 @@
5102
5105
  var visibility = cullingVolume.computeVisibility(boundingSphere);
5103
5106
  return visibility !== Cesium.Intersect.INSIDE && visibility !== Cesium.Intersect.INTERSECTING;
5104
5107
  }
5108
+ // Amount of entities to check per interval.
5105
5109
  var CHECK_BATCH = 500;
5106
- var LAST_RECHECK_KEY = Symbol("LAST_RECHECK_KEY");
5107
5110
  var checkInterval = null;
5108
5111
  var checkWaiting = false;
5112
+ // We will store the last recheck data on the camera.
5113
+ // This will allow us to check if the camera has moved enough to warrant a recheck.
5114
+ var LAST_RECHECK_KEY = Symbol("LAST_RECHECK_KEY");
5109
5115
  /**
5110
5116
  * We will recheck if the camera has turned or moved enough.
5111
5117
  * @param viewer
5112
5118
  * @returns
5113
5119
  */
5114
5120
  function shouldRecheck(viewer) {
5121
+ var _a;
5115
5122
  var camera = viewer.scene.camera;
5123
+ if (!((_a = camera === null || camera === void 0 ? void 0 : camera.position) === null || _a === void 0 ? void 0 : _a.x)) {
5124
+ return false;
5125
+ }
5116
5126
  var lastRecheck = camera[LAST_RECHECK_KEY];
5117
5127
  if (!lastRecheck) {
5118
5128
  camera[LAST_RECHECK_KEY] = {
@@ -5121,7 +5131,7 @@
5121
5131
  };
5122
5132
  return true;
5123
5133
  }
5124
- var _a = lastRecheck, position = _a.position, direction = _a.direction;
5134
+ var _b = lastRecheck, position = _b.position, direction = _b.direction;
5125
5135
  var posDiff = Cesium.Cartesian3.magnitude(Cesium.Cartesian3.subtract(position, camera.position, new Cesium.Cartesian3()));
5126
5136
  var dirDiff = Cesium.Cartesian3.magnitude(Cesium.Cartesian3.subtract(direction, camera.direction, new Cesium.Cartesian3()));
5127
5137
  var recheck = posDiff > 100 || dirDiff > 0.01;
@@ -5222,7 +5232,7 @@
5222
5232
  (_a = checkQueue.Call) === null || _a === void 0 ? void 0 : _a.call(checkQueue);
5223
5233
  });
5224
5234
  var RENDER_SECS_PASSED = 5;
5225
- var updateRemoval = register.Viewer.scene.postRender.addEventListener(function () {
5235
+ var updateRemoval = register.Viewer.scene.postUpdate.addEventListener(function () {
5226
5236
  var _a;
5227
5237
  var now = new Date();
5228
5238
  if (lastCullCheck == null || (now.getTime() - lastCullCheck.getTime()) > RENDER_SECS_PASSED * 1000) {
@@ -7558,6 +7568,94 @@
7558
7568
  EntitiesRenderManager.Manager = Manager;
7559
7569
  })(exports.EntitiesRenderManager || (exports.EntitiesRenderManager = {}));
7560
7570
 
7571
+ var MAX_AREA_IN_DEGREES = 90;
7572
+ var GETTER_DELAY = 50;
7573
+ /**
7574
+ * This is a batched "arbitrary data" getter.
7575
+ * You feed it an array of data, then it will emit that data in batches when the view changes.
7576
+ */
7577
+ var BatchedDataGetter;
7578
+ (function (BatchedDataGetter) {
7579
+ var Getter = /** @class */ (function () {
7580
+ function Getter(data, viewPort, batchSize) {
7581
+ this.viewPortRemoval = null;
7582
+ this.viewRect = null;
7583
+ this.viewCenter = null;
7584
+ this.onUpdate = null;
7585
+ this.data = data;
7586
+ this.viewPort = viewPort;
7587
+ this.batchSize = batchSize;
7588
+ }
7589
+ Object.defineProperty(Getter.prototype, "OnUpdate", {
7590
+ get: function () {
7591
+ if (!this.onUpdate) {
7592
+ this.onUpdate = new bruceModels.BruceEvent();
7593
+ }
7594
+ return this.onUpdate;
7595
+ },
7596
+ enumerable: false,
7597
+ configurable: true
7598
+ });
7599
+ Getter.prototype.Start = function () {
7600
+ var _this = this;
7601
+ this.viewPortRemoval = this.viewPort.Updated().Subscribe(function () {
7602
+ _this.updateViewport();
7603
+ });
7604
+ this.updateViewport();
7605
+ };
7606
+ Getter.prototype.Dispose = function () {
7607
+ var _a;
7608
+ (_a = this.viewPortRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
7609
+ };
7610
+ Getter.prototype.updateViewport = function () {
7611
+ this.updateBounds();
7612
+ this.startGetterLoop();
7613
+ };
7614
+ Getter.prototype.updateBounds = function () {
7615
+ var viewRect = this.viewPort.GetBounds();
7616
+ var poi = this.viewPort.GetTarget();
7617
+ if (viewRect && poi) {
7618
+ if (Math.abs(viewRect.west - viewRect.east) > MAX_AREA_IN_DEGREES) {
7619
+ return;
7620
+ }
7621
+ if (Math.abs(viewRect.south - viewRect.north) > MAX_AREA_IN_DEGREES) {
7622
+ return;
7623
+ }
7624
+ this.viewRect = viewRect;
7625
+ this.viewCenter = poi;
7626
+ }
7627
+ };
7628
+ Getter.prototype.startGetterLoop = function () {
7629
+ var _this = this;
7630
+ clearInterval(this.getterInterval);
7631
+ if (!this.viewRect || !this.viewCenter) {
7632
+ return;
7633
+ }
7634
+ var index = 0;
7635
+ var onTick = function () {
7636
+ _this.processBatch(_this.data.slice(index, index + _this.batchSize));
7637
+ index += _this.batchSize;
7638
+ return index >= _this.data.length;
7639
+ };
7640
+ if (!onTick()) {
7641
+ this.getterInterval = setInterval(function () {
7642
+ if (onTick()) {
7643
+ clearInterval(_this.getterInterval);
7644
+ }
7645
+ }, GETTER_DELAY);
7646
+ }
7647
+ };
7648
+ Getter.prototype.processBatch = function (batch) {
7649
+ var _a;
7650
+ if (batch.length > 0) {
7651
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(batch);
7652
+ }
7653
+ };
7654
+ return Getter;
7655
+ }());
7656
+ BatchedDataGetter.Getter = Getter;
7657
+ })(BatchedDataGetter || (BatchedDataGetter = {}));
7658
+
7561
7659
  var BATCH_SIZE$1 = 500;
7562
7660
  var CHECK_BATCH_SIZE$1 = 250;
7563
7661
  (function (EntitiesLoadedRenderManager) {
@@ -7681,7 +7779,7 @@
7681
7779
  var _this = this;
7682
7780
  var _a;
7683
7781
  (_a = this.getterSub) === null || _a === void 0 ? void 0 : _a.call(this);
7684
- this.getter = new bruceModels.BatchedDataGetter.Getter(this.item.BruceEntity.Entities, this.monitor, BATCH_SIZE$1);
7782
+ this.getter = new BatchedDataGetter.Getter(this.item.BruceEntity.Entities, this.monitor, BATCH_SIZE$1);
7685
7783
  this.getterSub = this.getter.OnUpdate.Subscribe(function (entities) {
7686
7784
  var _a;
7687
7785
  for (var _i = 0, entities_1 = entities; _i < entities_1.length; _i++) {
@@ -7945,7 +8043,7 @@
7945
8043
  }
7946
8044
  ];
7947
8045
  }
7948
- this.getter = new bruceModels.BatchedDataGetter.Getter(this.item.BruceEntity.EntityIds, this.monitor, BATCH_SIZE$2);
8046
+ this.getter = new BatchedDataGetter.Getter(this.item.BruceEntity.EntityIds, this.monitor, BATCH_SIZE$2);
7949
8047
  this.getterSub = this.getter.OnUpdate.Subscribe(function (ids) {
7950
8048
  _this.onGetterUpdate(ids);
7951
8049
  });
@@ -8165,7 +8263,7 @@
8165
8263
  }
8166
8264
  ];
8167
8265
  }
8168
- this.getter = new bruceModels.BatchedDataGetter.Getter([this.item.BruceEntity.EntityId], this.monitor, 1);
8266
+ this.getter = new BatchedDataGetter.Getter([this.item.BruceEntity.EntityId], this.monitor, 1);
8169
8267
  this.getterSub = this.getter.OnUpdate.Subscribe(function (ids) {
8170
8268
  _this.onGetterUpdate(ids[0]);
8171
8269
  });
@@ -9569,6 +9667,521 @@
9569
9667
  TilesetCadRenderManager.Manager = Manager;
9570
9668
  })(exports.TilesetCadRenderManager || (exports.TilesetCadRenderManager = {}));
9571
9669
 
9670
+ /**
9671
+ * This is a helper for making entity requests based on a grid area.
9672
+ * It will return grid cells based on given view-area then will remember when stuff-
9673
+ * was fully-fetched for those cells to avoid making duplicate requests.
9674
+ */
9675
+ var EntityGlobe;
9676
+ (function (EntityGlobe) {
9677
+ var Cell = /** @class */ (function () {
9678
+ function Cell() {
9679
+ this.Fetched = false;
9680
+ this.IsFetched = null;
9681
+ this.FetchPageIndex = 0;
9682
+ this.Boundaries = null;
9683
+ this.Fetching = false;
9684
+ }
9685
+ Cell.prototype.GetBounds = function () {
9686
+ // Entity data works in -180 to 180 range.
9687
+ function prepareRangeForBounds(range) {
9688
+ if (range > 180) {
9689
+ return range - 360;
9690
+ }
9691
+ return range;
9692
+ }
9693
+ // Add minor decimal as API crashes when giving it whole numbers.
9694
+ var maxLon = prepareRangeForBounds(this.Boundaries.maxLongitude) + 0.00001;
9695
+ var minLon = prepareRangeForBounds(this.Boundaries.minLongitude) - 0.00001;
9696
+ var maxLat = prepareRangeForBounds(this.Boundaries.maxLatitude) + 0.00001;
9697
+ var minLat = prepareRangeForBounds(this.Boundaries.minLatitude) - 0.00001;
9698
+ return {
9699
+ east: maxLon,
9700
+ north: maxLat,
9701
+ south: minLat,
9702
+ west: minLon
9703
+ };
9704
+ };
9705
+ return Cell;
9706
+ }());
9707
+ EntityGlobe.Cell = Cell;
9708
+ var Grid = /** @class */ (function () {
9709
+ function Grid() {
9710
+ this.cells = {};
9711
+ }
9712
+ Grid.prototype.GetCellsForView = function (cameraPos, viewRect) {
9713
+ var cells = [];
9714
+ var minLat = viewRect.south;
9715
+ var minLon = viewRect.west;
9716
+ var maxLat = viewRect.north;
9717
+ var maxLon = viewRect.east;
9718
+ var MAX_CELLS = 150;
9719
+ var cellDegreeSize = getCellSizeFromHeight(viewRect.alt);
9720
+ var curMinLon = floorValueToCellSize(cellDegreeSize, minLon);
9721
+ var curMinLat = floorValueToCellSize(cellDegreeSize, minLat);
9722
+ // For larger views we add additional padding because our view-area culling is too strong.
9723
+ if (cellDegreeSize >= 2) {
9724
+ curMinLon -= cellDegreeSize;
9725
+ curMinLat -= cellDegreeSize;
9726
+ }
9727
+ var centerX = cameraPos === null || cameraPos === void 0 ? void 0 : cameraPos.longitude;
9728
+ var centerY = cameraPos === null || cameraPos === void 0 ? void 0 : cameraPos.latitude;
9729
+ if (isNaN(centerX) || isNaN(centerY)) {
9730
+ centerX = (minLon + maxLon) / 2;
9731
+ centerY = (minLat + maxLat) / 2;
9732
+ }
9733
+ var width = Math.ceil((maxLon - curMinLon) / cellDegreeSize);
9734
+ var height = Math.ceil((maxLat - curMinLat) / cellDegreeSize);
9735
+ // For larger views we add additional padding because our view-area culling is too strong.
9736
+ if (cellDegreeSize >= 2) {
9737
+ width += 1;
9738
+ height += 1;
9739
+ }
9740
+ var cellDistances = [];
9741
+ for (var x = 0; x < width; x++) {
9742
+ for (var y = 0; y < height; y++) {
9743
+ var lon = x * cellDegreeSize + curMinLon;
9744
+ var lat = y * cellDegreeSize + curMinLat;
9745
+ var cellCenterX = lon + cellDegreeSize / 2;
9746
+ var cellCenterY = lat + cellDegreeSize / 2;
9747
+ var dist = Math.sqrt(Math.pow(cellCenterX - centerX, 2) + Math.pow(cellCenterY - centerY, 2));
9748
+ cellDistances.push({ x: x, y: y, dist: dist });
9749
+ }
9750
+ }
9751
+ cellDistances.sort(function (a, b) { return a.dist - b.dist; });
9752
+ for (var _i = 0, cellDistances_1 = cellDistances; _i < cellDistances_1.length; _i++) {
9753
+ var _a = cellDistances_1[_i], x = _a.x, y = _a.y;
9754
+ var lon = x * cellDegreeSize + curMinLon;
9755
+ var lat = y * cellDegreeSize + curMinLat;
9756
+ var _b = getOrCreateCell(this.cells, cellDegreeSize, lon, lon + cellDegreeSize, lat, lat + cellDegreeSize), cell = _b[1];
9757
+ cells.push(cell);
9758
+ if (cells.length >= MAX_CELLS) {
9759
+ break;
9760
+ }
9761
+ }
9762
+ return cells;
9763
+ };
9764
+ return Grid;
9765
+ }());
9766
+ EntityGlobe.Grid = Grid;
9767
+ })(EntityGlobe || (EntityGlobe = {}));
9768
+ function floorValueToCellSize(size, value) {
9769
+ return Math.floor(value / size) * size;
9770
+ }
9771
+ function getCellSizeFromHeight(height) {
9772
+ if (height < 1000) {
9773
+ return 0.01;
9774
+ }
9775
+ if (height < 5000) {
9776
+ return 0.025;
9777
+ }
9778
+ else if (height < 10000) {
9779
+ return 0.05;
9780
+ }
9781
+ else if (height < 30000) {
9782
+ return 0.1;
9783
+ }
9784
+ else if (height < 70000) {
9785
+ return 0.2;
9786
+ }
9787
+ else if (height < 100000) {
9788
+ return 0.3;
9789
+ }
9790
+ else if (height < 150000) {
9791
+ return 0.4;
9792
+ }
9793
+ else if (height < 200000) {
9794
+ return 0.5;
9795
+ }
9796
+ else if (height < 300000) {
9797
+ return 0.6;
9798
+ }
9799
+ else if (height < 500000) {
9800
+ return 1;
9801
+ }
9802
+ else if (height < 1000000) {
9803
+ return 1.3;
9804
+ }
9805
+ else if (height < 1200000) {
9806
+ return 1.8;
9807
+ }
9808
+ return 4;
9809
+ }
9810
+ function isCellFetched(cell) {
9811
+ if (cell.Fetched) {
9812
+ return true;
9813
+ }
9814
+ return false;
9815
+ }
9816
+ function getOrCreateCell(cells, cellSize, lon, maxLon, lat, maxLat) {
9817
+ var id = cellSize + "_" + lon + "_" + maxLon + "_" + lat + "_" + maxLat;
9818
+ var cell = cells[id];
9819
+ if (!cell) {
9820
+ cell = cells[id] = new EntityGlobe.Cell();
9821
+ cell.Boundaries = {
9822
+ minLatitude: lat,
9823
+ maxLatitude: maxLat,
9824
+ minLongitude: lon,
9825
+ maxLongitude: maxLon
9826
+ };
9827
+ cell.IsFetched = function () { return isCellFetched(cell); };
9828
+ }
9829
+ return [id, cell];
9830
+ }
9831
+
9832
+ var MAX_AREA_IN_DEGREES$1 = 90;
9833
+ var MAX_RETRY_ATTEMPTS = 1;
9834
+ var RETRY_DELAY_INCREMENT = 500;
9835
+ var REQUEST_PAGE_DELAY = 50;
9836
+ var regMenuItemGetter = /** @class */ (function () {
9837
+ function regMenuItemGetter(tagIds, minHeight, maxHeight) {
9838
+ this.TagIds = tagIds;
9839
+ this.MinHeight = minHeight;
9840
+ this.MaxHeight = maxHeight;
9841
+ }
9842
+ return regMenuItemGetter;
9843
+ }());
9844
+ function delay(milliseconds) {
9845
+ return __awaiter(this, void 0, void 0, function () {
9846
+ return __generator(this, function (_a) {
9847
+ return [2 /*return*/, new Promise(function (res) {
9848
+ setTimeout(function () {
9849
+ res();
9850
+ }, milliseconds);
9851
+ })];
9852
+ });
9853
+ });
9854
+ }
9855
+ /**
9856
+ * This is a batched entity getter.
9857
+ * It will scan for entity records in a view-area and emit them in batches.
9858
+ * It will restart scanning if the camera moves.
9859
+ */
9860
+ var EntityFilterGetter;
9861
+ (function (EntityFilterGetter) {
9862
+ var EStatus;
9863
+ (function (EStatus) {
9864
+ EStatus["Scanning"] = "SCANNING";
9865
+ EStatus["Loading"] = "LOADING";
9866
+ })(EStatus = EntityFilterGetter.EStatus || (EntityFilterGetter.EStatus = {}));
9867
+ var Getter = /** @class */ (function () {
9868
+ function Getter(api, viewPort, typeId, batchSize, attrFilter, viaCdn) {
9869
+ this.onUpdate = null;
9870
+ this.LastStateUpdates = {};
9871
+ this.onStateUpdate = null;
9872
+ this.onScanUpdate = null;
9873
+ this.viewPortChangeRemoval = null;
9874
+ this.cells = null;
9875
+ this.registeredItems = {};
9876
+ this.getterLoopId = 0;
9877
+ this.tagIds = null;
9878
+ this.minHeight = 0;
9879
+ this.maxHeight = 100000;
9880
+ this.viewRect = null;
9881
+ this.viewCenter = null;
9882
+ this.api = api;
9883
+ this.typeId = typeId;
9884
+ this.viaCdn = Boolean(viaCdn);
9885
+ this.batchSize = isNaN(batchSize) ? 300 : batchSize;
9886
+ this.viewPort = viewPort;
9887
+ this.attrFilter = attrFilter;
9888
+ this.updateBounds();
9889
+ }
9890
+ Object.defineProperty(Getter.prototype, "OnUpdate", {
9891
+ get: function () {
9892
+ if (!this.onUpdate) {
9893
+ this.onUpdate = new bruceModels.BruceEvent();
9894
+ }
9895
+ return this.onUpdate;
9896
+ },
9897
+ enumerable: false,
9898
+ configurable: true
9899
+ });
9900
+ Object.defineProperty(Getter.prototype, "OnStateUpdate", {
9901
+ get: function () {
9902
+ if (!this.onStateUpdate) {
9903
+ this.onStateUpdate = new bruceModels.BruceEvent();
9904
+ }
9905
+ return this.onStateUpdate;
9906
+ },
9907
+ enumerable: false,
9908
+ configurable: true
9909
+ });
9910
+ Object.defineProperty(Getter.prototype, "OnScanUpdate", {
9911
+ get: function () {
9912
+ if (!this.onScanUpdate) {
9913
+ this.onScanUpdate = new bruceModels.BruceEvent();
9914
+ }
9915
+ return this.onScanUpdate;
9916
+ },
9917
+ enumerable: false,
9918
+ configurable: true
9919
+ });
9920
+ /**
9921
+ * Returns id that represents the combined menu item parameters.
9922
+ * If integrity changes while a request is running, the request will not emit a response.
9923
+ * @returns
9924
+ */
9925
+ Getter.prototype.getIntegrityId = function () {
9926
+ return this.tagIds == null ? "" : this.tagIds.join();
9927
+ };
9928
+ Getter.prototype.viewAreaSub = function () {
9929
+ var _this = this;
9930
+ this.viewAreaDispose();
9931
+ this.viewPortChangeRemoval = this.viewPort.Updated().Subscribe(function () {
9932
+ _this.updateBounds();
9933
+ _this.startGetterLoop();
9934
+ });
9935
+ };
9936
+ Getter.prototype.viewAreaDispose = function () {
9937
+ var _a;
9938
+ (_a = this.viewPortChangeRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
9939
+ };
9940
+ Getter.prototype.GetMenuItems = function () {
9941
+ return Object.keys(this.registeredItems);
9942
+ };
9943
+ Getter.prototype.IncludeMenuItem = function (menuItemId, layerIds, minHeight, maxHeight) {
9944
+ this.registeredItems[menuItemId] = new regMenuItemGetter(layerIds, minHeight, maxHeight);
9945
+ this.updateState();
9946
+ };
9947
+ Getter.prototype.ExcludeMenuItem = function (menuItemId) {
9948
+ this.registeredItems[menuItemId] = null;
9949
+ delete this.registeredItems[menuItemId];
9950
+ this.updateState();
9951
+ };
9952
+ Getter.prototype.updateBounds = function () {
9953
+ var viewRect = this.viewPort.GetBounds();
9954
+ var poi = this.viewPort.GetTarget();
9955
+ if (viewRect && poi) {
9956
+ if (Math.abs(viewRect.west - viewRect.east) > MAX_AREA_IN_DEGREES$1) {
9957
+ return;
9958
+ }
9959
+ if (Math.abs(viewRect.south - viewRect.north) > MAX_AREA_IN_DEGREES$1) {
9960
+ return;
9961
+ }
9962
+ this.viewRect = viewRect;
9963
+ this.viewCenter = poi;
9964
+ }
9965
+ };
9966
+ Getter.prototype.updateState = function () {
9967
+ var tagIds = [];
9968
+ var menuItemIds = this.GetMenuItems();
9969
+ var minHeight = null;
9970
+ var maxHeight = null;
9971
+ for (var i = 0; i < menuItemIds.length; i++) {
9972
+ var menuItem = this.registeredItems[menuItemIds[i]];
9973
+ if (menuItem) {
9974
+ if (maxHeight == null || maxHeight < menuItem.MaxHeight) {
9975
+ maxHeight = menuItem.MaxHeight;
9976
+ }
9977
+ if (minHeight == null || minHeight > menuItem.MinHeight) {
9978
+ minHeight = menuItem.MinHeight;
9979
+ }
9980
+ var itemLayerIds = menuItem.TagIds;
9981
+ if (itemLayerIds) {
9982
+ for (var j = 0; j < itemLayerIds.length; j++) {
9983
+ var itemLayerId = itemLayerIds[j];
9984
+ if (!tagIds.includes(itemLayerId)) {
9985
+ tagIds.push(itemLayerId);
9986
+ }
9987
+ }
9988
+ }
9989
+ }
9990
+ }
9991
+ if (menuItemIds.length > 0) {
9992
+ // Reset cells so none are marked as fetched.
9993
+ this.cells = new EntityGlobe.Grid();
9994
+ this.tagIds = tagIds;
9995
+ this.minHeight = minHeight;
9996
+ this.maxHeight = maxHeight;
9997
+ this.updateBounds();
9998
+ this.startGetterLoop();
9999
+ this.viewAreaSub();
10000
+ }
10001
+ else {
10002
+ this.getterLoopId += 1;
10003
+ this.viewAreaDispose();
10004
+ }
10005
+ };
10006
+ Getter.prototype.postStatus = function (status) {
10007
+ var _a;
10008
+ this.LastStateUpdates[status.msg] = status;
10009
+ (_a = this.onStateUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(status);
10010
+ };
10011
+ Getter.prototype.startGetterLoop = function () {
10012
+ var _this = this;
10013
+ // Increase id so that existing loops stop.
10014
+ this.getterLoopId += 1;
10015
+ var loopId = this.getterLoopId;
10016
+ var loopIntegrity = this.getIntegrityId();
10017
+ new Promise(function () { return __awaiter(_this, void 0, void 0, function () {
10018
+ var MIN_HEIGHT, MAX_HEIGHT, PAGE_SIZE, retryAttempts, retryDelay, prevFirstId, prevLastId, prevTicks, alt, cells, curCellIndex, postedScanning, postedLoading, total, curCell, entities, integrity, first, last, e_1;
10019
+ var _a, _b, _c, _d, _e, _f, _g, _h;
10020
+ return __generator(this, function (_j) {
10021
+ switch (_j.label) {
10022
+ case 0:
10023
+ // Minor delay to stop 50 menu items enabling doing their first request all together.
10024
+ // This gives it time to recognize only 1 request is needed.
10025
+ // Would be better to not use this delay but we're on a clock.
10026
+ return [4 /*yield*/, delay(100)];
10027
+ case 1:
10028
+ // Minor delay to stop 50 menu items enabling doing their first request all together.
10029
+ // This gives it time to recognize only 1 request is needed.
10030
+ // Would be better to not use this delay but we're on a clock.
10031
+ _j.sent();
10032
+ MIN_HEIGHT = this.minHeight;
10033
+ MAX_HEIGHT = this.maxHeight;
10034
+ PAGE_SIZE = this.batchSize;
10035
+ retryAttempts = MAX_RETRY_ATTEMPTS;
10036
+ retryDelay = 0;
10037
+ prevFirstId = "";
10038
+ prevLastId = "";
10039
+ prevTicks = 0;
10040
+ _j.label = 2;
10041
+ case 2:
10042
+ if (!((!this.viewCenter || !this.viewRect) && this.getterLoopId == loopId)) return [3 /*break*/, 4];
10043
+ return [4 /*yield*/, delay(RETRY_DELAY_INCREMENT)];
10044
+ case 3:
10045
+ _j.sent();
10046
+ return [3 /*break*/, 2];
10047
+ case 4:
10048
+ if (this.getterLoopId != loopId) {
10049
+ return [2 /*return*/];
10050
+ }
10051
+ alt = this.viewRect.alt;
10052
+ if (alt > MAX_HEIGHT || (alt < MIN_HEIGHT && MIN_HEIGHT > 0)) {
10053
+ return [2 /*return*/];
10054
+ }
10055
+ cells = this.cells.GetCellsForView(this.viewCenter, this.viewRect);
10056
+ (_a = this.onScanUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(cells);
10057
+ curCellIndex = cells.length > 0 ? 0 : null;
10058
+ postedScanning = false;
10059
+ postedLoading = false;
10060
+ total = 0;
10061
+ _j.label = 5;
10062
+ case 5:
10063
+ if (!(retryAttempts > 0 && curCellIndex != null)) return [3 /*break*/, 13];
10064
+ if (!(retryDelay > 0)) return [3 /*break*/, 7];
10065
+ return [4 /*yield*/, delay(retryDelay)];
10066
+ case 6:
10067
+ _j.sent();
10068
+ _j.label = 7;
10069
+ case 7:
10070
+ if (this.getterLoopId != loopId) {
10071
+ return [3 /*break*/, 13];
10072
+ }
10073
+ if (!postedScanning) {
10074
+ this.postStatus({ msg: EStatus.Scanning, revoking: false });
10075
+ postedScanning = true;
10076
+ }
10077
+ curCell = cells[curCellIndex];
10078
+ if (curCell.IsFetched()) {
10079
+ curCell.Fetching = false;
10080
+ curCellIndex += 1;
10081
+ if (cells[curCellIndex]) {
10082
+ cells[curCellIndex].Fetching = true;
10083
+ }
10084
+ else {
10085
+ curCellIndex = null;
10086
+ }
10087
+ (_b = this.onScanUpdate) === null || _b === void 0 ? void 0 : _b.Trigger(cells);
10088
+ return [3 /*break*/, 5];
10089
+ }
10090
+ _j.label = 8;
10091
+ case 8:
10092
+ _j.trys.push([8, 10, , 11]);
10093
+ return [4 /*yield*/, bruceModels.Entity.GetList({
10094
+ api: this.api,
10095
+ filter: {
10096
+ pageSize: PAGE_SIZE,
10097
+ pageIndex: curCell.FetchPageIndex,
10098
+ entityTypeId: this.typeId,
10099
+ layerIds: this.tagIds,
10100
+ // Any tag specified will be allowed.
10101
+ layerIdsOperator: "in",
10102
+ bounds: curCell.GetBounds(),
10103
+ sortOrder: bruceModels.Api.ESortOrder.Asc,
10104
+ entityTypeConditions: this.attrFilter
10105
+ },
10106
+ viaCdn: this.viaCdn,
10107
+ req: {
10108
+ noCache: true
10109
+ }
10110
+ })];
10111
+ case 9:
10112
+ entities = (_j.sent()).entities;
10113
+ integrity = this.getIntegrityId();
10114
+ if (loopIntegrity == integrity && entities) {
10115
+ (_c = this.onUpdate) === null || _c === void 0 ? void 0 : _c.Trigger(entities);
10116
+ }
10117
+ if (this.getterLoopId != loopId) {
10118
+ return [3 /*break*/, 13];
10119
+ }
10120
+ if (entities.length) {
10121
+ total += entities.length;
10122
+ }
10123
+ if (!postedLoading) {
10124
+ this.postStatus({ msg: EStatus.Loading, revoking: false });
10125
+ postedLoading = true;
10126
+ }
10127
+ // Only mark as fetched when ALL pages are done.
10128
+ // Known issue where external sources may return less than page size.
10129
+ // Right now we're making it as fetched as we're siding with the majority use-case.
10130
+ if (entities.length <= 0 || entities.length < PAGE_SIZE) {
10131
+ curCell.Fetched = true;
10132
+ curCell.Fetching = false;
10133
+ (_d = this.onScanUpdate) === null || _d === void 0 ? void 0 : _d.Trigger(cells);
10134
+ return [3 /*break*/, 5];
10135
+ }
10136
+ // Checking to make sure it's not just the same batch over and over again.
10137
+ if (entities.length > 0) {
10138
+ first = (_f = (_e = entities[0]) === null || _e === void 0 ? void 0 : _e.Bruce) === null || _f === void 0 ? void 0 : _f.ID;
10139
+ last = (_h = (_g = entities[entities.length - 1]) === null || _g === void 0 ? void 0 : _g.Bruce) === null || _h === void 0 ? void 0 : _h.ID;
10140
+ if (prevFirstId == first && prevLastId == last) {
10141
+ prevTicks += 1;
10142
+ if (prevTicks > 3) {
10143
+ return [3 /*break*/, 13];
10144
+ }
10145
+ }
10146
+ else {
10147
+ prevFirstId = first;
10148
+ prevLastId = last;
10149
+ prevTicks = 0;
10150
+ }
10151
+ }
10152
+ curCell.FetchPageIndex++;
10153
+ // Request passed so let's assume it was server hiccup and refresh counts.
10154
+ retryAttempts = MAX_RETRY_ATTEMPTS;
10155
+ retryDelay = 0;
10156
+ return [3 /*break*/, 11];
10157
+ case 10:
10158
+ e_1 = _j.sent();
10159
+ console.error(e_1);
10160
+ // Request failed so let's add a delay and try again soon.
10161
+ retryDelay += RETRY_DELAY_INCREMENT;
10162
+ retryAttempts -= 1;
10163
+ return [3 /*break*/, 11];
10164
+ case 11: return [4 /*yield*/, delay(REQUEST_PAGE_DELAY)];
10165
+ case 12:
10166
+ _j.sent();
10167
+ return [3 /*break*/, 5];
10168
+ case 13:
10169
+ if (postedLoading) {
10170
+ this.postStatus({ msg: EStatus.Loading, revoking: true });
10171
+ }
10172
+ if (postedScanning) {
10173
+ this.postStatus({ msg: EStatus.Scanning, revoking: true });
10174
+ }
10175
+ return [2 /*return*/];
10176
+ }
10177
+ });
10178
+ }); });
10179
+ };
10180
+ return Getter;
10181
+ }());
10182
+ EntityFilterGetter.Getter = Getter;
10183
+ })(EntityFilterGetter || (EntityFilterGetter = {}));
10184
+
9572
10185
  function createFilterGetterCacheKey(params) {
9573
10186
  var cacheKey = "";
9574
10187
  cacheKey += params.api.GetBaseUrl();
@@ -9590,7 +10203,7 @@
9590
10203
  var cacheKey = createFilterGetterCacheKey(params);
9591
10204
  var getter = this.data[cacheKey];
9592
10205
  if (!getter) {
9593
- getter = new bruceModels.EntityFilterGetter.Getter(params.api, params.monitor, params.typeId, params.batchSize, params.attrFilter, params.cdn);
10206
+ getter = new EntityFilterGetter.Getter(params.api, params.monitor, params.typeId, params.batchSize, params.attrFilter, params.cdn);
9594
10207
  this.data[cacheKey] = getter;
9595
10208
  if (params.viewer && params.debugShowBounds) {
9596
10209
  // Cell id -> entity.
@@ -11671,7 +12284,7 @@
11671
12284
  }
11672
12285
  this.visualsRegister = visualsRegister;
11673
12286
  this.sharedGetters = new exports.SharedGetters.Cache();
11674
- this.sharedMonitor = new CesiumViewMonitor(this.viewer);
12287
+ this.sharedMonitor = new exports.CesiumViewMonitor.Monitor(this.viewer);
11675
12288
  }
11676
12289
  Object.defineProperty(Manager.prototype, "Getters", {
11677
12290
  get: function () {
@@ -17503,10 +18116,9 @@
17503
18116
  ViewerUtils.CreateWidgets = CreateWidgets;
17504
18117
  })(exports.ViewerUtils || (exports.ViewerUtils = {}));
17505
18118
 
17506
- var VERSION$1 = "2.9.7";
18119
+ var VERSION$1 = "2.9.9";
17507
18120
 
17508
18121
  exports.VERSION = VERSION$1;
17509
- exports.CesiumViewMonitor = CesiumViewMonitor;
17510
18122
  exports.CesiumParabola = CesiumParabola;
17511
18123
  exports.CESIUM_INSPECTOR_KEY = CESIUM_INSPECTOR_KEY;
17512
18124
  exports.Draw3dPolygon = Draw3dPolygon;