Skip to content

Commit be11eb8

Browse files
authored
Merge branch 'ue5-main' into dont-limit-curl-requests
2 parents 0c40d8f + b84a8b3 commit be11eb8

28 files changed

+960
-460
lines changed

CHANGES.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Change Log
22

3+
### ? - ?
4+
5+
##### Additions :tada:
6+
7+
- Added support for styling with property textures in `EXT_structural_metadata`.
8+
- Significantly improved tile download performance by adding `HttpThreadActiveFrameTimeInSeconds=0.001` to `Engine.ini`. This results in a major performance improvement for all tilesets, particularly Google Photorealistic 3D Tiles.
9+
310
### v2.0.0 - 2023-11-01
411

512
This release no longer supports Unreal Engine v5.0. Unreal Engine v5.1, v5.2, or v5.3 is required.

Config/Engine.ini

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@
55
[HTTP.HttpThread]
66
RunningThreadedRequestLimit=100
77

8-
# Explicitly set the libCurl max connections to a single host (maps to CURLMOPT_MAX_HOST_CONNECTIONS)
8+
# Set HttpThreadActiveFrameTimeInSeconds - Network download speed is very sensitive to this value
9+
# Maps to the sleep time (ms) between every loop of our libcurl processing thread
10+
# The value of 0.001 (or 1 ms) has the same performance as 0, yet still reserves some time for idle
11+
#
12+
# Set HttpMaxConnectionsPerServer - maps to libcurl's CURLMOPT_MAX_HOST_CONNECTIONS
913
# Unreal defaults to 16, but this is lower than a typical value for MaximumSimultaneousTileLoads
1014
# Use a number just past the highest reasonable value we think a user should ever pick
1115
[HTTP]
16+
HttpThreadActiveFrameTimeInSeconds=0.001
1217
HttpMaxConnectionsPerServer=40
1318

1419
[CoreRedirects]
Binary file not shown.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2020-2023 CesiumGS, Inc. and Contributors
2+
3+
#include "Cesium3DTilesetCustomization.h"
4+
#include "Cesium3DTileset.h"
5+
#include "CesiumCustomization.h"
6+
#include "DetailCategoryBuilder.h"
7+
#include "DetailLayoutBuilder.h"
8+
9+
void FCesium3DTilesetCustomization::Register(
10+
FPropertyEditorModule& PropertyEditorModule) {
11+
PropertyEditorModule.RegisterCustomClassLayout(
12+
ACesium3DTileset::StaticClass()->GetFName(),
13+
FOnGetDetailCustomizationInstance::CreateStatic(
14+
&FCesium3DTilesetCustomization::MakeInstance));
15+
}
16+
17+
void FCesium3DTilesetCustomization::Unregister(
18+
FPropertyEditorModule& PropertyEditorModule) {
19+
PropertyEditorModule.UnregisterCustomClassLayout(
20+
ACesium3DTileset::StaticClass()->GetFName());
21+
}
22+
23+
TSharedRef<IDetailCustomization> FCesium3DTilesetCustomization::MakeInstance() {
24+
return MakeShareable(new FCesium3DTilesetCustomization);
25+
}
26+
27+
void FCesium3DTilesetCustomization::CustomizeDetails(
28+
IDetailLayoutBuilder& DetailBuilder) {
29+
DetailBuilder.SortCategories(&SortCustomDetailsCategories);
30+
}
31+
32+
void FCesium3DTilesetCustomization::SortCustomDetailsCategories(
33+
const TMap<FName, IDetailCategoryBuilder*>& AllCategoryMap) {
34+
(*AllCategoryMap.Find(FName("TransformCommon")))->SetSortOrder(0);
35+
(*AllCategoryMap.Find(FName("Cesium")))->SetSortOrder(1);
36+
(*AllCategoryMap.Find(FName("Rendering")))->SetSortOrder(2);
37+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright 2020-2023 CesiumGS, Inc. and Contributors
2+
3+
#pragma once
4+
5+
#include "IDetailCustomization.h"
6+
7+
class IDetailCategoryBuilder;
8+
9+
/**
10+
* An implementation of the IDetailCustomization interface that customizes
11+
* the Details View of a Cesium3DTileset. It is registered in
12+
* FCesiumEditorModule::StartupModule.
13+
*/
14+
class FCesium3DTilesetCustomization : public IDetailCustomization {
15+
public:
16+
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;
17+
18+
static void Register(FPropertyEditorModule& PropertyEditorModule);
19+
static void Unregister(FPropertyEditorModule& PropertyEditorModule);
20+
21+
static TSharedRef<IDetailCustomization> MakeInstance();
22+
23+
static void SortCustomDetailsCategories(
24+
const TMap<FName, IDetailCategoryBuilder*>& AllCategoryMap);
25+
};

Source/CesiumEditor/Private/CesiumEditor.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "CesiumEditor.h"
44
#include "Cesium3DTilesSelection/Tileset.h"
55
#include "Cesium3DTileset.h"
6+
#include "Cesium3DTilesetCustomization.h"
67
#include "CesiumCartographicPolygon.h"
78
#include "CesiumCommands.h"
89
#include "CesiumGeoreferenceCustomization.h"
@@ -111,6 +112,7 @@ void registerDetailCustomization() {
111112

112113
FCesiumGeoreferenceCustomization::Register(PropertyEditorModule);
113114
FCesiumGlobeAnchorCustomization::Register(PropertyEditorModule);
115+
FCesium3DTilesetCustomization::Register(PropertyEditorModule);
114116

115117
PropertyEditorModule.NotifyCustomizationModuleChanged();
116118
}
@@ -126,6 +128,7 @@ void unregisterDetailCustomization() {
126128

127129
FCesiumGeoreferenceCustomization::Unregister(PropertyEditorModule);
128130
FCesiumGlobeAnchorCustomization::Unregister(PropertyEditorModule);
131+
FCesium3DTilesetCustomization::Unregister(PropertyEditorModule);
129132
}
130133
}
131134

