diff --git a/CHANGES.md b/CHANGES.md index 14eaaaef168b..c1ff6d39b89b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -35,6 +35,7 @@ Change Log * Added support for ordering in `DataSourceCollection` [#6316](https://github.com/AnalyticalGraphicsInc/cesium/pull/6316) * All ground geometry from one `DataSource` will render in front of all ground geometry from another `DataSource` in the same collection with a lower index. * Use `DataSourceCollection.raise`, `DataSourceCollection.lower`, `DataSourceCollection.raiseToTop` and `DataSourceCollection.lowerToBottom` functions to change the ordering of a `DataSource` in the collection. +* Improved processing order of 3D tiles. [#6364](https://github.com/AnalyticalGraphicsInc/cesium/pull/6364) ##### Fixes :wrench: * Fixed support of glTF-supplied tangent vectors. [#6302](https://github.com/AnalyticalGraphicsInc/cesium/pull/6302) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index e4590a8d60e1..951a50829721 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -28,6 +28,7 @@ define([ './Axis', './Cesium3DTile', './Cesium3DTileColorBlendMode', + './Cesium3DTileContentState', './Cesium3DTileOptimizations', './Cesium3DTilesetStatistics', './Cesium3DTilesetTraversal', @@ -72,6 +73,7 @@ define([ Axis, Cesium3DTile, Cesium3DTileColorBlendMode, + Cesium3DTileContentState, Cesium3DTileOptimizations, Cesium3DTilesetStatistics, Cesium3DTilesetTraversal, @@ -1484,16 +1486,13 @@ define([ function removeFromProcessingQueue(tileset, tile) { return function() { - var index = tileset._processingQueue.indexOf(tile); - if (index === -1) { + if (tile._contentState === Cesium3DTileContentState.FAILED) { // Not in processing queue // For example, when a url request fails and the ready promise is rejected --tileset._statistics.numberOfPendingRequests; return; } - // Remove from processing queue - tileset._processingQueue.splice(index, 1); --tileset._statistics.numberOfTilesProcessing; if (tile.hasRenderableContent) { @@ -1510,13 +1509,31 @@ define([ }; } + function filterProcessingQueue(tileset) { + var tiles = tileset._processingQueue; + var length = tiles.length; + + var removeCount = 0; + for (var i = 0; i < length; ++i) { + var tile = tiles[i]; + if (tile._contentState !== Cesium3DTileContentState.PROCESSING) { + ++removeCount; + continue; + } + if (removeCount > 0) { + tiles[i - removeCount] = tile; + } + } + tiles.length -= removeCount; + } + function processTiles(tileset, frameState) { + filterProcessingQueue(tileset); var tiles = tileset._processingQueue; var length = tiles.length; // Process tiles in the PROCESSING state so they will eventually move to the READY state. - // Traverse backwards in case a tile is removed as a result of calling process() - for (var i = length - 1; i >= 0; --i) { + for (var i = 0; i < length; ++i) { tiles[i].process(tileset, frameState); } } diff --git a/Specs/Data/Cesium3DTiles/Instanced/InstancedGltfExternal/Box.glb b/Specs/Data/Cesium3DTiles/Instanced/InstancedGltfExternal/box.glb similarity index 100% rename from Specs/Data/Cesium3DTiles/Instanced/InstancedGltfExternal/Box.glb rename to Specs/Data/Cesium3DTiles/Instanced/InstancedGltfExternal/box.glb