diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index 26ec2cb82..03df24363 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -165,6 +165,43 @@ void ACesium3DTileset::InvalidateResolvedGeoreference() { this->ResolvedGeoreference = nullptr; } +FVector ACesium3DTileset::GetApproximateTilesetLocationUnreal(bool& rootTileAvailable) { + ACesiumGeoreference* pGeoreference = this->ResolveGeoreference(); + bool tempBool = false; + + FVector approximateRootTileLocationECEF = this->GetApproximateTilesetLocationECEF(tempBool); + FVector approximateRootTileLocationUnreal = pGeoreference->TransformEarthCenteredEarthFixedPositionToUnreal(approximateRootTileLocationECEF); + + rootTileAvailable = tempBool; + return approximateRootTileLocationUnreal; +} + + +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; + } + + glm::dmat4x4 rootTileTransform = pRootTile->getTransform(); + glm::dvec3 translation(rootTileTransform[3][0], rootTileTransform[3][1], rootTileTransform[3][2]); + + FVector approximateRootTileLocationECEF = VecMath::createVector(translation); + + rootTileAvailable = true; + + 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..02c78fedc 100644 --- a/Source/CesiumRuntime/Public/Cesium3DTileset.h +++ b/Source/CesiumRuntime/Public/Cesium3DTileset.h @@ -163,6 +163,26 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { UFUNCTION(BlueprintCallable, Category = "Cesium") void InvalidateResolvedGeoreference(); + /** + * 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(bool& rootTileAvailable); + + /** + * 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(bool& rootTileAvailable); + private: /** * The actor managing this tileset's content attributions.