@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
@@ -0,0 +1,421 @@
1
+ import defined from "../Core/defined.js";
2
+ import ManagedArray from "../Core/ManagedArray.js";
3
+ import Cesium3DTileRefine from "./Cesium3DTileRefine.js";
4
+ import Cesium3DTilesetTraversal from "./Cesium3DTilesetTraversal.js";
5
+
6
+ /**
7
+ * Depth-first traversal that traverses all visible tiles and marks tiles for selection.
8
+ * Allows for skipping levels of the tree and rendering children and parent tiles simultaneously.
9
+ *
10
+ * @alias Cesium3DTilesetSkipTraversal
11
+ * @constructor
12
+ *
13
+ * @private
14
+ */
15
+ function Cesium3DTilesetSkipTraversal() {}
16
+
17
+ const traversal = {
18
+ stack: new ManagedArray(),
19
+ stackMaximumLength: 0,
20
+ };
21
+
22
+ const descendantTraversal = {
23
+ stack: new ManagedArray(),
24
+ stackMaximumLength: 0,
25
+ };
26
+
27
+ const selectionTraversal = {
28
+ stack: new ManagedArray(),
29
+ stackMaximumLength: 0,
30
+ ancestorStack: new ManagedArray(),
31
+ ancestorStackMaximumLength: 0,
32
+ };
33
+
34
+ const descendantSelectionDepth = 2;
35
+
36
+ /**
37
+ * Traverses a {@link Cesium3DTileset} to determine which tiles to load and render.
38
+ *
39
+ * @private
40
+ * @param {Cesium3DTileset} tileset
41
+ * @param {FrameState} frameState
42
+ */
43
+ Cesium3DTilesetSkipTraversal.selectTiles = function (tileset, frameState) {
44
+ tileset._requestedTiles.length = 0;
45
+
46
+ if (tileset.debugFreezeFrame) {
47
+ return;
48
+ }
49
+
50
+ tileset._selectedTiles.length = 0;
51
+ tileset._selectedTilesToStyle.length = 0;
52
+ tileset._emptyTiles.length = 0;
53
+ tileset.hasMixedContent = false;
54
+
55
+ const root = tileset.root;
56
+ Cesium3DTilesetTraversal.updateTile(root, frameState);
57
+
58
+ if (!root.isVisible) {
59
+ return;
60
+ }
61
+
62
+ if (
63
+ root.getScreenSpaceError(frameState, true) <=
64
+ tileset._maximumScreenSpaceError
65
+ ) {
66
+ return;
67
+ }
68
+
69
+ executeTraversal(root, frameState);
70
+ traverseAndSelect(root, frameState);
71
+
72
+ traversal.stack.trim(traversal.stackMaximumLength);
73
+ descendantTraversal.stack.trim(descendantTraversal.stackMaximumLength);
74
+ selectionTraversal.stack.trim(selectionTraversal.stackMaximumLength);
75
+ selectionTraversal.ancestorStack.trim(
76
+ selectionTraversal.ancestorStackMaximumLength
77
+ );
78
+
79
+ // Update the priority for any requests found during traversal
80
+ // Update after traversal so that min and max values can be used to normalize priority values
81
+ const requestedTiles = tileset._requestedTiles;
82
+ for (let i = 0; i < requestedTiles.length; ++i) {
83
+ requestedTiles[i].updatePriority();
84
+ }
85
+ };
86
+
87
+ /**
88
+ * Mark descendant tiles for rendering, and update as needed
89
+ *
90
+ * @private
91
+ * @param {Cesium3DTile} root
92
+ * @param {FrameState} frameState
93
+ */
94
+ function selectDescendants(root, frameState) {
95
+ const { updateTile, touchTile, selectTile } = Cesium3DTilesetTraversal;
96
+ const stack = descendantTraversal.stack;
97
+ stack.push(root);
98
+ while (stack.length > 0) {
99
+ descendantTraversal.stackMaximumLength = Math.max(
100
+ descendantTraversal.stackMaximumLength,
101
+ stack.length
102
+ );
103
+ const tile = stack.pop();
104
+ const children = tile.children;
105
+ for (let i = 0; i < children.length; ++i) {
106
+ const child = children[i];
107
+ if (child.isVisible) {
108
+ if (child.contentAvailable) {
109
+ updateTile(child, frameState);
110
+ touchTile(child, frameState);
111
+ selectTile(child, frameState);
112
+ } else if (child._depth - root._depth < descendantSelectionDepth) {
113
+ // Continue traversing, but not too far
114
+ stack.push(child);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Mark a tile as selected if it has content available.
123
+ * If its content is not available, and we are skipping levels of detail,
124
+ * select an ancestor or descendant tile instead
125
+ *
126
+ * @private
127
+ * @param {Cesium3DTile} tile
128
+ * @param {FrameState} frameState
129
+ */
130
+ function selectDesiredTile(tile, frameState) {
131
+ // If this tile is not loaded attempt to select its ancestor instead
132
+ const loadedTile = tile.contentAvailable
133
+ ? tile
134
+ : tile._ancestorWithContentAvailable;
135
+ if (defined(loadedTile)) {
136
+ // Tiles will actually be selected in traverseAndSelect
137
+ loadedTile._shouldSelect = true;
138
+ } else {
139
+ // If no ancestors are ready traverse down and select tiles to minimize empty regions.
140
+ // This happens often for immediatelyLoadDesiredLevelOfDetail where parent tiles are not necessarily loaded before zooming out.
141
+ selectDescendants(tile, frameState);
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Update links to the ancestor tiles that have content
147
+ *
148
+ * @private
149
+ * @param {Cesium3DTile} tile
150
+ * @param {FrameState} frameState
151
+ */
152
+ function updateTileAncestorContentLinks(tile, frameState) {
153
+ tile._ancestorWithContent = undefined;
154
+ tile._ancestorWithContentAvailable = undefined;
155
+
156
+ const { parent } = tile;
157
+ if (!defined(parent)) {
158
+ return;
159
+ }
160
+ const parentHasContent =
161
+ !parent.hasUnloadedRenderableContent ||
162
+ parent._requestedFrame === frameState.frameNumber;
163
+
164
+ // ancestorWithContent is an ancestor that has content or has the potential to have
165
+ // content. Used in conjunction with tileset.skipLevels to know when to skip a tile.
166
+ tile._ancestorWithContent = parentHasContent
167
+ ? parent
168
+ : parent._ancestorWithContent;
169
+
170
+ // ancestorWithContentAvailable is an ancestor that is rendered if a desired tile is not loaded
171
+ tile._ancestorWithContentAvailable = parent.contentAvailable
172
+ ? parent
173
+ : parent._ancestorWithContentAvailable;
174
+ }
175
+
176
+ /**
177
+ * Determine if a tile has reached the limit of level of detail skipping.
178
+ * If so, it should _not_ be skipped: it should be loaded and rendered
179
+ *
180
+ * @private
181
+ * @param {Cesium3DTileset} tileset
182
+ * @param {Cesium3DTile} tile
183
+ * @returns {boolean} true if this tile should not be skipped
184
+ */
185
+ function reachedSkippingThreshold(tileset, tile) {
186
+ const ancestor = tile._ancestorWithContent;
187
+ return (
188
+ !tileset.immediatelyLoadDesiredLevelOfDetail &&
189
+ (tile._priorityProgressiveResolutionScreenSpaceErrorLeaf ||
190
+ (defined(ancestor) &&
191
+ tile._screenSpaceError <
192
+ ancestor._screenSpaceError / tileset.skipScreenSpaceErrorFactor &&
193
+ tile._depth > ancestor._depth + tileset.skipLevels))
194
+ );
195
+ }
196
+
197
+ /**
198
+ * @private
199
+ * @param {Cesium3DTile} tile
200
+ * @param {ManagedArray} stack
201
+ * @param {FrameState} frameState
202
+ * @returns {boolean}
203
+ */
204
+ function updateAndPushChildren(tile, stack, frameState) {
205
+ const { tileset, children } = tile;
206
+ const { updateTile, loadTile, touchTile } = Cesium3DTilesetTraversal;
207
+
208
+ for (let i = 0; i < children.length; ++i) {
209
+ updateTile(children[i], frameState);
210
+ }
211
+
212
+ // Sort by distance to take advantage of early Z and reduce artifacts
213
+ children.sort(Cesium3DTilesetTraversal.sortChildrenByDistanceToCamera);
214
+
215
+ let anyChildrenVisible = false;
216
+
217
+ for (let i = 0; i < children.length; ++i) {
218
+ const child = children[i];
219
+ if (child.isVisible) {
220
+ stack.push(child);
221
+ anyChildrenVisible = true;
222
+ } else if (tileset.loadSiblings) {
223
+ loadTile(child, frameState);
224
+ touchTile(child, frameState);
225
+ }
226
+ }
227
+
228
+ return anyChildrenVisible;
229
+ }
230
+
231
+ /**
232
+ * Determine if a tile is part of the base traversal.
233
+ * If not, this tile could be considered for level of detail skipping
234
+ *
235
+ * @private
236
+ * @param {Cesium3DTile} tile
237
+ * @param {number} baseScreenSpaceError
238
+ * @returns {boolean}
239
+ */
240
+ function inBaseTraversal(tile, baseScreenSpaceError) {
241
+ const { tileset } = tile;
242
+ if (tileset.immediatelyLoadDesiredLevelOfDetail) {
243
+ return false;
244
+ }
245
+ if (!defined(tile._ancestorWithContent)) {
246
+ // Include root or near-root tiles in the base traversal so there is something to select up to
247
+ return true;
248
+ }
249
+ if (tile._screenSpaceError === 0.0) {
250
+ // If a leaf, use parent's SSE
251
+ return tile.parent._screenSpaceError > baseScreenSpaceError;
252
+ }
253
+ return tile._screenSpaceError > baseScreenSpaceError;
254
+ }
255
+
256
+ /**
257
+ * Depth-first traversal that traverses all visible tiles and marks tiles for selection.
258
+ * Tiles that have a greater screen space error than the base screen space error are part of the base traversal,
259
+ * all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree
260
+ * and rendering children and parent tiles simultaneously.
261
+ *
262
+ * @private
263
+ * @param {Cesium3DTile} root
264
+ * @param {FrameState} frameState
265
+ */
266
+ function executeTraversal(root, frameState) {
267
+ const { tileset } = root;
268
+ const baseScreenSpaceError = tileset.immediatelyLoadDesiredLevelOfDetail
269
+ ? Number.MAX_VALUE
270
+ : Math.max(tileset.baseScreenSpaceError, tileset.maximumScreenSpaceError);
271
+ const {
272
+ canTraverse,
273
+ loadTile,
274
+ visitTile,
275
+ touchTile,
276
+ } = Cesium3DTilesetTraversal;
277
+ const stack = traversal.stack;
278
+ stack.push(root);
279
+
280
+ while (stack.length > 0) {
281
+ traversal.stackMaximumLength = Math.max(
282
+ traversal.stackMaximumLength,
283
+ stack.length
284
+ );
285
+
286
+ const tile = stack.pop();
287
+
288
+ updateTileAncestorContentLinks(tile, frameState);
289
+ const parent = tile.parent;
290
+ const parentRefines = !defined(parent) || parent._refines;
291
+
292
+ tile._refines = canTraverse(tile)
293
+ ? updateAndPushChildren(tile, stack, frameState) && parentRefines
294
+ : false;
295
+
296
+ const stoppedRefining = !tile._refines && parentRefines;
297
+
298
+ if (!tile.hasRenderableContent) {
299
+ // Add empty tile just to show its debug bounding volume
300
+ // If the tile has tileset content load the external tileset
301
+ // If the tile cannot refine further select its nearest loaded ancestor
302
+ tileset._emptyTiles.push(tile);
303
+ loadTile(tile, frameState);
304
+ if (stoppedRefining) {
305
+ selectDesiredTile(tile, frameState);
306
+ }
307
+ } else if (tile.refine === Cesium3DTileRefine.ADD) {
308
+ // Additive tiles are always loaded and selected
309
+ selectDesiredTile(tile, frameState);
310
+ loadTile(tile, frameState);
311
+ } else if (tile.refine === Cesium3DTileRefine.REPLACE) {
312
+ if (inBaseTraversal(tile, baseScreenSpaceError)) {
313
+ // Always load tiles in the base traversal
314
+ // Select tiles that can't refine further
315
+ loadTile(tile, frameState);
316
+ if (stoppedRefining) {
317
+ selectDesiredTile(tile, frameState);
318
+ }
319
+ } else if (stoppedRefining) {
320
+ // In skip traversal, load and select tiles that can't refine further
321
+ selectDesiredTile(tile, frameState);
322
+ loadTile(tile, frameState);
323
+ } else if (reachedSkippingThreshold(tileset, tile)) {
324
+ // In skip traversal, load tiles that aren't skipped
325
+ loadTile(tile, frameState);
326
+ }
327
+ }
328
+
329
+ visitTile(tile, frameState);
330
+ touchTile(tile, frameState);
331
+ }
332
+ }
333
+
334
+ /**
335
+ * Traverse the tree and check if their selected frame is the current frame. If so, add it to a selection queue.
336
+ * This is a preorder traversal so children tiles are selected before ancestor tiles.
337
+ *
338
+ * The reason for the preorder traversal is so that tiles can easily be marked with their
339
+ * selection depth. A tile's _selectionDepth is its depth in the tree where all non-selected tiles are removed.
340
+ * This property is important for use in the stencil test because we want to render deeper tiles on top of their
341
+ * ancestors. If a tileset is very deep, the depth is unlikely to fit into the stencil buffer.
342
+ *
343
+ * We want to select children before their ancestors because there is no guarantee on the relationship between
344
+ * the children's z-depth and the ancestor's z-depth. We cannot rely on Z because we want the child to appear on top
345
+ * of ancestor regardless of true depth. The stencil tests used require children to be drawn first.
346
+ *
347
+ * NOTE: 3D Tiles uses 3 bits from the stencil buffer meaning this will not work when there is a chain of
348
+ * selected tiles that is deeper than 7. This is not very likely.
349
+ *
350
+ * @private
351
+ * @param {Cesium3DTile} root
352
+ * @param {FrameState} frameState
353
+ */
354
+ function traverseAndSelect(root, frameState) {
355
+ const { selectTile, canTraverse } = Cesium3DTilesetTraversal;
356
+ const { stack, ancestorStack } = selectionTraversal;
357
+ let lastAncestor;
358
+
359
+ stack.push(root);
360
+
361
+ while (stack.length > 0 || ancestorStack.length > 0) {
362
+ selectionTraversal.stackMaximumLength = Math.max(
363
+ selectionTraversal.stackMaximumLength,
364
+ stack.length
365
+ );
366
+ selectionTraversal.ancestorStackMaximumLength = Math.max(
367
+ selectionTraversal.ancestorStackMaximumLength,
368
+ ancestorStack.length
369
+ );
370
+
371
+ if (ancestorStack.length > 0) {
372
+ const waitingTile = ancestorStack.peek();
373
+ if (waitingTile._stackLength === stack.length) {
374
+ ancestorStack.pop();
375
+ if (waitingTile !== lastAncestor) {
376
+ waitingTile._finalResolution = false;
377
+ }
378
+ selectTile(waitingTile, frameState);
379
+ continue;
380
+ }
381
+ }
382
+
383
+ const tile = stack.pop();
384
+ if (!defined(tile)) {
385
+ // stack is empty but ancestorStack isn't
386
+ continue;
387
+ }
388
+
389
+ const traverse = canTraverse(tile);
390
+
391
+ if (tile._shouldSelect) {
392
+ if (tile.refine === Cesium3DTileRefine.ADD) {
393
+ selectTile(tile, frameState);
394
+ } else {
395
+ tile._selectionDepth = ancestorStack.length;
396
+ if (tile._selectionDepth > 0) {
397
+ tile.tileset.hasMixedContent = true;
398
+ }
399
+ lastAncestor = tile;
400
+ if (!traverse) {
401
+ selectTile(tile, frameState);
402
+ continue;
403
+ }
404
+ ancestorStack.push(tile);
405
+ tile._stackLength = stack.length;
406
+ }
407
+ }
408
+
409
+ if (traverse) {
410
+ const children = tile.children;
411
+ for (let i = 0; i < children.length; ++i) {
412
+ const child = children[i];
413
+ if (child.isVisible) {
414
+ stack.push(child);
415
+ }
416
+ }
417
+ }
418
+ }
419
+ }
420
+
421
+ export default Cesium3DTilesetSkipTraversal;