Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -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:

Expand Down
11 changes: 10 additions & 1 deletion Source/CesiumRuntime/Private/Cesium3DTileset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -992,7 +993,10 @@ void ACesium3DTileset::LoadTileset() {
->EnableExperimentalOcclusionCullingFeature &&
this->EnableOcclusionCulling && this->BoundingVolumePoolComponent)
? this->BoundingVolumePoolComponent->getPool()
: nullptr};
: nullptr,
{},
_gltfModifier
};

this->_startTime = std::chrono::high_resolution_clock::now();

Expand Down Expand Up @@ -2325,3 +2329,8 @@ void ACesium3DTileset::RuntimeSettingsChanged(
}
}
#endif

void ACesium3DTileset::SetGltfModifier(
const std::shared_ptr<Cesium3DTilesSelection::GltfModifier>& InModifier) {
_gltfModifier = InModifier;
}
10 changes: 9 additions & 1 deletion Source/CesiumRuntime/Private/CesiumGltfComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -3454,6 +3454,7 @@ UCesiumGltfComponent::CreateOffGameThread(
// }

UCesiumGltfComponent* Gltf = NewObject<UCesiumGltfComponent>(pTilesetActor);
Gltf->pTile = &tile;
Gltf->SetMobility(pTilesetActor->GetRootComponent()->Mobility);
Gltf->SetFlags(RF_Transient | RF_DuplicateTransient | RF_TextExportTransient);

Expand Down Expand Up @@ -3535,6 +3536,13 @@ UCesiumGltfComponent::UCesiumGltfComponent() : USceneComponent() {
PrimaryComponentTick.bCanEverTick = false;
}

const CesiumGltf::Model* UCesiumGltfComponent::GetGltfModel() const {
if (pTile)
if (auto RenderContent = pTile->getContent().getRenderContent())
return &RenderContent->getModel();
return nullptr;
}

void UCesiumGltfComponent::UpdateTransformFromCesium(
const glm::dmat4& cesiumToUnrealTransform) {
for (USceneComponent* pSceneComponent : this->GetAttachChildren()) {
Expand Down
10 changes: 8 additions & 2 deletions Source/CesiumRuntime/Private/CesiumGltfComponent.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -56,7 +57,7 @@ struct FRasterOverlayTile {
};

UCLASS()
class UCesiumGltfComponent : public USceneComponent {
class UCesiumGltfComponent : public USceneComponent, public ICesiumLoadedTile {
GENERATED_BODY()

public:
Expand Down Expand Up @@ -87,7 +88,7 @@ class UCesiumGltfComponent : public USceneComponent {
UMaterialInterface* BaseTranslucentMaterial,
UMaterialInterface* BaseWaterMaterial,
FCustomDepthParameters CustomDepthParameters,
const Cesium3DTilesSelection::Tile& tile,
Cesium3DTilesSelection::Tile& tile,
bool createNavCollision);

UCesiumGltfComponent();
Expand All @@ -104,6 +105,8 @@ class UCesiumGltfComponent : public USceneComponent {
UPROPERTY(EditAnywhere, Category = "Rendering")
FCustomDepthParameters CustomDepthParameters{};

Cesium3DTilesSelection::Tile* pTile = nullptr;

FCesiumModelMetadata Metadata{};
EncodedFeaturesMetadata::EncodedModelMetadata EncodedMetadata{};

Expand Down Expand Up @@ -132,6 +135,9 @@ class UCesiumGltfComponent : public USceneComponent {

virtual void BeginDestroy() override;

// from ICesiumLoadedTile
const CesiumGltf::Model* GetGltfModel() const override;

void UpdateFade(float fadePercentage, bool fadingIn);

private:
Expand Down
12 changes: 12 additions & 0 deletions Source/CesiumRuntime/Public/Cesium3DTileset.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class CesiumViewExtension;
struct FCesiumCamera;

namespace Cesium3DTilesSelection {
class GltfModifier;
class Tileset;
class TilesetView;
class TileOcclusionRendererProxyPool;
Expand Down Expand Up @@ -1257,6 +1258,15 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor {
*/
void UpdateTransformFromCesium();

/**
* 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 SetGltfModifier(
const std::shared_ptr<Cesium3DTilesSelection::GltfModifier>& InModifier);

private:
/**
* The event handler for ACesiumGeoreference::OnEllipsoidChanged.
Expand Down Expand Up @@ -1371,6 +1381,8 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor {

int32 _tilesetsBeingDestroyed;

std::shared_ptr<Cesium3DTilesSelection::GltfModifier> _gltfModifier;

friend class UnrealPrepareRendererResources;
friend class UCesiumGltfPointsComponent;
};
21 changes: 21 additions & 0 deletions Source/CesiumRuntime/Public/CesiumLoadedTile.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright 2020-2024 CesiumGS, Inc. and Contributors

#pragma once

#include "UObject/ObjectMacros.h"

#include "CesiumLoadedTile.generated.h"

namespace CesiumGltf {
struct Model;
}

UINTERFACE()
class UCesiumLoadedTile : public UInterface {
GENERATED_BODY()
};
class ICesiumLoadedTile {
GENERATED_BODY()
public:
virtual const CesiumGltf::Model* GetGltfModel() const = 0;
};