ITwinCesiumCuratedContentLoader + Tileset constructor refactor

This commit is contained in:
Ashley Rogers 2025-03-04 17:17:41 -05:00
parent 8cbad73664
commit bfbfebdb7e
16 changed files with 218 additions and 35 deletions

View File

@ -1,5 +1,7 @@
#pragma once
#include "Cesium3DTilesSelection/TilesetLoaderFactory.h"
#include <Cesium3DTilesSelection/Library.h>
#include <Cesium3DTilesSelection/RasterOverlayCollection.h>
#include <Cesium3DTilesSelection/SampleHeightResult.h>
@ -80,6 +82,19 @@ public:
const TilesetOptions& options = TilesetOptions(),
const std::string& ionAssetEndpointUrl = "https://api.cesium.com/");
/**
* @brief Constructs a new instance with the given @ref TilesetLoaderFactory.
*
* @param externals The external interfaces to use.
* @param loaderFactory The factory to use to create the @ref
* TilesetContentLoader.
* @param options Additional options for the tileset.
*/
Tileset(
const TilesetExternals& externals,
const TilesetLoaderFactory& loaderFactory,
const TilesetOptions& options = TilesetOptions());
/**
* @brief Destroys this tileset.
*

View File

@ -0,0 +1,79 @@
#pragma once
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <CesiumAsync/Future.h>
namespace Cesium3DTilesSelection {
class TilesetLoaderFactory {
public:
using AuthorizationHeaderChangeListener = std::function<
void(const std::string& header, const std::string& headerValue)>;
virtual CesiumAsync::Future<
Cesium3DTilesSelection::TilesetContentLoaderResult<
Cesium3DTilesSelection::TilesetContentLoader>>
createLoader(
const TilesetExternals& externals,
const TilesetContentOptions& contentOptions,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
const CesiumGeospatial::Ellipsoid& ellipsoid) const = 0;
virtual bool isValid() const = 0;
};
class CesiumIonTilesetLoaderFactory : public TilesetLoaderFactory {
public:
CesiumIonTilesetLoaderFactory(
uint32_t ionAssetID,
const std::string& ionAccessToken,
const std::string& ionAssetEndpointUrl)
: _ionAssetID(ionAssetID),
_ionAccessToken(ionAccessToken),
_ionAssetEndpointUrl(ionAssetEndpointUrl) {}
virtual CesiumAsync::Future<
Cesium3DTilesSelection::TilesetContentLoaderResult<
Cesium3DTilesSelection::TilesetContentLoader>>
createLoader(
const TilesetExternals& externals,
const TilesetContentOptions& contentOptions,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
const CesiumGeospatial::Ellipsoid& ellipsoid) const override;
virtual bool isValid() const override { return this->_ionAssetID > 0; }
uint32_t _ionAssetID;
std::string _ionAccessToken;
std::string _ionAssetEndpointUrl;
};
class ITwinCesiumCuratedContentLoaderFactory : public TilesetLoaderFactory {
public:
ITwinCesiumCuratedContentLoaderFactory(
uint32_t iTwinCesiumContentID,
const std::string& iTwinAccessToken)
: _iTwinCesiumContentID(iTwinCesiumContentID),
_iTwinAccessToken(iTwinAccessToken) {}
virtual CesiumAsync::Future<
Cesium3DTilesSelection::TilesetContentLoaderResult<
Cesium3DTilesSelection::TilesetContentLoader>>
createLoader(
const TilesetExternals& externals,
const TilesetContentOptions& contentOptions,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
const CesiumGeospatial::Ellipsoid& ellipsoid) const override;
virtual bool isValid() const override {
return this->_iTwinCesiumContentID > 0;
}
uint32_t _iTwinCesiumContentID;
std::string _iTwinAccessToken;
};
} // namespace Cesium3DTilesSelection

View File

@ -1,12 +1,12 @@
#include "CesiumIonTilesetLoader.h"
#include "LayerJsonTerrainLoader.h"
#include "TilesetContentLoaderResult.h"
#include "TilesetJsonLoader.h"
#include <Cesium3DTilesSelection/Tile.h>
#include <Cesium3DTilesSelection/TileLoadResult.h>
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <Cesium3DTilesSelection/TilesetOptions.h>
#include <CesiumAsync/Future.h>
@ -50,6 +50,10 @@ public:
ionAssetID,
ionAccessToken);
}
virtual bool needsAuthHeaderOnInitialRequest() const override {
return false;
}
};
CesiumAsync::Future<std::shared_ptr<CesiumAsync::IAssetRequest>>
@ -743,7 +747,12 @@ CesiumIonTilesetLoader::createLoader(
endpoint.type));
return externals.asyncSystem.createResolvedFuture(std::move(result));
} else {
return externals.pAssetAccessor->get(externals.asyncSystem, ionUrl)
std::vector<CesiumAsync::IAssetAccessor::THeader> headers;
if (endpointResource.needsAuthHeaderOnInitialRequest()) {
headers.emplace_back("Authorization", "Bearer " + ionAccessToken);
}
return externals.pAssetAccessor->get(externals.asyncSystem, ionUrl, headers)
.thenInMainThread(
[externals,
ellipsoid,

View File

@ -1,9 +1,9 @@
#pragma once
#include "CesiumAsync/IAssetAccessor.h"
#include "TilesetContentLoaderResult.h"
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <functional>
@ -15,6 +15,8 @@ class CesiumIonTilesetLoader;
class EndpointResource {
public:
virtual bool needsAuthHeaderOnInitialRequest() const = 0;
virtual std::string getUrl(
int64_t assetID,
const std::string& accessToken,

View File

@ -15,6 +15,8 @@ public:
ionAssetEndpointUrl,
ionAssetID);
}
virtual bool needsAuthHeaderOnInitialRequest() const override { return true; }
};
CesiumAsync::Future<TilesetContentLoaderResult<CesiumIonTilesetLoader>>
@ -23,7 +25,6 @@ ITwinCesiumCuratedContentLoader::createLoader(
const TilesetContentOptions& contentOptions,
int64_t ionAssetID,
const std::string& ionAccessToken,
const std::string& ionAssetEndpointUrl,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
const CesiumGeospatial::Ellipsoid& ellipsoid) {
@ -32,7 +33,7 @@ ITwinCesiumCuratedContentLoader::createLoader(
contentOptions,
ionAssetID,
ionAccessToken,
ionAssetEndpointUrl,
"",
ITwinCesiumCuratedContentEndpointResource{},
headerChangeListener,
showCreditsOnScreen,
@ -45,7 +46,6 @@ ITwinCesiumCuratedContentLoader::refreshTokenIfNeeded(
const TilesetContentOptions& contentOptions,
int64_t ionAssetID,
const std::string& ionAccessToken,
const std::string& ionAssetEndpointUrl,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
TilesetContentLoaderResult<CesiumIonTilesetLoader>&& result,
@ -55,7 +55,7 @@ ITwinCesiumCuratedContentLoader::refreshTokenIfNeeded(
contentOptions,
ionAssetID,
ionAccessToken,
ionAssetEndpointUrl,
"",
ITwinCesiumCuratedContentEndpointResource{},
headerChangeListener,
showCreditsOnScreen,

View File

@ -2,9 +2,9 @@
#include "CesiumAsync/IAssetAccessor.h"
#include "CesiumIonTilesetLoader.h"
#include "TilesetContentLoaderResult.h"
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <functional>
@ -23,7 +23,6 @@ public:
const TilesetContentOptions& contentOptions,
int64_t ionAssetID,
const std::string& ionAccessToken,
const std::string& ionAssetEndpointUrl,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
const CesiumGeospatial::Ellipsoid& ellipsoid CESIUM_DEFAULT_ELLIPSOID);
@ -34,7 +33,6 @@ public:
const TilesetContentOptions& contentOptions,
int64_t ionAssetID,
const std::string& ionAccessToken,
const std::string& ionAssetEndpointUrl,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
TilesetContentLoaderResult<CesiumIonTilesetLoader>&& result,

View File

@ -1,12 +1,11 @@
#include "LayerJsonTerrainLoader.h"
#include "TilesetContentLoaderResult.h"
#include <Cesium3DTilesSelection/BoundingVolume.h>
#include <Cesium3DTilesSelection/Tile.h>
#include <Cesium3DTilesSelection/TileContent.h>
#include <Cesium3DTilesSelection/TileLoadResult.h>
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <Cesium3DTilesSelection/TilesetOptions.h>
#include <CesiumAsync/AsyncSystem.h>

View File

@ -1,8 +1,7 @@
#pragma once
#include "TilesetContentLoaderResult.h"
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <CesiumAsync/Future.h>
#include <CesiumAsync/IAssetAccessor.h>

View File

@ -1,3 +1,4 @@
#include "Cesium3DTilesSelection/TilesetLoaderFactory.h"
#include "TilesetContentManager.h"
#include "TilesetHeightQuery.h"
@ -119,6 +120,22 @@ Tileset::Tileset(
ionAccessToken,
ionAssetEndpointUrl)} {}
Tileset::Tileset(
const TilesetExternals& externals,
const TilesetLoaderFactory& loaderFactory,
const TilesetOptions& options)
: _externals(externals),
_asyncSystem(externals.asyncSystem),
_options(options),
_previousFrameNumber(0),
_distances(),
_childOcclusionProxies(),
_pTilesetContentManager{new TilesetContentManager(
_externals,
_options,
RasterOverlayCollection{_loadedTiles, externals, options.ellipsoid},
loaderFactory)} {}
Tileset::~Tileset() noexcept {
TilesetHeightRequest::failHeightRequests(
this->_heightRequests,

View File

@ -1,10 +1,10 @@
#include "TilesetContentManager.h"
#include "CesiumIonTilesetLoader.h"
#include "ITwinCesiumCuratedContentLoader.h"
#include "LayerJsonTerrainLoader.h"
#include "RasterOverlayUpsampler.h"
#include "TileContentLoadInfo.h"
#include "TilesetContentLoaderResult.h"
#include "TilesetJsonLoader.h"
#include <Cesium3DTilesSelection/BoundingVolume.h>
@ -16,6 +16,7 @@
#include <Cesium3DTilesSelection/TileLoadResult.h>
#include <Cesium3DTilesSelection/TileRefine.h>
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <Cesium3DTilesSelection/TilesetLoadFailureDetails.h>
#include <Cesium3DTilesSelection/TilesetOptions.h>
@ -886,9 +887,7 @@ TilesetContentManager::TilesetContentManager(
const TilesetExternals& externals,
const TilesetOptions& tilesetOptions,
RasterOverlayCollection&& overlayCollection,
int64_t ionAssetID,
const std::string& ionAccessToken,
const std::string& ionAssetEndpointUrl)
const TilesetLoaderFactory& loaderFactory)
: _externals{externals},
_requestHeaders{tilesetOptions.requestHeaders},
_pLoader{},
@ -911,7 +910,7 @@ TilesetContentManager::TilesetContentManager(
_rootTileAvailablePromise{externals.asyncSystem.createPromise<void>()},
_rootTileAvailableFuture{
this->_rootTileAvailablePromise.getFuture().share()} {
if (ionAssetID > 0) {
if (loaderFactory.isValid()) {
auto authorizationChangeListener = [this](
const std::string& header,
const std::string& headerValue) {
@ -931,18 +930,16 @@ TilesetContentManager::TilesetContentManager(
CesiumUtility::IntrusivePointer<TilesetContentManager> thiz = this;
CesiumIonTilesetLoader::createLoader(
externals,
tilesetOptions.contentOptions,
static_cast<uint32_t>(ionAssetID),
ionAccessToken,
ionAssetEndpointUrl,
authorizationChangeListener,
tilesetOptions.showCreditsOnScreen,
tilesetOptions.ellipsoid)
loaderFactory
.createLoader(
externals,
tilesetOptions.contentOptions,
authorizationChangeListener,
tilesetOptions.showCreditsOnScreen,
tilesetOptions.ellipsoid)
.thenInMainThread(
[thiz, errorCallback = tilesetOptions.loadErrorCallback](
TilesetContentLoaderResult<CesiumIonTilesetLoader>&& result) {
TilesetContentLoaderResult<TilesetContentLoader>&& result) {
thiz->notifyTileDoneLoading(result.pRootTile.get());
thiz->propagateTilesetContentLoaderResult(
TilesetLoadType::CesiumIon,

View File

@ -1,12 +1,13 @@
#pragma once
#include "Cesium3DTilesSelection/TilesetLoaderFactory.h"
#include "RasterOverlayUpsampler.h"
#include "TilesetContentLoaderResult.h"
#include <Cesium3DTilesSelection/RasterOverlayCollection.h>
#include <Cesium3DTilesSelection/Tile.h>
#include <Cesium3DTilesSelection/TileContent.h>
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <Cesium3DTilesSelection/TilesetLoadFailureDetails.h>
#include <Cesium3DTilesSelection/TilesetOptions.h>
@ -57,13 +58,27 @@ public:
RasterOverlayCollection&& overlayCollection,
const std::string& url);
TilesetContentManager(
const TilesetExternals& externals,
const TilesetOptions& tilesetOptions,
RasterOverlayCollection&& overlayCollection,
const TilesetLoaderFactory& loaderFactory);
TilesetContentManager(
const TilesetExternals& externals,
const TilesetOptions& tilesetOptions,
RasterOverlayCollection&& overlayCollection,
int64_t ionAssetID,
const std::string& ionAccessToken,
const std::string& ionAssetEndpointUrl = "https://api.cesium.com/");
const std::string& ionAssetEndpointUrl = "https://api.cesium.com/")
: TilesetContentManager(
externals,
tilesetOptions,
std::move(overlayCollection),
CesiumIonTilesetLoaderFactory(
static_cast<uint32_t>(ionAssetID),
ionAccessToken,
ionAssetEndpointUrl)) {}
/**
* @brief A future that resolves after all async operations initiated by this

View File

@ -2,7 +2,6 @@
#include "ImplicitOctreeLoader.h"
#include "ImplicitQuadtreeLoader.h"
#include "TilesetContentLoaderResult.h"
#include "logTileLoadResult.h"
#include <Cesium3DTiles/Extension3dTilesBoundingVolumeCylinder.h>
@ -20,6 +19,7 @@
#include <Cesium3DTilesSelection/TileLoadResult.h>
#include <Cesium3DTilesSelection/TileRefine.h>
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <CesiumAsync/AsyncSystem.h>
#include <CesiumAsync/HttpHeaders.h>

View File

@ -1,8 +1,7 @@
#pragma once
#include "TilesetContentLoaderResult.h"
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetExternals.h>
#include <Cesium3DTilesSelection/TilesetSharedAssetSystem.h>
#include <CesiumAsync/Future.h>

View File

@ -0,0 +1,54 @@
#pragma once
#include "CesiumIonTilesetLoader.h"
#include "ITwinCesiumCuratedContentLoader.h"
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetLoaderFactory.h>
namespace Cesium3DTilesSelection {
CesiumAsync::Future<TilesetContentLoaderResult<TilesetContentLoader>>
CesiumIonTilesetLoaderFactory::createLoader(
const TilesetExternals& externals,
const TilesetContentOptions& contentOptions,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
const CesiumGeospatial::Ellipsoid& ellipsoid) const {
return CesiumIonTilesetLoader::createLoader(
externals,
contentOptions,
this->_ionAssetID,
this->_ionAccessToken,
this->_ionAssetEndpointUrl,
headerChangeListener,
showCreditsOnScreen,
ellipsoid)
.thenImmediately([](Cesium3DTilesSelection::TilesetContentLoaderResult<
CesiumIonTilesetLoader>&& result) {
return TilesetContentLoaderResult<TilesetContentLoader>(
std::move(result));
});
}
CesiumAsync::Future<TilesetContentLoaderResult<TilesetContentLoader>>
ITwinCesiumCuratedContentLoaderFactory::createLoader(
const TilesetExternals& externals,
const TilesetContentOptions& contentOptions,
const AuthorizationHeaderChangeListener& headerChangeListener,
bool showCreditsOnScreen,
const CesiumGeospatial::Ellipsoid& ellipsoid) const {
return ITwinCesiumCuratedContentLoader::createLoader(
externals,
contentOptions,
this->_iTwinCesiumContentID,
this->_iTwinAccessToken,
headerChangeListener,
showCreditsOnScreen,
ellipsoid)
.thenImmediately([](Cesium3DTilesSelection::TilesetContentLoaderResult<
CesiumIonTilesetLoader>&& result) {
return TilesetContentLoaderResult<TilesetContentLoader>(
std::move(result));
});
}
}; // namespace Cesium3DTilesSelection

View File

@ -2,7 +2,6 @@
#include "ImplicitQuadtreeLoader.h"
#include "SimplePrepareRendererResource.h"
#include "TilesetContentLoaderResult.h"
#include "TilesetJsonLoader.h"
#include <Cesium3DTiles/Schema.h>
@ -12,6 +11,7 @@
#include <Cesium3DTilesSelection/TileLoadResult.h>
#include <Cesium3DTilesSelection/TileRefine.h>
#include <Cesium3DTilesSelection/TilesetContentLoader.h>
#include <Cesium3DTilesSelection/TilesetContentLoaderResult.h>
#include <Cesium3DTilesSelection/TilesetMetadata.h>
#include <CesiumAsync/AsyncSystem.h>
#include <CesiumGeometry/Axis.h>