Skip to content

Commit d7193a5

Browse files
committed
Merge from geojson-support
2 parents 35cf828 + 3eff421 commit d7193a5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2069
-607
lines changed

CHANGES.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,25 @@
44

55
##### Fixes :wrench:
66

7+
- Worked around an Unreal Engine limitation that prevented collisions and line traces from working correctly for tilesets with a very small scale factor.
8+
- Add a missing include for `GEngine` when packaging from source, introduced in *v2.16.0*.
9+
- Fixed a bug in UCesiumFeaturesMetadataComponent where multiple references to same feature ID set would cause improper encoding of its feature IDs.
10+
11+
### v2.16.0 - 2025-05-01
12+
13+
##### Additions :tada:
14+
15+
- Added a Cesium -> Geocoder -> Geocode Blueprint function, making it easy to query the Cesium ion geocoder.
16+
- Added `UCesiumMetadataPickingBlueprintLibrary::FindPropertyTableProperty` to search for a `FCesiumPropertyTableProperty` by name on a given `UPrimitiveComponent`.
17+
18+
##### Fixes :wrench:
19+
720
- Fixed a linking issue introduced in *v2.15.0* in `GoogleTilesTestSetup`.
21+
- The "unsupported primitive mode" warning is now only logged once to avoid console spam.
22+
- Request cache will now use `FPaths::ProjectUserDir` instead of `FPaths::EngineUserDir` on non-Android and non-iOS platforms, fixing a permissions issue in Development builds.
23+
- Fixed a build issue with KTX-Software's overlay port on Windows when there is no bash.exe in the system PATH and Git-for-windows is installed in a non-default directory.
24+
25+
In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.46.0 to v0.47.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
826

927
### v2.15.0 - 2025-04-01
1028

CesiumForUnreal.uplugin

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"FileVersion": 3,
33
"Version": 75,
4-
"VersionName": "2.15.0",
4+
"VersionName": "2.16.0",
55
"FriendlyName": "Cesium for Unreal",
66
"Description": "Unlock the 3D geospatial ecosystem in Unreal Engine with real-world 3D content and a high accuracy full-scale WGS84 globe.",
77
"Category": "Geospatial",
2.64 KB
Binary file not shown.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"asset": { "version": "1.0" },
3+
"root": {
4+
"boundingVolume": {
5+
"sphere": [
6+
0,0,0,200000
7+
]
8+
},
9+
"children": [],
10+
"content": { "uri": "BigCube.glb" },
11+
"geometricError": 0.0,
12+
"refine": "REPLACE"
13+
}
14+
}

