From ede6c52dc7af0e7585f5ea87f2fa5e7dc8e57978 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Thu, 9 Jan 2025 16:51:13 -0500 Subject: [PATCH 1/6] Add RequestHeaders property to Cesium3DTileset --- CHANGES.md | 5 +++ .../CesiumRuntime/Private/Cesium3DTileset.cpp | 33 +++++++++++++++++++ Source/CesiumRuntime/Public/Cesium3DTileset.h | 16 +++++++++ extern/cesium-native | 2 +- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 9562d0e2d..18fea6719 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # Change Log +### ? - ? + +##### Additions :tada: +- Added `RequestHeaders` property to `Cesium3DTileset`, allowing per-tileset headers to be specified. + ### v2.12.0 - 2025-01-02 ##### Breaking Changes :mega: diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index fa224a405..89faa34da 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -385,6 +385,31 @@ void ACesium3DTileset::SetTilesetSource(ETilesetSource InSource) { } } +bool CompareMaps( + const TMap& Lhs, + const TMap& Rhs) { + if (Lhs.Num() != Rhs.Num()) { + return false; + } + + for (auto& [Key, Value] : Lhs) { + const FString* RhsVal = Rhs.Find(Key); + if (!RhsVal || *RhsVal != Value) { + return false; + } + } + + return true; +} + +void ACesium3DTileset::SetRequestHeaders( + const TMap& InRequestHeaders) { + if (!CompareMaps(InRequestHeaders, this->RequestHeaders)) { + this->DestroyTileset(); + this->RequestHeaders = RequestHeaders; + } +} + void ACesium3DTileset::SetUrl(const FString& InUrl) { if (InUrl != this->Url) { if (this->TilesetSource == ETilesetSource::FromUrl) { @@ -1287,6 +1312,14 @@ void ACesium3DTileset::LoadTileset() { options.contentOptions.applyTextureTransform = false; + options.requestHeaders.reserve(this->RequestHeaders.Num()); + + for (auto& [Key, Value] : this->RequestHeaders) { + options.requestHeaders.emplace_back(CesiumAsync::IAssetAccessor::THeader{ + std::string(TCHAR_TO_UTF8(*Key)), + std::string(TCHAR_TO_UTF8(*Value))}); + } + switch (this->TilesetSource) { case ETilesetSource::FromEllipsoid: UE_LOG(LogCesium, Log, TEXT("Loading tileset from ellipsoid")); diff --git a/Source/CesiumRuntime/Public/Cesium3DTileset.h b/Source/CesiumRuntime/Public/Cesium3DTileset.h index 22f27eb83..a13eb27b3 100644 --- a/Source/CesiumRuntime/Public/Cesium3DTileset.h +++ b/Source/CesiumRuntime/Public/Cesium3DTileset.h @@ -764,6 +764,16 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { meta = (EditCondition = "TilesetSource==ETilesetSource::FromCesiumIon")) UCesiumIonServer* CesiumIonServer; + /** + * Headers to be attached to each request made for this tileset. + */ + UPROPERTY( + EditAnywhere, + BlueprintGetter = GetRequestHeaders, + BlueprintSetter = SetRequestHeaders, + Category = "Cesium") + TMap RequestHeaders; + /** * Check if the Cesium ion token used to access this tileset is working * correctly, and fix it if necessary. @@ -972,6 +982,12 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { UFUNCTION(BlueprintSetter, Category = "Cesium") void SetUrl(const FString& InUrl); + UFUNCTION(BlueprintGetter, Category = "Cesium") + TMap GetRequestHeaders() const { return RequestHeaders; } + + UFUNCTION(BlueprintSetter, Category = "Cesium") + void SetRequestHeaders(const TMap& InRequestHeaders); + UFUNCTION(BlueprintGetter, Category = "Cesium") int64 GetIonAssetID() const { return IonAssetID; } diff --git a/extern/cesium-native b/extern/cesium-native index 4d9a63829..d15441622 160000 --- a/extern/cesium-native +++ b/extern/cesium-native @@ -1 +1 @@ -Subproject commit 4d9a63829f67370908a7fb4627fc3c3791b50c02 +Subproject commit d154416227d1f34a6f4a3562fd3312e269b367f8 From b7e985a9ac22a6db2a8cdf9522f169fd881f0ed0 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Thu, 9 Jan 2025 17:25:06 -0500 Subject: [PATCH 2/6] Fix self-assignment --- Source/CesiumRuntime/Private/Cesium3DTileset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index 89faa34da..46e391b28 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -406,7 +406,7 @@ void ACesium3DTileset::SetRequestHeaders( const TMap& InRequestHeaders) { if (!CompareMaps(InRequestHeaders, this->RequestHeaders)) { this->DestroyTileset(); - this->RequestHeaders = RequestHeaders; + this->RequestHeaders = InRequestHeaders; } } From 93a3060afbdc5bc716c3d188fa02889e87de2cba Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Thu, 16 Jan 2025 13:20:05 -0500 Subject: [PATCH 3/6] Address review comments --- Source/CesiumRuntime/Private/Cesium3DTileset.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index 46e391b28..374dac270 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -392,7 +392,7 @@ bool CompareMaps( return false; } - for (auto& [Key, Value] : Lhs) { + for (const auto& [Key, Value] : Lhs) { const FString* RhsVal = Rhs.Find(Key); if (!RhsVal || *RhsVal != Value) { return false; @@ -1314,10 +1314,8 @@ void ACesium3DTileset::LoadTileset() { options.requestHeaders.reserve(this->RequestHeaders.Num()); - for (auto& [Key, Value] : this->RequestHeaders) { - options.requestHeaders.emplace_back(CesiumAsync::IAssetAccessor::THeader{ - std::string(TCHAR_TO_UTF8(*Key)), - std::string(TCHAR_TO_UTF8(*Value))}); + for (const auto& [Key, Value] : this->RequestHeaders) { + options.requestHeaders.emplace_back(CesiumAsync::IAssetAccessor::THeader{TCHAR_TO_UTF8(*Key), TCHAR_TO_UTF8(*Value)}); } switch (this->TilesetSource) { @@ -2401,6 +2399,7 @@ void ACesium3DTileset::PostEditChangeProperty( GET_MEMBER_NAME_CHECKED(ACesium3DTileset, ShowCreditsOnScreen) || PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, Root) || PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, CesiumIonServer) || + PropName == GET_MEMBER_NAME_CHECKED(ACesium3DTileset, RequestHeaders) || // For properties nested in structs, GET_MEMBER_NAME_CHECKED will prefix // with the struct name, so just do a manual string comparison. PropNameAsString == TEXT("RenderCustomDepth") || From 96cf6051c532d398e1e58516cc46d1ad94067c0f Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Thu, 16 Jan 2025 14:16:02 -0500 Subject: [PATCH 4/6] Update cesium-native, format --- Source/CesiumRuntime/Private/Cesium3DTileset.cpp | 4 +++- extern/cesium-native | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index 374dac270..1273461c3 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -1315,7 +1315,9 @@ void ACesium3DTileset::LoadTileset() { options.requestHeaders.reserve(this->RequestHeaders.Num()); for (const auto& [Key, Value] : this->RequestHeaders) { - options.requestHeaders.emplace_back(CesiumAsync::IAssetAccessor::THeader{TCHAR_TO_UTF8(*Key), TCHAR_TO_UTF8(*Value)}); + options.requestHeaders.emplace_back(CesiumAsync::IAssetAccessor::THeader{ + TCHAR_TO_UTF8(*Key), + TCHAR_TO_UTF8(*Value)}); } switch (this->TilesetSource) { diff --git a/extern/cesium-native b/extern/cesium-native index d15441622..8269d1b7d 160000 --- a/extern/cesium-native +++ b/extern/cesium-native @@ -1 +1 @@ -Subproject commit d154416227d1f34a6f4a3562fd3312e269b367f8 +Subproject commit 8269d1b7da6e313bba3d07ffa875548acde69550 From dbb405618afc58f38e306efc5c3cef3e94f4efdd Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Wed, 29 Jan 2025 21:35:46 +1100 Subject: [PATCH 5/6] Remove redundant changelog entry. --- CHANGES.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index e67974a17..5aeae6267 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,6 @@ - Added `RequestHeaders` property to `Cesium3DTileset`, allowing per-tileset headers to be specified. - Added `CesiumUrlTemplateRasterOverlay`, allowing a raster overlay to be added using tiles requested based on a specified URL template. -- Added `RequestHeaders` property to `Cesium3DTileset`, allowing per-tileset headers to be specified. ##### Fixes :wrench: From a9476d76d3fcf1c922946ea531d0d15bfcc4eb3f Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Wed, 29 Jan 2025 21:44:43 +1100 Subject: [PATCH 6/6] CompareMaps -> MapsAreEqual, and move to anonymous namespace. --- Source/CesiumRuntime/Private/Cesium3DTileset.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index 1273461c3..736113f4a 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -385,7 +385,9 @@ void ACesium3DTileset::SetTilesetSource(ETilesetSource InSource) { } } -bool CompareMaps( +namespace { + +bool MapsAreEqual( const TMap& Lhs, const TMap& Rhs) { if (Lhs.Num() != Rhs.Num()) { @@ -402,9 +404,11 @@ bool CompareMaps( return true; } +} // namespace + void ACesium3DTileset::SetRequestHeaders( const TMap& InRequestHeaders) { - if (!CompareMaps(InRequestHeaders, this->RequestHeaders)) { + if (!MapsAreEqual(InRequestHeaders, this->RequestHeaders)) { this->DestroyTileset(); this->RequestHeaders = InRequestHeaders; }