Skip to content

Commit 8f0a56f

Browse files
committed
Support for vector styling callback
1 parent edb69b5 commit 8f0a56f

File tree

7 files changed

+319
-36
lines changed

7 files changed

+319
-36
lines changed

Source/CesiumRuntime/Private/CesiumVectorDocumentRasterOverlay.cpp

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,31 @@
1111

1212
#include "CesiumRuntime.h"
1313

14+
namespace {
15+
CesiumVectorData::VectorStyle
16+
unrealToNativeVectorStyle(const FCesiumVectorStyle& style) {
17+
return CesiumVectorData::VectorStyle{
18+
CesiumVectorData::LineStyle{
19+
CesiumVectorData::Color{
20+
style.LineStyle.Color.R,
21+
style.LineStyle.Color.G,
22+
style.LineStyle.Color.B,
23+
style.LineStyle.Color.A},
24+
(CesiumVectorData::ColorMode)style.LineStyle.ColorMode,
25+
style.LineStyle.Width,
26+
(CesiumVectorData::LineWidthMode)style.LineStyle.WidthMode},
27+
CesiumVectorData::PolygonStyle{
28+
CesiumVectorData::Color{
29+
style.PolygonStyle.Color.R,
30+
style.PolygonStyle.Color.G,
31+
style.PolygonStyle.Color.B,
32+
style.PolygonStyle.Color.A},
33+
(CesiumVectorData::ColorMode)style.PolygonStyle.ColorMode,
34+
style.PolygonStyle.Fill,
35+
style.PolygonStyle.Stroke}};
36+
}
37+
} // namespace
38+
1439
std::unique_ptr<CesiumRasterOverlays::RasterOverlay>
1540
UCesiumVectorDocumentRasterOverlay::CreateOverlay(
1641
const CesiumRasterOverlays::RasterOverlayOptions& options) {
@@ -20,24 +45,37 @@ UCesiumVectorDocumentRasterOverlay::CreateOverlay(
2045
return nullptr;
2146
}
2247

23-
const CesiumGeospatial::Ellipsoid& ellipsoid = options.ellipsoid;
24-
2548
CesiumGeospatial::Projection projection;
2649
if (this->Projection ==
2750
ECesiumVectorDocumentRasterOverlayProjection::Geographic) {
28-
projection = CesiumGeospatial::GeographicProjection(ellipsoid);
51+
projection = CesiumGeospatial::GeographicProjection(options.ellipsoid);
2952
} else {
30-
projection = CesiumGeospatial::WebMercatorProjection(ellipsoid);
53+
projection = CesiumGeospatial::WebMercatorProjection(options.ellipsoid);
54+
}
55+
56+
CesiumVectorData::VectorStyle style =
57+
unrealToNativeVectorStyle(this->DefaultStyle);
58+
59+
std::optional<CesiumRasterOverlays::VectorDocumentRasterOverlayStyleCallback>
60+
callbackOpt = std::nullopt;
61+
62+
if (this->StyleCallback.IsBound()) {
63+
callbackOpt = [Callback = this->StyleCallback](
64+
const CesiumUtility::IntrusivePointer<
65+
CesiumVectorData::VectorDocument>& doc,
66+
const CesiumVectorData::VectorNode* pNode) {
67+
return Callback.Execute(FCesiumVectorNode(doc, pNode)).toNative();
68+
};
3169
}
3270

33-
CesiumVectorData::VectorRasterizerStyle style{
34-
CesiumVectorData::Color{
35-
std::byte{this->Color.R},
36-
std::byte{this->Color.G},
37-
std::byte{this->Color.B},
38-
std::byte{this->Color.A}},
39-
this->LineWidth,
40-
(CesiumVectorData::VectorLineWidthMode)this->LineWidthMode};
71+
CesiumRasterOverlays::VectorDocumentRasterOverlayOptions vectorOptions{
72+
unrealToNativeVectorStyle(this->DefaultStyle),
73+
callbackOpt,
74+
std::move(projection),
75+
options.ellipsoid,
76+
this->MipLevels};
77+
78+
const CesiumGeospatial::Ellipsoid& ellipsoid = options.ellipsoid;
4179

4280
if (this->Source == ECesiumVectorDocumentRasterOverlaySource::FromCesiumIon) {
4381
if (!IsValid(this->CesiumIonServer)) {
@@ -50,19 +88,13 @@ UCesiumVectorDocumentRasterOverlay::CreateOverlay(
5088
this->IonAssetID,
5189
TCHAR_TO_UTF8(*this->CesiumIonServer->DefaultIonAccessToken),
5290
TCHAR_TO_UTF8(*this->CesiumIonServer->ApiUrl)},
53-
style,
54-
projection,
55-
ellipsoid,
56-
(uint32_t)this->MipLevels,
91+
vectorOptions,
5792
options);
5893
}
5994

6095
return std::make_unique<CesiumRasterOverlays::VectorDocumentRasterOverlay>(
6196
TCHAR_TO_UTF8(*this->MaterialLayerKey),
6297
this->VectorDocument.GetDocument(),
63-
style,
64-
projection,
65-
ellipsoid,
66-
(uint32_t)this->MipLevels,
98+
vectorOptions,
6799
options);
68100
}

