From ede6c52dc7af0e7585f5ea87f2fa5e7dc8e57978 Mon Sep 17 00:00:00 2001 From: Ashley Rogers Date: Thu, 9 Jan 2025 16:51:13 -0500 Subject: [PATCH] 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