Skip to content

Commit

Permalink
Merge pull request #1581 from CesiumGS/request-headers-tileset
Browse files Browse the repository at this point in the history
Add `RequestHeaders` property to `Cesium3DTileset`
  • Loading branch information
kring authored Jan 29, 2025
2 parents c557e79 + a9476d7 commit 950e28f
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

##### Additions :tada:

- 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.

##### Fixes :wrench:
Expand Down
38 changes: 38 additions & 0 deletions Source/CesiumRuntime/Private/Cesium3DTileset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,35 @@ void ACesium3DTileset::SetTilesetSource(ETilesetSource InSource) {
}
}

namespace {

bool MapsAreEqual(
const TMap<FString, FString>& Lhs,
const TMap<FString, FString>& Rhs) {
if (Lhs.Num() != Rhs.Num()) {
return false;
}

for (const auto& [Key, Value] : Lhs) {
const FString* RhsVal = Rhs.Find(Key);
if (!RhsVal || *RhsVal != Value) {
return false;
}
}

return true;
}

} // namespace

void ACesium3DTileset::SetRequestHeaders(
const TMap<FString, FString>& InRequestHeaders) {
if (!MapsAreEqual(InRequestHeaders, this->RequestHeaders)) {
this->DestroyTileset();
this->RequestHeaders = InRequestHeaders;
}
}

void ACesium3DTileset::SetUrl(const FString& InUrl) {
if (InUrl != this->Url) {
if (this->TilesetSource == ETilesetSource::FromUrl) {
Expand Down Expand Up @@ -1287,6 +1316,14 @@ void ACesium3DTileset::LoadTileset() {

options.contentOptions.applyTextureTransform = false;

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)});
}

switch (this->TilesetSource) {
case ETilesetSource::FromEllipsoid:
UE_LOG(LogCesium, Log, TEXT("Loading tileset from ellipsoid"));
Expand Down Expand Up @@ -2368,6 +2405,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") ||
Expand Down
16 changes: 16 additions & 0 deletions Source/CesiumRuntime/Public/Cesium3DTileset.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<FString, FString> RequestHeaders;

/**
* Check if the Cesium ion token used to access this tileset is working
* correctly, and fix it if necessary.
Expand Down Expand Up @@ -972,6 +982,12 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor {
UFUNCTION(BlueprintSetter, Category = "Cesium")
void SetUrl(const FString& InUrl);

UFUNCTION(BlueprintGetter, Category = "Cesium")
TMap<FString, FString> GetRequestHeaders() const { return RequestHeaders; }

UFUNCTION(BlueprintSetter, Category = "Cesium")
void SetRequestHeaders(const TMap<FString, FString>& InRequestHeaders);

UFUNCTION(BlueprintGetter, Category = "Cesium")
int64 GetIonAssetID() const { return IonAssetID; }

Expand Down

0 comments on commit 950e28f

Please sign in to comment.