Skip to content
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 244 additions & 14 deletions Source/CesiumRuntime/Private/Cesium3DTileset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
#include "Async/Async.h"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remember to update CHANGES.md!

#include "Camera/CameraTypes.h"
#include "Camera/PlayerCameraManager.h"
#include "Cesium3DTilesSelection/CesiumIonTilesetContentLoaderFactory.h"
#include "Cesium3DTilesSelection/EllipsoidTilesetLoader.h"
#include "Cesium3DTilesSelection/IModelMeshExportContentLoaderFactory.h"
#include "Cesium3DTilesSelection/ITwinCesiumCuratedContentLoaderFactory.h"
#include "Cesium3DTilesSelection/ITwinRealityDataContentLoaderFactory.h"
#include "Cesium3DTilesSelection/Tile.h"
#include "Cesium3DTilesSelection/TilesetLoadFailureDetails.h"
#include "Cesium3DTilesSelection/TilesetOptions.h"
Comment on lines +7 to 14
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we make these angle brackets? I see that other files in this PR are using angle brackets anyway.

Expand Down Expand Up @@ -436,6 +440,54 @@ void ACesium3DTileset::SetIonAccessToken(const FString& InAccessToken) {
}
}

void ACesium3DTileset::SetITwinCesiumContentID(int64 InContentID) {
if (InContentID >= 0 && InContentID != this->ITwinCesiumContentID) {
if (this->TilesetSource == ETilesetSource::FromITwinCesiumCuratedContent) {
this->DestroyTileset();
}
this->ITwinCesiumContentID = InContentID;
}
}

void ACesium3DTileset::SetIModelID(const FString& InModelID) {
if (InModelID != this->IModelID) {
if (this->TilesetSource == ETilesetSource::FromIModelMeshExportService) {
this->DestroyTileset();
}
this->IModelID = InModelID;
}
}

void ACesium3DTileset::SetRealityDataID(const FString& InRealityDataID) {
if (InRealityDataID != this->RealityDataID) {
if (this->TilesetSource == ETilesetSource::FromITwinRealityData) {
this->DestroyTileset();
}
this->RealityDataID = InRealityDataID;
}
}

void ACesium3DTileset::SetITwinID(const FString& InITwinID) {
if (InITwinID != this->ITwinID) {
if (this->TilesetSource == ETilesetSource::FromITwinRealityData) {
this->DestroyTileset();
}
this->ITwinID = InITwinID;
}
}

void ACesium3DTileset::SetITwinConnection(
UCesiumITwinConnection* InConnection) {
if (this->ITwinConnection != InConnection) {
if (this->TilesetSource == ETilesetSource::FromITwinCesiumCuratedContent ||
this->TilesetSource == ETilesetSource::FromIModelMeshExportService ||
this->TilesetSource == ETilesetSource::FromITwinRealityData) {
this->DestroyTileset();
}
this->ITwinConnection = InConnection;
}
}

