Skip to content

Implement CesiumRasterOverlays::VectorDocumentRasterOverlay in Unreal #1677

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 43 commits into from
Jul 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
c799b49
VectorDocumentRasterOverlay
azrogers Apr 25, 2025
5981b19
Vector overlay from ion
azrogers Apr 25, 2025
edb69b5
Update with native changes
azrogers Apr 28, 2025
8f0a56f
Support for vector styling callback
azrogers May 2, 2025
992c2ee
Working style callback
azrogers May 2, 2025
35cf828
Cleanup
azrogers May 2, 2025
d7193a5
Merge from geojson-support
azrogers May 20, 2025
4649dce
Update from changes in Native
azrogers May 20, 2025
eb9fc2a
Format
azrogers May 20, 2025
9542362
Remove unnecessary includes
azrogers May 21, 2025
c642c9a
Merge from main
azrogers Jun 3, 2025
e3dad3a
Merge from geojson-support
azrogers Jun 12, 2025
db89632
Update overlay for GeoJSON changes
azrogers Jun 12, 2025
ffc975f
Add overlay to disable JIT on iOS
azrogers Jun 12, 2025
35347f9
Fix portfile
azrogers Jun 12, 2025
efaaae5
Fix incorrectly named usage
azrogers Jun 12, 2025
d413312
Fix CI issue
azrogers Jun 13, 2025
0a56439
Update cesium-native
azrogers Jun 13, 2025
d8f57c8
Merge branch 'geojson-support' of github.com:CesiumGS/cesium-unreal i…
azrogers Jun 13, 2025
98fb46b
Update cesium-native
azrogers Jun 13, 2025
96ce2c8
Set BLEND2D_NO_JIT to ON
azrogers Jun 13, 2025
43da958
Remove overlay port, update cesium-native
azrogers Jun 13, 2025
e93154e
Bring up to date with vector-rasterizer
azrogers Jun 17, 2025
1596f67
Remove std::move
azrogers Jun 17, 2025
4630fc6
Re-add overlay port
azrogers Jun 17, 2025
53b62a2
Fix portfile
azrogers Jun 17, 2025
ecccf91
Fix portfile again
azrogers Jun 17, 2025
b9bd5a5
Give that portfile another go
azrogers Jun 17, 2025
d0140d4
Exclude curl from build
azrogers Jun 17, 2025
058283f
Update cesium-native
azrogers Jun 17, 2025
d5d68a3
Fix inverted logic.
kring Jun 18, 2025
e380197
Update cesium-native
azrogers Jun 18, 2025
1be940f
Add functions for modifying style
azrogers Jun 18, 2025
a6c3062
Update cesium-native
azrogers Jun 26, 2025
facd63a
Merge remote-tracking branch 'origin/main' into vector-overlay
kring Jul 30, 2025
06593d9
Update cesium-native.
kring Jul 30, 2025
175a92a
Update cesium-native.
kring Jul 30, 2025
cca53bd
Merge remote-tracking branch 'origin/main' into vector-overlay
kring Jul 31, 2025
bf49997
Update changelog.
kring Jul 31, 2025
eb2ea66
Remove projection from GeoJsonDocumentRasterOverlay
azrogers Jul 31, 2025
25249b7
Merge branch 'vector-overlay' of github.com:CesiumGS/cesium-unreal in…
azrogers Jul 31, 2025
6bb68a9
Default color for vector style
azrogers Jul 31, 2025
761bf28
Update cesium-native.
kring Jul 31, 2025
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
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

##### Additions :tada:

- Added `CesiumGeoJsonDocumentRasterOverlay`, allowing stylized GeoJSON to be rasterized and draped over terrain and other 3D Tiles.
- Added `FCesiumPropertyAttributeProperty` to represent glTF property attribute properties and `UCesiumPropertyAttributePropertyBlueprintLibrary` to retrieve their values.
- Added `FCesiumPropertyAttribute` to represent glTF property attributes and `UCesiumPropertyAttributeBlueprintLibrary` to act upon them with Blueprints.
- Added `UCesiumPrimitiveMetadataBlueprintLibrary::GetPropertyAttributes` to retrieve the property attributes from a `FCesiumPrimitiveMetadata`.
Expand Down
9 changes: 9 additions & 0 deletions Source/CesiumRuntime/Private/CesiumGeoJsonDocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@ FCesiumGeoJsonDocument::FCesiumGeoJsonDocument(
std::shared_ptr<CesiumVectorData::GeoJsonDocument>&& document)
: _pDocument(std::move(document)) {}

bool FCesiumGeoJsonDocument::IsValid() const {
return this->_pDocument != nullptr;
}

const std::shared_ptr<CesiumVectorData::GeoJsonDocument>&
FCesiumGeoJsonDocument::GetDocument() const {
return this->_pDocument;
}

