@cesium/engine 11.1.0 → 12.0.1

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 (159) hide show
  1. package/Build/Workers/{chunk-U72QNFOJ.js → chunk-22FZ334F.js} +10 -10
  2. package/Build/Workers/{chunk-GNBFYG7F.js → chunk-2F42VIW6.js} +13 -13
  3. package/Build/Workers/{chunk-K4GQUNB5.js → chunk-2IJZVFHY.js} +5 -5
  4. package/Build/Workers/{chunk-7KTQP4VB.js → chunk-2XOUWNPN.js} +5 -5
  5. package/Build/Workers/{chunk-IBLIYJZR.js → chunk-3Y4UGAYI.js} +6 -6
  6. package/Build/Workers/{chunk-VJZB3WAV.js → chunk-54NYY4U4.js} +7 -7
  7. package/Build/Workers/{chunk-DHYHSFFJ.js → chunk-647NL6VU.js} +2 -2
  8. package/Build/Workers/{chunk-CKY7HOHV.js → chunk-76KRKKEF.js} +9 -9
  9. package/Build/Workers/{chunk-BHQJ2NT7.js → chunk-7CKQ7PVJ.js} +6 -6
  10. package/Build/Workers/{chunk-5PTXS2GO.js → chunk-7D6T2WYT.js} +7 -7
  11. package/Build/Workers/{chunk-PRGYLLJT.js → chunk-7EBHNJTG.js} +1 -1
  12. package/Build/Workers/{chunk-YFXQECWV.js → chunk-AER5CLXD.js} +5 -5
  13. package/Build/Workers/{chunk-N5KJGGCM.js → chunk-AGYO4ZSF.js} +17 -17
  14. package/Build/Workers/{chunk-VU2MNO7L.js → chunk-BH5M522L.js} +7 -7
  15. package/Build/Workers/{chunk-MXIZJAPH.js → chunk-COHL4R3G.js} +1 -1
  16. package/Build/Workers/{chunk-FIGIZHAQ.js → chunk-DJ7K7EYK.js} +11 -11
  17. package/Build/Workers/{chunk-3Q2L65QU.js → chunk-DR56WFYZ.js} +7 -7
  18. package/Build/Workers/{chunk-AD63PIY6.js → chunk-EMCXAVSG.js} +2 -2
  19. package/Build/Workers/{chunk-YSGTGQQO.js → chunk-ENARO52I.js} +14 -14
  20. package/Build/Workers/{chunk-5OOFQLKF.js → chunk-ETXXXGMP.js} +7 -7
  21. package/Build/Workers/{chunk-E27BLMDD.js → chunk-GBPW65E3.js} +6 -6
  22. package/Build/Workers/{chunk-NGPPMXRM.js → chunk-GRQQHWMD.js} +7 -7
  23. package/Build/Workers/{chunk-SMDOP47J.js → chunk-GSJ6LWIS.js} +10 -10
  24. package/Build/Workers/{chunk-26GA3JAM.js → chunk-H3RMGG7L.js} +5 -5
  25. package/Build/Workers/{chunk-PGRPDNHG.js → chunk-IAX6MIST.js} +17 -17
  26. package/Build/Workers/{chunk-5ODQSF26.js → chunk-IJWXYSFC.js} +2 -2
  27. package/Build/Workers/{chunk-C6YYBQXW.js → chunk-IVCFTVYW.js} +4 -4
  28. package/Build/Workers/{chunk-JW4FOI6M.js → chunk-JAKTB6CE.js} +11 -11
  29. package/Build/Workers/{chunk-TKVT5GQM.js → chunk-JPNFQRN7.js} +13 -13
  30. package/Build/Workers/{chunk-E63IIM5T.js → chunk-K7QC3WDT.js} +1 -1
  31. package/Build/Workers/{chunk-TGONEMZO.js → chunk-KJ65M35B.js} +11 -11
  32. package/Build/Workers/{chunk-2ZGOQXYU.js → chunk-KKMH4BKN.js} +6 -6
  33. package/Build/Workers/{chunk-76BYBWHP.js → chunk-LBNGHEJY.js} +4 -4
  34. package/Build/Workers/{chunk-XY4BATBS.js → chunk-LVHHB5T6.js} +4 -4
  35. package/Build/Workers/{chunk-S6MRMMQU.js → chunk-MV7YO647.js} +6 -6
  36. package/Build/Workers/{chunk-6CHGCNMW.js → chunk-NELAPOO6.js} +2 -2
  37. package/Build/Workers/{chunk-GESF4OXQ.js → chunk-NL73INJS.js} +2 -2
  38. package/Build/Workers/{chunk-GGZJN2TI.js → chunk-PH3T7LNP.js} +15 -15
  39. package/Build/Workers/{chunk-YZ733KKS.js → chunk-PISTPJXS.js} +12 -12
  40. package/Build/Workers/{chunk-GWCFU2SA.js → chunk-PJHRB4YJ.js} +7 -7
  41. package/Build/Workers/{chunk-I2ITFFPX.js → chunk-PNA47CR7.js} +1 -1
  42. package/Build/Workers/{chunk-7JO7GPJN.js → chunk-Q7IIOKAT.js} +1 -1
  43. package/Build/Workers/{chunk-27HUZ7SA.js → chunk-U7SH6OK7.js} +4 -4
  44. package/Build/Workers/{chunk-M3GMB5OP.js → chunk-VHGI7D3P.js} +10 -10
  45. package/Build/Workers/{chunk-FDOV2LBJ.js → chunk-VO4SXJXT.js} +7 -7
  46. package/Build/Workers/{chunk-7BMOHCPM.js → chunk-VXVQITFC.js} +13 -13
  47. package/Build/Workers/{chunk-DI5NGJUP.js → chunk-WMHJAREU.js} +2 -2
  48. package/Build/Workers/{chunk-EJZTDTUH.js → chunk-X6YBZOOA.js} +4 -4
  49. package/Build/Workers/{chunk-472HQ3EH.js → chunk-XDJ7V4NZ.js} +5 -5
  50. package/Build/Workers/{chunk-E6V6SQZW.js → chunk-YT5PQMSP.js} +6 -6
  51. package/Build/Workers/{chunk-O3E4OAOE.js → chunk-ZCCI55EY.js} +13 -13
  52. package/Build/Workers/{chunk-7O373FFS.js → chunk-ZPTNVB3S.js} +8 -8
  53. package/Build/Workers/combineGeometry.js +22 -22
  54. package/Build/Workers/createBoxGeometry.js +16 -16
  55. package/Build/Workers/createBoxOutlineGeometry.js +14 -14
  56. package/Build/Workers/createCircleGeometry.js +24 -24
  57. package/Build/Workers/createCircleOutlineGeometry.js +17 -17
  58. package/Build/Workers/createCoplanarPolygonGeometry.js +31 -31
  59. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +29 -29
  60. package/Build/Workers/createCorridorGeometry.js +27 -27
  61. package/Build/Workers/createCorridorOutlineGeometry.js +26 -26
  62. package/Build/Workers/createCylinderGeometry.js +18 -18
  63. package/Build/Workers/createCylinderOutlineGeometry.js +16 -16
  64. package/Build/Workers/createEllipseGeometry.js +24 -24
  65. package/Build/Workers/createEllipseOutlineGeometry.js +17 -17
  66. package/Build/Workers/createEllipsoidGeometry.js +17 -17
  67. package/Build/Workers/createEllipsoidOutlineGeometry.js +16 -16
  68. package/Build/Workers/createFrustumGeometry.js +16 -16
  69. package/Build/Workers/createFrustumOutlineGeometry.js +16 -16
  70. package/Build/Workers/createGeometry.js +22 -22
  71. package/Build/Workers/createGroundPolylineGeometry.js +20 -20
  72. package/Build/Workers/createPlaneGeometry.js +14 -14
  73. package/Build/Workers/createPlaneOutlineGeometry.js +13 -13
  74. package/Build/Workers/createPolygonGeometry.js +30 -30
  75. package/Build/Workers/createPolygonOutlineGeometry.js +28 -28
  76. package/Build/Workers/createPolylineGeometry.js +23 -23
  77. package/Build/Workers/createPolylineVolumeGeometry.js +29 -29
  78. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +25 -25
  79. package/Build/Workers/createRectangleGeometry.js +25 -25
  80. package/Build/Workers/createRectangleOutlineGeometry.js +18 -18
  81. package/Build/Workers/createSimplePolylineGeometry.js +21 -21
  82. package/Build/Workers/createSphereGeometry.js +17 -17
  83. package/Build/Workers/createSphereOutlineGeometry.js +16 -16
  84. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  85. package/Build/Workers/createVectorTileClampedPolylines.js +13 -13
  86. package/Build/Workers/createVectorTileGeometries.js +22 -22
  87. package/Build/Workers/createVectorTilePoints.js +12 -12
  88. package/Build/Workers/createVectorTilePolygons.js +20 -20
  89. package/Build/Workers/createVectorTilePolylines.js +13 -13
  90. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +20 -20
  91. package/Build/Workers/createVerticesFromHeightmap.js +20 -20
  92. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +17 -17
  93. package/Build/Workers/createWallGeometry.js +22 -22
  94. package/Build/Workers/createWallOutlineGeometry.js +21 -21
  95. package/Build/Workers/decodeDraco.js +11 -11
  96. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  97. package/Build/Workers/decodeI3S.js +10 -10
  98. package/Build/Workers/transcodeKTX2.js +7 -7
  99. package/Build/Workers/transferTypedArrayTest.js +1 -1
  100. package/Build/Workers/upsampleQuantizedTerrainMesh.js +20 -20
  101. package/Source/Core/BoundingSphere.js +1 -1
  102. package/Source/Core/Color.js +1 -1
  103. package/Source/Core/CorridorGeometryLibrary.js +4 -4
  104. package/Source/Core/EllipseGeometry.js +1 -1
  105. package/Source/Core/EllipsoidGeodesic.js +1 -1
  106. package/Source/Core/FrustumGeometry.js +1 -1
  107. package/Source/Core/Ion.js +1 -1
  108. package/Source/Core/Math.js +2 -0
  109. package/Source/Core/PolylineVolumeGeometryLibrary.js +2 -2
  110. package/Source/Core/decodeGoogleEarthEnterpriseData.js +1 -1
  111. package/Source/DataSources/DataSourceDisplay.js +1 -1
  112. package/Source/DataSources/ModelGraphics.js +1 -0
  113. package/Source/Renderer/AutomaticUniforms.js +13 -0
  114. package/Source/Renderer/CubeMap.js +89 -12
  115. package/Source/Renderer/CubeMapFace.js +90 -13
  116. package/Source/Renderer/UniformState.js +13 -0
  117. package/Source/Scene/ArcGisMapService.js +1 -1
  118. package/Source/Scene/Atmosphere.js +22 -0
  119. package/Source/Scene/BingMapsImageryProvider.js +1 -1
  120. package/Source/Scene/Cesium3DTileset.js +39 -0
  121. package/Source/Scene/DynamicEnvironmentMapManager.js +894 -0
  122. package/Source/Scene/Fog.js +75 -82
  123. package/Source/Scene/FrameState.js +5 -3
  124. package/Source/Scene/ImageBasedLighting.js +7 -64
  125. package/Source/Scene/Model/AtmospherePipelineStage.js +10 -5
  126. package/Source/Scene/Model/ImageBasedLightingPipelineStage.js +43 -21
  127. package/Source/Scene/Model/Model.js +98 -25
  128. package/Source/Scene/Model/Model3DTileContent.js +5 -0
  129. package/Source/Scene/Model/ModelSceneGraph.js +1 -0
  130. package/Source/Scene/ScreenSpaceCameraController.js +20 -1
  131. package/Source/Shaders/Builtin/Functions/computeAtmosphereColor.glsl +44 -0
  132. package/Source/Shaders/Builtin/Functions/computeAtmosphereColor.js +44 -0
  133. package/Source/Shaders/Builtin/Functions/computeScattering.glsl +0 -1
  134. package/Source/Shaders/Builtin/Functions/computeScattering.js +0 -1
  135. package/Source/Shaders/Builtin/Functions/sphericalHarmonics.glsl +3 -1
  136. package/Source/Shaders/Builtin/Functions/sphericalHarmonics.js +3 -1
  137. package/Source/Shaders/ComputeIrradianceFS.glsl +103 -0
  138. package/Source/Shaders/ComputeIrradianceFS.js +105 -0
  139. package/Source/Shaders/ComputeRadianceMapFS.glsl +107 -0
  140. package/Source/Shaders/ComputeRadianceMapFS.js +109 -0
  141. package/Source/Shaders/ConvolveSpecularMapFS.glsl +70 -0
  142. package/Source/Shaders/ConvolveSpecularMapFS.js +72 -0
  143. package/Source/Shaders/ConvolveSpecularMapVS.glsl +24 -0
  144. package/Source/Shaders/ConvolveSpecularMapVS.js +26 -0
  145. package/Source/Shaders/GlobeFS.glsl +1 -2
  146. package/Source/Shaders/GlobeFS.js +1 -2
  147. package/Source/Shaders/Model/AtmosphereStageFS.glsl +1 -4
  148. package/Source/Shaders/Model/AtmosphereStageFS.js +1 -4
  149. package/Source/Shaders/Model/ImageBasedLightingStageFS.glsl +2 -155
  150. package/Source/Shaders/Model/ImageBasedLightingStageFS.js +3 -156
  151. package/Source/Shaders/Model/LightingStageFS.glsl +3 -22
  152. package/Source/Shaders/Model/LightingStageFS.js +3 -22
  153. package/Source/Shaders/SkyBoxVS.glsl +0 -1
  154. package/Source/Shaders/SkyBoxVS.js +0 -1
  155. package/Source/Widget/CesiumWidget.js +776 -1
  156. package/Source/Workers/decodeGoogleEarthEnterprisePacket.js +1 -1
  157. package/index.d.ts +281 -12
  158. package/index.js +62 -57
  159. package/package.json +2 -2
