cesium-native 0.44.2
Loading...
Searching...
No Matches
Tileset.h
1#pragma once
2
3#include <Cesium3DTilesSelection/Library.h>
4#include <Cesium3DTilesSelection/RasterOverlayCollection.h>
5#include <Cesium3DTilesSelection/SampleHeightResult.h>
6#include <Cesium3DTilesSelection/Tile.h>
7#include <Cesium3DTilesSelection/TilesetContentLoader.h>
8#include <Cesium3DTilesSelection/TilesetExternals.h>
9#include <Cesium3DTilesSelection/TilesetLoadFailureDetails.h>
10#include <Cesium3DTilesSelection/TilesetOptions.h>
11#include <Cesium3DTilesSelection/ViewState.h>
12#include <Cesium3DTilesSelection/ViewUpdateResult.h>
13#include <CesiumAsync/AsyncSystem.h>
14#include <CesiumUtility/IntrusivePointer.h>
15
16#include <rapidjson/fwd.h>
17
18#include <list>
19#include <memory>
20#include <optional>
21#include <string>
22#include <vector>
23
24namespace Cesium3DTilesSelection {
25
26class TilesetContentManager;
27class TilesetMetadata;
28class TilesetHeightQuery;
29struct TilesetHeightRequest;
30class TilesetSharedAssetSystem;
31
38class CESIUM3DTILESSELECTION_API Tileset final {
39public:
49 const TilesetExternals& externals,
50 std::unique_ptr<TilesetContentLoader>&& pCustomLoader,
51 std::unique_ptr<Tile>&& pRootTile,
52 const TilesetOptions& options = TilesetOptions());
53
61 const TilesetExternals& externals,
62 const std::string& url,
63 const TilesetOptions& options = TilesetOptions());
64
77 const TilesetExternals& externals,
78 int64_t ionAssetID,
79 const std::string& ionAccessToken,
80 const TilesetOptions& options = TilesetOptions(),
81 const std::string& ionAssetEndpointUrl = "https://api.cesium.com/");
82
93 ~Tileset() noexcept;
94
100 CesiumAsync::SharedFuture<void>& getAsyncDestructionCompleteEvent();
101
107 CesiumAsync::SharedFuture<void>& getRootTileAvailableEvent();
108
112 const std::vector<CesiumUtility::Credit>& getTilesetCredits() const noexcept;
113
118 void setShowCreditsOnScreen(bool showCreditsOnScreen) noexcept;
119
124 TilesetExternals& getExternals() noexcept { return this->_externals; }
125
130 const TilesetExternals& getExternals() const noexcept {
131 return this->_externals;
132 }
133
139 return this->_asyncSystem;
140 }
141
143 const CesiumAsync::AsyncSystem& getAsyncSystem() const noexcept {
144 return this->_asyncSystem;
145 }
146
148 const TilesetOptions& getOptions() const noexcept { return this->_options; }
149
153 TilesetOptions& getOptions() noexcept { return this->_options; }
154
159 return this->_options.ellipsoid;
160 }
161
164 return this->_options.ellipsoid;
165 }
166
172 Tile* getRootTile() noexcept;
173
175 const Tile* getRootTile() const noexcept;
176
180 RasterOverlayCollection& getOverlays() noexcept;
181
183 const RasterOverlayCollection& getOverlays() const noexcept;
184
188 TilesetSharedAssetSystem& getSharedAssetSystem() noexcept;
189
191 const TilesetSharedAssetSystem& getSharedAssetSystem() const noexcept;
192
203 const ViewUpdateResult&
204 updateViewOffline(const std::vector<ViewState>& frustums);
205
216 const ViewUpdateResult&
217 updateView(const std::vector<ViewState>& frustums, float deltaTime = 0.0f);
218
222 int32_t getNumberOfTilesLoaded() const;
223
228 float computeLoadProgress() noexcept;
229
235 void forEachLoadedTile(const std::function<void(Tile& tile)>& callback);
236
242 void forEachLoadedTile(
243 const std::function<void(const Tile& tile)>& callback) const;
244
249 int64_t getTotalDataBytes() const noexcept;
250
275 const TilesetMetadata* getMetadata(const Tile* pTile = nullptr) const;
276
292 CesiumAsync::Future<const TilesetMetadata*> loadMetadata();
293
312 CesiumAsync::Future<SampleHeightResult> sampleHeightMostDetailed(
313 const std::vector<CesiumGeospatial::Cartographic>& positions);
314
315 Tileset(const Tileset& rhs) = delete;
316 Tileset& operator=(const Tileset& rhs) = delete;
317
318private:
327 struct TraversalDetails {
335 bool allAreRenderable = true;
336
346 bool anyWereRenderedLastFrame = false;
347
366 uint32_t notYetRenderableCount = 0;
367 };
368
376 struct FrameState {
377 const std::vector<ViewState>& frustums;
378 std::vector<double> fogDensities;
379 int32_t lastFrameNumber;
380 int32_t currentFrameNumber;
381 };
382
383 TraversalDetails _renderLeaf(
384 const FrameState& frameState,
385 Tile& tile,
386 double tilePriority,
387 ViewUpdateResult& result);
388 TraversalDetails _renderInnerTile(
389 const FrameState& frameState,
390 Tile& tile,
391 ViewUpdateResult& result);
392 bool _kickDescendantsAndRenderTile(
393 const FrameState& frameState,
394 Tile& tile,
395 ViewUpdateResult& result,
396 TraversalDetails& traversalDetails,
397 size_t firstRenderedDescendantIndex,
398 size_t workerThreadLoadQueueIndex,
399 size_t mainThreadLoadQueueIndex,
400 bool queuedForLoad,
401 double tilePriority);
402 TileOcclusionState
403 _checkOcclusion(const Tile& tile, const FrameState& frameState);
404
405 TraversalDetails _visitTile(
406 const FrameState& frameState,
407 uint32_t depth,
408 bool meetsSse,
409 bool ancestorMeetsSse,
410 Tile& tile,
411 double tilePriority,
412 ViewUpdateResult& result);
413
414 struct CullResult {
415 // whether we should visit this tile
416 bool shouldVisit = true;
417 // whether this tile was culled (Note: we might still want to visit it)
418 bool culled = false;
419 };
420
421 // TODO: abstract these into a composable culling interface.
422 void _frustumCull(
423 const Tile& tile,
424 const FrameState& frameState,
425 bool cullWithChildrenBounds,
426 CullResult& cullResult);
427 void _fogCull(
428 const FrameState& frameState,
429 const std::vector<double>& distances,
430 CullResult& cullResult);
431 bool _meetsSse(
432 const std::vector<ViewState>& frustums,
433 const Tile& tile,
434 const std::vector<double>& distances,
435 bool culled) const noexcept;
436
437 TraversalDetails _visitTileIfNeeded(
438 const FrameState& frameState,
439 uint32_t depth,
440 bool ancestorMeetsSse,
441 Tile& tile,
442 ViewUpdateResult& result);
443 TraversalDetails _visitVisibleChildrenNearToFar(
444 const FrameState& frameState,
445 uint32_t depth,
446 bool ancestorMeetsSse,
447 Tile& tile,
448 ViewUpdateResult& result);
449
465 bool _loadAndRenderAdditiveRefinedTile(
466 Tile& tile,
467 ViewUpdateResult& result,
468 double tilePriority,
469 bool queuedForLoad);
470
471 void _processWorkerThreadLoadQueue();
472 void _processMainThreadLoadQueue();
473
474 void _unloadCachedTiles(double timeBudget) noexcept;
475 void _markTileVisited(Tile& tile) noexcept;
476
477 void _updateLodTransitions(
478 const FrameState& frameState,
479 float deltaTime,
480 ViewUpdateResult& result) const noexcept;
481
482 TilesetExternals _externals;
483 CesiumAsync::AsyncSystem _asyncSystem;
484
485 TilesetOptions _options;
486
487 int32_t _previousFrameNumber;
488 ViewUpdateResult _updateResult;
489
490 enum class TileLoadPriorityGroup {
495 Preload = 0,
496
501 Normal = 1,
502
508 Urgent = 2
509 };
510
511 struct TileLoadTask {
515 Tile* pTile;
516
524 TileLoadPriorityGroup group;
525
531 double priority;
532
533 bool operator<(const TileLoadTask& rhs) const noexcept {
534 if (this->group == rhs.group)
535 return this->priority < rhs.priority;
536 else
537 return this->group > rhs.group;
538 }
539 };
540
541 std::vector<TileLoadTask> _mainThreadLoadQueue;
542 std::vector<TileLoadTask> _workerThreadLoadQueue;
543 std::vector<Tile*> _heightQueryLoadQueue;
544
545 Tile::LoadedLinkedList _loadedTiles;
546
547 // Holds computed distances, to avoid allocating them on the heap during tile
548 // selection.
549 std::vector<double> _distances;
550
551 // Holds the occlusion proxies of the children of a tile. Store them in this
552 // scratch variable so that it can allocate only when growing bigger.
553 std::vector<const TileOcclusionRendererProxy*> _childOcclusionProxies;
554
556 _pTilesetContentManager;
557
558 std::list<TilesetHeightRequest> _heightRequests;
559
560 void addTileToLoadQueue(
561 Tile& tile,
562 TileLoadPriorityGroup priorityGroup,
563 double priority);
564
565 static TraversalDetails createTraversalDetailsForSingleTile(
566 const FrameState& frameState,
567 const Tile& tile,
568 const TileSelectionState& lastFrameSelectionState);
569};
570
571} // namespace Cesium3DTilesSelection
A collection of CesiumRasterOverlays::RasterOverlay instances that are associated with a Tileset.
A tile in a Tileset.
Definition Tile.h:96
External interfaces used by a Tileset.
Holds the metadata associated with a Tileset or an external tileset.
Contains assets that are potentially shared across multiple Tilesets.
A 3D Tiles tileset, used for streaming massive heterogeneous 3D geospatial datasets.
Definition Tileset.h:38
CesiumGeospatial::Ellipsoid & getEllipsoid() noexcept
Gets the CesiumGeospatial::Ellipsoid used by this tileset.
Definition Tileset.h:163
Tileset(const TilesetExternals &externals, int64_t ionAssetID, const std::string &ionAccessToken, const TilesetOptions &options=TilesetOptions(), const std::string &ionAssetEndpointUrl="https://api.cesium.com/")
Constructs a new instance with the given asset ID on Cesium ion.
Tileset(const TilesetExternals &externals, const std::string &url, const TilesetOptions &options=TilesetOptions())
Constructs a new instance with a given tileset.json URL.
CesiumAsync::AsyncSystem & getAsyncSystem() noexcept
Returns the CesiumAsync::AsyncSystem that is used for dispatching asynchronous tasks.
Definition Tileset.h:138
Tile * getRootTile() noexcept
Gets the root tile of this tileset.
const TilesetOptions & getOptions() const noexcept
Gets the TilesetOptions of this tileset.
Definition Tileset.h:148
const TilesetExternals & getExternals() const noexcept
Gets the TilesetExternals that summarize the external interfaces used by this tileset.
Definition Tileset.h:130
const CesiumAsync::AsyncSystem & getAsyncSystem() const noexcept
Returns the CesiumAsync::AsyncSystem that is used for dispatching asynchronous tasks.
Definition Tileset.h:143
TilesetOptions & getOptions() noexcept
Gets the TilesetOptions of this tileset.
Definition Tileset.h:153
const CesiumGeospatial::Ellipsoid & getEllipsoid() const
Gets the CesiumGeospatial::Ellipsoid used by this tileset.
Definition Tileset.h:158
~Tileset() noexcept
Destroys this tileset.
Tileset(const TilesetExternals &externals, std::unique_ptr< TilesetContentLoader > &&pCustomLoader, std::unique_ptr< Tile > &&pRootTile, const TilesetOptions &options=TilesetOptions())
Constructs a new instance with a given custom tileset loader.
The state of the view that is used during the traversal of a tileset.
Definition ViewState.h:23
Reports the results of Tileset::updateView.
A system for managing asynchronous requests and tasks.
Definition AsyncSystem.h:36
A quadratic surface defined in Cartesian coordinates.
Definition Ellipsoid.h:39
A smart pointer that calls addReference and releaseReference on the controlled object.
Classes that implement the 3D Tiles standard.
Classes that support asynchronous operations.
Classes for geospatial computations in Cesium.
Utility classes for Cesium.
STL namespace.
The result of sampling heights with Tileset::sampleHeightMostDetailed.
Additional options for configuring a Tileset.