From 6cdf329cbf7923213a72228fa0e5c5b0cec3eeac Mon Sep 17 00:00:00 2001 From: Ghislain Cottat Date: Wed, 28 May 2025 12:04:25 +0200 Subject: [PATCH 1/4] ICesiumLoadedTile interface isolated from PR 1669 --- .../Private/CesiumGltfComponent.cpp | 3 ++- .../CesiumRuntime/Private/CesiumGltfComponent.h | 7 +++++-- Source/CesiumRuntime/Public/CesiumLoadedTile.h | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 Source/CesiumRuntime/Public/CesiumLoadedTile.h diff --git a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp index 495f52444..e7e475a02 100644 --- a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp +++ b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp @@ -3440,7 +3440,7 @@ UCesiumGltfComponent::CreateOffGameThread( UMaterialInterface* pBaseTranslucentMaterial, UMaterialInterface* pBaseWaterMaterial, FCustomDepthParameters CustomDepthParameters, - const Cesium3DTilesSelection::Tile& tile, + Cesium3DTilesSelection::Tile& tile, bool createNavCollision) { TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::LoadModel) @@ -3454,6 +3454,7 @@ UCesiumGltfComponent::CreateOffGameThread( // } UCesiumGltfComponent* Gltf = NewObject(pTilesetActor); + Gltf->pTile = &tile; Gltf->SetMobility(pTilesetActor->GetRootComponent()->Mobility); Gltf->SetFlags(RF_Transient | RF_DuplicateTransient | RF_TextExportTransient); diff --git a/Source/CesiumRuntime/Private/CesiumGltfComponent.h b/Source/CesiumRuntime/Private/CesiumGltfComponent.h index 848a82e5f..5ffedd5b5 100644 --- a/Source/CesiumRuntime/Private/CesiumGltfComponent.h +++ b/Source/CesiumRuntime/Private/CesiumGltfComponent.h @@ -5,6 +5,7 @@ #include "Cesium3DTilesSelection/Tile.h" #include "Cesium3DTileset.h" #include "CesiumEncodedMetadataUtility.h" +#include "CesiumLoadedTile.h" #include "CesiumModelMetadata.h" #include "Components/PrimitiveComponent.h" #include "Components/SceneComponent.h" @@ -56,7 +57,7 @@ struct FRasterOverlayTile { }; UCLASS() -class UCesiumGltfComponent : public USceneComponent { +class UCesiumGltfComponent : public USceneComponent, public ICesiumLoadedTile { GENERATED_BODY() public: @@ -87,7 +88,7 @@ class UCesiumGltfComponent : public USceneComponent { UMaterialInterface* BaseTranslucentMaterial, UMaterialInterface* BaseWaterMaterial, FCustomDepthParameters CustomDepthParameters, - const Cesium3DTilesSelection::Tile& tile, + Cesium3DTilesSelection::Tile& tile, bool createNavCollision); UCesiumGltfComponent(); @@ -104,6 +105,8 @@ class UCesiumGltfComponent : public USceneComponent { UPROPERTY(EditAnywhere, Category = "Rendering") FCustomDepthParameters CustomDepthParameters{}; + Cesium3DTilesSelection::Tile* pTile = nullptr; + FCesiumModelMetadata Metadata{}; EncodedFeaturesMetadata::EncodedModelMetadata EncodedMetadata{}; diff --git a/Source/CesiumRuntime/Public/CesiumLoadedTile.h b/Source/CesiumRuntime/Public/CesiumLoadedTile.h new file mode 100644 index 000000000..2cfdb0fb9 --- /dev/null +++ b/Source/CesiumRuntime/Public/CesiumLoadedTile.h @@ -0,0 +1,17 @@ +// Copyright 2020-2024 CesiumGS, Inc. and Contributors + +#pragma once + +#include "UObject/ObjectMacros.h" + +#include "CesiumLoadedTile.generated.h" + +UINTERFACE() +class UCesiumLoadedTile : public UInterface { + GENERATED_BODY() +}; +class ICesiumLoadedTile { + GENERATED_BODY() +public: +}; + From 35eba16441de956815325d909b6adec2a9c0ac2e Mon Sep 17 00:00:00 2001 From: Ghislain Cottat Date: Wed, 28 May 2025 13:57:38 +0200 Subject: [PATCH 2/4] Added an optional glTF model post-processing stage after the tile loading step, before the tile can be displayed --- CHANGES.md | 1 + Source/CesiumRuntime/Private/Cesium3DTileset.cpp | 10 +++++++++- Source/CesiumRuntime/Public/Cesium3DTileset.h | 11 +++++++++++ extern/cesium-native | 2 +- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e6bab36b1..179b761cd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ ##### Additions :tada: - Added support for `TRIANGLE_FAN` primitives in tile meshes. +- Added an optional glTF model post-processing stage after the tile loading step, before the tile can be displayed. ##### Fixes :wrench: diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index 2dedccb28..a3a035a20 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -992,7 +992,10 @@ void ACesium3DTileset::LoadTileset() { ->EnableExperimentalOcclusionCullingFeature && this->EnableOcclusionCulling && this->BoundingVolumePoolComponent) ? this->BoundingVolumePoolComponent->getPool() - : nullptr}; + : nullptr, + {}, + _gltfTuner + }; this->_startTime = std::chrono::high_resolution_clock::now(); @@ -2325,3 +2328,8 @@ void ACesium3DTileset::RuntimeSettingsChanged( } } #endif + +void ACesium3DTileset::SetGltfTuner( + const std::shared_ptr& tuner) { + _gltfTuner = tuner; +} diff --git a/Source/CesiumRuntime/Public/Cesium3DTileset.h b/Source/CesiumRuntime/Public/Cesium3DTileset.h index ce26a4617..15a7a66ee 100644 --- a/Source/CesiumRuntime/Public/Cesium3DTileset.h +++ b/Source/CesiumRuntime/Public/Cesium3DTileset.h @@ -1257,6 +1257,15 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { */ void UpdateTransformFromCesium(); + /** + * Sets the glTF model tuner, an optional extension class that can edit + * each tile's glTF model after it has been loaded, before it can be + * displayed. Can only be called in the same engine tick after the tileset + * actor was spawned, or {@link RefreshTileset} was called. + */ + void + SetGltfTuner(const std::shared_ptr& tuner); + private: /** * The event handler for ACesiumGeoreference::OnEllipsoidChanged. @@ -1371,6 +1380,8 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { int32 _tilesetsBeingDestroyed; + std::shared_ptr _gltfTuner; + friend class UnrealPrepareRendererResources; friend class UCesiumGltfPointsComponent; }; diff --git a/extern/cesium-native b/extern/cesium-native index 790bb78b8..297d6d66b 160000 --- a/extern/cesium-native +++ b/extern/cesium-native @@ -1 +1 @@ -Subproject commit 790bb78b860af84a617389cd9a30aa46d129b542 +Subproject commit 297d6d66b19d4ef7166aefce48fba53e9954da5d From 85103cda704e21c31f4359fc8243f0f9cb8d4ff2 Mon Sep 17 00:00:00 2001 From: Ghislain Cottat Date: Wed, 28 May 2025 13:58:19 +0200 Subject: [PATCH 3/4] Expose model tuning version in a public interface for loaded tiles --- Source/CesiumRuntime/Private/CesiumGltfComponent.cpp | 7 +++++++ Source/CesiumRuntime/Private/CesiumGltfComponent.h | 3 +++ Source/CesiumRuntime/Public/CesiumLoadedTile.h | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp index e7e475a02..da1fd2199 100644 --- a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp +++ b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp @@ -3536,6 +3536,13 @@ UCesiumGltfComponent::UCesiumGltfComponent() : USceneComponent() { PrimaryComponentTick.bCanEverTick = false; } +int32 UCesiumGltfComponent::GetTuningVersion() const { + if (pTile && pTile->getContent().getRenderContent()) { + return pTile->getContent().getRenderContent()->getModel()._tuningVersion; + } + return -1; +} + void UCesiumGltfComponent::UpdateTransformFromCesium( const glm::dmat4& cesiumToUnrealTransform) { for (USceneComponent* pSceneComponent : this->GetAttachChildren()) { diff --git a/Source/CesiumRuntime/Private/CesiumGltfComponent.h b/Source/CesiumRuntime/Private/CesiumGltfComponent.h index 5ffedd5b5..8a009927c 100644 --- a/Source/CesiumRuntime/Private/CesiumGltfComponent.h +++ b/Source/CesiumRuntime/Private/CesiumGltfComponent.h @@ -135,6 +135,9 @@ class UCesiumGltfComponent : public USceneComponent, public ICesiumLoadedTile { virtual void BeginDestroy() override; + // from ICesiumLoadedTile + int32 GetTuningVersion() const override; + void UpdateFade(float fadePercentage, bool fadingIn); private: diff --git a/Source/CesiumRuntime/Public/CesiumLoadedTile.h b/Source/CesiumRuntime/Public/CesiumLoadedTile.h index 2cfdb0fb9..08a42afed 100644 --- a/Source/CesiumRuntime/Public/CesiumLoadedTile.h +++ b/Source/CesiumRuntime/Public/CesiumLoadedTile.h @@ -13,5 +13,5 @@ class UCesiumLoadedTile : public UInterface { class ICesiumLoadedTile { GENERATED_BODY() public: + virtual int32 GetTuningVersion() const = 0; }; - From 55cc9ba6670626820b8d9f848361857e37a91194 Mon Sep 17 00:00:00 2001 From: Ghislain Cottat Date: Wed, 4 Jun 2025 10:03:15 +0200 Subject: [PATCH 4/4] tuner becomes modifier, use std::optional for version --- Source/CesiumRuntime/Private/Cesium3DTileset.cpp | 9 +++++---- Source/CesiumRuntime/Private/CesiumGltfComponent.cpp | 10 +++++----- Source/CesiumRuntime/Private/CesiumGltfComponent.h | 2 +- Source/CesiumRuntime/Public/Cesium3DTileset.h | 9 +++++---- Source/CesiumRuntime/Public/CesiumLoadedTile.h | 6 +++++- extern/cesium-native | 2 +- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp index a3a035a20..6f15e4419 100644 --- a/Source/CesiumRuntime/Private/Cesium3DTileset.cpp +++ b/Source/CesiumRuntime/Private/Cesium3DTileset.cpp @@ -5,6 +5,7 @@ #include "Camera/CameraTypes.h" #include "Camera/PlayerCameraManager.h" #include "Cesium3DTilesSelection/EllipsoidTilesetLoader.h" +#include "Cesium3DTilesSelection/GltfModifier.h" #include "Cesium3DTilesSelection/Tile.h" #include "Cesium3DTilesSelection/TilesetLoadFailureDetails.h" #include "Cesium3DTilesSelection/TilesetOptions.h" @@ -994,7 +995,7 @@ void ACesium3DTileset::LoadTileset() { ? this->BoundingVolumePoolComponent->getPool() : nullptr, {}, - _gltfTuner + _gltfModifier }; this->_startTime = std::chrono::high_resolution_clock::now(); @@ -2329,7 +2330,7 @@ void ACesium3DTileset::RuntimeSettingsChanged( } #endif -void ACesium3DTileset::SetGltfTuner( - const std::shared_ptr& tuner) { - _gltfTuner = tuner; +void ACesium3DTileset::SetGltfModifier( + const std::shared_ptr& InModifier) { + _gltfModifier = InModifier; } diff --git a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp index da1fd2199..25387930f 100644 --- a/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp +++ b/Source/CesiumRuntime/Private/CesiumGltfComponent.cpp @@ -3536,11 +3536,11 @@ UCesiumGltfComponent::UCesiumGltfComponent() : USceneComponent() { PrimaryComponentTick.bCanEverTick = false; } -int32 UCesiumGltfComponent::GetTuningVersion() const { - if (pTile && pTile->getContent().getRenderContent()) { - return pTile->getContent().getRenderContent()->getModel()._tuningVersion; - } - return -1; +const CesiumGltf::Model* UCesiumGltfComponent::GetGltfModel() const { + if (pTile) + if (auto RenderContent = pTile->getContent().getRenderContent()) + return &RenderContent->getModel(); + return nullptr; } void UCesiumGltfComponent::UpdateTransformFromCesium( diff --git a/Source/CesiumRuntime/Private/CesiumGltfComponent.h b/Source/CesiumRuntime/Private/CesiumGltfComponent.h index 8a009927c..cdef417aa 100644 --- a/Source/CesiumRuntime/Private/CesiumGltfComponent.h +++ b/Source/CesiumRuntime/Private/CesiumGltfComponent.h @@ -136,7 +136,7 @@ class UCesiumGltfComponent : public USceneComponent, public ICesiumLoadedTile { virtual void BeginDestroy() override; // from ICesiumLoadedTile - int32 GetTuningVersion() const override; + const CesiumGltf::Model* GetGltfModel() const override; void UpdateFade(float fadePercentage, bool fadingIn); diff --git a/Source/CesiumRuntime/Public/Cesium3DTileset.h b/Source/CesiumRuntime/Public/Cesium3DTileset.h index 15a7a66ee..8256d0a8d 100644 --- a/Source/CesiumRuntime/Public/Cesium3DTileset.h +++ b/Source/CesiumRuntime/Public/Cesium3DTileset.h @@ -39,6 +39,7 @@ class CesiumViewExtension; struct FCesiumCamera; namespace Cesium3DTilesSelection { +class GltfModifier; class Tileset; class TilesetView; class TileOcclusionRendererProxyPool; @@ -1258,13 +1259,13 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { void UpdateTransformFromCesium(); /** - * Sets the glTF model tuner, an optional extension class that can edit + * Sets the glTF modifier, an optional extension class that can edit * each tile's glTF model after it has been loaded, before it can be * displayed. Can only be called in the same engine tick after the tileset * actor was spawned, or {@link RefreshTileset} was called. */ - void - SetGltfTuner(const std::shared_ptr& tuner); + void SetGltfModifier( + const std::shared_ptr& InModifier); private: /** @@ -1380,7 +1381,7 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor { int32 _tilesetsBeingDestroyed; - std::shared_ptr _gltfTuner; + std::shared_ptr _gltfModifier; friend class UnrealPrepareRendererResources; friend class UCesiumGltfPointsComponent; diff --git a/Source/CesiumRuntime/Public/CesiumLoadedTile.h b/Source/CesiumRuntime/Public/CesiumLoadedTile.h index 08a42afed..d8d53f5f7 100644 --- a/Source/CesiumRuntime/Public/CesiumLoadedTile.h +++ b/Source/CesiumRuntime/Public/CesiumLoadedTile.h @@ -6,6 +6,10 @@ #include "CesiumLoadedTile.generated.h" +namespace CesiumGltf { +struct Model; +} + UINTERFACE() class UCesiumLoadedTile : public UInterface { GENERATED_BODY() @@ -13,5 +17,5 @@ class UCesiumLoadedTile : public UInterface { class ICesiumLoadedTile { GENERATED_BODY() public: - virtual int32 GetTuningVersion() const = 0; + virtual const CesiumGltf::Model* GetGltfModel() const = 0; }; diff --git a/extern/cesium-native b/extern/cesium-native index 297d6d66b..c5fc64121 160000 --- a/extern/cesium-native +++ b/extern/cesium-native @@ -1 +1 @@ -Subproject commit 297d6d66b19d4ef7166aefce48fba53e9954da5d +Subproject commit c5fc641212cc2bec96dc4e748ab6e5212dea19e3