@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,301 @@
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
+ * A tile does not refine until all children are loaded.
9
+ * This is the traditional replacement refinement approach and is called the base traversal.
10
+ *
11
+ * @alias Cesium3DTilesetBaseTraversal
12
+ * @constructor
13
+ *
14
+ * @private
15
+ */
16
+ function Cesium3DTilesetBaseTraversal() {}
17
+
18
+ const traversal = {
19
+ stack: new ManagedArray(),
20
+ stackMaximumLength: 0,
21
+ };
22
+
23
+ const emptyTraversal = {
24
+ stack: new ManagedArray(),
25
+ stackMaximumLength: 0,
26
+ };
27
+
28
+ /**
29
+ * Traverses a {@link Cesium3DTileset} to determine which tiles to load and render.
30
+ *
31
+ * @private
32
+ * @param {Cesium3DTileset} tileset
33
+ * @param {FrameState} frameState
34
+ */
35
+ Cesium3DTilesetBaseTraversal.selectTiles = function (tileset, frameState) {
36
+ tileset._requestedTiles.length = 0;
37
+
38
+ if (tileset.debugFreezeFrame) {
39
+ return;
40
+ }
41
+
42
+ tileset._selectedTiles.length = 0;
43
+ tileset._selectedTilesToStyle.length = 0;
44
+ tileset._emptyTiles.length = 0;
45
+ tileset.hasMixedContent = false;
46
+
47
+ const root = tileset.root;
48
+ Cesium3DTilesetTraversal.updateTile(root, frameState);
49
+
50
+ if (!root.isVisible) {
51
+ return;
52
+ }
53
+
54
+ if (
55
+ root.getScreenSpaceError(frameState, true) <=
56
+ tileset._maximumScreenSpaceError
57
+ ) {
58
+ return;
59
+ }
60
+
61
+ executeTraversal(root, frameState);
62
+
63
+ traversal.stack.trim(traversal.stackMaximumLength);
64
+ emptyTraversal.stack.trim(emptyTraversal.stackMaximumLength);
65
+
66
+ // Update the priority for any requests found during traversal
67
+ // Update after traversal so that min and max values can be used to normalize priority values
68
+ const requestedTiles = tileset._requestedTiles;
69
+ for (let i = 0; i < requestedTiles.length; ++i) {
70
+ requestedTiles[i].updatePriority();
71
+ }
72
+ };
73
+
74
+ /**
75
+ * Mark a tile as selected if it has content available.
76
+ *
77
+ * @private
78
+ * @param {Cesium3DTile} tile
79
+ * @param {FrameState} frameState
80
+ */
81
+ function selectDesiredTile(tile, frameState) {
82
+ if (tile.contentAvailable) {
83
+ Cesium3DTilesetTraversal.selectTile(tile, frameState);
84
+ }
85
+ }
86
+
87
+ /**
88
+ * @private
89
+ * @param {Cesium3DTile} tile
90
+ * @param {ManagedArray} stack
91
+ * @param {FrameState} frameState
92
+ * @returns {boolean}
93
+ */
94
+ function updateAndPushChildren(tile, stack, frameState) {
95
+ const replace = tile.refine === Cesium3DTileRefine.REPLACE;
96
+ const { tileset, children } = tile;
97
+ const { updateTile, loadTile, touchTile } = Cesium3DTilesetTraversal;
98
+
99
+ for (let i = 0; i < children.length; ++i) {
100
+ updateTile(children[i], frameState);
101
+ }
102
+
103
+ // Sort by distance to take advantage of early Z and reduce artifacts for skipLevelOfDetail
104
+ children.sort(Cesium3DTilesetTraversal.sortChildrenByDistanceToCamera);
105
+
106
+ // For traditional replacement refinement only refine if all children are loaded.
107
+ // Empty tiles are exempt since it looks better if children stream in as they are loaded to fill the empty space.
108
+ const checkRefines = replace && tile.hasRenderableContent;
109
+ let refines = true;
110
+
111
+ let anyChildrenVisible = false;
112
+
113
+ // Determining min child
114
+ let minIndex = -1;
115
+ let minimumPriority = Number.MAX_VALUE;
116
+
117
+ for (let i = 0; i < children.length; ++i) {
118
+ const child = children[i];
119
+ if (child.isVisible) {
120
+ stack.push(child);
121
+ if (child._foveatedFactor < minimumPriority) {
122
+ minIndex = i;
123
+ minimumPriority = child._foveatedFactor;
124
+ }
125
+ anyChildrenVisible = true;
126
+ } else if (checkRefines || tileset.loadSiblings) {
127
+ // Keep non-visible children loaded since they are still needed before the parent can refine.
128
+ // Or loadSiblings is true so always load tiles regardless of visibility.
129
+ if (child._foveatedFactor < minimumPriority) {
130
+ minIndex = i;
131
+ minimumPriority = child._foveatedFactor;
132
+ }
133
+ loadTile(child, frameState);
134
+ touchTile(child, frameState);
135
+ }
136
+ if (checkRefines) {
137
+ let childRefines;
138
+ if (!child._inRequestVolume) {
139
+ childRefines = false;
140
+ } else if (!child.hasRenderableContent) {
141
+ childRefines = executeEmptyTraversal(child, frameState);
142
+ } else {
143
+ childRefines = child.contentAvailable;
144
+ }
145
+ refines = refines && childRefines;
146
+ }
147
+ }
148
+
149
+ if (!anyChildrenVisible) {
150
+ refines = false;
151
+ }
152
+
153
+ if (minIndex !== -1 && replace) {
154
+ // An ancestor will hold the _foveatedFactor and _distanceToCamera for descendants between itself and its highest priority descendant. Siblings of a min children along the way use this ancestor as their priority holder as well.
155
+ // Priority of all tiles that refer to the _foveatedFactor and _distanceToCamera stored in the common ancestor will be differentiated based on their _depth.
156
+ const minPriorityChild = children[minIndex];
157
+ minPriorityChild._wasMinPriorityChild = true;
158
+ const priorityHolder =
159
+ (tile._wasMinPriorityChild || tile === tileset.root) &&
160
+ minimumPriority <= tile._priorityHolder._foveatedFactor
161
+ ? tile._priorityHolder
162
+ : tile; // This is where priority dependency chains are wired up or started anew.
163
+ priorityHolder._foveatedFactor = Math.min(
164
+ minPriorityChild._foveatedFactor,
165
+ priorityHolder._foveatedFactor
166
+ );
167
+ priorityHolder._distanceToCamera = Math.min(
168
+ minPriorityChild._distanceToCamera,
169
+ priorityHolder._distanceToCamera
170
+ );
171
+
172
+ for (let i = 0; i < children.length; ++i) {
173
+ children[i]._priorityHolder = priorityHolder;
174
+ }
175
+ }
176
+
177
+ return refines;
178
+ }
179
+
180
+ /**
181
+ * Depth-first traversal that traverses all visible tiles and marks tiles for selection.
182
+ * A tile does not refine until all children are loaded.
183
+ * This is the traditional replacement refinement approach and is called the base traversal.
184
+ *
185
+ * @private
186
+ * @param {Cesium3DTile} root
187
+ * @param {FrameState} frameState
188
+ */
189
+ function executeTraversal(root, frameState) {
190
+ const { tileset } = root;
191
+
192
+ const {
193
+ canTraverse,
194
+ loadTile,
195
+ visitTile,
196
+ touchTile,
197
+ } = Cesium3DTilesetTraversal;
198
+ const stack = traversal.stack;
199
+ stack.push(root);
200
+
201
+ while (stack.length > 0) {
202
+ traversal.stackMaximumLength = Math.max(
203
+ traversal.stackMaximumLength,
204
+ stack.length
205
+ );
206
+
207
+ const tile = stack.pop();
208
+
209
+ const parent = tile.parent;
210
+ const parentRefines = !defined(parent) || parent._refines;
211
+
212
+ tile._refines = canTraverse(tile)
213
+ ? updateAndPushChildren(tile, stack, frameState) && parentRefines
214
+ : false;
215
+
216
+ const stoppedRefining = !tile._refines && parentRefines;
217
+
218
+ if (!tile.hasRenderableContent) {
219
+ // Add empty tile just to show its debug bounding volume
220
+ // If the tile has tileset content load the external tileset
221
+ tileset._emptyTiles.push(tile);
222
+ loadTile(tile, frameState);
223
+ if (stoppedRefining) {
224
+ selectDesiredTile(tile, frameState);
225
+ }
226
+ } else if (tile.refine === Cesium3DTileRefine.ADD) {
227
+ // Additive tiles are always loaded and selected
228
+ selectDesiredTile(tile, frameState);
229
+ loadTile(tile, frameState);
230
+ } else if (tile.refine === Cesium3DTileRefine.REPLACE) {
231
+ loadTile(tile, frameState);
232
+ if (stoppedRefining) {
233
+ selectDesiredTile(tile, frameState);
234
+ }
235
+ }
236
+
237
+ visitTile(tile, frameState);
238
+ touchTile(tile, frameState);
239
+ }
240
+ }
241
+
242
+ /**
243
+ * Depth-first traversal that checks if all nearest descendants with content are loaded.
244
+ * Ignores visibility.
245
+ *
246
+ * @private
247
+ * @param {Cesium3DTile} root
248
+ * @param {FrameState} frameState
249
+ * @returns {boolean}
250
+ */
251
+ function executeEmptyTraversal(root, frameState) {
252
+ const {
253
+ canTraverse,
254
+ updateTile,
255
+ loadTile,
256
+ touchTile,
257
+ } = Cesium3DTilesetTraversal;
258
+ let allDescendantsLoaded = true;
259
+ const stack = emptyTraversal.stack;
260
+ stack.push(root);
261
+
262
+ while (stack.length > 0) {
263
+ emptyTraversal.stackMaximumLength = Math.max(
264
+ emptyTraversal.stackMaximumLength,
265
+ stack.length
266
+ );
267
+
268
+ const tile = stack.pop();
269
+ const children = tile.children;
270
+ const childrenLength = children.length;
271
+
272
+ // Only traverse if the tile is empty - traversal stops at descendants with content
273
+ const traverse = !tile.hasRenderableContent && canTraverse(tile);
274
+ const emptyLeaf = !tile.hasRenderableContent && tile.children.length === 0;
275
+
276
+ // Traversal stops but the tile does not have content yet
277
+ // There will be holes if the parent tries to refine to its children, so don't refine
278
+ // One exception: a parent may refine even if one of its descendants is an empty leaf
279
+ if (!traverse && !tile.contentAvailable && !emptyLeaf) {
280
+ allDescendantsLoaded = false;
281
+ }
282
+
283
+ updateTile(tile, frameState);
284
+ if (!tile.isVisible) {
285
+ // Load tiles that aren't visible since they are still needed for the parent to refine
286
+ loadTile(tile, frameState);
287
+ touchTile(tile, frameState);
288
+ }
289
+
290
+ if (traverse) {
291
+ for (let i = 0; i < childrenLength; ++i) {
292
+ const child = children[i];
293
+ stack.push(child);
294
+ }
295
+ }
296
+ }
297
+
298
+ return allDescendantsLoaded;
299
+ }
300
+
301
+ export default Cesium3DTilesetBaseTraversal;
@@ -1,11 +1,15 @@
1
1
  import Intersect from "../Core/Intersect.js";