@@ -1,13 +1,26 @@
1
+ import BoundingSphere from "../Core/BoundingSphere.js";
1
2
  import Cartesian3 from "../Core/Cartesian3.js";
3
+ import Cartographic from "../Core/Cartographic.js";
2
4
  import Clock from "../Core/Clock.js";
3
5
  import defaultValue from "../Core/defaultValue.js";
4
6
  import defined from "../Core/defined.js";
5
7
  import destroyObject from "../Core/destroyObject.js";
6
8
  import DeveloperError from "../Core/DeveloperError.js";
7
9
  import Ellipsoid from "../Core/Ellipsoid.js";
10
+ import Event from "../Core/Event.js";
11
+ import EventHelper from "../Core/EventHelper.js";
8
12
  import FeatureDetection from "../Core/FeatureDetection.js";
9
13
  import formatError from "../Core/formatError.js";
14
+ import HeadingPitchRange from "../Core/HeadingPitchRange.js";
15
+ import Matrix4 from "../Core/Matrix4.js";
16
+ import BoundingSphereState from "../DataSources/BoundingSphereState.js";
17
+ import DataSourceCollection from "../DataSources/DataSourceCollection.js";
18
+ import DataSourceDisplay from "../DataSources/DataSourceDisplay.js";
19
+ import EntityView from "../DataSources/EntityView.js";
10
20
  import getElement from "../DataSources/getElement.js";