bool UCesiumGeoJsonDocumentBlueprintLibrary::LoadGeoJsonFromString(
const FString& InString,
FCesiumGeoJsonDocument& OutGeoJsonDocument) {
Expand Down
111 changes: 111 additions & 0 deletions Source/CesiumRuntime/Private/CesiumGeoJsonDocumentRasterOverlay.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
// Copyright 2020-2024 CesiumGS, Inc. and Contributors

#include "CesiumGeoJsonDocumentRasterOverlay.h"

#include "CesiumCustomVersion.h"
#include "CesiumGeometry/QuadtreeTilingScheme.h"
#include "CesiumGeospatial/GlobeRectangle.h"
#include "CesiumGeospatial/Projection.h"
#include "CesiumRasterOverlays/GeoJsonDocumentRasterOverlay.h"
#include "CesiumVectorData/VectorStyle.h"

#include "CesiumRuntime.h"

namespace {
CesiumAsync::Future<std::shared_ptr<CesiumVectorData::GeoJsonDocument>>
wrapLoaderFuture(
UCesiumGeoJsonDocumentRasterOverlay* pThis,
CesiumAsync::Future<
CesiumUtility::Result<CesiumVectorData::GeoJsonDocument>>&& future) {
return std::move(future).thenInMainThread(
[pThis](CesiumUtility::Result<CesiumVectorData::GeoJsonDocument>&&
documentResult)
-> std::shared_ptr<CesiumVectorData::GeoJsonDocument> {
if (documentResult.errors) {
documentResult.errors.logError(
spdlog::default_logger(),
"Errors loading GeoJSON document: ");
return nullptr;
}

std::shared_ptr<CesiumVectorData::GeoJsonDocument> pGeoJsonDocument =
std::make_shared<CesiumVectorData::GeoJsonDocument>(
std::move(*documentResult.value));

if (pThis->OnDocumentLoaded.IsBound()) {
pThis->OnDocumentLoaded.Execute(FCesiumGeoJsonDocument(
std::shared_ptr<CesiumVectorData::GeoJsonDocument>(
pGeoJsonDocument)));
}

return pGeoJsonDocument;
});
}
} // namespace

std::unique_ptr<CesiumRasterOverlays::RasterOverlay>
UCesiumGeoJsonDocumentRasterOverlay::CreateOverlay(
const CesiumRasterOverlays::RasterOverlayOptions& options) {
if (this->Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromDocument &&
!this->GeoJsonDocument.IsValid()) {
// Don't create an overlay with an invalid document.
return nullptr;
}

CesiumRasterOverlays::GeoJsonDocumentRasterOverlayOptions vectorOptions{
this->DefaultStyle.toNative(),
options.ellipsoid,
this->MipLevels};

if (this->Source ==
ECesiumGeoJsonDocumentRasterOverlaySource::FromCesiumIon) {
if (!IsValid(this->CesiumIonServer)) {
this->CesiumIonServer = UCesiumIonServer::GetServerForNewObjects();
}

return std::make_unique<CesiumRasterOverlays::GeoJsonDocumentRasterOverlay>(
TCHAR_TO_UTF8(*this->MaterialLayerKey),
wrapLoaderFuture(
this,
CesiumVectorData::GeoJsonDocument::fromCesiumIonAsset(
getAsyncSystem(),
getAssetAccessor(),
this->IonAssetID,
TCHAR_TO_UTF8(*this->CesiumIonServer->DefaultIonAccessToken),
std::string(TCHAR_TO_UTF8(*this->CesiumIonServer->ApiUrl)) +
"/")),
vectorOptions,
options);
} else if (
this->Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromUrl) {
std::vector<CesiumAsync::IAssetAccessor::THeader> headers;
headers.reserve(this->RequestHeaders.Num());

for (auto& [k, v] : this->RequestHeaders) {
headers.push_back({TCHAR_TO_UTF8(*k), TCHAR_TO_UTF8(*v)});
}

return std::make_unique<CesiumRasterOverlays::GeoJsonDocumentRasterOverlay>(
TCHAR_TO_UTF8(*this->MaterialLayerKey),
wrapLoaderFuture(
this,
CesiumVectorData::GeoJsonDocument::fromUrl(
getAsyncSystem(),
getAssetAccessor(),
TCHAR_TO_UTF8(*this->Url),
std::move(headers))),
vectorOptions,
options);
}

if (this->OnDocumentLoaded.IsBound()) {
this->OnDocumentLoaded.Execute(this->GeoJsonDocument);
}

return std::make_unique<CesiumRasterOverlays::GeoJsonDocumentRasterOverlay>(
getAsyncSystem(),
TCHAR_TO_UTF8(*this->MaterialLayerKey),
this->GeoJsonDocument.GetDocument(),
vectorOptions,
options);
}
35 changes: 35 additions & 0 deletions Source/CesiumRuntime/Private/CesiumGeoJsonObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,41 @@ UCesiumGeoJsonObjectBlueprintLibrary::GetObjectAsFeatureCollection(
return Features;
}

FCesiumVectorStyle UCesiumGeoJsonObjectBlueprintLibrary::GetStyle(
const FCesiumGeoJsonObject& InObject,
EHasValue& Branches) {
if (!InObject._pDocument || !InObject._pObject) {
Branches = EHasValue::NoValue;
return FCesiumVectorStyle();
}

const std::optional<CesiumVectorData::VectorStyle> style =
InObject._pObject->getStyle();
Branches = style ? EHasValue::HasValue : EHasValue::NoValue;
return style ? FCesiumVectorStyle::fromNative(*style) : FCesiumVectorStyle();
}

void UCesiumGeoJsonObjectBlueprintLibrary::SetStyle(
UPARAM(Ref) FCesiumGeoJsonObject& InObject,
const FCesiumVectorStyle& InStyle) {
if (!InObject._pDocument || !InObject._pObject) {
return;
}

const_cast<CesiumVectorData::GeoJsonObject*>(InObject._pObject)->getStyle() =
InStyle.toNative();
}

void UCesiumGeoJsonObjectBlueprintLibrary::ClearStyle(
UPARAM(Ref) FCesiumGeoJsonObject& InObject) {
if (!InObject._pDocument || !InObject._pObject) {
return;
}

const_cast<CesiumVectorData::GeoJsonObject*>(InObject._pObject)->getStyle() =
std::nullopt;
}

FCesiumGeoJsonLineString::FCesiumGeoJsonLineString(TArray<FVector>&& InPoints)
: Points(MoveTemp(InPoints)) {}

Expand Down
97 changes: 97 additions & 0 deletions Source/CesiumRuntime/Private/CesiumVectorStyle.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#include "CesiumVectorStyle.h"

#include "CesiumUtility/Color.h"

namespace {
CesiumVectorData::LineStyle
lineStyleToNative(const FCesiumVectorLineStyle& InLineStyle) {
return CesiumVectorData::LineStyle{
{CesiumUtility::Color{
InLineStyle.Color.R,
InLineStyle.Color.G,
InLineStyle.Color.B,
InLineStyle.Color.A},
(CesiumVectorData::ColorMode)InLineStyle.ColorMode},
InLineStyle.Width,
(CesiumVectorData::LineWidthMode)InLineStyle.WidthMode};
}
} // namespace

CesiumVectorData::VectorStyle FCesiumVectorStyle::toNative() const {
// Assert that enums are equivalent to catch any issues.
static_assert(
(uint8)CesiumVectorData::ColorMode::Normal ==
(uint8)ECesiumVectorColorMode::Normal);
static_assert(
(uint8)CesiumVectorData::ColorMode::Random ==
(uint8)ECesiumVectorColorMode::Random);
static_assert(
(uint8)CesiumVectorData::LineWidthMode::Meters ==
(uint8)ECesiumVectorLineWidthMode::Meters);
static_assert(
(uint8)CesiumVectorData::LineWidthMode::Pixels ==
(uint8)ECesiumVectorLineWidthMode::Pixels);

std::optional<CesiumVectorData::ColorStyle> fillStyle;
if (this->PolygonStyle.Fill) {
fillStyle = CesiumVectorData::ColorStyle{
CesiumUtility::Color{
this->PolygonStyle.FillStyle.Color.R,
this->PolygonStyle.FillStyle.Color.G,
this->PolygonStyle.FillStyle.Color.B,
this->PolygonStyle.FillStyle.Color.A},
(CesiumVectorData::ColorMode)this->LineStyle.ColorMode};
}

return CesiumVectorData::VectorStyle{
lineStyleToNative(this->LineStyle),
CesiumVectorData::PolygonStyle{
fillStyle,
this->PolygonStyle.Outline
? std::optional<CesiumVectorData::LineStyle>(
lineStyleToNative(this->PolygonStyle.OutlineStyle))
: std::nullopt}};
}

FCesiumVectorStyle
FCesiumVectorStyle::fromNative(const CesiumVectorData::VectorStyle& style) {
FCesiumVectorLineStyle OutlineStyle;
if (style.polygon.outline) {
OutlineStyle = FCesiumVectorLineStyle{
FColor(
(uint8)style.polygon.outline->color.r,
(uint8)style.polygon.outline->color.g,
(uint8)style.polygon.outline->color.b,
(uint8)style.polygon.outline->color.a),
(ECesiumVectorColorMode)style.polygon.outline->colorMode,
style.polygon.outline->width,
(ECesiumVectorLineWidthMode)style.polygon.outline->widthMode};
}

FCesiumVectorPolygonFillStyle FillStyle;
if (style.polygon.fill) {
FillStyle = FCesiumVectorPolygonFillStyle{
FColor(
(uint8)style.polygon.fill->color.r,
(uint8)style.polygon.fill->color.g,
(uint8)style.polygon.fill->color.b,
(uint8)style.polygon.fill->color.a),
(ECesiumVectorColorMode)style.polygon.fill->colorMode};
}

return FCesiumVectorStyle{
FCesiumVectorLineStyle{
FColor(
(uint8)style.line.color.r,
(uint8)style.line.color.g,
(uint8)style.line.color.b,
(uint8)style.line.color.a),
(ECesiumVectorColorMode)style.line.colorMode,
style.line.width,
(ECesiumVectorLineWidthMode)style.line.widthMode},
FCesiumVectorPolygonStyle{
style.polygon.fill.has_value(),
FillStyle,
style.polygon.outline.has_value(),
OutlineStyle}};
}
11 changes: 11 additions & 0 deletions Source/CesiumRuntime/Public/CesiumGeoJsonDocument.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,17 @@ struct FCesiumGeoJsonDocument {
FCesiumGeoJsonDocument(
std::shared_ptr<CesiumVectorData::GeoJsonDocument>&& document);

/**
* @brief Checks if this FCesiumGeoJsonDocument is valid (document is not
* nullptr).
*/
bool IsValid() const;

/**
* @brief Returns the `CesiumVectorData::GeoJsonDocument` this wraps.
*/
const std::shared_ptr<CesiumVectorData::GeoJsonDocument>& GetDocument() const;

private:
std::shared_ptr<CesiumVectorData::GeoJsonDocument> _pDocument;

Expand Down
Loading
Loading