Source/CesiumRuntime/Private/CesiumVectorNode.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,29 @@ bool UCesiumVectorNodeBlueprintLibrary::FindNodeByIntId(
256256
return false;
257257
}
258258

259+
bool UCesiumVectorNodeBlueprintLibrary::GetStyle(
260+
const FCesiumVectorNode& InVectorNode,
261+
FCesiumVectorStyle& OutStyle) {
262+
if (!InVectorNode._document || InVectorNode._node == nullptr ||
263+
!InVectorNode._node->style) {
264+
return false;
265+
}
266+
267+
OutStyle = FCesiumVectorStyle::fromNative(*InVectorNode._node->style);
268+
return true;
269+
}
270+
271+
FCesiumVectorStyle UCesiumVectorNodeBlueprintLibrary::GetStyleOrDefault(
272+
const FCesiumVectorNode& InVectorNode,
273+
const FCesiumVectorStyle& InDefaultStyle) {
274+
if (!InVectorNode._document || InVectorNode._node == nullptr ||
275+
!InVectorNode._node->style) {
276+
return InDefaultStyle;
277+
}
278+
279+
return FCesiumVectorStyle::fromNative(*InVectorNode._node->style);
280+
}
281+
259282
ECesiumVectorPrimitiveType
260283
UCesiumVectorPrimitiveBlueprintLibrary::GetPrimitiveType(
261284
const FCesiumVectorPrimitive& InPrimitive) {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "CesiumVectorStyle.h"
2+
3+
CesiumVectorData::VectorStyle FCesiumVectorStyle::toNative() const {
4+
return CesiumVectorData::VectorStyle{
5+
CesiumVectorData::LineStyle{
6+
CesiumVectorData::Color{
7+
this->LineStyle.Color.R,
8+
this->LineStyle.Color.G,
9+
this->LineStyle.Color.B,
10+
this->LineStyle.Color.A},
11+
(CesiumVectorData::ColorMode)this->LineStyle.ColorMode,
12+
this->LineStyle.Width,
13+
(CesiumVectorData::LineWidthMode)this->LineStyle.WidthMode},
14+
CesiumVectorData::PolygonStyle{
15+
CesiumVectorData::Color{
16+
this->PolygonStyle.Color.R,
17+
this->PolygonStyle.Color.G,
18+
this->PolygonStyle.Color.B,
19+
this->PolygonStyle.Color.A},
20+
(CesiumVectorData::ColorMode)this->PolygonStyle.ColorMode,
21+
this->PolygonStyle.Fill,
22+
this->PolygonStyle.Outline}};
23+
}
24+
25+
FCesiumVectorStyle FCesiumVectorStyle::fromNative(const CesiumVectorData::VectorStyle& style) {
26+
return FCesiumVectorStyle{
27+
FCesiumVectorLineStyle{
28+
FColor(
29+
(uint8)style.line.color.r,
30+
(uint8)style.line.color.g,
31+
(uint8)style.line.color.b,
32+
(uint8)style.line.color.a),
33+
(ECesiumVectorColorMode)style.line.colorMode,
34+
style.line.width,
35+
(ECesiumVectorLineWidthMode)style.line.widthMode},
36+
FCesiumVectorPolygonStyle{
37+
FColor(
38+
(uint8)style.polygon.color.r,
39+
(uint8)style.polygon.color.g,
40+
(uint8)style.polygon.color.b,
41+
(uint8)style.polygon.color.a),
42+
(ECesiumVectorColorMode)style.polygon.colorMode,
43+
style.polygon.fill,
44+
style.polygon.outline}};
45+
}

Source/CesiumRuntime/Public/CesiumVectorDocumentRasterOverlay.h

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@
55
#include "CesiumIonServer.h"
66
#include "CesiumRasterOverlay.h"
77
#include "CesiumVectorDocument.h"
8+
#include "CesiumVectorStyle.h"
89
#include "Components/ActorComponent.h"
910
#include "CoreMinimal.h"
11+
#include "Delegates/Delegate.h"
1012
#include "CesiumVectorDocumentRasterOverlay.generated.h"
1113

14+
/**
15+
* The projection used by a CesiumVectorDocumentRasterOverlay.
16+
*/
1217
UENUM(BlueprintType)
1318
enum class ECesiumVectorDocumentRasterOverlayProjection : uint8 {
1419
/**
@@ -22,19 +27,33 @@ enum class ECesiumVectorDocumentRasterOverlayProjection : uint8 {
2227
Geographic
2328
};
2429

30+
/**
31+
* Configures where the CesiumVectorDocumentRasterOverlay should load its vector
32+
* data from.
33+
*/
2534
UENUM(BlueprintType)
2635
enum class ECesiumVectorDocumentRasterOverlaySource : uint8 {
36+
/**
37+
* The raster overlay will display the provided VectorDocument.
38+
*/
2739
FromDocument = 0,
40+
/**
41+
* The raster overlay will load the VectorDocument from Cesium ion.
42+
*/
2843
FromCesiumIon = 1
2944
};
3045

31-
UENUM(BlueprintType)
32-
enum class ECesiumVectorDocumentRasterOverlayLineWidthMode : uint8 {
33-
Pixels = 0,
34-
Meters = 1
35-
};
36-
37-
UCLASS(ClassGroup = Cesium, meta = (BlueprintSpawnableComponent))
46+
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(
47+
FCesiumVectorStyle,
48+
FCesiumVectorDocumentRasterOverlayStyleCallback,
49+
FCesiumVectorNode,
50+
InNode);
51+
52+
UCLASS(
53+
ClassGroup = Cesium,
54+
BlueprintType,
55+
Blueprintable,
56+
meta = (BlueprintSpawnableComponent))
3857
class CESIUMRUNTIME_API UCesiumVectorDocumentRasterOverlay
3958
: public UCesiumRasterOverlay {
4059
GENERATED_BODY()
@@ -56,7 +75,13 @@ class CESIUMRUNTIME_API UCesiumVectorDocumentRasterOverlay
5675
/**
5776
* The ID of the Cesium ion asset to use.
5877
*/
59-
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium", meta=(EditCondition="Source == ECesiumVectorDocumentRasterOverlaySource::FromCesiumIon"))
78+
UPROPERTY(
79+
EditAnywhere,
80+
BlueprintReadWrite,
81+
Category = "Cesium",
82+
meta =
83+
(EditCondition =
84+
"Source == ECesiumVectorDocumentRasterOverlaySource::FromCesiumIon"))
6085
int64 IonAssetID;
6186

6287
/**
@@ -89,14 +114,13 @@ class CESIUMRUNTIME_API UCesiumVectorDocumentRasterOverlay
89114
int32 MipLevels = 0;
90115

91116
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium")
92-
FColor Color = FColor(0, 0, 0, 255);
93-
94-
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium", meta=(ClampMin = "0"))
95-
double LineWidth = 1.0;
117+
FCesiumVectorStyle DefaultStyle;
96118

97-
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium")
98-
ECesiumVectorDocumentRasterOverlayLineWidthMode LineWidthMode =
99-
ECesiumVectorDocumentRasterOverlayLineWidthMode::Pixels;
119+
UPROPERTY(
120+
EditAnywhere,
121+
BlueprintReadWrite,
122+
Category = "Cesium")
123+
FCesiumVectorDocumentRasterOverlayStyleCallback StyleCallback;
100124

101125
protected:
102126
virtual std::unique_ptr<CesiumRasterOverlays::RasterOverlay> CreateOverlay(

Source/CesiumRuntime/Public/CesiumVectorNode.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "CesiumUtility/IntrusivePointer.h"
66
#include "CesiumVectorData/VectorDocument.h"
77
#include "CesiumVectorData/VectorNode.h"
8+
#include "CesiumVectorStyle.h"
89
#include "JsonObjectWrapper.h"
910
#include "Kismet/BlueprintFunctionLibrary.h"
1011
#include "Templates/SharedPointer.h"
@@ -179,6 +180,26 @@ class UCesiumVectorNodeBlueprintLibrary : public UBlueprintFunctionLibrary {
179180
const FCesiumVectorNode& InVectorNode,
180181
int64 InNodeId,
181182
FCesiumVectorNode& OutNode);
183+
184+
/**
185+
* @brief Returns true if this node has a style, or false if no style is
186+
* attached. If this node has a style, OutStyle will be set to that style.
187+
*/
188+
UFUNCTION(
189+
BlueprintCallable,
190+
Category = "Cesium|Vector|Node",
191+
meta = (DisplayName = "Get Node Style"))
192+
static UPARAM(DisplayName = "Has Style") bool GetStyle(
193+
const FCesiumVectorNode& InVectorNode,
194+
FCesiumVectorStyle& OutStyle);
195+
196+
/**
197+
* @brief Returns the style on this node, or the default style if this node
198+
* has no style attached.
199+
*/
200+
static FCesiumVectorStyle GetStyleOrDefault(
201+
const FCesiumVectorNode& InVectorNode,
202+
const FCesiumVectorStyle& InDefaultStyle);
182203
};
183204

184205
/**

0 commit comments

Comments
 (0)