21
+ import Property from "../DataSources/Property.js";
22
+ import Cesium3DTileset from "../Scene/Cesium3DTileset.js";
23
+ import computeFlyToLocationForRectangle from "../Scene/computeFlyToLocationForRectangle.js";
11
24
  import Globe from "../Scene/Globe.js";
12
25
  import ImageryLayer from "../Scene/ImageryLayer.js";
13
26
  import Moon from "../Scene/Moon.js";
@@ -18,6 +31,17 @@ import ShadowMode from "../Scene/ShadowMode.js";
18
31
  import SkyAtmosphere from "../Scene/SkyAtmosphere.js";
19
32
  import SkyBox from "../Scene/SkyBox.js";
20
33
  import Sun from "../Scene/Sun.js";
34
+ import TimeDynamicPointCloud from "../Scene/TimeDynamicPointCloud.js";
35
+ import VoxelPrimitive from "../Scene/VoxelPrimitive.js";
36
+
37
+ function trackDataSourceClock(clock, dataSource) {
38
+ if (defined(dataSource)) {
39
+ const dataSourceClock = dataSource.clock;
40
+ if (defined(dataSourceClock)) {
41
+ dataSourceClock.getValue(clock);
42
+ }
43
+ }
44
+ }
21
45
 
22
46
  function startRenderLoop(widget) {
23
47
  widget._renderLoopRunning = true;
@@ -118,6 +142,7 @@ function configureCameraFrustum(widget) {
118
142
  * @param {Element|string} container The DOM element or ID that will contain the widget.
119
143
  * @param {object} [options] Object with the following properties:
120
144
  * @param {Clock} [options.clock=new Clock()] The clock to use to control current time.
145
+ * @param {boolean} [options.shouldAnimate=false] <code>true</code> if the clock should attempt to advance simulation time by default, <code>false</code> otherwise.
121
146
  * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.default] The default ellipsoid.
122
147
  * @param {ImageryLayer|false} [options.baseLayer=ImageryLayer.fromWorldImagery()] The bottommost imagery layer applied to the globe. If set to <code>false</code>, no imagery provider will be added.
123
148
  * @param {TerrainProvider} [options.terrainProvider=new EllipsoidTerrainProvider(options.ellipsoid)] The terrain provider.
@@ -133,14 +158,17 @@ function configureCameraFrustum(widget) {
133
158
  * @param {boolean} [options.useBrowserRecommendedResolution=true] If true, render at the browser's recommended resolution and ignore <code>window.devicePixelRatio</code>.
134
159
  * @param {number} [options.targetFrameRate] The target frame rate when using the default render loop.
135
160
  * @param {boolean} [options.showRenderLoopErrors=true] If true, this widget will automatically display an HTML panel to the user containing the error, if a render loop error occurs.
161
+ * @param {boolean} [options.automaticallyTrackDataSourceClocks=true] If true, this widget will automatically track the clock settings of newly added DataSources, updating if the DataSource's clock changes. Set this to false if you want to configure the clock independently.
136
162
  * @param {ContextOptions} [options.contextOptions] Context and WebGL creation properties passed to {@link Scene}.
137
163
  * @param {Element|string} [options.creditContainer] The DOM element or ID that will contain the {@link CreditDisplay}. If not specified, the credits are added
138
164
  * to the bottom of the widget itself.
139
165
  * @param {Element|string} [options.creditViewport] The DOM element or ID that will contain the credit pop up created by the {@link CreditDisplay}. If not specified, it will appear over the widget itself.
166
+ * @param {DataSourceCollection} [options.dataSources=new DataSourceCollection()] The collection of data sources visualized by the widget. If this parameter is provided,
167
+ * the instance is assumed to be owned by the caller and will not be destroyed when the widget is destroyed.
140
168
  * @param {boolean} [options.shadows=false] Determines if shadows are cast by light sources.
141
169
  * @param {ShadowMode} [options.terrainShadows=ShadowMode.RECEIVE_ONLY] Determines if the terrain casts or receives shadows from light sources.
142
170
  * @param {MapMode2D} [options.mapMode2D=MapMode2D.INFINITE_SCROLL] Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction.
143
- * @param {boolean} [options.blurActiveElementOnCanvasFocus=true] If true, the active element will blur when the viewer's canvas is clicked. Setting this to false is useful for cases when the canvas is clicked only for retrieving position or an entity data without actually meaning to set the canvas to be the active element.
171
+ * @param {boolean} [options.blurActiveElementOnCanvasFocus=true] If true, the active element will blur when the widget's canvas is clicked. Setting this to false is useful for cases when the canvas is clicked only for retrieving position or an entity data without actually meaning to set the canvas to be the active element.
144
172
  * @param {boolean} [options.requestRenderMode=false] If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling improves performance of the application, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}.
145
173
  * @param {number} [options.maximumRenderTimeChange=0.0] If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}.