2
2
  import ManagedArray from "../Core/ManagedArray.js";
3
3
  import Cesium3DTileRefine from "./Cesium3DTileRefine.js";
4
+ import Cesium3DTilesetTraversal from "./Cesium3DTilesetTraversal.js";
4
5
 
5
6
  /**
6
7
  * Traversal that loads all leaves that intersect the camera frustum.
7
8
  * Used to determine ray-tileset intersections during a pickFromRayMostDetailed call.
8
9
  *
10
+ * @alias Cesium3DTilesetMostDetailedTraversal
11
+ * @constructor
12
+ *
9
13
  * @private
10
14
  */
11
15
  function Cesium3DTilesetMostDetailedTraversal() {}
@@ -15,25 +19,35 @@ const traversal = {
15
19
  stackMaximumLength: 0,
16
20
  };
17
21
 
22
+ /**
23
+ * Traverses a {@link Cesium3DTileset} to determine which tiles to load and render.
24
+ *
25
+ * @private
26
+ * @param {Cesium3DTileset} tileset
27
+ * @param {FrameState} frameState
28
+ * @returns {boolean} Whether the appropriate tile is ready for picking
29
+ */
18
30
  Cesium3DTilesetMostDetailedTraversal.selectTiles = function (
19
31
  tileset,
20
32
  frameState
21
33
  ) {
22
34
  tileset._selectedTiles.length = 0;
23
35
  tileset._requestedTiles.length = 0;
24
- tileset._hasMixedContent = false;
36
+ tileset.hasMixedContent = false;
25
37
 
26
38
  let ready = true;
27
39
 
28
40
  const root = tileset.root;
29
41
  root.updateVisibility(frameState);
30
42
 
31
- if (!isVisible(root)) {
43
+ if (!root.isVisible) {
32
44
  return ready;
33
45
  }
34
46
 
47
+ const { touchTile, visitTile } = Cesium3DTilesetTraversal;
48
+
35
49
  const stack = traversal.stack;
36
- stack.push(tileset.root);
50
+ stack.push(root);
37
51
 
38
52
  while (stack.length > 0) {
39
53
  traversal.stackMaximumLength = Math.max(
@@ -44,23 +58,23 @@ Cesium3DTilesetMostDetailedTraversal.selectTiles = function (
44
58
  const tile = stack.pop();
45
59
  const add = tile.refine === Cesium3DTileRefine.ADD;
46
60
  const replace = tile.refine === Cesium3DTileRefine.REPLACE;
47
- const traverse = canTraverse(tileset, tile);
61
+ const traverse = canTraverse(tile);
48
62
 
49
63
  if (traverse) {
50
- updateAndPushChildren(tileset, tile, stack, frameState);
64
+ updateAndPushChildren(tile, stack, frameState);
51
65
  }
52
66
 
53
67
  if (add || (replace && !traverse)) {
54
68
  loadTile(tileset, tile);
55
- touchTile(tileset, tile, frameState);
56
- selectDesiredTile(tileset, tile, frameState);
69
+ touchTile(tile, frameState);
70
+ selectDesiredTile(tile, frameState);
57
71
 
58
- if (!hasEmptyContent(tile) && !tile.contentAvailable) {
72
+ if (tile.hasRenderableContent && !tile.contentAvailable) {
59
73
  ready = false;
60
74
  }
61
75
  }
62
76
 
63
- visitTile(tileset);
77
+ visitTile(tile, frameState);
64
78
  }
65
79
 
66
80
  traversal.stack.trim(traversal.stackMaximumLength);
@@ -68,21 +82,7 @@ Cesium3DTilesetMostDetailedTraversal.selectTiles = function (
68
82
  return ready;
69
83
  };
70
84
 
71
- function isVisible(tile) {
72
- return tile._visible && tile._inRequestVolume;
73
- }
74
-
75
- function hasEmptyContent(tile) {
76
- return (
77
- tile.hasEmptyContent || tile.hasTilesetContent || tile.hasImplicitContent
78
- );
79
- }
80
-
81
- function hasUnloadedContent(tile) {
82
- return !hasEmptyContent(tile) && tile.contentUnloaded;
83
- }
84
-
85
- function canTraverse(tileset, tile) {
85
+ function canTraverse(tile) {
86
86
  if (tile.children.length === 0) {
87
87
  return false;
88
88
  }
@@ -97,48 +97,35 @@ function canTraverse(tileset, tile) {
97
97
  return true;
98
98
  }
99
99
 
100
- return true; // Keep traversing until a leave is hit
100
+ return true; // Keep traversing until a leaf is hit
101
101
  }
102
102
 
103
- function updateAndPushChildren(tileset, tile, stack, frameState) {
104
- const children = tile.children;
105
- const length = children.length;
103
+ function updateAndPushChildren(tile, stack, frameState) {
104
+ const { children } = tile;
106
105
 
107
- for (let i = 0; i < length; ++i) {
106
+ for (let i = 0; i < children.length; ++i) {
108
107
  const child = children[i];
109
108
  child.updateVisibility(frameState);
110
- if (isVisible(child)) {
109
+ if (child.isVisible) {
111
110
  stack.push(child);
112
111
  }
113
112
  }
114
113
  }
115
114
 
116
115
  function loadTile(tileset, tile) {
117
- if (hasUnloadedContent(tile) || tile.contentExpired) {
116
+ if (tile.hasUnloadedRenderableContent || tile.contentExpired) {
118
117
  tile._priority = 0.0; // Highest priority
119
118
  tileset._requestedTiles.push(tile);
120
119
  }
121
120
  }
122
121
 
123
- function touchTile(tileset, tile, frameState) {
124
- if (tile._touchedFrame === frameState.frameNumber) {
125
- // Prevents another pass from touching the frame again
126
- return;
127
- }
128
- tileset._cache.touch(tile);
129
- tile._touchedFrame = frameState.frameNumber;
130
- }
131
-
132
- function visitTile(tileset) {
133
- ++tileset.statistics.visited;
134
- }
135
-
136
- function selectDesiredTile(tileset, tile, frameState) {
122
+ function selectDesiredTile(tile, frameState) {
137
123
  if (
138
124
  tile.contentAvailable &&
139
125
  tile.contentVisibility(frameState) !== Intersect.OUTSIDE
140
126
  ) {
141
- tileset._selectedTiles.push(tile);
127
+ tile.tileset._selectedTiles.push(tile);
142
128
  }
143
129
  }
130
+
144
131
  export default Cesium3DTilesetMostDetailedTraversal;