From 7a608c63290772b8607830b816f9f62466564330 Mon Sep 17 00:00:00 2001 From: arbertrary Date: Tue, 18 Jun 2024 16:47:37 +0200 Subject: [PATCH 1/2] Add(Cesium3DTileset): functions to calculate the approximate location of a tileset. Exposed to blueprints --- .../CesiumRuntime/Private/Cesium3DTileset.cpp | 25 +++++++++++++++++++ Source/CesiumRuntime/Public/Cesium3DTileset.h | 18 +++++++++++++ 2 files changed, 43 insertions(+) diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index 26ec2cb82..acc4660e0 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -165,6 +165,31 @@ void ACesium3DTileset::InvalidateResolvedGeoreference() { this->ResolvedGeoreference = nullptr; } +FVector ACesium3DTileset::GetApproximateTilesetLocationUnreal() { + ACesiumGeoreference* pGeoreference = this->ResolveGeoreference(); + + FVector approximateRootTileLocationECEF = this->GetApproximateTilesetLocationECEF(); + FVector approximateRootTileLocationUnreal = pGeoreference->TransformEarthCenteredEarthFixedPositionToUnreal(approximateRootTileLocationECEF); + + return approximateRootTileLocationUnreal; +} + + +FVector ACesium3DTileset::GetApproximateTilesetLocationECEF() { + const Cesium3DTilesSelection::Tile* pRootTile = + this->_pTileset->getRootTile(); + if (!pRootTile) { + return FVector::ZeroVector; + } + + glm::dmat4x4 rootTileTransform = pRootTile->getTransform(); + glm::dvec3 translation(rootTileTransform[3][0], rootTileTransform[3][1], rootTileTransform[3][2]); + + FVector approximateRootTileLocationECEF = VecMath::createVector(translation); + + return approximateRootTileLocationECEF; +} + TSoftObjectPtr ACesium3DTileset::GetCreditSystem() const { return this->CreditSystem; } diff --git a/Source/CesiumRuntime/Public/Cesium3DTileset.h b/Source/CesiumRuntime/Public/Cesium3DTileset.h index e398d7889..3bdbf870b 100644 --- a/Source/CesiumRuntime/Public/Cesium3DTileset.h +++ b/Source/CesiumRuntime/Public/Cesium3DTileset.h @@ -163,6 +163,24 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { UFUNCTION(BlueprintCallable, Category = "Cesium") void InvalidateResolvedGeoreference(); + /** + * Returns the approximate Unreal Location of this tileset + */ + UFUNCTION( + BlueprintCallable, + Category = "Cesium", + meta = (ReturnDisplayName = "approximate Unreal Location")) + FVector GetApproximateTilesetLocationUnreal(); + + /** + * Returns the approximate ECEF Location of this tileset + */ + UFUNCTION( + BlueprintCallable, + Category = "Cesium", + meta = (ReturnDisplayName = "approximate ECEF Location")) + FVector GetApproximateTilesetLocationECEF(); + private: /** * The actor managing this tileset's content attributions. From 831a31cc995810c6eac7e49bfd1fe34cee84eb9d Mon Sep 17 00:00:00 2001 From: arbertrary Date: Thu, 20 Jun 2024 11:38:28 +0200 Subject: [PATCH 2/2] Add warning if rootTile not available; add out boolean to check in blueprints if rootTile is/was available --- .../CesiumRuntime/Private/Cesium3DTileset.cpp | 18 +++++++++++++++--- Source/CesiumRuntime/Public/Cesium3DTileset.h | 10 ++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index acc4660e0..03df24363 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -165,20 +165,30 @@ void ACesium3DTileset::InvalidateResolvedGeoreference() { this->ResolvedGeoreference = nullptr; } -FVector ACesium3DTileset::GetApproximateTilesetLocationUnreal() { +FVector ACesium3DTileset::GetApproximateTilesetLocationUnreal(bool& rootTileAvailable) { ACesiumGeoreference* pGeoreference = this->ResolveGeoreference(); + bool tempBool = false; - FVector approximateRootTileLocationECEF = this->GetApproximateTilesetLocationECEF(); + FVector approximateRootTileLocationECEF = this->GetApproximateTilesetLocationECEF(tempBool); FVector approximateRootTileLocationUnreal = pGeoreference->TransformEarthCenteredEarthFixedPositionToUnreal(approximateRootTileLocationECEF); + rootTileAvailable = tempBool; return approximateRootTileLocationUnreal; } -FVector ACesium3DTileset::GetApproximateTilesetLocationECEF() { +FVector ACesium3DTileset::GetApproximateTilesetLocationECEF(bool& rootTileAvailable) { const Cesium3DTilesSelection::Tile* pRootTile = this->_pTileset->getRootTile(); if (!pRootTile) { + UE_LOG( + LogCesium, + Warning, + TEXT("Root tile not (yet) available for actor %s"), + *this->GetName()); + + rootTileAvailable = false; + return FVector::ZeroVector; } @@ -187,6 +197,8 @@ FVector ACesium3DTileset::GetApproximateTilesetLocationECEF() { FVector approximateRootTileLocationECEF = VecMath::createVector(translation); + rootTileAvailable = true; + return approximateRootTileLocationECEF; } diff --git a/Source/CesiumRuntime/Public/Cesium3DTileset.h b/Source/CesiumRuntime/Public/Cesium3DTileset.h index 3bdbf870b..02c78fedc 100644 --- a/Source/CesiumRuntime/Public/Cesium3DTileset.h +++ b/Source/CesiumRuntime/Public/Cesium3DTileset.h @@ -164,22 +164,24 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { void InvalidateResolvedGeoreference(); /** - * Returns the approximate Unreal Location of this tileset + * Returns the approximate Unreal Location of this tileset or a zero-Vector if + * the root tile is not available yet */ UFUNCTION( BlueprintCallable, Category = "Cesium", meta = (ReturnDisplayName = "approximate Unreal Location")) - FVector GetApproximateTilesetLocationUnreal(); + FVector GetApproximateTilesetLocationUnreal(bool& rootTileAvailable); /** - * Returns the approximate ECEF Location of this tileset + * Returns the approximate ECEF Location of this tileset or a zero-Vector if + * the root tile is not available yet */ UFUNCTION( BlueprintCallable, Category = "Cesium", meta = (ReturnDisplayName = "approximate ECEF Location")) - FVector GetApproximateTilesetLocationECEF(); + FVector GetApproximateTilesetLocationECEF(bool& rootTileAvailable); private: /**