146
174
  * @param {number} [options.msaaSamples=4] If provided, this value controls the rate of multisample antialiasing. Typical multisampling rates are 2, 4, and sometimes 8 samples per pixel. Higher sampling rates of MSAA may impact performance in exchange for improved visual quality. This value only applies to WebGL2 contexts that support multisample render targets. Set to 1 to disable MSAA.
@@ -266,8 +294,23 @@ function CesiumWidget(container, options) {
266
294
  this._resolutionScale = 1.0;
267
295
  this._useBrowserRecommendedResolution = useBrowserRecommendedResolution;
268
296
  this._forceResize = false;
297
+ this._entityView = undefined;
298
+ this._clockTrackedDataSource = undefined;
299
+ this._trackedEntity = undefined;
300
+ this._needTrackedEntityUpdate = false;
301
+ this._zoomIsFlight = false;
302
+ this._zoomTarget = undefined;
303
+ this._zoomPromise = undefined;
304
+ this._zoomOptions = undefined;
305
+ this._trackedEntityChanged = new Event();
306
+ this._allowDataSourcesToSuspendAnimation = true;
307
+
269
308
  this._clock = defined(options.clock) ? options.clock : new Clock();
270
309
 
310
+ if (defined(options.shouldAnimate)) {
311
+ this._clock.shouldAnimate = options.shouldAnimate;
312
+ }
313
+
271
314
  configureCanvasSize(this);
272
315
 
273
316
  try {
@@ -388,6 +431,71 @@ function CesiumWidget(container, options) {
388
431
  }
389
432
  };
390
433
  scene.renderError.addEventListener(this._onRenderError);
434
+
435
+ let dataSourceCollection = options.dataSources;
436
+ let destroyDataSourceCollection = false;
437
+ if (!defined(dataSourceCollection)) {
438
+ dataSourceCollection = new DataSourceCollection();
439
+ destroyDataSourceCollection = true;
440
+ }
441
+
442
+ const dataSourceDisplay = new DataSourceDisplay({
443
+ scene: scene,
444
+ dataSourceCollection: dataSourceCollection,
445
+ });
446
+
447
+ const eventHelper = new EventHelper();
448
+ this._dataSourceChangedListeners = {};
449
+ this._automaticallyTrackDataSourceClocks =
450
+ options.automaticallyTrackDataSourceClocks ?? true;
451
+
452
+ this._dataSourceCollection = dataSourceCollection;
453
+ this._destroyDataSourceCollection = destroyDataSourceCollection;
454
+ this._dataSourceDisplay = dataSourceDisplay;
455
+ this._eventHelper = eventHelper;
456
+ this._canAnimateUpdateCallback = this._updateCanAnimate;
457
+
458
+ eventHelper.add(this._clock.onTick, CesiumWidget.prototype._onTick, this);
459
+ eventHelper.add(
460
+ scene.morphStart,
461
+ CesiumWidget.prototype._clearTrackedObject,
462
+ this,
463
+ );
464
+
465
+ //Listen to data source events in order to track clock changes.
466
+ eventHelper.add(
467
+ dataSourceCollection.dataSourceAdded,
468
+ CesiumWidget.prototype._onDataSourceAdded,
469
+ this,
470
+ );
471
+ eventHelper.add(
472
+ dataSourceCollection.dataSourceRemoved,
473
+ CesiumWidget.prototype._onDataSourceRemoved,
474
+ this,
475
+ );
476
+
477
+ eventHelper.add(scene.postRender, CesiumWidget.prototype._postRender, this);
478
+
479
+ // We need to subscribe to the data sources and collections so that we can clear the
480
+ // tracked object when it is removed from the scene.
481
+ // Subscribe to current data sources
482
+ const dataSourceLength = dataSourceCollection.length;
483
+ for (let i = 0; i < dataSourceLength; i++) {
484
+ this._dataSourceAdded(dataSourceCollection, dataSourceCollection.get(i));
485
+ }
486
+ this._dataSourceAdded(undefined, dataSourceDisplay.defaultDataSource);
487
+
488
+ // Hook up events so that we can subscribe to future sources.
489
+ eventHelper.add(
490
+ dataSourceCollection.dataSourceAdded,
491
+ CesiumWidget.prototype._dataSourceAdded,
492
+ this,
493
+ );
494
+ eventHelper.add(
495
+ dataSourceCollection.dataSourceRemoved,
496
+ CesiumWidget.prototype._dataSourceRemoved,
497
+ this,
498
+ );
391
499
  } catch (error) {
392
500
  if (showRenderLoopErrors) {
393
501
  const title = "Error constructing CesiumWidget.";
@@ -505,6 +613,43 @@ Object.defineProperties(CesiumWidget.prototype, {
505
613
  },
506
614
  },
507
615
 
616
+ /**
617
+ * Gets the display used for {@link DataSource} visualization.
618
+ * @memberof CesiumWidget.prototype
619
+ * @type {DataSourceDisplay}
620
+ * @readonly
621
+ */
622
+ dataSourceDisplay: {
623
+ get: function () {
624
+ return this._dataSourceDisplay;
625
+ },
626
+ },
627
+
628
+ /**
629
+ * Gets the collection of entities not tied to a particular data source.
630
+ * This is a shortcut to [dataSourceDisplay.defaultDataSource.entities]{@link CesiumWidget#dataSourceDisplay}.
631
+ * @memberof CesiumWidget.prototype
632
+ * @type {EntityCollection}
633
+ * @readonly
634
+ */
635
+ entities: {
636
+ get: function () {
637
+ return this._dataSourceDisplay.defaultDataSource.entities;
638
+ },
639
+ },
640
+
641
+ /**
642
+ * Gets the set of {@link DataSource} instances to be visualized.
643
+ * @memberof CesiumWidget.prototype
644
+ * @type {DataSourceCollection}
645
+ * @readonly
646
+ */
647
+ dataSources: {
648
+ get: function () {
649
+ return this._dataSourceCollection;
650
+ },
651
+ },
652
+
508
653
  /**
509
654
  * Gets the camera.
510
655
  * @memberof CesiumWidget.prototype
@@ -662,6 +807,104 @@ Object.defineProperties(CesiumWidget.prototype, {
662
807
  }
663
808
  },
664
809
  },
810
+
811
+ /**
812
+ * Gets or sets whether or not data sources can temporarily pause
813
+ * animation in order to avoid showing an incomplete picture to the user.
814
+ * For example, if asynchronous primitives are being processed in the
815
+ * background, the clock will not advance until the geometry is ready.
816
+ *
817
+ * @memberof CesiumWidget.prototype
818
+ *
819
+ * @type {boolean}
820
+ */
821
+ allowDataSourcesToSuspendAnimation: {
822
+ get: function () {
823
+ return this._allowDataSourcesToSuspendAnimation;
824
+ },
825
+ set: function (value) {
826
+ this._allowDataSourcesToSuspendAnimation = value;
827
+ },
828
+ },
829
+
830
+ /**
831
+ * Gets or sets the Entity instance currently being tracked by the camera.
832
+ * @memberof CesiumWidget.prototype
833
+ * @type {Entity | undefined}
834
+ */
835
+ trackedEntity: {
836
+ get: function () {
837
+ return this._trackedEntity;
838
+ },
839
+ set: function (value) {
840
+ if (this._trackedEntity !== value) {
841
+ this._trackedEntity = value;
842
+
843
+ //Cancel any pending zoom
844
+ cancelZoom(this);
845
+
846
+ const scene = this.scene;
847
+ const sceneMode = scene.mode;
848
+
849
+ //Stop tracking
850
+ if (!defined(value) || !defined(value.position)) {
851
+ this._needTrackedEntityUpdate = false;
852
+ if (
853
+ sceneMode === SceneMode.COLUMBUS_VIEW ||
854
+ sceneMode === SceneMode.SCENE2D
855
+ ) {
856
+ scene.screenSpaceCameraController.enableTranslate = true;
857
+ }
858
+
859
+ if (
860
+ sceneMode === SceneMode.COLUMBUS_VIEW ||
861
+ sceneMode === SceneMode.SCENE3D
862
+ ) {
863
+ scene.screenSpaceCameraController.enableTilt = true;
864
+ }
865
+
866
+ this._entityView = undefined;
867
+ this.camera.lookAtTransform(Matrix4.IDENTITY);
868
+ } else {
869
+ //We can't start tracking immediately, so we set a flag and start tracking
870
+ //when the bounding sphere is ready (most likely next frame).
871
+ this._needTrackedEntityUpdate = true;
872
+ }
873
+
874
+ this._trackedEntityChanged.raiseEvent(value);
875
+ this.scene.requestRender();
876
+ }
877
+ },
878
+ },
879
+
880
+ /**
881
+ * Gets the event that is raised when the tracked entity changes.
882
+ * @memberof CesiumWidget.prototype
883
+ * @type {Event}
884
+ * @readonly
885
+ */
886
+ trackedEntityChanged: {
887
+ get: function () {
888
+ return this._trackedEntityChanged;
889
+ },
890
+ },
891
+
892
+ /**
893
+ * Gets or sets the data source to track with the widget's clock.
894
+ * @memberof CesiumWidget.prototype
895
+ * @type {DataSource}
896
+ */
897
+ clockTrackedDataSource: {
898
+ get: function () {
899
+ return this._clockTrackedDataSource;
900
+ },
901
+ set: function (value) {
902
+ if (this._clockTrackedDataSource !== value) {
903
+ this._clockTrackedDataSource = value;
904
+ trackDataSourceClock(this.clock, value);
905
+ }
906
+ },
907
+ },
665
908
  });
