@cesium/engine 2.1.0 → 2.3.0

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 (240) hide show
  1. package/Build/Workers/{AttributeCompression-8a5a065e.js → AttributeCompression-f9f6c717.js} +1 -1
  2. package/Build/Workers/{AxisAlignedBoundingBox-a6f9f0e5.js → AxisAlignedBoundingBox-31fadcf0.js} +1 -1
  3. package/Build/Workers/{BoundingRectangle-b0a68595.js → BoundingRectangle-995f0079.js} +1 -1
  4. package/Build/Workers/{BoxGeometry-baedd794.js → BoxGeometry-7eb1af60.js} +1 -1
  5. package/Build/Workers/{Color-f85df1be.js → Color-2dc49658.js} +1 -1
  6. package/Build/Workers/{CoplanarPolygonGeometryLibrary-30516950.js → CoplanarPolygonGeometryLibrary-d7d972d6.js} +1 -1
  7. package/Build/Workers/{CorridorGeometryLibrary-5d5d3b3a.js → CorridorGeometryLibrary-1f5ef7b3.js} +1 -1
  8. package/Build/Workers/{CylinderGeometry-d899ae26.js → CylinderGeometry-23c67a6c.js} +1 -1
  9. package/Build/Workers/{CylinderGeometryLibrary-135b0858.js → CylinderGeometryLibrary-7bf291b4.js} +1 -1
  10. package/Build/Workers/{EllipseGeometry-a49f8449.js → EllipseGeometry-37014da4.js} +1 -1
  11. package/Build/Workers/{EllipseGeometryLibrary-cba7edde.js → EllipseGeometryLibrary-92ab6b1e.js} +1 -1
  12. package/Build/Workers/{EllipseOutlineGeometry-8095c8cb.js → EllipseOutlineGeometry-12b6fef5.js} +1 -1
  13. package/Build/Workers/{EllipsoidGeodesic-dcff5cbd.js → EllipsoidGeodesic-5b3623dc.js} +1 -1
  14. package/Build/Workers/{EllipsoidGeometry-ed93f571.js → EllipsoidGeometry-508da15c.js} +1 -1
  15. package/Build/Workers/{EllipsoidOutlineGeometry-e4854854.js → EllipsoidOutlineGeometry-40d97455.js} +1 -1
  16. package/Build/Workers/{EllipsoidRhumbLine-b672d507.js → EllipsoidRhumbLine-ef872433.js} +1 -1
  17. package/Build/Workers/{EllipsoidTangentPlane-7ae1aa9a.js → EllipsoidTangentPlane-46d4d9c2.js} +1 -1
  18. package/Build/Workers/{EncodedCartesian3-e8bbca36.js → EncodedCartesian3-57415c8a.js} +1 -1
  19. package/Build/Workers/{FrustumGeometry-b62db3e3.js → FrustumGeometry-38605e69.js} +32 -4
  20. package/Build/Workers/{GeometryAttribute-780af4fa.js → GeometryAttribute-a466e9c7.js} +1 -1
  21. package/Build/Workers/{GeometryInstance-3fb607b7.js → GeometryInstance-34d9e21e.js} +1 -1
  22. package/Build/Workers/{GeometryPipeline-36b61c99.js → GeometryPipeline-dcf79306.js} +1 -1
  23. package/Build/Workers/{IndexDatatype-b8f3e09d.js → IndexDatatype-2643aa47.js} +1 -1
  24. package/Build/Workers/{IntersectionTests-e889fcf0.js → IntersectionTests-88c49b2e.js} +1 -1
  25. package/Build/Workers/{Math-dad82b4d.js → Math-0a2ac845.js} +12 -2
  26. package/Build/Workers/{Matrix2-1e403d0e.js → Matrix2-e1298525.js} +1 -1
  27. package/Build/Workers/{Matrix3-fa806b97.js → Matrix3-41c58dde.js} +1 -1
  28. package/Build/Workers/{OrientedBoundingBox-43478ac8.js → OrientedBoundingBox-2dd47921.js} +5 -3
  29. package/Build/Workers/{Plane-c27e1ac6.js → Plane-4c3d403b.js} +1 -1
  30. package/Build/Workers/{PolygonGeometryLibrary-38a98276.js → PolygonGeometryLibrary-59126025.js} +1 -1
  31. package/Build/Workers/PolygonPipeline-1fe328c0.js +1344 -0
  32. package/Build/Workers/{PolylinePipeline-30e4cec9.js → PolylinePipeline-896735cc.js} +1 -1
  33. package/Build/Workers/{PolylineVolumeGeometryLibrary-90551d26.js → PolylineVolumeGeometryLibrary-9c0639f7.js} +1 -1
  34. package/Build/Workers/{PrimitivePipeline-558d9cb0.js → PrimitivePipeline-fc1a47ff.js} +1 -1
  35. package/Build/Workers/{RectangleGeometryLibrary-815c68df.js → RectangleGeometryLibrary-a23c9ebe.js} +1 -1
  36. package/Build/Workers/{TerrainEncoding-341ead52.js → TerrainEncoding-51b8b33b.js} +1 -1
  37. package/Build/Workers/Transforms-bc45e707.js +14699 -0
  38. package/Build/Workers/{WallGeometryLibrary-ccf90976.js → WallGeometryLibrary-007e9883.js} +1 -1
  39. package/Build/Workers/{WebMercatorProjection-76a3fcc0.js → WebMercatorProjection-13ed1a6e.js} +1 -1
  40. package/Build/Workers/{arrayRemoveDuplicates-fac118a8.js → arrayRemoveDuplicates-d2061e85.js} +1 -1
  41. package/Build/Workers/cesiumWorkerBootstrapper.js +1 -1
  42. package/Build/Workers/combineGeometry.js +1 -1
  43. package/Build/Workers/createBoxGeometry.js +1 -1
  44. package/Build/Workers/createBoxOutlineGeometry.js +1 -1
  45. package/Build/Workers/createCircleGeometry.js +1 -1
  46. package/Build/Workers/createCircleOutlineGeometry.js +1 -1
  47. package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
  48. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
  49. package/Build/Workers/createCorridorGeometry.js +1 -1
  50. package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
  51. package/Build/Workers/createCylinderGeometry.js +1 -1
  52. package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
  53. package/Build/Workers/createEllipseGeometry.js +1 -1
  54. package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
  55. package/Build/Workers/createEllipsoidGeometry.js +1 -1
  56. package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
  57. package/Build/Workers/createFrustumGeometry.js +1 -1
  58. package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
  59. package/Build/Workers/createGeometry.js +1 -1
  60. package/Build/Workers/createGroundPolylineGeometry.js +1 -1
  61. package/Build/Workers/createPlaneGeometry.js +1 -1
  62. package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
  63. package/Build/Workers/createPolygonGeometry.js +1 -1
  64. package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
  65. package/Build/Workers/createPolylineGeometry.js +1 -1
  66. package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
  67. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
  68. package/Build/Workers/createRectangleGeometry.js +1 -1
  69. package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
  70. package/Build/Workers/createSimplePolylineGeometry.js +1 -1
  71. package/Build/Workers/createSphereGeometry.js +1 -1
  72. package/Build/Workers/createSphereOutlineGeometry.js +1 -1
  73. package/Build/Workers/createVectorTileClampedPolylines.js +1 -1
  74. package/Build/Workers/createVectorTileGeometries.js +1 -1
  75. package/Build/Workers/createVectorTilePoints.js +1 -1
  76. package/Build/Workers/createVectorTilePolygons.js +1 -1
  77. package/Build/Workers/createVectorTilePolylines.js +1 -1
  78. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
  79. package/Build/Workers/createVerticesFromHeightmap.js +5 -8
  80. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +10 -15
  81. package/Build/Workers/createWallGeometry.js +1 -1
  82. package/Build/Workers/createWallOutlineGeometry.js +1 -1
  83. package/Build/Workers/decodeDraco.js +1 -1
  84. package/Build/Workers/decodeI3S.js +1 -1
  85. package/Build/Workers/package.js +1 -1
  86. package/Build/Workers/transferTypedArrayTest.js +1 -1
  87. package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  88. package/Source/Core/ArcGISTiledElevationTerrainProvider.js +291 -191
  89. package/Source/Core/BingMapsGeocoderService.js +19 -1
  90. package/Source/Core/CartographicGeocoderService.js +15 -0
  91. package/Source/Core/CesiumTerrainProvider.js +571 -434
  92. package/Source/Core/Credit.js +1 -1
  93. package/Source/Core/CustomHeightmapTerrainProvider.js +12 -0
  94. package/Source/Core/EllipsoidTerrainProvider.js +17 -10
  95. package/Source/Core/FrustumGeometry.js +4 -3
  96. package/Source/Core/GeocoderService.js +32 -1
  97. package/Source/Core/GoogleEarthEnterpriseMetadata.js +86 -34
  98. package/Source/Core/GoogleEarthEnterpriseTerrainProvider.js +119 -82
  99. package/Source/Core/Ion.js +1 -1
  100. package/Source/Core/IonGeocoderService.js +17 -2
  101. package/Source/Core/IonResource.js +14 -3
  102. package/Source/Core/OpenCageGeocoderService.js +18 -1
  103. package/Source/Core/OrientedBoundingBox.js +4 -2
  104. package/Source/Core/OrthographicFrustum.js +13 -0
  105. package/Source/Core/PeliasGeocoderService.js +14 -1
  106. package/Source/Core/PerspectiveFrustum.js +14 -0
  107. package/Source/Core/Request.js +3 -2
  108. package/Source/Core/RequestScheduler.js +10 -5
  109. package/Source/Core/Resource.js +230 -236
  110. package/Source/Core/TerrainProvider.js +9 -14
  111. package/Source/Core/TileProviderError.js +8 -8
  112. package/Source/Core/VRTheWorldTerrainProvider.js +193 -124
  113. package/Source/Core/buildModuleUrl.js +4 -3
  114. package/Source/Core/createWorldTerrain.js +20 -2
  115. package/Source/Core/createWorldTerrainAsync.js +48 -0
  116. package/Source/Core/sampleTerrain.js +9 -10
  117. package/Source/Core/sampleTerrainMostDetailed.js +66 -72
  118. package/Source/DataSources/Cesium3DTilesetVisualizer.js +37 -26
  119. package/Source/DataSources/DataSourceDisplay.js +2 -2
  120. package/Source/DataSources/Entity.js +6 -1
  121. package/Source/DataSources/EntityCluster.js +126 -128
  122. package/Source/DataSources/ModelVisualizer.js +104 -34
  123. package/Source/DataSources/PolygonGraphics.js +1 -1
  124. package/Source/Renderer/UniformState.js +3 -2
  125. package/Source/Renderer/demodernizeShader.js +5 -5
  126. package/Source/Scene/ArcGisBaseMapType.js +12 -0
  127. package/Source/Scene/ArcGisMapServerImageryProvider.js +694 -376
  128. package/Source/Scene/ArcGisMapService.js +83 -0
  129. package/Source/Scene/BingMapsImageryProvider.js +511 -305
  130. package/Source/Scene/BufferLoader.js +29 -34
  131. package/Source/Scene/Camera.js +8 -7
  132. package/Source/Scene/Cesium3DTile.js +392 -254
  133. package/Source/Scene/Cesium3DTileBatchTable.js +2 -2
  134. package/Source/Scene/Cesium3DTileContent.js +16 -0
  135. package/Source/Scene/Cesium3DTileContentFactory.js +4 -4
  136. package/Source/Scene/Cesium3DTilePass.js +8 -11
  137. package/Source/Scene/Cesium3DTileStyleEngine.js +1 -1
  138. package/Source/Scene/Cesium3DTilesVoxelProvider.js +225 -117
  139. package/Source/Scene/Cesium3DTileset.js +756 -482
  140. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +301 -0
  141. package/Source/Scene/Cesium3DTilesetMostDetailedTraversal.js +33 -46
  142. package/Source/Scene/Cesium3DTilesetSkipTraversal.js +421 -0
  143. package/Source/Scene/Cesium3DTilesetTraversal.js +219 -671
  144. package/Source/Scene/ClassificationPrimitive.js +7 -0
  145. package/Source/Scene/Composite3DTileContent.js +69 -26
  146. package/Source/Scene/CreditDisplay.js +132 -20
  147. package/Source/Scene/DepthPlane.js +1 -1
  148. package/Source/Scene/Empty3DTileContent.js +31 -1
  149. package/Source/Scene/Geometry3DTileContent.js +47 -7
  150. package/Source/Scene/Globe.js +5 -1
  151. package/Source/Scene/GlobeSurfaceTile.js +2 -1
  152. package/Source/Scene/GlobeSurfaceTileProvider.js +53 -30
  153. package/Source/Scene/GltfBufferViewLoader.js +47 -91
  154. package/Source/Scene/GltfDracoLoader.js +110 -112
  155. package/Source/Scene/GltfImageLoader.js +71 -78
  156. package/Source/Scene/GltfIndexBufferLoader.js +108 -121
  157. package/Source/Scene/GltfJsonLoader.js +87 -74
  158. package/Source/Scene/GltfLoader.js +381 -300
  159. package/Source/Scene/GltfStructuralMetadataLoader.js +109 -110
  160. package/Source/Scene/GltfTextureLoader.js +97 -96
  161. package/Source/Scene/GltfVertexBufferLoader.js +128 -133
  162. package/Source/Scene/GoogleEarthEnterpriseImageryProvider.js +353 -225
  163. package/Source/Scene/GoogleEarthEnterpriseMapsProvider.js +491 -331
  164. package/Source/Scene/GridImageryProvider.js +267 -104
  165. package/Source/Scene/GroundPolylinePrimitive.js +12 -1
  166. package/Source/Scene/GroundPrimitive.js +8 -1
  167. package/Source/Scene/I3SDataProvider.js +214 -113
  168. package/Source/Scene/I3SFeature.js +7 -6
  169. package/Source/Scene/I3SLayer.js +26 -37
  170. package/Source/Scene/I3SNode.js +59 -66
  171. package/Source/Scene/Imagery.js +6 -1
  172. package/Source/Scene/ImageryLayer.js +299 -48
  173. package/Source/Scene/ImageryLayerCollection.js +26 -0
  174. package/Source/Scene/ImageryProvider.js +129 -111
  175. package/Source/Scene/Implicit3DTileContent.js +72 -23
  176. package/Source/Scene/ImplicitSubtree.js +66 -45
  177. package/Source/Scene/IonImageryProvider.js +482 -275
  178. package/Source/Scene/MapboxImageryProvider.js +272 -112
  179. package/Source/Scene/MapboxStyleImageryProvider.js +270 -111
  180. package/Source/Scene/MetadataSchemaLoader.js +26 -36
  181. package/Source/Scene/Model/B3dmLoader.js +42 -46
  182. package/Source/Scene/Model/GeoJsonLoader.js +8 -32
  183. package/Source/Scene/Model/I3dmLoader.js +48 -74
  184. package/Source/Scene/Model/MaterialPipelineStage.js +12 -12
  185. package/Source/Scene/Model/Model.js +514 -135
  186. package/Source/Scene/Model/Model3DTileContent.js +83 -31
  187. package/Source/Scene/Model/ModelAnimationCollection.js +3 -3
  188. package/Source/Scene/Model/ModelDrawCommand.js +15 -26
  189. package/Source/Scene/Model/ModelUtility.js +16 -16
  190. package/Source/Scene/Model/PntsLoader.js +27 -32
  191. package/Source/Scene/Model/UniformType.js +1 -1
  192. package/Source/Scene/Multiple3DTileContent.js +134 -115
  193. package/Source/Scene/Picking.js +3 -2
  194. package/Source/Scene/PointCloud.js +11 -19
  195. package/Source/Scene/Primitive.js +20 -0
  196. package/Source/Scene/QuadtreePrimitive.js +5 -2
  197. package/Source/Scene/QuadtreeTileProvider.js +4 -8
  198. package/Source/Scene/ResourceCache.js +47 -105
  199. package/Source/Scene/ResourceCacheStatistics.js +24 -58
  200. package/Source/Scene/ResourceLoader.js +5 -17
  201. package/Source/Scene/ResourceLoaderState.js +12 -4
  202. package/Source/Scene/Scene.js +65 -0
  203. package/Source/Scene/SceneTransforms.js +3 -2
  204. package/Source/Scene/ScreenSpaceCameraController.js +2 -2
  205. package/Source/Scene/SingleTileImageryProvider.js +382 -209
  206. package/Source/Scene/Terrain.js +196 -0
  207. package/Source/Scene/TileCoordinatesImageryProvider.js +267 -104
  208. package/Source/Scene/TileMapServiceImageryProvider.js +177 -85
  209. package/Source/Scene/Tileset3DTileContent.js +47 -5
  210. package/Source/Scene/TimeDynamicPointCloud.js +15 -2
  211. package/Source/Scene/UrlTemplateImageryProvider.js +343 -215
  212. package/Source/Scene/Vector3DTileClampedPolylines.js +96 -84
  213. package/Source/Scene/Vector3DTileContent.js +47 -22
  214. package/Source/Scene/Vector3DTileGeometry.js +57 -52
  215. package/Source/Scene/Vector3DTilePoints.js +97 -81
  216. package/Source/Scene/Vector3DTilePolygons.js +118 -117
  217. package/Source/Scene/Vector3DTilePolylines.js +86 -82
  218. package/Source/Scene/Vector3DTilePrimitive.js +0 -1
  219. package/Source/Scene/VoxelContent.js +61 -63
  220. package/Source/Scene/VoxelPrimitive.js +39 -91
  221. package/Source/Scene/VoxelProvider.js +2 -2
  222. package/Source/Scene/WebMapServiceImageryProvider.js +272 -111
  223. package/Source/Scene/WebMapTileServiceImageryProvider.js +270 -107
  224. package/Source/Scene/computeFlyToLocationForRectangle.js +33 -37
  225. package/Source/Scene/createOsmBuildings.js +6 -0
  226. package/Source/Scene/createOsmBuildingsAsync.js +82 -0
  227. package/Source/Scene/createWorldImagery.js +14 -5
  228. package/Source/Scene/createWorldImageryAsync.js +39 -0
  229. package/Source/Shaders/AtmosphereCommon.glsl +51 -8
  230. package/Source/Shaders/AtmosphereCommon.js +51 -8
  231. package/Source/Shaders/PostProcessStages/AmbientOcclusionGenerate.glsl +1 -1
  232. package/Source/Shaders/PostProcessStages/AmbientOcclusionGenerate.js +1 -1
  233. package/Source/Shaders/PostProcessStages/AmbientOcclusionModulate.glsl +3 -3
  234. package/Source/Shaders/PostProcessStages/AmbientOcclusionModulate.js +3 -3
  235. package/Source/Widget/CesiumWidget.js +67 -27
  236. package/index.d.ts +2429 -1475
  237. package/index.js +324 -315
  238. package/package.json +4 -4
  239. package/Build/Workers/PolygonPipeline-d31ff61c.js +0 -1345
  240. package/Build/Workers/Transforms-9e9df299.js +0 -14714
