Skip to content

Commit fd684be

Browse files
committed
FromUrl async action
1 parent 452fddc commit fd684be

File tree

3 files changed

+85
-4
lines changed

3 files changed

+85
-4
lines changed

Source/CesiumRuntime/Private/CesiumGeoJsonDocument.cpp

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#include "CesiumGeoJsonDocument.h"
22
#include "CesiumRuntime.h"
33

4-
#include "CesiumUtility/Result.h"
4+
#include <CesiumAsync/IAssetAccessor.h>
5+
#include <CesiumUtility/Result.h>
56

67
#include <span>
78

@@ -92,3 +93,54 @@ void UCesiumLoadVectorDocumentFromIonAsyncAction::Activate() {
9293
}
9394
});
9495
}
96+
97+
UCesiumLoadVectorDocumentFromUrlAsyncAction*
98+
UCesiumLoadVectorDocumentFromUrlAsyncAction::LoadFromUrl(
99+
const FString& Url,
100+
const TMap<FString, FString>& Headers) {
101+
UCesiumLoadVectorDocumentFromUrlAsyncAction* pAction =
102+
NewObject<UCesiumLoadVectorDocumentFromUrlAsyncAction>();
103+
pAction->Url = Url;
104+
pAction->Headers = Headers;
105+
return pAction;
106+
}
107+
108+
void UCesiumLoadVectorDocumentFromUrlAsyncAction::Activate() {
109+
std::vector<CesiumAsync::IAssetAccessor::THeader> requestHeaders;
110+
requestHeaders.reserve(this->Headers.Num());
111+
112+
for (const auto& [Key, Value] : this->Headers) {
113+
requestHeaders.emplace_back(CesiumAsync::IAssetAccessor::THeader{
114+
TCHAR_TO_UTF8(*Key),
115+
TCHAR_TO_UTF8(*Value)});
116+
}
117+
118+
CesiumVectorData::GeoJsonDocument::fromUrl(
119+
getAsyncSystem(),
120+
getAssetAccessor(),
121+
TCHAR_TO_UTF8(*this->Url),
122+
std::move(requestHeaders))
123+
.thenInMainThread(
124+
[Callback = this->OnLoadResult](
125+
CesiumUtility::Result<CesiumVectorData::GeoJsonDocument>&&
126+
result) {
127+
if (result.errors.hasErrors()) {
128+
result.errors.logError(
129+
spdlog::default_logger(),
130+
"Errors loading GeoJSON:");
131+
result.errors.logWarning(
132+
spdlog::default_logger(),
133+
"Warnings loading GeoJSON:");
134+
}
135+
136+
if (result.value) {
137+
Callback.Broadcast(
138+
true,
139+
FCesiumGeoJsonDocument(
140+
std::make_shared<CesiumVectorData::GeoJsonDocument>(
141+
std::move(*result.value))));
142+
} else {
143+
Callback.Broadcast(false, {});
144+
}
145+
});
146+
}

Source/CesiumRuntime/Public/CesiumGeoJsonDocument.h

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class UCesiumGeoJsonDocumentBlueprintLibrary
7979
};
8080

8181
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(
82-
FCesiumVectorDocumentIonLoadDelegate,
82+
FCesiumVectorDocumentAsyncLoadDelegate,
8383
bool,
8484
Success,
8585
FCesiumGeoJsonDocument,
@@ -108,11 +108,40 @@ class CESIUMRUNTIME_API UCesiumLoadVectorDocumentFromIonAsyncAction
108108
const FString& IonAssetEndpointUrl = "https://api.cesium.com/");
109109

110110
UPROPERTY(BlueprintAssignable)
111-
FCesiumVectorDocumentIonLoadDelegate OnLoadResult;
111+
FCesiumVectorDocumentAsyncLoadDelegate OnLoadResult;
112112

113113
virtual void Activate() override;
114114

115115
int64 AssetId;
116116
FString IonAccessToken;
117117
FString IonAssetEndpointUrl;
118118
};
119+
120+
UCLASS()
121+
class CESIUMRUNTIME_API UCesiumLoadVectorDocumentFromUrlAsyncAction
122+
: public UBlueprintAsyncActionBase {
123+
GENERATED_BODY()
124+
public:
125+
/**
126+
* @brief Attempts to load a vector document from a URL.
127+
*
128+
* If successful, `Success` will be true and `Document` will contain the
129+
* loaded document.
130+
*/
131+
UFUNCTION(
132+
BlueprintCallable,
133+
Category = "Cesium|Vector|Document",
134+
meta =
135+
(BlueprintInternalUseOnly = true,
136+
DisplayName = "Load Vector Document from URL"))
137+
static UCesiumLoadVectorDocumentFromUrlAsyncAction*
138+
LoadFromUrl(const FString& Url, const TMap<FString, FString>& Headers);
139+
140+
UPROPERTY(BlueprintAssignable)
141+
FCesiumVectorDocumentAsyncLoadDelegate OnLoadResult;
142+
143+
virtual void Activate() override;
144+
145+
FString Url;
146+
TMap<FString, FString> Headers;
147+
};

0 commit comments

Comments
 (0)