666
909
 
667
910
  /**
@@ -785,12 +1028,29 @@ CesiumWidget.prototype.isDestroyed = function () {
785
1028
  * removing the widget from layout.
786
1029
  */
787
1030
  CesiumWidget.prototype.destroy = function () {
1031
+ // Unsubscribe from data sources
1032
+ const dataSources = this.dataSources;
1033
+ const dataSourceLength = dataSources.length;
1034
+ for (let i = 0; i < dataSourceLength; i++) {
1035
+ this._dataSourceRemoved(dataSources, dataSources.get(i));
1036
+ }
1037
+ this._dataSourceRemoved(undefined, this._dataSourceDisplay.defaultDataSource);
1038
+
1039
+ this._dataSourceDisplay = this._dataSourceDisplay.destroy();
1040
+
788
1041
  if (defined(this._scene)) {
789
1042
  this._scene.renderError.removeEventListener(this._onRenderError);
790
1043
  this._scene = this._scene.destroy();
791
1044
  }
792
1045
  this._container.removeChild(this._element);
793
1046
  this._creditContainer.removeChild(this._innerCreditContainer);
1047
+
1048
+ this._eventHelper.removeAll();
1049
+
1050
+ if (this._destroyDataSourceCollection) {
1051
+ this._dataSourceCollection = this._dataSourceCollection.destroy();
1052
+ }
1053
+
794
1054
  destroyObject(this);
795
1055
  };
796
1056
 
@@ -830,4 +1090,519 @@ CesiumWidget.prototype.render = function () {
830
1090
  this._clock.tick();
831
1091
  }
832
1092
  };