void ACesium3DTileset::SetCesiumIonServer(UCesiumIonServer* Server) {
if (this->CesiumIonServer != Server) {
if (this->TilesetSource == ETilesetSource::FromCesiumIon) {
Expand Down Expand Up @@ -1110,28 +1162,137 @@ void ACesium3DTileset::LoadTileset() {
Log,
TEXT("Loading tileset for asset ID %d"),
this->IonAssetID);
FString token = this->IonAccessToken.IsEmpty()
? this->CesiumIonServer->DefaultIonAccessToken
: this->IonAccessToken;
{
FString token = this->IonAccessToken.IsEmpty()
? this->CesiumIonServer->DefaultIonAccessToken
: this->IonAccessToken;

#if WITH_EDITOR
this->CesiumIonServer->ResolveApiUrl();
this->CesiumIonServer->ResolveApiUrl();
#endif

std::string ionAssetEndpointUrl =
TCHAR_TO_UTF8(*this->CesiumIonServer->ApiUrl);
std::string ionAssetEndpointUrl =
TCHAR_TO_UTF8(*this->CesiumIonServer->ApiUrl);

if (!ionAssetEndpointUrl.empty()) {
// Make sure the URL ends with a slash
if (!ionAssetEndpointUrl.empty() && *ionAssetEndpointUrl.rbegin() != '/')
ionAssetEndpointUrl += '/';
if (!ionAssetEndpointUrl.empty()) {
// Make sure the URL ends with a slash
if (!ionAssetEndpointUrl.empty() &&
*ionAssetEndpointUrl.rbegin() != '/')
ionAssetEndpointUrl += '/';

this->_pTileset = MakeUnique<Cesium3DTilesSelection::Tileset>(
externals,
static_cast<uint32_t>(this->IonAssetID),
TCHAR_TO_UTF8(*token),
options,
ionAssetEndpointUrl);
}
}
break;
case ETilesetSource::FromITwinCesiumCuratedContent:
UE_LOG(
LogCesium,
Log,
TEXT("Loading tileset for asset ID %d"),
this->ITwinCesiumContentID);

{
const std::string token = IsValid(this->ITwinConnection)
? this->ITwinConnection->GetConnection()
->getAuthenticationToken()
.getToken()
: "";
this->_pTileset = MakeUnique<Cesium3DTilesSelection::Tileset>(
externals,
Cesium3DTilesSelection::ITwinCesiumCuratedContentLoaderFactory(
static_cast<uint32_t>(this->ITwinCesiumContentID),
token),
options);
}
break;
case ETilesetSource::FromIModelMeshExportService:
UE_LOG(
LogCesium,
Log,
TEXT("Loading mesh export for iModel ID %s"),
*this->IModelID);

{
const std::string token = IsValid(this->ITwinConnection)
? this->ITwinConnection->GetConnection()
->getAuthenticationToken()
.getToken()
: "";
this->_pTileset = MakeUnique<Cesium3DTilesSelection::Tileset>(
externals,
static_cast<uint32_t>(this->IonAssetID),
TCHAR_TO_UTF8(*token),
options,
ionAssetEndpointUrl);
Cesium3DTilesSelection::IModelMeshExportContentLoaderFactory(
TCHAR_TO_UTF8(*this->IModelID),
std::nullopt,
token),
options);
}
break;
case ETilesetSource::FromITwinRealityData:
UE_LOG(
LogCesium,
Log,
TEXT("Loading reality data ID %s"),
*this->RealityDataID);

{
const std::string token = IsValid(this->ITwinConnection)
? this->ITwinConnection->GetConnection()
->getAuthenticationToken()
.getToken()
: "";

this->_pTileset = MakeUnique<Cesium3DTilesSelection::Tileset>(
externals,
Cesium3DTilesSelection::ITwinRealityDataContentLoaderFactory(
TCHAR_TO_UTF8(*this->RealityDataID),
this->ITwinID.IsEmpty() ? std::nullopt
: std::make_optional<std::string>(
TCHAR_TO_UTF8(*this->ITwinID)),
token,
[asyncSystem,
pConnectionObject = this->ITwinConnection](const std::string&) {
if (!IsValid(pConnectionObject) ||
!pConnectionObject->GetConnection().IsValid()) {
return asyncSystem.createResolvedFuture<
CesiumUtility::
Result<std::string>>(CesiumUtility::ErrorList::error(
"iTwin connection property on tileset is not valid."));
}

const TSharedPtr<CesiumITwinClient::Connection> pConnection =
pConnectionObject->GetConnection();
if (!pConnection->getRefreshToken()) {
return asyncSystem.createResolvedFuture<
CesiumUtility::
Result<std::string>>(CesiumUtility::ErrorList::error(
"Access token for reality data is expired, no refresh token available."));
}

return pConnection->me().thenImmediately(
[pConnection](
CesiumUtility::Result<CesiumITwinClient::UserProfile>&&
result) -> CesiumUtility::Result<std::string> {
if (!result.value) {
return CesiumUtility::Result<std::string>(
result.errors);
}

if (!pConnection->getAuthenticationToken().isValid()) {
return CesiumUtility::Result<
std::string>(CesiumUtility::ErrorList::error(
"Tried to refresh access token for reality data, but was not able to obtain valid token."));
}

return CesiumUtility::Result<std::string>(
pConnection->getAuthenticationToken().getToken());
});
}),
options);
}
break;
}
Expand Down Expand Up @@ -1183,6 +1344,27 @@ void ACesium3DTileset::LoadTileset() {
TEXT("Loading tileset for asset ID %d done"),
this->IonAssetID);
break;
case ETilesetSource::FromITwinCesiumCuratedContent:
UE_LOG(
LogCesium,
Log,
TEXT("Loading tileset for asset ID %d done"),
this->ITwinCesiumContentID);
break;
case ETilesetSource::FromIModelMeshExportService:
UE_LOG(
LogCesium,
Log,
TEXT("Loading mesh export for iModel ID %s done"),
*this->IModelID);
break;
case ETilesetSource::FromITwinRealityData:
UE_LOG(
LogCesium,
Log,
TEXT("Loading reality data ID %s done"),
*this->RealityDataID);
break;
}

switch (ApplyDpiScaling) {
Expand Down Expand Up @@ -1224,6 +1406,27 @@ void ACesium3DTileset::DestroyTileset() {
TEXT("Destroying tileset for asset ID %d"),
this->IonAssetID);
break;
case ETilesetSource::FromITwinCesiumCuratedContent:
UE_LOG(
LogCesium,
Verbose,
TEXT("Destroying tileset for asset ID %d"),
this->ITwinCesiumContentID);
break;
case ETilesetSource::FromIModelMeshExportService:
UE_LOG(
LogCesium,
Log,
TEXT("Destroying tileset for iModel ID %s"),
*this->IModelID);
break;
case ETilesetSource::FromITwinRealityData:
UE_LOG(
LogCesium,
Log,
TEXT("Destroying tileset for reality data ID %s done"),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
TEXT("Destroying tileset for reality data ID %s done"),
TEXT("Destroying tileset for reality data ID %s"),

*this->RealityDataID);
break;
}

// The way CesiumRasterOverlay::add is currently implemented, destroying the
Expand Down Expand Up @@ -1282,6 +1485,27 @@ void ACesium3DTileset::DestroyTileset() {
TEXT("Destroying tileset for asset ID %d done"),
this->IonAssetID);
break;
case ETilesetSource::FromITwinCesiumCuratedContent:
UE_LOG(
LogCesium,
Verbose,
TEXT("Destroying tileset for asset ID %d done"),
this->ITwinCesiumContentID);
break;
case ETilesetSource::FromIModelMeshExportService:
UE_LOG(
LogCesium,
Log,
TEXT("Destroying tileset for iModel ID %s done"),
*this->IModelID);
break;
case ETilesetSource::FromITwinRealityData:
UE_LOG(
LogCesium,
Log,
TEXT("Destroying tileset for reality data ID %s done"),
*this->RealityDataID);
break;
}
}

Expand Down Expand Up @@ -2178,6 +2402,12 @@ void ACesium3DTileset::PostEditChangeProperty(
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, Url) ||
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, IonAssetID) ||
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, IonAccessToken) ||
PropName ==
GET_MEMBER_NAME_CHECKED(ACesium3DTileset, ITwinCesiumContentID) ||
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, IModelID) ||
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, RealityDataID) ||
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, ITwinID) ||
PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, ITwinConnection) ||
PropName ==
GET_MEMBER_NAME_CHECKED(ACesium3DTileset, CreatePhysicsMeshes) ||
PropName ==
Expand Down
Loading