Skip to content

Commit 40676e5

Browse files
committed
Merge remote-tracking branch 'cesium/main' into enh-1658_mesh-build-callbacks
2 parents 65efbd2 + ed38004 commit 40676e5

File tree

5 files changed

+84
-75
lines changed

5 files changed

+84
-75
lines changed

CHANGES.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Change Log {#changes}
22

3-
### ? - ?
3+
### v2.16.1 - 2025-06-02
44

55
##### Additions :tada:
66

@@ -9,12 +9,14 @@
99
##### Fixes :wrench:
1010

1111
- Worked around an Unreal Engine limitation that prevented collisions and line traces from working correctly for tilesets with a very small scale factor.
12-
- Add a missing include for `GEngine` when packaging from source, introduced in *v2.16.0*.
12+
- Add a missing include for `GEngine` when packaging from source, introduced in `v2.16.0`.
1313
- Fixed a bug in `UCesiumFeaturesMetadataComponent` where multiple references to same feature ID set would cause improper encoding of its feature IDs.
1414
- Fixed a crash that would occur when duplicating an `ACesiumGeoreference`.
1515
- Fixed a bug that caused tilesets to render incorrectly when Dynamic Material Instances were used for their material settings.
1616
- Removed an unnecessary copy operation that happened while constructing tile meshes.
1717

18+
In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.47.0 to v0.48.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
19+
1820
### v2.16.0 - 2025-05-01
1921

2022
##### Additions :tada:

CesiumForUnreal.uplugin

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"FileVersion": 3,
3-
"Version": 75,
4-
"VersionName": "2.16.0",
3+
"Version": 76,
4+
"VersionName": "2.16.1",
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",

Source/CesiumRuntime/Private/CesiumGltfComponent.cpp

Lines changed: 76 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,7 @@ static void mikkSetTSpaceBasic(
645645

646646
TangentX.Y = -TangentX.Y;
647647
TangentY.Y = -TangentY.Y;
648+
TangentZ.Y = -TangentZ.Y;
648649

649650
vertexBuffer.SetVertexTangents(vertexIndex, TangentX, TangentY, TangentZ);
650651
}
@@ -3149,17 +3150,17 @@ static void loadPrimitiveGameThreadPart(
31493150

31503151
#if PLATFORM_MAC
31513152
// TODO: figure out why water material crashes mac
3152-
UMaterialInterface* pBaseMaterial = is_in_blend_mode(loadResult)
3153-
? pGltf->BaseMaterialWithTranslucency
3154-
: pGltf->BaseMaterial;
3153+
UMaterialInterface* pUserDesignatedMaterial =
3154+
is_in_blend_mode(loadResult) ? pGltf->BaseMaterialWithTranslucency
3155+
: pGltf->BaseMaterial;
31553156
#else
3156-
UMaterialInterface* pBaseMaterial;
3157+
UMaterialInterface* pUserDesignatedMaterial;
31573158
if (loadResult.onlyWater || !loadResult.onlyLand) {
3158-
pBaseMaterial = pGltf->BaseMaterialWithWater;
3159+
pUserDesignatedMaterial = pGltf->BaseMaterialWithWater;
31593160
} else {
3160-
pBaseMaterial = is_in_blend_mode(loadResult)
3161-
? pGltf->BaseMaterialWithTranslucency
3162-
: pGltf->BaseMaterial;
3161+
pUserDesignatedMaterial = is_in_blend_mode(loadResult)
3162+
? pGltf->BaseMaterialWithTranslucency
3163+
: pGltf->BaseMaterial;
31633164
}
31643165
#endif
31653166

@@ -3170,88 +3171,91 @@ static void loadPrimitiveGameThreadPart(
31703171
primData.Features = std::move(loadResult.Features);
31713172
primData.Metadata = std::move(loadResult.Metadata);
31723173

3173-
UMaterialInstanceDynamic* pMaterial = nullptr;
3174+
UMaterialInstanceDynamic* pMaterialForGltfPrimitive = nullptr;
31743175
ICesium3DTilesetLifecycleEventReceiver* pLifecycleEventReceiver =
31753176
pTilesetActor->GetLifecycleEventReceiver();
31763177
{
31773178
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::SetupMaterial)
3178-
ensure(pBaseMaterial);
3179-
3180-
UMaterialInstanceDynamic* pBaseAsMaterialInstanceDynamic =
3181-
Cast<UMaterialInstanceDynamic>(pBaseMaterial);
3182-
UMaterialInstance* pParentMaterialInstance =
3183-
Cast<UMaterialInstance>(pBaseMaterial);
3184-
// If the base material is a UMaterialInstanceDynamic, Create() will
3185-
// reject it as a valid instance parent. Defer to its non-dynamic parent
3186-
// instead.
3187-
if (pBaseAsMaterialInstanceDynamic) {
3188-
pParentMaterialInstance =
3189-
Cast<UMaterialInstance>(pParentMaterialInstance->Parent.Get());
3190-
}
3179+
ensure(pUserDesignatedMaterial);
3180+
3181+
UMaterialInstanceDynamic* pUserDesignatedMaterialAsDynamic =
3182+
Cast<UMaterialInstanceDynamic>(pUserDesignatedMaterial);
3183+
// If the user-designated material is a UMaterialInstanceDynamic, Create()
3184+
// will reject it as a valid instance parent. Defer to its non-dynamic
3185+
// parent instead.
3186+
UMaterialInterface* pBaseMaterial =
3187+
pUserDesignatedMaterialAsDynamic
3188+
? pUserDesignatedMaterialAsDynamic->Parent.Get()
3189+
: pUserDesignatedMaterial;
31913190

31923191
if (pLifecycleEventReceiver) {
31933192
// Possibility to override the material for this primitive
3194-
pMaterial = pLifecycleEventReceiver->CreateMaterial(
3193+
pMaterialForGltfPrimitive = pLifecycleEventReceiver->CreateMaterial(
31953194
*pCesiumPrimitive,
3196-
pParentMaterialInstance,
3195+
pBaseMaterial,
31973196
ImportedSlotName);
3198-
if (pMaterial) {
3199-
// pMaterial created above may not have used the suggested pBaseMaterial
3200-
// passed as input
3201-
pBaseMaterial = pMaterial->Parent.Get();
3202-
pBaseAsMaterialInstanceDynamic =
3203-
Cast<UMaterialInstanceDynamic>(pBaseMaterial);
3204-
pParentMaterialInstance = Cast<UMaterialInstance>(pBaseMaterial);
3197+
if (pMaterialForGltfPrimitive) {
3198+
// pMaterialForGltfPrimitive created above may not have used the suggested
3199+
// pBaseMaterial passed as input
3200+
pBaseMaterial = pMaterialForGltfPrimitive->Parent.Get();
3201+
// may have changed but we don't need it from now on:
3202+
pUserDesignatedMaterialAsDynamic = nullptr;
32053203
}
32063204
}
3207-
if (!pMaterial) {
3208-
pMaterial = UMaterialInstanceDynamic::Create(
3209-
pParentMaterialInstance,
3205+
if (!pMaterialForGltfPrimitive) {
3206+
pMaterialForGltfPrimitive = UMaterialInstanceDynamic::Create(
3207+
pBaseMaterial,
32103208
nullptr,
32113209
ImportedSlotName);
32123210
}
32133211

3214-
pMaterial->SetFlags(
3212+
pMaterialForGltfPrimitive->SetFlags(
32153213
RF_Transient | RF_DuplicateTransient | RF_TextExportTransient);
32163214
SetGltfParameterValues(
32173215
model,
32183216
loadResult,
32193217
material,
32203218
pbr,
3221-
pMaterial,
3219+
pMaterialForGltfPrimitive,
32223220
EMaterialParameterAssociation::GlobalParameter,
32233221
INDEX_NONE);
32243222
SetWaterParameterValues(
32253223
model,
32263224
loadResult,
3227-
pMaterial,
3225+
pMaterialForGltfPrimitive,
32283226
EMaterialParameterAssociation::GlobalParameter,
32293227
INDEX_NONE);
32303228

3229+
// The base material might be a Material, or it might be a MaterialInstance.
3230+
// Only MaterialInstances can use the material layer system, so only
3231+
// MaterialInstances will have UCesiumMaterialUserData.
3232+
UMaterialInstance* pBaseAsMaterialInstance =
3233+
Cast<UMaterialInstance>(pBaseMaterial);
3234+
32313235
UCesiumMaterialUserData* pCesiumData =
3232-
pParentMaterialInstance
3233-
? pParentMaterialInstance
3236+
pBaseAsMaterialInstance
3237+
? pBaseAsMaterialInstance
32343238
->GetAssetUserData<UCesiumMaterialUserData>()
32353239
: nullptr;
32363240

32373241
// If possible and necessary, attach the CesiumMaterialUserData now.
32383242
#if WITH_EDITORONLY_DATA
3239-
if (pParentMaterialInstance && !pCesiumData) {
3243+
if (pBaseAsMaterialInstance && !pCesiumData) {
32403244
const FStaticParameterSet& parameters =
3241-
pParentMaterialInstance->GetStaticParameters();
3245+
pBaseAsMaterialInstance->GetStaticParameters();
32423246

32433247
bool hasLayers = parameters.bHasMaterialLayers;
32443248
if (hasLayers) {
32453249
#if WITH_EDITOR
32463250
FScopedTransaction transaction(
32473251
FText::FromString("Add Cesium User Data to Material"));
3248-
pParentMaterialInstance->Modify();
3252+
pBaseAsMaterialInstance->Modify();
32493253
#endif
32503254
pCesiumData = NewObject<UCesiumMaterialUserData>(
3251-
pParentMaterialInstance,
3255+
pBaseAsMaterialInstance,
32523256
NAME_None,
32533257
RF_Transactional);
3254-
pParentMaterialInstance->AddAssetUserData(pCesiumData);
3258+
pBaseAsMaterialInstance->AddAssetUserData(pCesiumData);
32553259
pCesiumData->PostEditChangeOwner();
32563260
}
32573261
}
@@ -3260,11 +3264,13 @@ static void loadPrimitiveGameThreadPart(
32603264
// If CesiumMaterialUserData was not attached (e.g., material was
32613265
// dynamically created at runtime), then walk the parent chain of the
32623266
// material to find it.
3263-
while (pParentMaterialInstance && !pCesiumData) {
3264-
pParentMaterialInstance =
3265-
Cast<UMaterialInstance>(pParentMaterialInstance->Parent.Get());
3266-
pCesiumData =
3267-
pParentMaterialInstance->GetAssetUserData<UCesiumMaterialUserData>();
3267+
while (pBaseAsMaterialInstance && !pCesiumData) {
3268+
pBaseAsMaterialInstance =
3269+
Cast<UMaterialInstance>(pBaseAsMaterialInstance->Parent.Get());
3270+
if (pBaseAsMaterialInstance) {
3271+
pCesiumData = pBaseAsMaterialInstance
3272+
->GetAssetUserData<UCesiumMaterialUserData>();
3273+
}
32683274
}
32693275

32703276
if (pCesiumData) {
@@ -3273,21 +3279,21 @@ static void loadPrimitiveGameThreadPart(
32733279
loadResult,
32743280
material,
32753281
pbr,
3276-
pMaterial,
3282+
pMaterialForGltfPrimitive,
32773283
EMaterialParameterAssociation::LayerParameter,
32783284
0);
32793285

32803286
// Initialize fade uniform to fully visible, in case LOD transitions
32813287
// are off.
32823288
int fadeLayerIndex = pCesiumData->LayerNames.Find("DitherFade");
32833289
if (fadeLayerIndex >= 0) {
3284-
pMaterial->SetScalarParameterValueByInfo(
3290+
pMaterialForGltfPrimitive->SetScalarParameterValueByInfo(
32853291
FMaterialParameterInfo(
32863292
"FadePercentage",
32873293
EMaterialParameterAssociation::LayerParameter,
32883294
fadeLayerIndex),
32893295
1.0f);
3290-
pMaterial->SetScalarParameterValueByInfo(
3296+
pMaterialForGltfPrimitive->SetScalarParameterValueByInfo(
32913297
FMaterialParameterInfo(
32923298
"FadingType",
32933299
EMaterialParameterAssociation::LayerParameter,
@@ -3301,7 +3307,7 @@ static void loadPrimitiveGameThreadPart(
33013307
SetWaterParameterValues(
33023308
model,
33033309
loadResult,
3304-
pMaterial,
3310+
pMaterialForGltfPrimitive,
33053311
EMaterialParameterAssociation::LayerParameter,
33063312
waterIndex);
33073313
}
@@ -3314,7 +3320,7 @@ static void loadPrimitiveGameThreadPart(
33143320
model,
33153321
*pGltf,
33163322
loadResult,
3317-
pMaterial,
3323+
pMaterialForGltfPrimitive,
33183324
EMaterialParameterAssociation::LayerParameter,
33193325
featuresMetadataIndex);
33203326
} else if (metadataIndex >= 0) {
@@ -3323,42 +3329,43 @@ static void loadPrimitiveGameThreadPart(
33233329
model,
33243330
*pGltf,
33253331
loadResult,
3326-
pMaterial,
3332+
pMaterialForGltfPrimitive,
33273333
EMaterialParameterAssociation::LayerParameter,
33283334
metadataIndex);
33293335
}
33303336
}
33313337

3332-
if (pBaseAsMaterialInstanceDynamic) {
3338+
if (pUserDesignatedMaterialAsDynamic) {
33333339
// Ensure any parameters on the original UMaterialInstanceDynamic are
33343340
// transferred to the copy.
3335-
for (auto& it : pBaseAsMaterialInstanceDynamic->ScalarParameterValues) {
3336-
pMaterial->SetScalarParameterValueByInfo(
3341+
for (auto& it : pUserDesignatedMaterialAsDynamic->ScalarParameterValues) {
3342+
pMaterialForGltfPrimitive->SetScalarParameterValueByInfo(
33373343
it.ParameterInfo,
33383344
it.ParameterValue);
33393345
}
33403346

3341-
for (auto& it : pBaseAsMaterialInstanceDynamic->VectorParameterValues) {
3342-
pMaterial->SetVectorParameterValueByInfo(
3347+
for (auto& it : pUserDesignatedMaterialAsDynamic->VectorParameterValues) {
3348+
pMaterialForGltfPrimitive->SetVectorParameterValueByInfo(
33433349
it.ParameterInfo,
33443350
it.ParameterValue);
33453351
}
33463352

33473353
for (auto& it :
3348-
pBaseAsMaterialInstanceDynamic->DoubleVectorParameterValues) {
3349-
pMaterial->SetVectorParameterValueByInfo(
3354+
pUserDesignatedMaterialAsDynamic->DoubleVectorParameterValues) {
3355+
pMaterialForGltfPrimitive->SetVectorParameterValueByInfo(
33503356
it.ParameterInfo,
33513357
it.ParameterValue);
33523358
}
33533359

3354-
for (auto& it : pBaseAsMaterialInstanceDynamic->TextureParameterValues) {
3355-
pMaterial->SetTextureParameterValueByInfo(
3360+
for (auto& it :
3361+
pUserDesignatedMaterialAsDynamic->TextureParameterValues) {
3362+
pMaterialForGltfPrimitive->SetTextureParameterValueByInfo(
33563363
it.ParameterInfo,
33573364
it.ParameterValue);
33583365
}
33593366

3360-
for (auto& it : pBaseAsMaterialInstanceDynamic->FontParameterValues) {
3361-
pMaterial->SetFontParameterValue(
3367+
for (auto& it : pUserDesignatedMaterialAsDynamic->FontParameterValues) {
3368+
pMaterialForGltfPrimitive->SetFontParameterValue(
33623369
it.ParameterInfo,
33633370
it.FontValue,
33643371
it.FontPage);
@@ -3369,7 +3376,7 @@ static void loadPrimitiveGameThreadPart(
33693376
if (pLifecycleEventReceiver) {
33703377
pLifecycleEventReceiver->CustomizeMaterial(
33713378
*pCesiumPrimitive,
3372-
*pMaterial,
3379+
*pMaterialForGltfPrimitive,
33733380
pCesiumData,
33743381
material,
33753382
pbr);
@@ -3396,9 +3403,9 @@ static void loadPrimitiveGameThreadPart(
33963403

33973404
PRAGMA_ENABLE_DEPRECATION_WARNINGS
33983405

3399-
pMaterial->TwoSided = true;
3406+
pMaterialForGltfPrimitive->TwoSided = true;
34003407

3401-
pStaticMesh->AddMaterial(pMaterial);
3408+
pStaticMesh->AddMaterial(pMaterialForGltfPrimitive);
34023409

34033410
pStaticMesh->SetLightingGuid();
34043411

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cesium-unreal",
3-
"version": "2.16.0",
3+
"version": "2.16.1",
44
"description": "Cesium for Unreal",
55
"main": "index.js",
66
"directories": {

0 commit comments

Comments
 (0)