Source/CesiumRuntime/Private/Cesium3DTileset.cpp

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,7 +1654,8 @@ bool ACesium3DTileset::ShouldTickIfViewportsOnly() const {
16541654
namespace {
16551655
template <typename Func>
16561656
void forEachRenderableTile(const auto& tiles, Func&& f) {
1657-
for (Cesium3DTilesSelection::Tile* pTile : tiles) {
1657+
for (const CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>&
1658+
pTile : tiles) {
16581659
if (!pTile ||
16591660
pTile->getState() != Cesium3DTilesSelection::TileLoadState::Done) {
16601661
continue;
@@ -1682,13 +1683,17 @@ void forEachRenderableTile(const auto& tiles, Func&& f) {
16821683
}
16831684

16841685
void removeVisibleTilesFromList(
1685-
std::vector<Cesium3DTilesSelection::Tile*>& list,
1686-
const std::vector<Cesium3DTilesSelection::Tile*>& visibleTiles) {
1686+
std::vector<CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>>&
1687+
list,
1688+
const std::vector<
1689+
CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>>&
1690+
visibleTiles) {
16871691
if (list.empty()) {
16881692
return;
16891693
}
16901694

1691-
for (Cesium3DTilesSelection::Tile* pTile : visibleTiles) {
1695+
for (const CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>&
1696+
pTile : visibleTiles) {
16921697
auto it = std::find(list.begin(), list.end(), pTile);
16931698
if (it != list.end()) {
16941699
list.erase(it);
@@ -1705,11 +1710,15 @@ void removeVisibleTilesFromList(
17051710
*
17061711
* @param tiles The tiles to hide
17071712
*/
1708-
void hideTiles(const std::vector<Cesium3DTilesSelection::Tile*>& tiles) {
1713+
void hideTiles(
1714+
const std::vector<
1715+
CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>>& tiles) {
17091716
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::HideTiles)
17101717
forEachRenderableTile(
17111718
tiles,
1712-
[](Cesium3DTilesSelection::Tile* /*pTile*/, UCesiumGltfComponent* pGltf) {
1719+
[](const CesiumUtility::IntrusivePointer<
1720+
Cesium3DTilesSelection::Tile>& /*pTile*/,
1721+
UCesiumGltfComponent* pGltf) {
17131722
if (pGltf->IsVisible()) {
17141723
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::SetVisibilityFalse)
17151724
pGltf->SetVisibility(false, true);
@@ -1728,11 +1737,14 @@ void hideTiles(const std::vector<Cesium3DTilesSelection::Tile*>& tiles) {
17281737
* list. This includes tiles that are fading out.
17291738
*/
17301739
void removeCollisionForTiles(
1731-
const std::unordered_set<Cesium3DTilesSelection::Tile*>& tiles) {
1740+
const std::unordered_set<
1741+
CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>>& tiles) {
17321742
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::RemoveCollisionForTiles)
17331743
forEachRenderableTile(
17341744
tiles,
1735-
[](Cesium3DTilesSelection::Tile* /*pTile*/, UCesiumGltfComponent* pGltf) {
1745+
[](const CesiumUtility::IntrusivePointer<
1746+
Cesium3DTilesSelection::Tile>& /*pTile*/,
1747+
UCesiumGltfComponent* pGltf) {
17361748
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::SetCollisionDisabled)
17371749
pGltf->SetCollisionEnabled(ECollisionEnabled::NoCollision);
17381750
});
@@ -1814,10 +1826,11 @@ void ACesium3DTileset::updateLastViewUpdateResultState(
18141826
ResolveGeoreference();
18151827
check(Georeference);
18161828

1817-
for (Cesium3DTilesSelection::Tile* tile : result.tilesToRenderThisFrame) {
1829+
for (const CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>&
1830+
pTile : result.tilesToRenderThisFrame) {
18181831
CesiumGeometry::OrientedBoundingBox obb =
18191832
Cesium3DTilesSelection::getOrientedBoundingBoxFromBoundingVolume(
1820-
tile->getBoundingVolume(),
1833+
pTile->getBoundingVolume(),
18211834
Georeference->GetEllipsoid()->GetNativeEllipsoid());
18221835

18231836
FVector unrealCenter =
@@ -1828,9 +1841,9 @@ void ACesium3DTileset::updateLastViewUpdateResultState(
18281841
TEXT("ID %s (%p)"),
18291842
UTF8_TO_TCHAR(
18301843
Cesium3DTilesSelection::TileIdUtilities::createTileIdString(
1831-
tile->getTileID())
1844+
pTile->getTileID())
18321845
.c_str()),
1833-
tile);
1846+
pTile.get());
18341847

18351848
DrawDebugString(World, unrealCenter, text, nullptr, FColor::Red, 0, true);
18361849
}
@@ -1914,13 +1927,15 @@ void ACesium3DTileset::updateLastViewUpdateResultState(
19141927
}
19151928

19161929
void ACesium3DTileset::showTilesToRender(
1917-
const std::vector<Cesium3DTilesSelection::Tile*>& tiles) {
1930+
const std::vector<
1931+
CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>>& tiles) {
19181932
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::ShowTilesToRender)
19191933
forEachRenderableTile(
19201934
tiles,
19211935
[&RootComponent = this->RootComponent,
19221936
&BodyInstance = this->BodyInstance](
1923-
Cesium3DTilesSelection::Tile* pTile,
1937+
const CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>&
1938+
pTile,
19241939
UCesiumGltfComponent* pGltf) {
19251940
applyActorCollisionSettings(BodyInstance, pGltf);
19261941

@@ -1959,7 +1974,8 @@ static void updateTileFades(const auto& tiles, bool fadingIn) {
19591974
forEachRenderableTile(
19601975
tiles,
19611976
[fadingIn](
1962-
Cesium3DTilesSelection::Tile* pTile,
1977+
const CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>&
1978+
pTile,
19631979
UCesiumGltfComponent* pGltf) {
19641980
float percentage = pTile->getContent()
19651981
.getRenderContent()
@@ -2046,22 +2062,34 @@ void ACesium3DTileset::Tick(float DeltaTime) {
20462062
const Cesium3DTilesSelection::ViewUpdateResult* pResult;
20472063
if (this->_captureMovieMode) {
20482064
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::updateViewOffline)
2049-
pResult = &this->_pTileset->updateViewOffline(frustums);
2065+
pResult = &this->_pTileset->updateViewGroupOffline(
2066+
this->_pTileset->getDefaultViewGroup(),
2067+
frustums);
20502068
} else {
20512069
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::updateView)
2052-
pResult = &this->_pTileset->updateView(frustums, DeltaTime);
2070+
pResult = &this->_pTileset->updateViewGroup(
2071+
this->_pTileset->getDefaultViewGroup(),
2072+
frustums,
2073+
DeltaTime);
20532074
}
2075+
2076+
{
2077+
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::loadTiles)
2078+
this->_pTileset->loadTiles();
2079+
}
2080+
20542081
updateLastViewUpdateResultState(*pResult);
20552082

20562083
removeCollisionForTiles(pResult->tilesFadingOut);
20572084

20582085
removeVisibleTilesFromList(
2059-
_tilesToHideNextFrame,
2086+
this->_tilesToHideNextFrame,
20602087
pResult->tilesToRenderThisFrame);
2061-
hideTiles(_tilesToHideNextFrame);
2088+
hideTiles(this->_tilesToHideNextFrame);
20622089

20632090
_tilesToHideNextFrame.clear();
2064-
for (Cesium3DTilesSelection::Tile* pTile : pResult->tilesFadingOut) {
2091+
for (const CesiumUtility::IntrusivePointer<Cesium3DTilesSelection::Tile>&
2092+
pTile : pResult->tilesFadingOut) {
20652093
Cesium3DTilesSelection::TileRenderContent* pRenderContent =
20662094
pTile->getContent().getRenderContent();
20672095
if (!this->UseLodTransitions ||

Source/CesiumRuntime/Private/CesiumCreditSystem.cpp

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "CesiumCreditSystemBPLoader.h"
66
#include "CesiumRuntime.h"
77
#include "CesiumUtility/CreditSystem.h"
8+
#include "Engine/Engine.h"
89
#include "Engine/World.h"
910
#include "EngineUtils.h"
1011
#include "ScreenCreditsWidget.h"
@@ -21,7 +22,6 @@
2122
#include "Modules/ModuleManager.h"
2223
#endif
2324

24-
/*static*/ UObject* ACesiumCreditSystem::CesiumCreditSystemBP = nullptr;
2525
namespace {
2626

2727
/**
@@ -89,17 +89,6 @@ FName ACesiumCreditSystem::DEFAULT_CREDITSYSTEM_TAG =
8989

9090
/*static*/ ACesiumCreditSystem*
9191
ACesiumCreditSystem::GetDefaultCreditSystem(const UObject* WorldContextObject) {
92-
// Blueprint loading can only happen in a constructor, so we instantiate a
93-
// loader object that retrieves the blueprint class in its constructor. We can
94-
// destroy the loader immediately once it's done since it will have already
95-
// set CesiumCreditSystemBP.
96-
if (!CesiumCreditSystemBP) {
97-
UCesiumCreditSystemBPLoader* bpLoader =
98-
NewObject<UCesiumCreditSystemBPLoader>();
99-
CesiumCreditSystemBP = bpLoader->CesiumCreditSystemBP.LoadSynchronous();
100-
bpLoader->ConditionalBeginDestroy();
101-
}
102-
10392
UWorld* world = WorldContextObject->GetWorld();
10493
// This method can be called by actors even when opening the content browser.
10594
if (!IsValid(world)) {
@@ -154,8 +143,12 @@ ACesiumCreditSystem::GetDefaultCreditSystem(const UObject* WorldContextObject) {
154143
spawnParameters.SpawnCollisionHandlingOverride =
155144
ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
156145
spawnParameters.OverrideLevel = world->PersistentLevel;
146+
UCesiumCreditSystemBPLoader* bpLoader =
147+
GEngine->GetEngineSubsystem<UCesiumCreditSystemBPLoader>();
148+
UClass* CesiumCreditSystemBP =
149+
Cast<UClass>(bpLoader->CesiumCreditSystemBP.LoadSynchronous());
157150
pCreditSystem = world->SpawnActor<ACesiumCreditSystem>(
158-
Cast<UClass>(CesiumCreditSystemBP),
151+
CesiumCreditSystemBP,
159152
spawnParameters);
160153
// Null check so the editor doesn't crash when it makes arbitrary calls to
161154
// this function without a valid world context object.
@@ -333,13 +326,14 @@ void ACesiumCreditSystem::Tick(float DeltaTime) {
333326
return;
334327
}
335328

329+
const CesiumUtility::CreditsSnapshot& credits = _pCreditSystem->getSnapshot();
330+
336331
const std::vector<CesiumUtility::Credit>& creditsToShowThisFrame =
337-
_pCreditSystem->getCreditsToShowThisFrame();
332+
credits.currentCredits;
338333

339334
// if the credit list has changed, we want to reformat the credits
340-
CreditsUpdated =
341-
creditsToShowThisFrame.size() != _lastCreditsCount ||
342-
_pCreditSystem->getCreditsToNoLongerShowThisFrame().size() > 0;
335+
CreditsUpdated = creditsToShowThisFrame.size() != _lastCreditsCount ||
336+
credits.removedCredits.size() > 0;
343337

344338
if (CreditsUpdated) {
345339
FString OnScreenCredits;
@@ -385,7 +379,6 @@ void ACesiumCreditSystem::Tick(float DeltaTime) {
385379

386380
CreditsWidget->SetCredits(Credits, OnScreenCredits);
387381
}
388-
_pCreditSystem->startNextFrame();
389382
}
390383

391384
namespace {

Source/CesiumRuntime/Private/CesiumCreditSystemBPLoader.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
#pragma once
44

5+
#include <Subsystems/EngineSubsystem.h>
6+
57
#include "CesiumCreditSystemBPLoader.generated.h"
68

79
UCLASS()
8-
class UCesiumCreditSystemBPLoader : public UObject {
10+
class UCesiumCreditSystemBPLoader : public UEngineSubsystem {
911
GENERATED_BODY()
1012

1113
public:

Source/CesiumRuntime/Private/CesiumEncodedMetadataUtility.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct FMetadataDescription;
2222
struct FCesiumPrimitiveFeaturesDescription;
2323

2424
/**
25-
* DEPRECATED. Use CesiumEncodedFeaturesMetadata instead.
25+
* DEPRECATED. Use EncodedFeaturesMetadata instead.
2626
*/
2727
namespace CesiumEncodedMetadataUtility {
2828
struct EncodedMetadataProperty {

0 commit comments

Comments
 (0)