@cesium/engine 2.1.0 → 2.2.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 (193) hide show
  1. package/Build/Workers/{AxisAlignedBoundingBox-a6f9f0e5.js → AxisAlignedBoundingBox-379015ef.js} +1 -1
  2. package/Build/Workers/{BoundingRectangle-b0a68595.js → BoundingRectangle-57f2b24f.js} +1 -1
  3. package/Build/Workers/{BoxGeometry-baedd794.js → BoxGeometry-ecabfc78.js} +1 -1
  4. package/Build/Workers/{Color-f85df1be.js → Color-14d1a36d.js} +1 -1
  5. package/Build/Workers/{CoplanarPolygonGeometryLibrary-30516950.js → CoplanarPolygonGeometryLibrary-048c3c14.js} +1 -1
  6. package/Build/Workers/{CorridorGeometryLibrary-5d5d3b3a.js → CorridorGeometryLibrary-520c8619.js} +1 -1
  7. package/Build/Workers/{CylinderGeometry-d899ae26.js → CylinderGeometry-119068b8.js} +1 -1
  8. package/Build/Workers/{EllipseGeometry-a49f8449.js → EllipseGeometry-2dfc3523.js} +1 -1
  9. package/Build/Workers/{EllipseGeometryLibrary-cba7edde.js → EllipseGeometryLibrary-0a1e0170.js} +1 -1
  10. package/Build/Workers/{EllipseOutlineGeometry-8095c8cb.js → EllipseOutlineGeometry-c5251669.js} +1 -1
  11. package/Build/Workers/{EllipsoidGeometry-ed93f571.js → EllipsoidGeometry-d10a5221.js} +1 -1
  12. package/Build/Workers/{EllipsoidOutlineGeometry-e4854854.js → EllipsoidOutlineGeometry-7039a0ae.js} +1 -1
  13. package/Build/Workers/{EllipsoidTangentPlane-7ae1aa9a.js → EllipsoidTangentPlane-857186be.js} +1 -1
  14. package/Build/Workers/{FrustumGeometry-b62db3e3.js → FrustumGeometry-400fa1b7.js} +2 -2
  15. package/Build/Workers/{GeometryAttribute-780af4fa.js → GeometryAttribute-7a2de5c6.js} +1 -1
  16. package/Build/Workers/{GeometryPipeline-36b61c99.js → GeometryPipeline-916636fa.js} +1 -1
  17. package/Build/Workers/{IntersectionTests-e889fcf0.js → IntersectionTests-b4d02d4d.js} +1 -1
  18. package/Build/Workers/{OrientedBoundingBox-43478ac8.js → OrientedBoundingBox-96fe1752.js} +5 -3
  19. package/Build/Workers/{PolygonGeometryLibrary-38a98276.js → PolygonGeometryLibrary-931f1ec6.js} +1 -1
  20. package/Build/Workers/{PolygonPipeline-d31ff61c.js → PolygonPipeline-32fc92cc.js} +1 -1
  21. package/Build/Workers/{PolylinePipeline-30e4cec9.js → PolylinePipeline-6d5c63e5.js} +1 -1
  22. package/Build/Workers/{PolylineVolumeGeometryLibrary-90551d26.js → PolylineVolumeGeometryLibrary-f068c1fb.js} +1 -1
  23. package/Build/Workers/{PrimitivePipeline-558d9cb0.js → PrimitivePipeline-879f996a.js} +1 -1
  24. package/Build/Workers/{RectangleGeometryLibrary-815c68df.js → RectangleGeometryLibrary-2d6f36f3.js} +1 -1
  25. package/Build/Workers/{TerrainEncoding-341ead52.js → TerrainEncoding-82882059.js} +1 -1
  26. package/Build/Workers/{Transforms-9e9df299.js → Transforms-9052372a.js} +6 -5
  27. package/Build/Workers/{WallGeometryLibrary-ccf90976.js → WallGeometryLibrary-db7a64fb.js} +1 -1
  28. package/Build/Workers/cesiumWorkerBootstrapper.js +1 -1
  29. package/Build/Workers/combineGeometry.js +1 -1
  30. package/Build/Workers/createBoxGeometry.js +1 -1
  31. package/Build/Workers/createBoxOutlineGeometry.js +1 -1
  32. package/Build/Workers/createCircleGeometry.js +1 -1
  33. package/Build/Workers/createCircleOutlineGeometry.js +1 -1
  34. package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
  35. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
  36. package/Build/Workers/createCorridorGeometry.js +1 -1
  37. package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
  38. package/Build/Workers/createCylinderGeometry.js +1 -1
  39. package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
  40. package/Build/Workers/createEllipseGeometry.js +1 -1
  41. package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
  42. package/Build/Workers/createEllipsoidGeometry.js +1 -1
  43. package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
  44. package/Build/Workers/createFrustumGeometry.js +1 -1
  45. package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
  46. package/Build/Workers/createGeometry.js +1 -1
  47. package/Build/Workers/createGroundPolylineGeometry.js +1 -1
  48. package/Build/Workers/createPlaneGeometry.js +1 -1
  49. package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
  50. package/Build/Workers/createPolygonGeometry.js +1 -1
  51. package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
  52. package/Build/Workers/createPolylineGeometry.js +1 -1
  53. package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
  54. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
  55. package/Build/Workers/createRectangleGeometry.js +1 -1
  56. package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
  57. package/Build/Workers/createSimplePolylineGeometry.js +1 -1
  58. package/Build/Workers/createSphereGeometry.js +1 -1
  59. package/Build/Workers/createSphereOutlineGeometry.js +1 -1
  60. package/Build/Workers/createVectorTileGeometries.js +1 -1
  61. package/Build/Workers/createVectorTilePolygons.js +1 -1
  62. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
  63. package/Build/Workers/createVerticesFromHeightmap.js +1 -1
  64. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +10 -15
  65. package/Build/Workers/createWallGeometry.js +1 -1
  66. package/Build/Workers/createWallOutlineGeometry.js +1 -1
  67. package/Build/Workers/package.js +1 -1
  68. package/Build/Workers/transferTypedArrayTest.js +1 -1
  69. package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  70. package/Source/Core/ArcGISTiledElevationTerrainProvider.js +291 -191
  71. package/Source/Core/CesiumTerrainProvider.js +571 -434
  72. package/Source/Core/CustomHeightmapTerrainProvider.js +12 -0
  73. package/Source/Core/EllipsoidTerrainProvider.js +17 -10
  74. package/Source/Core/FrustumGeometry.js +1 -1
  75. package/Source/Core/GoogleEarthEnterpriseMetadata.js +86 -34
  76. package/Source/Core/GoogleEarthEnterpriseTerrainProvider.js +119 -82
  77. package/Source/Core/Ion.js +1 -1
  78. package/Source/Core/IonResource.js +14 -3
  79. package/Source/Core/OrientedBoundingBox.js +4 -2
  80. package/Source/Core/RequestScheduler.js +1 -1
  81. package/Source/Core/Resource.js +2 -2
  82. package/Source/Core/TerrainProvider.js +9 -14
  83. package/Source/Core/TileProviderError.js +8 -8
  84. package/Source/Core/VRTheWorldTerrainProvider.js +193 -124
  85. package/Source/Core/buildModuleUrl.js +4 -3
  86. package/Source/Core/createWorldTerrain.js +20 -2
  87. package/Source/Core/createWorldTerrainAsync.js +48 -0
  88. package/Source/Core/sampleTerrain.js +9 -10
  89. package/Source/Core/sampleTerrainMostDetailed.js +66 -72
  90. package/Source/DataSources/Cesium3DTilesetVisualizer.js +37 -26
  91. package/Source/DataSources/Entity.js +6 -1
  92. package/Source/DataSources/ModelVisualizer.js +99 -31
  93. package/Source/DataSources/PolygonGraphics.js +1 -1
  94. package/Source/Scene/ArcGisMapServerImageryProvider.js +552 -376
  95. package/Source/Scene/BingMapsImageryProvider.js +511 -305
  96. package/Source/Scene/BufferLoader.js +29 -34
  97. package/Source/Scene/Cesium3DTile.js +388 -251
  98. package/Source/Scene/Cesium3DTileBatchTable.js +2 -2
  99. package/Source/Scene/Cesium3DTileContent.js +16 -0
  100. package/Source/Scene/Cesium3DTileContentFactory.js +4 -4
  101. package/Source/Scene/Cesium3DTilePass.js +8 -11
  102. package/Source/Scene/Cesium3DTileStyleEngine.js +1 -1
  103. package/Source/Scene/Cesium3DTilesVoxelProvider.js +225 -117
  104. package/Source/Scene/Cesium3DTileset.js +755 -481
  105. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +301 -0
  106. package/Source/Scene/Cesium3DTilesetMostDetailedTraversal.js +33 -46
  107. package/Source/Scene/Cesium3DTilesetSkipTraversal.js +421 -0
  108. package/Source/Scene/Cesium3DTilesetTraversal.js +219 -671
  109. package/Source/Scene/ClassificationPrimitive.js +7 -0
  110. package/Source/Scene/Composite3DTileContent.js +69 -26
  111. package/Source/Scene/CreditDisplay.js +20 -4
  112. package/Source/Scene/DepthPlane.js +1 -1
  113. package/Source/Scene/Empty3DTileContent.js +31 -1
  114. package/Source/Scene/Geometry3DTileContent.js +47 -7
  115. package/Source/Scene/Globe.js +5 -1
  116. package/Source/Scene/GlobeSurfaceTile.js +2 -1
  117. package/Source/Scene/GlobeSurfaceTileProvider.js +50 -27
  118. package/Source/Scene/GltfBufferViewLoader.js +47 -91
  119. package/Source/Scene/GltfDracoLoader.js +110 -112
  120. package/Source/Scene/GltfImageLoader.js +71 -78
  121. package/Source/Scene/GltfIndexBufferLoader.js +108 -121
  122. package/Source/Scene/GltfJsonLoader.js +75 -74
  123. package/Source/Scene/GltfLoader.js +392 -280
  124. package/Source/Scene/GltfStructuralMetadataLoader.js +109 -110
  125. package/Source/Scene/GltfTextureLoader.js +97 -96
  126. package/Source/Scene/GltfVertexBufferLoader.js +128 -133
  127. package/Source/Scene/GoogleEarthEnterpriseImageryProvider.js +353 -225
  128. package/Source/Scene/GoogleEarthEnterpriseMapsProvider.js +491 -331
  129. package/Source/Scene/GridImageryProvider.js +267 -104
  130. package/Source/Scene/GroundPolylinePrimitive.js +12 -1
  131. package/Source/Scene/GroundPrimitive.js +8 -1
  132. package/Source/Scene/I3SDataProvider.js +214 -113
  133. package/Source/Scene/I3SFeature.js +7 -6
  134. package/Source/Scene/I3SLayer.js +26 -37
  135. package/Source/Scene/I3SNode.js +59 -66
  136. package/Source/Scene/Imagery.js +6 -1
  137. package/Source/Scene/ImageryLayer.js +299 -48
  138. package/Source/Scene/ImageryLayerCollection.js +26 -0
  139. package/Source/Scene/ImageryProvider.js +129 -111
  140. package/Source/Scene/Implicit3DTileContent.js +72 -23
  141. package/Source/Scene/ImplicitSubtree.js +66 -45
  142. package/Source/Scene/IonImageryProvider.js +471 -264
  143. package/Source/Scene/MapboxImageryProvider.js +272 -112
  144. package/Source/Scene/MapboxStyleImageryProvider.js +270 -111
  145. package/Source/Scene/MetadataSchemaLoader.js +26 -36
  146. package/Source/Scene/Model/B3dmLoader.js +42 -46
  147. package/Source/Scene/Model/GeoJsonLoader.js +8 -32
  148. package/Source/Scene/Model/I3dmLoader.js +48 -74
  149. package/Source/Scene/Model/Model.js +470 -132
  150. package/Source/Scene/Model/Model3DTileContent.js +83 -31
  151. package/Source/Scene/Model/ModelAnimationCollection.js +3 -3
  152. package/Source/Scene/Model/ModelDrawCommand.js +15 -26
  153. package/Source/Scene/Model/ModelUtility.js +16 -16
  154. package/Source/Scene/Model/PntsLoader.js +27 -32
  155. package/Source/Scene/Multiple3DTileContent.js +134 -115
  156. package/Source/Scene/PointCloud.js +11 -19
  157. package/Source/Scene/Primitive.js +20 -0
  158. package/Source/Scene/QuadtreePrimitive.js +2 -0
  159. package/Source/Scene/QuadtreeTileProvider.js +4 -8
  160. package/Source/Scene/ResourceCache.js +47 -105
  161. package/Source/Scene/ResourceCacheStatistics.js +24 -58
  162. package/Source/Scene/ResourceLoader.js +5 -17
  163. package/Source/Scene/ResourceLoaderState.js +12 -4
  164. package/Source/Scene/Scene.js +65 -0
  165. package/Source/Scene/ScreenSpaceCameraController.js +1 -1
  166. package/Source/Scene/SingleTileImageryProvider.js +382 -209
  167. package/Source/Scene/Terrain.js +196 -0
  168. package/Source/Scene/TileCoordinatesImageryProvider.js +267 -104
  169. package/Source/Scene/TileMapServiceImageryProvider.js +177 -85
  170. package/Source/Scene/Tileset3DTileContent.js +47 -5
  171. package/Source/Scene/TimeDynamicPointCloud.js +15 -2
  172. package/Source/Scene/UrlTemplateImageryProvider.js +343 -215
  173. package/Source/Scene/Vector3DTileClampedPolylines.js +96 -84
  174. package/Source/Scene/Vector3DTileContent.js +47 -22
  175. package/Source/Scene/Vector3DTileGeometry.js +57 -52
  176. package/Source/Scene/Vector3DTilePoints.js +72 -68
  177. package/Source/Scene/Vector3DTilePolygons.js +118 -117
  178. package/Source/Scene/Vector3DTilePolylines.js +86 -82
  179. package/Source/Scene/Vector3DTilePrimitive.js +0 -1
  180. package/Source/Scene/VoxelContent.js +61 -63
  181. package/Source/Scene/VoxelPrimitive.js +39 -91
  182. package/Source/Scene/VoxelProvider.js +2 -2
  183. package/Source/Scene/WebMapServiceImageryProvider.js +272 -111
  184. package/Source/Scene/WebMapTileServiceImageryProvider.js +270 -107
  185. package/Source/Scene/computeFlyToLocationForRectangle.js +33 -37
  186. package/Source/Scene/createOsmBuildings.js +6 -0
  187. package/Source/Scene/createOsmBuildingsAsync.js +82 -0
  188. package/Source/Scene/createWorldImagery.js +14 -5
  189. package/Source/Scene/createWorldImageryAsync.js +39 -0
  190. package/Source/Widget/CesiumWidget.js +55 -27
  191. package/index.d.ts +2158 -1395
  192. package/index.js +58 -51
  193. package/package.json +1 -1
@@ -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;