1093
+
1094
+ /**
1095
+ * @private
1096
+ */
1097
+ CesiumWidget.prototype._dataSourceAdded = function (
1098
+ dataSourceCollection,
1099
+ dataSource,
1100
+ ) {
1101
+ const entityCollection = dataSource.entities;
1102
+ entityCollection.collectionChanged.addEventListener(
1103
+ CesiumWidget.prototype._onEntityCollectionChanged,
1104
+ this,
1105
+ );
1106
+ };
1107
+
1108
+ /**
1109
+ * @private
1110
+ */
1111
+ CesiumWidget.prototype._dataSourceRemoved = function (
1112
+ dataSourceCollection,
1113
+ dataSource,
1114
+ ) {
1115
+ const entityCollection = dataSource.entities;
1116
+ entityCollection.collectionChanged.removeEventListener(
1117
+ CesiumWidget.prototype._onEntityCollectionChanged,
1118
+ this,
1119
+ );
1120
+
1121
+ if (defined(this.trackedEntity)) {
1122
+ if (
1123
+ entityCollection.getById(this.trackedEntity.id) === this.trackedEntity
1124
+ ) {
1125
+ this.trackedEntity = undefined;
1126
+ }
1127
+ }
1128
+ };
1129
+
1130
+ /**
1131
+ * @private
1132
+ */
1133
+ CesiumWidget.prototype._updateCanAnimate = function (isUpdated) {
1134
+ this._clock.canAnimate = isUpdated;
1135
+ };
1136
+
1137
+ const boundingSphereScratch = new BoundingSphere();
1138
+
1139
+ /**
1140
+ * @private
1141
+ */
1142
+ CesiumWidget.prototype._onTick = function (clock) {
1143
+ const time = clock.currentTime;
1144
+
1145
+ const isUpdated = this._dataSourceDisplay.update(time);
1146
+ if (this._allowDataSourcesToSuspendAnimation) {
1147
+ this._canAnimateUpdateCallback(isUpdated);
1148
+ }
1149
+
1150
+ const entityView = this._entityView;
1151
+ if (defined(entityView)) {
1152
+ const trackedEntity = this._trackedEntity;
1153
+ const trackedState = this._dataSourceDisplay.getBoundingSphere(
1154
+ trackedEntity,
1155
+ true,
1156
+ boundingSphereScratch,
1157
+ );
1158
+ if (trackedState === BoundingSphereState.DONE) {
1159
+ entityView.update(time, boundingSphereScratch);
1160
+ }
1161
+ }
1162
+ };
1163
+
1164
+ /**
1165
+ * @private
1166
+ */
1167
+ CesiumWidget.prototype._onEntityCollectionChanged = function (
1168
+ collection,
1169
+ added,
1170
+ removed,
1171
+ ) {
1172
+ const length = removed.length;
1173
+ for (let i = 0; i < length; i++) {
1174
+ const removedObject = removed[i];
1175
+ if (this.trackedEntity === removedObject) {
1176
+ this.trackedEntity = undefined;
1177
+ }
1178
+ }
1179
+ };
1180
+
1181
+ /**
1182
+ * @private
1183
+ */
1184
+ CesiumWidget.prototype._clearTrackedObject = function () {
1185
+ this.trackedEntity = undefined;
1186
+ };
1187
+
1188
+ /**
1189
+ * @private
1190
+ */
1191
+ CesiumWidget.prototype._onDataSourceChanged = function (dataSource) {
1192
+ if (this.clockTrackedDataSource === dataSource) {
1193
+ trackDataSourceClock(this.clock, dataSource);
1194
+ }
1195
+ };
1196
+
1197
+ /**
1198
+ * @private
1199
+ */
1200
+ CesiumWidget.prototype._onDataSourceAdded = function (
1201
+ dataSourceCollection,
1202
+ dataSource,
1203
+ ) {
1204
+ if (this._automaticallyTrackDataSourceClocks) {
1205
+ this.clockTrackedDataSource = dataSource;
1206
+ }
1207
+ const id = dataSource.entities.id;
1208
+ const removalFunc = this._eventHelper.add(
1209
+ dataSource.changedEvent,
1210
+ CesiumWidget.prototype._onDataSourceChanged,
1211
+ this,
1212
+ );
1213
+ this._dataSourceChangedListeners[id] = removalFunc;
1214
+ };
1215
+
1216
+ /**
1217
+ * @private
1218
+ */
1219
+ CesiumWidget.prototype._onDataSourceRemoved = function (
1220
+ dataSourceCollection,
1221
+ dataSource,
1222
+ ) {
1223
+ const resetClock = this.clockTrackedDataSource === dataSource;
1224
+ const id = dataSource.entities.id;
1225
+ this._dataSourceChangedListeners[id]();
1226
+ this._dataSourceChangedListeners[id] = undefined;
1227
+ if (resetClock) {
1228
+ const numDataSources = dataSourceCollection.length;
1229
+ if (this._automaticallyTrackDataSourceClocks && numDataSources > 0) {
1230
+ this.clockTrackedDataSource = dataSourceCollection.get(
1231
+ numDataSources - 1,
1232
+ );
1233
+ } else {
1234
+ this.clockTrackedDataSource = undefined;
1235
+ }
1236
+ }
1237
+ };
1238
+
1239
+ /**
1240
+ * Asynchronously sets the camera to view the provided entity, entities, or data source.
1241
+ * If the data source is still in the process of loading or the visualization is otherwise still loading,
1242
+ * this method waits for the data to be ready before performing the zoom.
1243
+ *
1244
+ * <p>The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere.
1245
+ * The heading and the pitch angles are defined in the local east-north-up reference frame.
1246
+ * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch
1247
+ * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is
1248
+ * zero, a range will be computed such that the whole bounding sphere is visible.</p>
1249
+ *
1250
+ * <p>In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the
1251
+ * target will be the range. The heading will be determined from the offset. If the heading cannot be
1252
+ * determined from the offset, the heading will be north.</p>
1253
+ *
1254
+ * @param {Entity|Entity[]|EntityCollection|DataSource|ImageryLayer|Cesium3DTileset|TimeDynamicPointCloud|Promise<Entity|Entity[]|EntityCollection|DataSource|ImageryLayer|Cesium3DTileset|TimeDynamicPointCloud|VoxelPrimitive>} target The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types.
1255
+ * @param {HeadingPitchRange} [offset] The offset from the center of the entity in the local east-north-up reference frame.
1256
+ * @returns {Promise<boolean>} A Promise that resolves to true if the zoom was successful or false if the target is not currently visualized in the scene or the zoom was cancelled.
1257
+ */
1258
+ CesiumWidget.prototype.zoomTo = function (target, offset) {
1259
+ const options = {
1260
+ offset: offset,
1261
+ };
1262
+ return zoomToOrFly(this, target, options, false);
1263
+ };
1264
+
1265
+ /**
1266
+ * Flies the camera to the provided entity, entities, or data source.
1267
+ * If the data source is still in the process of loading or the visualization is otherwise still loading,
1268
+ * this method waits for the data to be ready before performing the flight.
1269
+ *
1270
+ * <p>The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere.
1271
+ * The heading and the pitch angles are defined in the local east-north-up reference frame.
1272
+ * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch
1273
+ * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is
1274
+ * zero, a range will be computed such that the whole bounding sphere is visible.</p>
1275
+ *
1276
+ * <p>In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the
1277
+ * target will be the range. The heading will be determined from the offset. If the heading cannot be
1278
+ * determined from the offset, the heading will be north.</p>
1279
+ *
1280
+ * @param {Entity|Entity[]|EntityCollection|DataSource|ImageryLayer|Cesium3DTileset|TimeDynamicPointCloud|Promise<Entity|Entity[]|EntityCollection|DataSource|ImageryLayer|Cesium3DTileset|TimeDynamicPointCloud|VoxelPrimitive>} target The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types.
1281
+ * @param {object} [options] Object with the following properties:
1282
+ * @param {number} [options.duration=3.0] The duration of the flight in seconds.
1283
+ * @param {number} [options.maximumHeight] The maximum height at the peak of the flight.
1284
+ * @param {HeadingPitchRange} [options.offset] The offset from the target in the local east-north-up reference frame centered at the target.
1285
+ * @returns {Promise<boolean>} A Promise that resolves to true if the flight was successful or false if the target is not currently visualized in the scene or the flight was cancelled. //TODO: Cleanup entity mentions
1286
+ */
1287
+ CesiumWidget.prototype.flyTo = function (target, options) {
1288
+ return zoomToOrFly(this, target, options, true);
1289
+ };
1290
+
1291
+ function zoomToOrFly(that, zoomTarget, options, isFlight) {
1292
+ //>>includeStart('debug', pragmas.debug);
1293
+ if (!defined(zoomTarget)) {
1294
+ throw new DeveloperError("zoomTarget is required.");
1295
+ }
1296
+ //>>includeEnd('debug');
1297
+
1298
+ cancelZoom(that);
1299
+
1300
+ //We can't actually perform the zoom until all visualization is ready and
1301
+ //bounding spheres have been computed. Therefore we create and return
1302
+ //a deferred which will be resolved as part of the post-render step in the
1303
+ //frame that actually performs the zoom.
1304
+ const zoomPromise = new Promise((resolve) => {
1305
+ that._completeZoom = function (value) {
1306
+ resolve(value);
1307
+ };
1308
+ });
1309
+ that._zoomPromise = zoomPromise;
1310
+ that._zoomIsFlight = isFlight;
1311
+ that._zoomOptions = options;
1312
+
1313
+ Promise.resolve(zoomTarget).then(function (zoomTarget) {
1314
+ //Only perform the zoom if it wasn't cancelled before the promise resolved.
1315
+ if (that._zoomPromise !== zoomPromise) {
1316
+ return;
1317
+ }
1318
+
1319
+ //If the zoom target is a rectangular imagery in an ImageLayer
1320
+ if (zoomTarget instanceof ImageryLayer) {
1321
+ let rectanglePromise;
1322
+
1323
+ if (defined(zoomTarget.imageryProvider)) {
1324
+ rectanglePromise = Promise.resolve(zoomTarget.getImageryRectangle());
1325
+ } else {
1326
+ rectanglePromise = new Promise((resolve) => {
1327
+ const removeListener = zoomTarget.readyEvent.addEventListener(() => {
1328
+ removeListener();
1329
+ resolve(zoomTarget.getImageryRectangle());
1330
+ });
1331
+ });
1332
+ }
1333
+ rectanglePromise
1334
+ .then(function (rectangle) {
1335
+ return computeFlyToLocationForRectangle(rectangle, that.scene);
1336
+ })
1337
+ .then(function (position) {
1338
+ //Only perform the zoom if it wasn't cancelled before the promise was resolved
1339
+ if (that._zoomPromise === zoomPromise) {
1340
+ that._zoomTarget = position;
1341
+ }
1342
+ });
1343
+ return;
1344
+ }
1345
+
1346
+ if (
1347
+ zoomTarget instanceof Cesium3DTileset ||
1348
+ zoomTarget instanceof TimeDynamicPointCloud ||
1349
+ zoomTarget instanceof VoxelPrimitive
1350
+ ) {
1351
+ that._zoomTarget = zoomTarget;
1352
+ return;
1353
+ }
1354
+
1355
+ //If the zoom target is a data source, and it's in the middle of loading, wait for it to finish loading.
1356
+ if (zoomTarget.isLoading && defined(zoomTarget.loadingEvent)) {
1357
+ const removeEvent = zoomTarget.loadingEvent.addEventListener(function () {
1358
+ removeEvent();
1359
+
1360
+ //Only perform the zoom if it wasn't cancelled before the data source finished.
1361
+ if (that._zoomPromise === zoomPromise) {
1362
+ that._zoomTarget = zoomTarget.entities.values.slice(0);
1363
+ }
1364
+ });
1365
+ return;
1366
+ }
1367
+
1368
+ //Zoom target is already an array, just copy it and return.
1369
+ if (Array.isArray(zoomTarget)) {
1370
+ that._zoomTarget = zoomTarget.slice(0);
1371
+ return;
1372
+ }
1373
+
1374
+ //If zoomTarget is an EntityCollection, this will retrieve the array
1375
+ zoomTarget = zoomTarget.values ?? zoomTarget;
1376
+
1377
+ //If zoomTarget is a DataSource, this will retrieve the array.
1378
+ if (defined(zoomTarget.entities)) {
1379
+ zoomTarget = zoomTarget.entities.values;
1380
+ }
1381
+
1382
+ //Zoom target is already an array, just copy it and return.
1383
+ if (Array.isArray(zoomTarget)) {
1384
+ that._zoomTarget = zoomTarget.slice(0);
1385
+ } else {
1386
+ //Single entity
1387
+ that._zoomTarget = [zoomTarget];
1388
+ }
1389
+ });
1390
+
1391
+ that.scene.requestRender();
1392
+ return zoomPromise;
1393
+ }
1394
+
1395
+ function clearZoom(widget) {
1396
+ widget._zoomPromise = undefined;
1397
+ widget._zoomTarget = undefined;
1398
+ widget._zoomOptions = undefined;
1399
+ }
1400
+
1401
+ function cancelZoom(widget) {
1402
+ const zoomPromise = widget._zoomPromise;
1403
+ if (defined(zoomPromise)) {
1404
+ clearZoom(widget);
1405
+ widget._completeZoom(false);
1406
+ }
1407
+ }
1408
+
1409
+ /**
1410
+ * @private
1411
+ */
1412
+ CesiumWidget.prototype._postRender = function () {
1413
+ updateZoomTarget(this);
1414
+ updateTrackedEntity(this);
1415
+ };
1416
+
1417
+ function updateZoomTarget(widget) {
1418
+ const target = widget._zoomTarget;
1419
+ if (!defined(target) || widget.scene.mode === SceneMode.MORPHING) {
1420
+ return;
1421
+ }
1422
+
1423
+ const scene = widget.scene;
1424
+ const camera = scene.camera;
1425
+ const zoomOptions = widget._zoomOptions ?? {};
1426
+ let options;
1427
+ function zoomToBoundingSphere(boundingSphere) {
1428
+ // If offset was originally undefined then give it base value instead of empty object
1429
+ if (!defined(zoomOptions.offset)) {
1430
+ zoomOptions.offset = new HeadingPitchRange(
1431
+ 0.0,
1432
+ -0.5,
1433
+ boundingSphere.radius,
1434
+ );
1435
+ }
1436
+
1437
+ options = {
1438
+ offset: zoomOptions.offset,
1439
+ duration: zoomOptions.duration,
1440
+ maximumHeight: zoomOptions.maximumHeight,
1441
+ complete: function () {
1442
+ widget._completeZoom(true);
1443
+ },
1444
+ cancel: function () {
1445
+ widget._completeZoom(false);
1446
+ },
1447
+ };
1448
+
1449
+ if (widget._zoomIsFlight) {
1450
+ camera.flyToBoundingSphere(target.boundingSphere, options);
1451
+ } else {
1452
+ camera.viewBoundingSphere(boundingSphere, zoomOptions.offset);
1453
+ camera.lookAtTransform(Matrix4.IDENTITY);
1454
+
1455
+ // Finish the promise
1456
+ widget._completeZoom(true);
1457
+ }
1458
+
1459
+ clearZoom(widget);
1460
+ }
1461
+
1462
+ if (target instanceof TimeDynamicPointCloud) {
1463
+ if (defined(target.boundingSphere)) {
1464
+ zoomToBoundingSphere(target.boundingSphere);
1465
+ return;
1466
+ }
1467
+
1468
+ // Otherwise, the first "frame" needs to have been rendered
1469
+ const removeEventListener = target.frameChanged.addEventListener(
1470
+ function (timeDynamicPointCloud) {
1471
+ zoomToBoundingSphere(timeDynamicPointCloud.boundingSphere);
1472
+ removeEventListener();
1473
+ },
1474
+ );
1475
+ return;
1476
+ }
1477
+
1478
+ if (target instanceof Cesium3DTileset || target instanceof VoxelPrimitive) {
1479
+ zoomToBoundingSphere(target.boundingSphere);
1480
+ return;
1481
+ }
1482
+
1483
+ // If zoomTarget was an ImageryLayer
1484
+ if (target instanceof Cartographic) {
1485
+ options = {
1486
+ destination: scene.ellipsoid.cartographicToCartesian(target),
1487
+ duration: zoomOptions.duration,
1488
+ maximumHeight: zoomOptions.maximumHeight,
1489
+ complete: function () {
1490
+ widget._completeZoom(true);
1491
+ },
1492
+ cancel: function () {
1493
+ widget._completeZoom(false);
1494
+ },
1495
+ };
1496
+
1497
+ if (widget._zoomIsFlight) {
1498
+ camera.flyTo(options);
1499
+ } else {
1500
+ camera.setView(options);
1501
+ widget._completeZoom(true);
1502
+ }
1503
+ clearZoom(widget);
1504
+ return;
1505
+ }
1506
+
1507
+ const entities = target;
1508
+
1509
+ const boundingSpheres = [];
1510
+ for (let i = 0, len = entities.length; i < len; i++) {
1511
+ const state = widget._dataSourceDisplay.getBoundingSphere(
1512
+ entities[i],
1513
+ false,
1514
+ boundingSphereScratch,
1515
+ );
1516
+
1517
+ if (state === BoundingSphereState.PENDING) {
1518
+ return;
1519
+ } else if (state !== BoundingSphereState.FAILED) {
1520
+ boundingSpheres.push(BoundingSphere.clone(boundingSphereScratch));
1521
+ }
1522
+ }
1523
+
1524
+ if (boundingSpheres.length === 0) {
1525
+ cancelZoom(widget);
1526
+ return;
1527
+ }
1528
+
1529
+ // Stop tracking the current entity.
1530
+ widget.trackedEntity = undefined;
1531
+
1532
+ const boundingSphere = BoundingSphere.fromBoundingSpheres(boundingSpheres);
1533
+
1534
+ if (!widget._zoomIsFlight) {
1535
+ camera.viewBoundingSphere(boundingSphere, zoomOptions.offset);
1536
+ camera.lookAtTransform(Matrix4.IDENTITY);
1537
+ clearZoom(widget);
1538
+ widget._completeZoom(true);
1539
+ } else {
1540
+ clearZoom(widget);
1541
+ camera.flyToBoundingSphere(boundingSphere, {
1542
+ duration: zoomOptions.duration,
1543
+ maximumHeight: zoomOptions.maximumHeight,
1544
+ complete: function () {
1545
+ widget._completeZoom(true);
1546
+ },
1547
+ cancel: function () {
1548
+ widget._completeZoom(false);
1549
+ },
1550
+ offset: zoomOptions.offset,
1551
+ });
1552
+ }
1553
+ }
1554
+
1555
+ function updateTrackedEntity(widget) {
1556
+ if (!widget._needTrackedEntityUpdate) {
1557
+ return;
1558
+ }
1559
+
1560
+ const trackedEntity = widget._trackedEntity;
1561
+ const currentTime = widget.clock.currentTime;
1562
+
1563
+ //Verify we have a current position at this time. This is only triggered if a position
1564
+ //has become undefined after trackedEntity is set but before the boundingSphere has been
1565
+ //computed. In this case, we will track the entity once it comes back into existence.
1566
+ const currentPosition = Property.getValueOrUndefined(
1567
+ trackedEntity.position,
1568
+ currentTime,
1569
+ );
1570
+
1571
+ if (!defined(currentPosition)) {
1572
+ return;
1573
+ }
1574
+
1575
+ const scene = widget.scene;
1576
+
1577
+ const state = widget._dataSourceDisplay.getBoundingSphere(
1578
+ trackedEntity,
1579
+ false,
1580
+ boundingSphereScratch,
1581
+ );
1582
+ if (state === BoundingSphereState.PENDING) {
1583
+ return;
1584
+ }
1585
+
1586
+ const sceneMode = scene.mode;
1587
+ if (
1588
+ sceneMode === SceneMode.COLUMBUS_VIEW ||
1589
+ sceneMode === SceneMode.SCENE2D
1590
+ ) {
1591
+ scene.screenSpaceCameraController.enableTranslate = false;
1592
+ }
1593
+
1594
+ if (
1595
+ sceneMode === SceneMode.COLUMBUS_VIEW ||
1596
+ sceneMode === SceneMode.SCENE3D
1597
+ ) {
1598
+ scene.screenSpaceCameraController.enableTilt = false;
1599
+ }
1600
+
1601
+ const bs =
1602
+ state !== BoundingSphereState.FAILED ? boundingSphereScratch : undefined;
1603
+ widget._entityView = new EntityView(trackedEntity, scene, scene.ellipsoid);
1604
+ widget._entityView.update(currentTime, bs);
1605
+ widget._needTrackedEntityUpdate = false;
1606
+ }
1607
+
833
1608
  export default CesiumWidget;