Source/CesiumEditor/Private/SelectCesiumIonToken.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -459,11 +459,7 @@ FReply SelectCesiumIonToken::UseOrCreate() {
459459
UTF8_TO_TCHAR(response.value->token.c_str());
460460
pSettings->Modify();
461461

462-
#if ENGINE_MAJOR_VERSION >= 5
463462
pSettings->TryUpdateDefaultConfigFile();
464-
#else
465-
pSettings->UpdateDefaultConfigFile();
466-
#endif
467463

468464
// Refresh all tilesets and overlays that are using the project
469465
// default token.

Source/CesiumRuntime/Private/Cesium3DTileset.cpp

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020-2021 CesiumGS, Inc. and Contributors
1+
// Copyright 2020-2023 CesiumGS, Inc. and Contributors
22

33
#include "Cesium3DTileset.h"
44
#include "Async/Async.h"
@@ -954,18 +954,6 @@ void ACesium3DTileset::LoadTileset() {
954954
*this->Url);
955955
}
956956

957-
#if ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION == 0
958-
if (pWorldSettings && !pWorldSettings->bEnableLargeWorlds) {
959-
pWorldSettings->bEnableLargeWorlds = true;
960-
UE_LOG(
961-
LogCesium,
962-
Warning,
963-
TEXT(
964-
"Cesium for Unreal has enabled the \"Enable Large Worlds\" option in this world's settings, as it is required in order to avoid serious culling problems with Cesium3DTilesets in Unreal Engine 5."),
965-
*this->Url);
966-
}
967-
#endif
968-
969957
const TSharedRef<CesiumViewExtension, ESPMode::ThreadSafe>&
970958
cesiumViewExtension = getCesiumViewExtension();
971959
const std::shared_ptr<CesiumAsync::IAssetAccessor>& pAssetAccessor =
@@ -1000,7 +988,11 @@ void ACesium3DTileset::LoadTileset() {
1000988
FCesiumFeaturesMetadataDescription& description =
1001989
this->_featuresMetadataDescription.emplace();
1002990
description.Features = {pFeaturesMetadataComponent->FeatureIdSets};
1003-
description.ModelMetadata = {pFeaturesMetadataComponent->PropertyTables};
991+
description.PrimitiveMetadata = {
992+
pFeaturesMetadataComponent->PropertyTextureNames};
993+
description.ModelMetadata = {
994+
pFeaturesMetadataComponent->PropertyTables,
995+
pFeaturesMetadataComponent->PropertyTextures};
1004996
} else if (pEncodedMetadataComponent) {
1005997
UE_LOG(
1006998
LogCesium,
@@ -1377,13 +1369,8 @@ std::vector<FCesiumCamera> ACesium3DTileset::GetPlayerCameras() const {
13771369
}
13781370

13791371
if (useStereoRendering) {
1380-
#if ENGINE_MAJOR_VERSION >= 5
13811372
const auto leftEye = EStereoscopicEye::eSSE_LEFT_EYE;
13821373
const auto rightEye = EStereoscopicEye::eSSE_RIGHT_EYE;
1383-
#else
1384-
const auto leftEye = EStereoscopicPass::eSSP_LEFT_EYE;
1385-
const auto rightEye = EStereoscopicPass::eSSP_RIGHT_EYE;
1386-
#endif
13871374

13881375
uint32 stereoLeftSizeX = static_cast<uint32>(sizeX);
13891376
uint32 stereoLeftSizeY = static_cast<uint32>(sizeY);
@@ -1420,9 +1407,9 @@ std::vector<FCesiumCamera> ACesium3DTileset::GetPlayerCameras() const {
14201407
pStereoRendering->GetStereoProjectionMatrix(leftEye);
14211408

14221409
// TODO: consider assymetric frustums using 4 fovs
1423-
CesiumReal one_over_tan_half_hfov = projection.M[0][0];
1410+
double one_over_tan_half_hfov = projection.M[0][0];
14241411

1425-
CesiumReal hfov =
1412+
double hfov =
14261413
glm::degrees(2.0 * glm::atan(1.0 / one_over_tan_half_hfov));
14271414

14281415
cameras.emplace_back(
@@ -1444,9 +1431,9 @@ std::vector<FCesiumCamera> ACesium3DTileset::GetPlayerCameras() const {
14441431
FMatrix projection =
14451432
pStereoRendering->GetStereoProjectionMatrix(rightEye);
14461433

1447-
CesiumReal one_over_tan_half_hfov = projection.M[0][0];
1434+
double one_over_tan_half_hfov = projection.M[0][0];
14481435

1449-
CesiumReal hfov =
1436+
double hfov =
14501437
glm::degrees(2.0f * glm::atan(1.0f / one_over_tan_half_hfov));
14511438

14521439
cameras.emplace_back(

Source/CesiumRuntime/Private/CesiumEncodedFeaturesMetadata.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,16 @@ FString getMaterialNameForPropertyTableProperty(
315315
const FString& propertyTableName,
316316
const FString& propertyName) {
317317
// Example: "PTABLE_houses_roofColor"
318-
return MaterialPropertyTablePrefix + propertyTableName + "_" + propertyName;
318+
return createHlslSafeName(
319+
MaterialPropertyTablePrefix + propertyTableName + "_" + propertyName);
319320
}
320321

321322
FString getMaterialNameForPropertyTextureProperty(
322323
const FString& propertyTextureName,
323324
const FString& propertyName) {
324325
// Example: "PTEXTURE_house_temperature"
325-
return MaterialPropertyTexturePrefix + propertyTextureName + "_" +
326-
propertyName;
326+
return createHlslSafeName(
327+
MaterialPropertyTexturePrefix + propertyTextureName + "_" + propertyName);
327328
}
328329

329330
namespace {
@@ -691,7 +692,8 @@ EncodedPropertyTexture encodePropertyTextureAnyThreadPart(
691692
EncodedPropertyTextureProperty& encodedProperty =
692693
encodedPropertyTexture.properties.Emplace_GetRef();
693694
encodedProperty.name = createHlslSafeName(pDescription->Name);
694-
encodedProperty.type = pDescription->PropertyDetails.Type;
695+
encodedProperty.type =
696+
CesiumMetadataTypeToEncodingType(pDescription->PropertyDetails.Type);
695697
encodedProperty.textureCoordinateSetIndex = property.getTexCoordSetIndex();
696698

697699
if (UCesiumPropertyTexturePropertyBlueprintLibrary::
@@ -700,9 +702,7 @@ EncodedPropertyTexture encodePropertyTextureAnyThreadPart(
700702

701703
const TArray<int64>& channels =
702704
UCesiumPropertyTexturePropertyBlueprintLibrary::GetChannels(property);
703-
const int32 channelCount = FMath::Max(
704-
channels.Num(),
705-
static_cast<int32>(encodedProperty.channels.size()));
705+
const int32 channelCount = channels.Num();
706706
for (int32 i = 0; i < channelCount; i++) {
707707
encodedProperty.channels[i] = channels[i];
708708
}
@@ -748,6 +748,7 @@ EncodedPropertyTexture encodePropertyTextureAnyThreadPart(
748748
encodedProperty.pTexture->addressY = TextureAddress::TA_Clamp;
749749
}
750750

751+
// TODO: account for texture filter
751752
encodedProperty.pTexture->filter = TextureFilter::TF_Nearest;
752753

753754
if (!encodedProperty.pTexture->pTextureData) {
@@ -815,13 +816,16 @@ EncodedPrimitiveMetadata encodePrimitiveMetadataAnyThreadPart(
815816
result.propertyTextureIndices.Reserve(
816817
metadataDescription.PropertyTextureNames.Num());
817818

818-
for (const FCesiumPropertyTexture& propertyTexture : propertyTextures) {
819+
for (int32 i = 0; i < propertyTextures.Num(); i++) {
820+
const FCesiumPropertyTexture& propertyTexture = propertyTextures[i];
819821
FString propertyTextureName = getNameForPropertyTexture(propertyTexture);
820-
int32 index =
822+
const FString* pName =
821823
metadataDescription.PropertyTextureNames.Find(propertyTextureName);
822-
// Confirm that the named property texture is actually present.
823-
if (index != INDEX_NONE) {
824-
result.propertyTextureIndices.Add(index);
824+
// Confirm that the named property texture is actually present. This
825+
// indicates that it is acceptable to pass the texture coordinate index to
826+
// the material layer.
827+
if (pName) {
828+
result.propertyTextureIndices.Add(i);
825829
}
826830
}
827831

@@ -887,6 +891,7 @@ EncodedModelMetadata encodeModelMetadataAnyThreadPart(
887891
*pExpectedPropertyTexture,
888892
propertyTexture,
889893
propertyTexturePropertyMap));
894+
encodedPropertyTexture.name = propertyTextureName;
890895
}
891896
}
892897

0 commit comments

Comments
 (0)