@@ -52,6 +52,10 @@ import Pass from "../Renderer/Pass.js";
52
52
  *
53
53
  * @alias Cesium3DTile
54
54
  * @constructor
55
+ * @param {Cesium3DTileset} tileset The tileset
56
+ * @param {Resource} baseResource The base resource for the tileset
57
+ * @param {object} header The JSON header for the tile
58
+ * @param {Cesium3DTile} parent The parent tile of the new tile
55
59
  */
56
60
  function Cesium3DTile(tileset, baseResource, header, parent) {
57
61
  this._tileset = tileset;
@@ -255,8 +259,6 @@ function Cesium3DTile(tileset, baseResource, header, parent) {
255
259
  this._content = content;
256
260
  this._contentResource = contentResource;
257
261
  this._contentState = contentState;
258
- this._contentReadyToProcessPromise = undefined;
259
- this._contentReadyPromise = undefined;
260
262
  this._expiredContent = undefined;
261
263
 
262
264
  this._serverKey = serverKey;
@@ -574,13 +576,29 @@ Object.defineProperties(Cesium3DTile.prototype, {
574
576
  },
575
577
  },
576
578
 
579
+ /**
580
+ * Determines if the tile is visible within the current field of view
581
+ *
582
+ * @memberof Cesium3DTile.prototype
583
+ *
584
+ * @type {boolean}
585
+ * @readonly
586
+ *
587
+ * @private
588
+ */
589
+ isVisible: {
590
+ get: function () {
591
+ return this._visible && this._inRequestVolume;
592
+ },
593
+ },
594
+
577
595
  /**
578
596
  * Returns the <code>extras</code> property in the tileset JSON for this tile, which contains application specific metadata.
579
597
  * Returns <code>undefined</code> if <code>extras</code> does not exist.
580
598
  *
581
599
  * @memberof Cesium3DTile.prototype
582
600
  *
583
- * @type {*}
601
+ * @type {object}
584
602
  * @readonly
585
603
  * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#specifying-extensions-and-application-specific-extras|Extras in the 3D Tiles specification.}
586
604
  */
@@ -614,6 +632,27 @@ Object.defineProperties(Cesium3DTile.prototype, {
614
632
  },
615
633
  },
616
634
 
635
+ /**
636
+ * Determines if the tile's content is renderable. <code>false</code> if the
637
+ * tile has empty content or if it points to an external tileset or implicit content
638
+ *
639
+ * @memberof Cesium3DTile.prototype
640
+ *
641
+ * @type {boolean}
642
+ * @readonly
643
+ *
644
+ * @private
645
+ */
646
+ hasRenderableContent: {
647
+ get: function () {
648
+ return (
649
+ !this.hasEmptyContent &&
650
+ !this.hasTilesetContent &&
651
+ !this.hasImplicitContent
652
+ );
653
+ },
654
+ },
655
+
617
656
  /**
618
657
  * Determines if the tile has available content to render. <code>true</code> if the tile's
619
658
  * content is ready or if it has expired content that renders while new content loads; otherwise,
@@ -629,10 +668,7 @@ Object.defineProperties(Cesium3DTile.prototype, {
629
668
  contentAvailable: {
630
669
  get: function () {
631
670
  return (
632
- (this.contentReady &&
633
- !this.hasEmptyContent &&
634
- !this.hasTilesetContent &&
635
- !this.hasImplicitContent) ||
671
+ (this.contentReady && this.hasRenderableContent) ||
636
672
  (defined(this._expiredContent) && !this.contentFailed)
637
673
  );
638
674
  },
@@ -673,8 +709,7 @@ Object.defineProperties(Cesium3DTile.prototype, {
673
709
  },
674
710
 
675
711
  /**
676
- * Determines if the tile's content is expired. <code>true</code> if tile's
677
- * content is expired; otherwise, <code>false</code>.
712
+ * Determines if the tile has renderable content which is unloaded
678
713
  *
679
714
  * @memberof Cesium3DTile.prototype
680
715
  *
@@ -683,15 +718,15 @@ Object.defineProperties(Cesium3DTile.prototype, {
683
718
  *
684
719
  * @private
685
720
  */
686
- contentExpired: {
721
+ hasUnloadedRenderableContent: {
687
722
  get: function () {
688
- return this._contentState === Cesium3DTileContentState.EXPIRED;
723
+ return this.hasRenderableContent && this.contentUnloaded;
689
724
  },
690
725
  },
691
726
 
692
727
  /**
693
- * Determines if the tile's content failed to load. <code>true</code> if the tile's
694
- * content failed to load; otherwise, <code>false</code>.
728
+ * Determines if the tile's content is expired. <code>true</code> if tile's
729
+ * content is expired; otherwise, <code>false</code>.
695
730
  *
696
731
  * @memberof Cesium3DTile.prototype
697
732
  *
@@ -700,45 +735,26 @@ Object.defineProperties(Cesium3DTile.prototype, {
700
735
  *
701
736
  * @private
702
737
  */
703
- contentFailed: {
738
+ contentExpired: {
704
739
  get: function () {
705
- return this._contentState === Cesium3DTileContentState.FAILED;
740
+ return this._contentState === Cesium3DTileContentState.EXPIRED;
706
741
  },
707
742
  },
708
743
 
709
744
  /**
710
- * Gets the promise that will be resolved when the tile's content is ready to process.
711
- * This happens after the content is downloaded but before the content is ready
712
- * to render.
713
- * <p>
714
- * The promise remains <code>undefined</code> until the tile's content is requested.
715
- * </p>
716
- *
717
- * @type {Promise<Cesium3DTileContent>}
718
- * @readonly
745
+ * Determines if the tile's content failed to load. <code>true</code> if the tile's
746
+ * content failed to load; otherwise, <code>false</code>.
719
747
  *
720
- * @private
721
- */
722
- contentReadyToProcessPromise: {
723
- get: function () {
724
- return this._contentReadyToProcessPromise;
725
- },
726
- },
727
-
728
- /**
729
- * Gets the promise that will be resolved when the tile's content is ready to render.
730
- * <p>
731
- * The promise remains <code>undefined</code> until the tile's content is requested.
732
- * </p>
748
+ * @memberof Cesium3DTile.prototype
733
749
  *
734
- * @type {Promise<Cesium3DTileContent>}
750
+ * @type {boolean}
735
751
  * @readonly
736
752
  *
737
753
  * @private
738
754
  */
739
- contentReadyPromise: {
755
+ contentFailed: {
740
756
  get: function () {
741
- return this._contentReadyPromise;
757
+ return this._contentState === Cesium3DTileContentState.FAILED;
742
758
  },
743
759
  },
744
760
 
@@ -757,13 +773,20 @@ Object.defineProperties(Cesium3DTile.prototype, {
757
773
  });
758
774
 
759
775
  const scratchCartesian = new Cartesian3();
776
+
777
+ /**
778
+ * @private
779
+ * @param {Cesium3DTile} tile
780
+ * @param {FrameState} frameState
781
+ * @returns {Boolean}
782
+ */
760
783
  function isPriorityDeferred(tile, frameState) {
761
- const tileset = tile._tileset;
784
+ const { tileset, boundingSphere } = tile;
785
+ const { radius, center } = boundingSphere;
786
+ const { camera } = frameState;
762
787
 
763
- // If closest point on line is inside the sphere then set foveatedFactor to 0. Otherwise, the dot product is with the line from camera to the point on the sphere that is closest to the line.
764
- const camera = frameState.camera;
765
- const boundingSphere = tile.boundingSphere;
766
- const radius = boundingSphere.radius;
788
+ // If closest point on line is inside the sphere then set foveatedFactor to 0.
789
+ // Otherwise, the dot product is with the line from camera to the point on the sphere that is closest to the line.
767
790
  const scaledCameraDirection = Cartesian3.multiplyByScalar(
768
791
  camera.directionWC,
769
792
  tile._centerZDepth,
@@ -777,7 +800,7 @@ function isPriorityDeferred(tile, frameState) {
777
800
  // The distance from the camera's view direction to the tile.
778
801
  const toLine = Cartesian3.subtract(
779
802
  closestPointOnLine,
780
- boundingSphere.center,
803
+ center,
781
804
  scratchCartesian
782
805
  );
783
806
  const distanceToCenterLine = Cartesian3.magnitude(toLine);
@@ -795,7 +818,7 @@ function isPriorityDeferred(tile, frameState) {
795
818
  scratchCartesian
796
819
  );
797
820
  const closestOnSphere = Cartesian3.add(
798
- boundingSphere.center,
821
+ center,
799
822
  scaledToLine,
800
823
  scratchCartesian
801
824
  );
@@ -818,7 +841,7 @@ function isPriorityDeferred(tile, frameState) {
818
841
  // Skip this feature if: non-skipLevelOfDetail and replace refine, if the foveated settings are turned off, if tile is progressive resolution and replace refine and skipLevelOfDetail (will help get rid of ancestor artifacts faster)
819
842
  // Or if the tile is a preload of any kind
820
843
  const replace = tile.refine === Cesium3DTileRefine.REPLACE;
821
- const skipLevelOfDetail = tileset._skipLevelOfDetail;
844
+ const skipLevelOfDetail = tileset.isSkippingLevelOfDetail;
822
845
  if (
823
846
  (replace && !skipLevelOfDetail) ||
824
847
  !tileset.foveatedScreenSpaceError ||
@@ -864,6 +887,9 @@ const scratchJulianDate = new JulianDate();
864
887
  * Get the tile's screen space error.
865
888
  *
866
889
  * @private
890
+ * @param {FrameState} frameState
891
+ * @param {Boolean} useParentGeometricError
892
+ * @param {number} progressiveResolutionHeightFraction
867
893
  */
868
894
  Cesium3DTile.prototype.getScreenSpaceError = function (
869
895
  frameState,
@@ -882,9 +908,8 @@ Cesium3DTile.prototype.getScreenSpaceError = function (
882
908
  // Leaf tiles do not have any error so save the computation
883
909
  return 0.0;
884
910
  }
885
- const camera = frameState.camera;
911
+ const { camera, context } = frameState;
886
912
  let frustum = camera.frustum;
887
- const context = frameState.context;
888
913
  const width = context.drawingBufferWidth;
889
914
  const height = context.drawingBufferHeight * heightFraction;
890
915
  let error;
@@ -892,8 +917,9 @@ Cesium3DTile.prototype.getScreenSpaceError = function (
892
917
  frameState.mode === SceneMode.SCENE2D ||
893
918
  frustum instanceof OrthographicFrustum
894
919
  ) {
895
- if (defined(frustum._offCenterFrustum)) {
896
- frustum = frustum._offCenterFrustum;
920
+ const offCenterFrustum = frustum.offCenterFrustum;
921
+ if (defined(offCenterFrustum)) {
922
+ frustum = offCenterFrustum;
897
923
  }
898
924
  const pixelSize =
899
925
  Math.max(frustum.top - frustum.bottom, frustum.right - frustum.left) /
@@ -902,7 +928,7 @@ Cesium3DTile.prototype.getScreenSpaceError = function (
902
928
  } else {
903
929
  // Avoid divide by zero when viewer is inside the tile
904
930
  const distance = Math.max(this._distanceToCamera, CesiumMath.EPSILON7);
905
- const sseDenominator = camera.frustum.sseDenominator;
931
+ const sseDenominator = frustum.sseDenominator;
906
932
  error = (geometricError * height) / (distance * sseDenominator);
907
933
  if (tileset.dynamicScreenSpaceError) {
908
934
  const density = tileset._dynamicScreenSpaceErrorComputedDensity;
@@ -917,6 +943,12 @@ Cesium3DTile.prototype.getScreenSpaceError = function (
917
943
  return error;
918
944
  };
919
945
 
946
+ /**
947
+ * @private
948
+ * @param {Cesium3DTileset} tileset
949
+ * @param {Cesium3DTile} tile
950
+ * @returns {Boolean}
951
+ */
920
952
  function isPriorityProgressiveResolution(tileset, tile) {
921
953
  if (
922
954
  tileset.progressiveResolutionHeightFraction <= 0.0 ||
@@ -944,11 +976,17 @@ function isPriorityProgressiveResolution(tileset, tile) {
944
976
  return isProgressiveResolutionTile;
945
977
  }
946
978
 
979
+ /**
980
+ * @private
981
+ * @param {Cesium3DTileset} tileset
982
+ * @param {Cesium3DTile} tile
983
+ * @returns {number}
984
+ */
947
985
  function getPriorityReverseScreenSpaceError(tileset, tile) {
948
986
  const parent = tile.parent;
949
987
  const useParentScreenSpaceError =
950
988
  defined(parent) &&
951
- (!tileset._skipLevelOfDetail ||
989
+ (!tileset.isSkippingLevelOfDetail ||
952
990
  tile._screenSpaceError === 0.0 ||
953
991
  parent.hasTilesetContent ||
954
992
  parent.hasImplicitContent);
@@ -962,10 +1000,15 @@ function getPriorityReverseScreenSpaceError(tileset, tile) {
962
1000
  * Update the tile's visibility.
963
1001
  *
964
1002
  * @private
1003
+ * @param {FrameState} frameState
965
1004
  */
966
1005
  Cesium3DTile.prototype.updateVisibility = function (frameState) {
967
- const parent = this.parent;
968
- const tileset = this._tileset;
1006
+ const { parent, tileset } = this;
1007
+ if (this._updatedVisibilityFrame === tileset._updatedVisibilityFrame) {
1008
+ // The tile has already been updated for this frame
1009
+ return;
1010
+ }
1011
+
969
1012
  const parentTransform = defined(parent)
970
1013
  ? parent.computedTransform
971
1014
  : tileset.modelMatrix;
@@ -996,6 +1039,8 @@ Cesium3DTile.prototype.updateVisibility = function (frameState) {
996
1039
  this
997
1040
  );
998
1041
  this.priorityDeferred = isPriorityDeferred(this, frameState);
1042
+
1043
+ this._updatedVisibilityFrame = tileset._updatedVisibilityFrame;
999
1044
  };
1000
1045
 
1001
1046
  /**
@@ -1018,25 +1063,35 @@ Cesium3DTile.prototype.updateExpiration = function () {
1018
1063
  }
1019
1064
  };
1020
1065
 
1066
+ /**
1067
+ * @private
1068
+ * @param {Cesium3DTile} tile
1069
+ */
1021
1070
  function updateExpireDate(tile) {
1022
- if (defined(tile.expireDuration)) {
1023
- const expireDurationDate = JulianDate.now(scratchJulianDate);
1024
- JulianDate.addSeconds(
1025
- expireDurationDate,
1026
- tile.expireDuration,
1027
- expireDurationDate
1028
- );
1071
+ if (!defined(tile.expireDuration)) {
1072
+ return;
1073
+ }
1074
+ const expireDurationDate = JulianDate.now(scratchJulianDate);
1075
+ JulianDate.addSeconds(
1076
+ expireDurationDate,
1077
+ tile.expireDuration,
1078
+ expireDurationDate
1079
+ );
1029
1080
 
1030
- if (defined(tile.expireDate)) {
1031
- if (JulianDate.lessThan(tile.expireDate, expireDurationDate)) {
1032
- JulianDate.clone(expireDurationDate, tile.expireDate);
1033
- }
1034
- } else {
1035
- tile.expireDate = JulianDate.clone(expireDurationDate);
1081
+ if (defined(tile.expireDate)) {
1082
+ if (JulianDate.lessThan(tile.expireDate, expireDurationDate)) {
1083
+ JulianDate.clone(expireDurationDate, tile.expireDate);
1036
1084
  }
1085
+ } else {
1086
+ tile.expireDate = JulianDate.clone(expireDurationDate);
1037
1087
  }
1038
1088
  }
1039
1089
 
1090
+ /**
1091
+ * @private
1092
+ * @param {Cesium3DTile} tile
1093
+ * @returns {Function}
1094
+ */
1040
1095
  function createPriorityFunction(tile) {
1041
1096
  return function () {
1042
1097
  return tile._priority;
@@ -1049,13 +1104,13 @@ function createPriorityFunction(tile) {
1049
1104
  * The request may not be made if the Cesium Request Scheduler can't prioritize it.
1050
1105
  * </p>
1051
1106
  *
1052
- * @return {number} The number of requests that were attempted but not scheduled.
1107
+ * @return {Promise<Cesium3DTileContent>|undefined} A promise that resolves when the request completes, or undefined if there is no request needed, or the request cannot be scheduled.
1053
1108
  * @private
1054
1109
  */
1055
1110
  Cesium3DTile.prototype.requestContent = function () {
1056
1111
  // empty contents don't require any HTTP requests
1057
1112
  if (this.hasEmptyContent) {
1058
- return 0;
1113
+ return;
1059
1114
  }
1060
1115
 
1061
1116
  if (this.hasMultipleContents) {
@@ -1076,6 +1131,8 @@ Cesium3DTile.prototype.requestContent = function () {
1076
1131
  * </p>
1077
1132
  *
1078
1133
  * @private
1134
+ * @param {Cesium3DTile} tile
1135
+ * @returns {Promise<Cesium3DTileContent>|Promise<undefined>|undefined} A promise that resolves to the tile content once loaded, or a promise that resolves to undefined if the request was cancelled mid-flight, or undefined if the request cannot be scheduled this frame
1079
1136
  */
1080
1137
  function requestMultipleContents(tile) {
1081
1138
  let multipleContents = tile._content;
@@ -1097,86 +1154,120 @@ function requestMultipleContents(tile) {
1097
1154
  tile._content = multipleContents;
1098
1155
  }
1099
1156
 
1100
- const backloggedRequestCount = multipleContents.requestInnerContents();
1101
- if (backloggedRequestCount > 0) {
1102
- return backloggedRequestCount;
1157
+ const promise = multipleContents.requestInnerContents();
1158
+
1159
+ if (!defined(promise)) {
1160
+ // Request could not all be scheduled this frame
1161
+ return;
1103
1162
  }
1104
1163
 
1105
1164
  tile._contentState = Cesium3DTileContentState.LOADING;
1106
- const contentReadyToProcessPromise = multipleContents.contentsFetchedPromise.then(
1107
- function () {
1108
- if (
1109
- tile._contentState !== Cesium3DTileContentState.LOADING ||
1110
- !defined(multipleContents.readyPromise)
1111
- ) {
1112
- // The tile or one of the inner content requests was canceled,
1113
- // short circuit.
1114
- return;
1115
- }
1116
-
1165
+ return promise
1166
+ .then((content) => {
1117
1167
  if (tile.isDestroyed()) {
1118
- multipleContentFailed(
1119
- tile,
1120
- tileset,
1121
- "Tile was unloaded while content was loading"
1122
- );
1168
+ // Tile is unloaded before the content can process
1123
1169
  return;
1124
1170
  }
1125
1171
 
1126
- tile._contentState = Cesium3DTileContentState.PROCESSING;
1127
- return multipleContents;
1128
- }
1129
- );
1130
- tile._contentReadyToProcessPromise = contentReadyToProcessPromise;
1131
- tile._contentReadyPromise = contentReadyToProcessPromise
1132
- .then(function (content) {
1172
+ // Tile was canceled, try again later
1133
1173
  if (!defined(content)) {
1134
- // request was canceled, short circuit.
1135
1174
  return;
1136
1175
  }
1137
1176
 
1138
- return multipleContents.readyPromise;
1177
+ tile._contentState = Cesium3DTileContentState.PROCESSING;
1178
+ return multipleContents;
1139
1179
  })
1140
- .then(function (content) {
1141
- if (!defined(content)) {
1142
- // tile was canceled, short circuit.
1143
- return;
1144
- }
1145
-
1180
+ .catch((error) => {
1146
1181
  if (tile.isDestroyed()) {
1147
- multipleContentFailed(
1148
- tile,
1149
- tileset,
1150
- "Tile was unloaded while content was processing"
1151
- );
1182
+ // Tile is unloaded before the content can process
1152
1183
  return;
1153
1184
  }
1154
1185
 
1155
- // Refresh style for expired content
1156
- tile._selectedFrame = 0;
1157
- tile.lastStyleTime = 0.0;
1158
-
1159
- JulianDate.now(tile._loadTimestamp);
1160
- tile._contentState = Cesium3DTileContentState.READY;
1161
- return content;
1162
- })
1163
- .catch(function (error) {
1164
- multipleContentFailed(tile, tileset, error);
1186
+ tile._contentState = Cesium3DTileContentState.FAILED;
1187
+ throw error;
1165
1188
  });
1166
-
1167
- return 0;
1168
1189
  }
1169
1190
 
1170
- function multipleContentFailed(tile, tileset, error) {
1171
- // note: The Multiple3DTileContent handles decrementing the number of pending
1172
- // requests if the state is LOADING.
1173
- if (tile._contentState === Cesium3DTileContentState.PROCESSING) {
1174
- --tileset.statistics.numberOfTilesProcessing;
1191
+ async function processArrayBuffer(
1192
+ tile,
1193
+ tileset,
1194
+ request,
1195
+ expired,
1196
+ requestPromise
1197
+ ) {
1198
+ const previousState = tile._contentState;
1199
+ tile._contentState = Cesium3DTileContentState.LOADING;
1200
+ ++tileset.statistics.numberOfPendingRequests;
1201
+
1202
+ let arrayBuffer;
1203
+ try {
1204
+ arrayBuffer = await requestPromise;
1205
+ } catch (error) {
1206
+ --tileset.statistics.numberOfPendingRequests;
1207
+ if (tile.isDestroyed()) {
1208
+ // Tile is unloaded before the content can process
1209
+ return;
1210
+ }
1211
+
1212
+ if (request.cancelled || request.state === RequestState.CANCELLED) {
1213
+ // Cancelled due to low priority - try again later.
1214
+ tile._contentState = previousState;
1215
+ ++tileset.statistics.numberOfAttemptedRequests;
1216
+ return;
1217
+ }
1218
+
1219
+ tile._contentState = Cesium3DTileContentState.FAILED;
1220
+ throw error;
1221
+ }
1222
+
1223
+ if (tile.isDestroyed()) {
1224
+ --tileset.statistics.numberOfPendingRequests;
1225
+ // Tile is unloaded before the content can process
1226
+ return;
1227
+ }
1228
+
1229
+ if (request.cancelled || request.state === RequestState.CANCELLED) {
1230
+ // Cancelled due to low priority - try again later.
1231
+ tile._contentState = previousState;
1232
+ --tileset.statistics.numberOfPendingRequests;
1233
+ ++tileset.statistics.numberOfAttemptedRequests;
1234
+ return;
1175
1235
  }
1176
1236
 
1177
- tile._contentState = Cesium3DTileContentState.FAILED;
1237
+ try {
1238
+ const content = await makeContent(tile, arrayBuffer);
1239
+ --tileset.statistics.numberOfPendingRequests;
1240
+
1241
+ if (tile.isDestroyed()) {
1242
+ // Tile is unloaded before the content can process
1243
+ return;
1244
+ }
1245
+
1246
+ if (expired) {
1247
+ tile.expireDate = undefined;
1248
+ }
1249
+
1250
+ tile._content = content;
1251
+ tile._contentState = Cesium3DTileContentState.PROCESSING;
1252
+
1253
+ return content;
1254
+ } catch (error) {
1255
+ --tileset.statistics.numberOfPendingRequests;
1256
+ if (tile.isDestroyed()) {
1257
+ // Tile is unloaded before the content can process
1258
+ return;
1259
+ }
1260
+
1261
+ tile._contentState = Cesium3DTileContentState.FAILED;
1262
+ throw error;
1263
+ }
1178
1264
  }
1179
1265
 
1266
+ /**
1267
+ * @private
1268
+ * @param {Cesium3DTile} tile
1269
+ * @returns {Promise<Cesium3DTileContent>|Promise<undefined>|undefined} A promise that resolves to the tile content once loaded; a promise that resolves to undefined if the tile was destroyed before processing can happen or the request was cancelled mid-flight; or undefined if the request cannot be scheduled this frame.
1270
+ */
1180
1271
  function requestSingleContent(tile) {
1181
1272
  // it is important to clone here. The fetchArrayBuffer() below uses
1182
1273
  // throttling, but other uses of the resources do not.
@@ -1199,85 +1290,14 @@ function requestSingleContent(tile) {
1199
1290
 
1200
1291
  tile._request = request;
1201
1292
  resource.request = request;
1202
-
1293
+ const tileset = tile._tileset;
1203
1294
  const promise = resource.fetchArrayBuffer();
1204
1295
  if (!defined(promise)) {
1205
- return 1;
1296
+ ++tileset.statistics.numberOfAttemptedRequests;
1297
+ return;
1206
1298
  }
1207
1299
 
1208
- const previousState = tile._contentState;
1209
- const tileset = tile._tileset;
1210
- tile._contentState = Cesium3DTileContentState.LOADING;
1211
- ++tileset.statistics.numberOfPendingRequests;
1212
- const contentReadyToProcessPromise = promise.then(function (arrayBuffer) {
1213
- if (tile.isDestroyed()) {
1214
- // Tile is unloaded before the content finishes loading
1215
- singleContentFailed(tile, tileset);
1216
- return;
1217
- }
1218
-
1219
- const content = makeContent(tile, arrayBuffer);
1220
-
1221
- if (expired) {
1222
- tile.expireDate = undefined;
1223
- }
1224
-
1225
- tile._content = content;
1226
- tile._contentState = Cesium3DTileContentState.PROCESSING;
1227
- return content;
1228
- });
1229
- tile._contentReadyToProcessPromise = contentReadyToProcessPromise;
1230
- tile._contentReadyPromise = contentReadyToProcessPromise
1231
- .then(function (content) {
1232
- if (!defined(content)) {
1233
- return;
1234
- }
1235
-
1236
- --tileset.statistics.numberOfPendingRequests;
1237
- return content.readyPromise;
1238
- })
1239
- .then(function (content) {
1240
- if (!defined(content)) {
1241
- return;
1242
- }
1243
-
1244
- if (tile.isDestroyed()) {
1245
- // Tile is unloaded before the content finishes processing
1246
- singleContentFailed(tile, tileset);
1247
- return;
1248
- }
1249
- updateExpireDate(tile);
1250
-
1251
- // Refresh style for expired content
1252
- tile._selectedFrame = 0;
1253
- tile.lastStyleTime = 0.0;
1254
-
1255
- JulianDate.now(tile._loadTimestamp);
1256
- tile._contentState = Cesium3DTileContentState.READY;
1257
- return content;
1258
- })
1259
- .catch(function (error) {
1260
- if (request.state === RequestState.CANCELLED) {
1261
- // Cancelled due to low priority - try again later.
1262
- tile._contentState = previousState;
1263
- --tileset.statistics.numberOfPendingRequests;
1264
- ++tileset.statistics.numberOfAttemptedRequests;
1265
- return Promise.reject("Cancelled");
1266
- }
1267
- singleContentFailed(tile, tileset);
1268
- return Promise.reject(error);
1269
- });
1270
-
1271
- return 0;
1272
- }
1273
-
1274
- function singleContentFailed(tile, tileset) {
1275
- if (tile._contentState === Cesium3DTileContentState.PROCESSING) {
1276
- --tileset.statistics.numberOfTilesProcessing;
1277
- } else {
1278
- --tileset.statistics.numberOfPendingRequests;
1279
- }
1280
- tile._contentState = Cesium3DTileContentState.FAILED;
1300
+ return processArrayBuffer(tile, tileset, request, expired, promise);
1281
1301
  }
1282
1302
 
1283
1303
  /**
@@ -1288,10 +1308,10 @@ function singleContentFailed(tile, tileset) {
1288
1308
  *
1289
1309
  * @param {Cesium3DTile} tile The tile
1290
1310
  * @param {ArrayBuffer} arrayBuffer The downloaded payload containing data for the content
1291
- * @return {Cesium3DTileContent} A content object
1311
+ * @return {Promise<Cesium3DTileContent>} A content object
1292
1312
  * @private
1293
1313
  */
1294
- function makeContent(tile, arrayBuffer) {
1314
+ async function makeContent(tile, arrayBuffer) {
1295
1315
  const preprocessed = preprocess3DTileContent(arrayBuffer);
1296
1316
 
1297
1317
  // Vector and Geometry tile rendering do not support the skip LOD optimization.
@@ -1314,21 +1334,29 @@ function makeContent(tile, arrayBuffer) {
1314
1334
 
1315
1335
  let content;
1316
1336
  const contentFactory = Cesium3DTileContentFactory[preprocessed.contentType];
1337
+ if (tile.isDestroyed()) {
1338
+ return;
1339
+ }
1340
+
1317
1341
  if (defined(preprocessed.binaryPayload)) {
1318
- content = contentFactory(
1319
- tileset,
1320
- tile,
1321
- tile._contentResource,
1322
- preprocessed.binaryPayload.buffer,
1323
- 0
1342
+ content = await Promise.resolve(
1343
+ contentFactory(
1344
+ tileset,
1345
+ tile,
1346
+ tile._contentResource,
1347
+ preprocessed.binaryPayload.buffer,
1348
+ 0
1349
+ )
1324
1350
  );
1325
1351
  } else {
1326
1352
  // JSON formats
1327
- content = contentFactory(
1328
- tileset,
1329
- tile,
1330
- tile._contentResource,
1331
- preprocessed.jsonPayload
1353
+ content = await Promise.resolve(
1354
+ contentFactory(
1355
+ tileset,
1356
+ tile,
1357
+ tile._contentResource,
1358
+ preprocessed.jsonPayload
1359
+ )
1332
1360
  );
1333
1361
  }
1334
1362
 
@@ -1372,18 +1400,12 @@ Cesium3DTile.prototype.cancelRequests = function () {
1372
1400
  * @private
1373
1401
  */
1374
1402
  Cesium3DTile.prototype.unloadContent = function () {
1375
- if (
1376
- this.hasEmptyContent ||
1377
- this.hasTilesetContent ||
1378
- this.hasImplicitContent
1379
- ) {
1403
+ if (!this.hasRenderableContent) {
1380
1404
  return;
1381
1405
  }
1382
1406
 
1383
1407
  this._content = this._content && this._content.destroy();
1384
1408
  this._contentState = Cesium3DTileContentState.UNLOADED;
1385
- this._contentReadyToProcessPromise = undefined;
1386
- this._contentReadyPromise = undefined;
1387
1409
 
1388
1410
  this.lastStyleTime = 0.0;
1389
1411
  this.clippingPlanesDirty = this._clippingPlanesState === 0;
@@ -1402,6 +1424,12 @@ Cesium3DTile.prototype.unloadContent = function () {
1402
1424
 
1403
1425
  const scratchProjectedBoundingSphere = new BoundingSphere();
1404
1426
 
1427
+ /**
1428
+ * @private
1429
+ * @param {Cesium3DTile} tile
1430
+ * @param {FrameState} frameState
1431
+ * @returns {TileBoundingVolume}
1432
+ */
1405
1433
  function getBoundingVolume(tile, frameState) {
1406
1434
  if (
1407
1435
  frameState.mode !== SceneMode.SCENE3D &&
@@ -1424,6 +1452,12 @@ function getBoundingVolume(tile, frameState) {
1424
1452
  : tile._boundingVolume;
1425
1453
  }
1426
1454
 
1455
+ /**
1456
+ * @private
1457
+ * @param {Cesium3DTile} tile
1458
+ * @param {FrameState} frameState
1459
+ * @returns {TileBoundingVolume}
1460
+ */
1427
1461
  function getContentBoundingVolume(tile, frameState) {
1428
1462
  if (
1429
1463
  frameState.mode !== SceneMode.SCENE3D &&
@@ -1581,6 +1615,13 @@ const scratchRectangle = new Rectangle();
1581
1615
  const scratchOrientedBoundingBox = new OrientedBoundingBox();
1582
1616
  const scratchTransform = new Matrix4();
1583
1617
 
1618
+ /**
1619
+ * @private
1620
+ * @param {Array} box An array of 12 numbers that define an oriented bounding box
1621
+ * @param {Matrix4} transform
1622
+ * @param {TileBoundingVolume} [result]
1623
+ * @returns {TileOrientedBoundingBox}
1624
+ */
1584
1625
  function createBox(box, transform, result) {
1585
1626
  let center = Cartesian3.fromElements(box[0], box[1], box[2], scratchCenter);
1586
1627
  let halfAxes = Matrix3.fromArray(box, 3, scratchHalfAxes);
@@ -1597,6 +1638,14 @@ function createBox(box, transform, result) {
1597
1638
  return new TileOrientedBoundingBox(center, halfAxes);
1598
1639
  }
1599
1640
 
1641
+ /**
1642
+ * @private
1643
+ * @param {Array} region An array of six numbers that define a bounding geographic region in EPSG:4979 coordinates with the order [west, south, east, north, minimum height, maximum height]
1644
+ * @param {Matrix4} transform
1645
+ * @param {Matrix4} initialTransform
1646
+ * @param {TileOrientedBoundingBox} [result]
1647
+ * @returns {TileOrientedBoundingBox}
1648
+ */
1600
1649
  function createBoxFromTransformedRegion(
1601
1650
  region,
1602
1651
  transform,
@@ -1637,6 +1686,14 @@ function createBoxFromTransformedRegion(
1637
1686
  return new TileOrientedBoundingBox(center, halfAxes);
1638
1687
  }
1639
1688
 
1689
+ /**
1690
+ * @private
1691
+ * @param {Array} region An array of six numbers that define a bounding geographic region in EPSG:4979 coordinates with the order [west, south, east, north, minimum height, maximum height]
1692
+ * @param {Matrix4} transform
1693
+ * @param {Matrix4} initialTransform
1694
+ * @param {TileBoundingVolume} [result]
1695
+ * @returns {TileBoundingVolume}
1696
+ */
1640
1697
  function createRegion(region, transform, initialTransform, result) {
1641
1698
  if (
1642
1699
  !Matrix4.equalsEpsilon(transform, initialTransform, CesiumMath.EPSILON8)
@@ -1662,6 +1719,13 @@ function createRegion(region, transform, initialTransform, result) {
1662
1719
  });
1663
1720
  }
1664
1721
 
1722
+ /**
1723
+ * @private
1724
+ * @param {Array} sphere An array of four numbers that define a bounding sphere
1725
+ * @param {Matrix4} transform
1726
+ * @param {TileBoundingVolume} [result]
1727
+ * @returns {TileBoundingSphere}
1728
+ */
1665
1729
  function createSphere(sphere, transform, result) {
1666
1730
  let center = Cartesian3.fromElements(
1667
1731
  sphere[0],
@@ -1710,19 +1774,15 @@ Cesium3DTile.prototype.createBoundingVolume = function (
1710
1774
  );
1711
1775
  }
1712
1776
 
1713
- if (defined(boundingVolumeHeader.box)) {
1714
- return createBox(boundingVolumeHeader.box, transform, result);
1777
+ const { box, region, sphere } = boundingVolumeHeader;
1778
+ if (defined(box)) {
1779
+ return createBox(box, transform, result);
1715
1780
  }
1716
- if (defined(boundingVolumeHeader.region)) {
1717
- return createRegion(
1718
- boundingVolumeHeader.region,
1719
- transform,
1720
- this._initialTransform,
1721
- result
1722
- );
1781
+ if (defined(region)) {
1782
+ return createRegion(region, transform, this._initialTransform, result);
1723
1783
  }
1724
- if (defined(boundingVolumeHeader.sphere)) {
1725
- return createSphere(boundingVolumeHeader.sphere, transform, result);
1784
+ if (defined(sphere)) {
1785
+ return createSphere(sphere, transform, result);
1726
1786
  }
1727
1787
  throw new RuntimeError(
1728
1788
  "boundingVolume must contain a sphere, region, or box"
@@ -1733,10 +1793,11 @@ Cesium3DTile.prototype.createBoundingVolume = function (
1733
1793
  * Update the tile's transform. The transform is applied to the tile's bounding volumes.
1734
1794
  *
1735
1795
  * @private
1796
+ * @param {Matrix4} parentTransform
1736
1797
  */
1737
1798
  Cesium3DTile.prototype.updateTransform = function (parentTransform) {
1738
1799
  parentTransform = defaultValue(parentTransform, Matrix4.IDENTITY);
1739
- const computedTransform = Matrix4.multiply(
1800
+ const computedTransform = Matrix4.multiplyTransformation(
1740
1801
  parentTransform,
1741
1802
  this.transform,
1742
1803
  scratchTransform
@@ -1799,6 +1860,13 @@ Cesium3DTile.prototype.updateGeometricErrorScale = function () {
1799
1860
  }
1800
1861
  };
1801
1862
 
1863
+ /**
1864
+ * @private
1865
+ * @param {Cesium3DTile} tile
1866
+ * @param {Cesium3DTileset} tileset
1867
+ * @param {FrameState} frameState
1868
+ * @param {object} passOptions
1869
+ */
1802
1870
  function applyDebugSettings(tile, tileset, frameState, passOptions) {
1803
1871
  if (!passOptions.isRender) {
1804
1872
  return;
@@ -1806,8 +1874,6 @@ function applyDebugSettings(tile, tileset, frameState, passOptions) {
1806
1874
 
1807
1875
  const hasContentBoundingVolume =
1808
1876
  defined(tile._contentHeader) && defined(tile._contentHeader.boundingVolume);
1809
- const empty =
1810
- tile.hasEmptyContent || tile.hasTilesetContent || tile.hasImplicitContent;
1811
1877
 
1812
1878
  const showVolume =
1813
1879
  tileset.debugShowBoundingVolume ||
@@ -1816,7 +1882,7 @@ function applyDebugSettings(tile, tileset, frameState, passOptions) {
1816
1882
  let color;
1817
1883
  if (!tile._finalResolution) {
1818
1884
  color = Color.YELLOW;
1819
- } else if (empty) {
1885
+ } else if (!tile.hasRenderableContent) {
1820
1886
  color = Color.DARKGRAY;
1821
1887
  } else {
1822
1888
  color = Color.WHITE;
@@ -1892,15 +1958,24 @@ function applyDebugSettings(tile, tileset, frameState, passOptions) {
1892
1958
  }
1893
1959
  }
1894
1960
 
1961
+ /**
1962
+ * @private
1963
+ * @param {Cesium3DTile} tile
1964
+ * @param {Cesium3DTileset} tileset
1965
+ * @param {FrameState} frameState
1966
+ */
1895
1967
  function updateContent(tile, tileset, frameState) {
1896
- const content = tile._content;
1897
1968
  const expiredContent = tile._expiredContent;
1898
1969
 
1899
1970
  // expired content is not supported for multiple contents
1900
1971
  if (!tile.hasMultipleContents && defined(expiredContent)) {
1901
1972
  if (!tile.contentReady) {
1902
1973
  // Render the expired content while the content loads
1903
- expiredContent.update(tileset, frameState);
1974
+ try {
1975
+ expiredContent.update(tileset, frameState);
1976
+ } catch (error) {
1977
+ // Eat error for expired content
1978
+ }
1904
1979
  return;
1905
1980
  }
1906
1981
 
@@ -1909,14 +1984,30 @@ function updateContent(tile, tileset, frameState) {
1909
1984
  tile._expiredContent = undefined;
1910
1985
  }
1911
1986
 
1912
- content.update(tileset, frameState);
1987
+ if (!defined(tile.content)) {
1988
+ // Implicit placeholder tile
1989
+ return;
1990
+ }
1991
+
1992
+ try {
1993
+ tile.content.update(tileset, frameState);
1994
+ } catch (error) {
1995
+ tile._contentState = Cesium3DTileContentState.FAILED;
1996
+ throw error;
1997
+ }
1913
1998
  }
1914
1999
 
2000
+ /**
2001
+ * Compute and compare ClippingPlanes state:
2002
+ * - enabled-ness - are clipping planes enabled? is this tile clipped?
2003
+ * - clipping plane count
2004
+ * - clipping function (union v. intersection)
2005
+
2006
+ * @private
2007
+ * @param {Cesium3DTile} tile
2008
+ * @param {Cesium3DTileset} tileset
2009
+ */
1915
2010
  function updateClippingPlanes(tile, tileset) {
1916
- // Compute and compare ClippingPlanes state:
1917
- // - enabled-ness - are clipping planes enabled? is this tile clipped?
1918
- // - clipping plane count
1919
- // - clipping function (union v. intersection)
1920
2011
  const clippingPlanes = tileset.clippingPlanes;
1921
2012
  let currentClippingPlanesState = 0;
1922
2013
  if (defined(clippingPlanes) && tile._isClipped && clippingPlanes.enabled) {
@@ -1933,20 +2024,23 @@ function updateClippingPlanes(tile, tileset) {
1933
2024
  * Get the draw commands needed to render this tile.
1934
2025
  *
1935
2026
  * @private
2027
+ * @param {Cesium3DTileset} tileset
2028
+ * @param {FrameState} frameState
2029
+ * @param {object} passOptions
1936
2030
  */
1937
2031
  Cesium3DTile.prototype.update = function (tileset, frameState, passOptions) {
1938
- const commandStart = frameState.commandList.length;
2032
+ const { commandList } = frameState;
2033
+ const commandStart = commandList.length;
1939
2034
 
1940
2035
  updateClippingPlanes(this, tileset);
1941
2036
  applyDebugSettings(this, tileset, frameState, passOptions);
1942
2037
  updateContent(this, tileset, frameState);
1943
2038
 
1944
- const commandEnd = frameState.commandList.length;
1945
- const commandsLength = commandEnd - commandStart;
1946
- this._commandsLength = commandsLength;
2039
+ const commandEnd = commandList.length;
2040
+ this._commandsLength = commandEnd - commandStart;
1947
2041
 
1948
- for (let i = 0; i < commandsLength; ++i) {
1949
- const command = frameState.commandList[commandStart + i];
2042
+ for (let i = commandStart; i < commandEnd; ++i) {
2043
+ const command = commandList[i];
1950
2044
  const translucent = command.pass === Pass.TRANSLUCENT;
1951
2045
  command.depthForTranslucentClassification = translucent;
1952
2046
  }
@@ -1965,26 +2059,68 @@ const scratchCommandList = [];
1965
2059
  * @private
1966
2060
  */
1967
2061
  Cesium3DTile.prototype.process = function (tileset, frameState) {
2062
+ if (!this.contentExpired && !this.contentReady && this._content.ready) {
2063
+ updateExpireDate(this);
2064
+
2065
+ // Refresh style for expired content
2066
+ this._selectedFrame = 0;
2067
+ this.lastStyleTime = 0.0;
2068
+
2069
+ JulianDate.now(this._loadTimestamp);
2070
+ this._contentState = Cesium3DTileContentState.READY;
2071
+
2072
+ if (!this.hasTilesetContent && !this.hasImplicitContent) {
2073
+ // RESEARCH_IDEA: ability to unload tiles (without content) for an
2074
+ // external tileset when all the tiles are unloaded.
2075
+ tileset._statistics.incrementLoadCounts(this.content);
2076
+ ++tileset._statistics.numberOfTilesWithContentReady;
2077
+ ++tileset._statistics.numberOfLoadedTilesTotal;
2078
+
2079
+ // Add to the tile cache. Previously expired tiles are already in the cache and won't get re-added.
2080
+ tileset._cache.add(this);
2081
+ }
2082
+ }
2083
+
1968
2084
  const savedCommandList = frameState.commandList;
1969
2085
  frameState.commandList = scratchCommandList;
1970
2086
 
1971
- this._content.update(tileset, frameState);
2087
+ try {
2088
+ this._content.update(tileset, frameState);
2089
+ } catch (error) {
2090
+ this._contentState = Cesium3DTileContentState.FAILED;
2091
+ throw error;
2092
+ }
1972
2093
 
1973
2094
  scratchCommandList.length = 0;
1974
2095
  frameState.commandList = savedCommandList;
1975
2096
  };
1976
2097
 
2098
+ /**
2099
+ * @private
2100
+ * @param {number} normalizedValue
2101
+ * @param {number} numberOfDigits
2102
+ * @param {number} leftShift
2103
+ * @returns {number}
2104
+ */
1977
2105
  function isolateDigits(normalizedValue, numberOfDigits, leftShift) {
1978
2106
  const scaled = normalizedValue * Math.pow(10, numberOfDigits);
1979
2107
  const integer = parseInt(scaled);
1980
2108
  return integer * Math.pow(10, leftShift);
1981
2109
  }
1982
2110
 
2111
+ /**
2112
+ * @private
2113
+ * @param {number} value
2114
+ * @param {number} minimum
2115
+ * @param {number} maximum
2116
+ * @returns {number}
2117
+ */
1983
2118
  function priorityNormalizeAndClamp(value, minimum, maximum) {
2119
+ // Subtract epsilon since we only want decimal digits present in the output.
1984
2120
  return Math.max(
1985
2121
  CesiumMath.normalize(value, minimum, maximum) - CesiumMath.EPSILON7,
1986
2122
  0.0
1987
- ); // Subtract epsilon since we only want decimal digits present in the output.
2123
+ );
1988
2124
  }
1989
2125
 
1990
2126
  /**
@@ -2044,7 +2180,8 @@ Cesium3DTile.prototype.updatePriority = function () {
2044
2180
 
2045
2181
  // Map 0-1 then convert to digit. Include a distance sort when doing non-skipLOD and replacement refinement, helps things like non-skipLOD photogrammetry
2046
2182
  const useDistance =
2047
- !tileset._skipLevelOfDetail && this.refine === Cesium3DTileRefine.REPLACE;
2183
+ !tileset.isSkippingLevelOfDetail &&
2184
+ this.refine === Cesium3DTileRefine.REPLACE;
2048
2185
  const normalizedPreferredSorting = useDistance
2049
2186
  ? priorityNormalizeAndClamp(
2050
2187
  this._priorityHolder._distanceToCamera,
@@ -2118,4 +2255,5 @@ Cesium3DTile.prototype.destroy = function () {
2118
2255
  this._debugViewerRequestVolume && this._debugViewerRequestVolume.destroy();
2119
2256
  return destroyObject(this);
2120
2257
  };
2258
+
2121
2259
  export default Cesium3DTile;