Skip to content

Commit 77a3c57

Browse files
committed
Support Materials, not just MaterialInstances.
1 parent c673662 commit 77a3c57

File tree

1 file changed

+60
-53
lines changed

1 file changed

+60
-53
lines changed

Source/CesiumRuntime/Private/CesiumGltfComponent.cpp

Lines changed: 60 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3151,79 +3151,83 @@ static void loadPrimitiveGameThreadPart(
31513151
? pGltf->BaseMaterialWithTranslucency
31523152
: pGltf->BaseMaterial;
31533153
#else
3154-
UMaterialInterface* pBaseMaterial;
3154+
UMaterialInterface* pUserDesignatedMaterial;
31553155
if (loadResult.onlyWater || !loadResult.onlyLand) {
3156-
pBaseMaterial = pGltf->BaseMaterialWithWater;
3156+
pUserDesignatedMaterial = pGltf->BaseMaterialWithWater;
31573157
} else {
3158-
pBaseMaterial = is_in_blend_mode(loadResult)
3159-
? pGltf->BaseMaterialWithTranslucency
3160-
: pGltf->BaseMaterial;
3158+
pUserDesignatedMaterial = is_in_blend_mode(loadResult)
3159+
? pGltf->BaseMaterialWithTranslucency
3160+
: pGltf->BaseMaterial;
31613161
}
31623162
#endif
31633163

3164-
UMaterialInstanceDynamic* pMaterial;
3164+
UMaterialInstanceDynamic* pMaterialForGltfPrimitive;
31653165
{
31663166
TRACE_CPUPROFILER_EVENT_SCOPE(Cesium::SetupMaterial)
31673167

3168-
UMaterialInstanceDynamic* pBaseAsMaterialInstanceDynamic =
3169-
Cast<UMaterialInstanceDynamic>(pBaseMaterial);
3170-
UMaterialInstance* pParentMaterialInstance =
3171-
Cast<UMaterialInstance>(pBaseMaterial);
3168+
UMaterialInstanceDynamic* pUserDesignatedMaterialAsDynamic =
3169+
Cast<UMaterialInstanceDynamic>(pUserDesignatedMaterial);
31723170

3173-
// If the base material is a UMaterialInstanceDynamic, Create() will
3174-
// reject it as a valid instance parent. Defer to its non-dynamic parent
3175-
// instead.
3176-
if (pBaseAsMaterialInstanceDynamic) {
3177-
pParentMaterialInstance =
3178-
Cast<UMaterialInstance>(pParentMaterialInstance->Parent.Get());
3179-
}
3171+
// If the user-designated material is a UMaterialInstanceDynamic, Create()
3172+
// will reject it as a valid instance parent. Defer to its non-dynamic
3173+
// parent instead.
3174+
UMaterialInterface* pBaseMaterial =
3175+
pUserDesignatedMaterialAsDynamic
3176+
? pUserDesignatedMaterialAsDynamic->Parent.Get()
3177+
: pUserDesignatedMaterial;
31803178

3181-
pMaterial = UMaterialInstanceDynamic::Create(
3182-
pParentMaterialInstance,
3179+
pMaterialForGltfPrimitive = UMaterialInstanceDynamic::Create(
3180+
pBaseMaterial,
31833181
nullptr,
31843182
ImportedSlotName);
31853183

3186-
pMaterial->SetFlags(
3184+
pMaterialForGltfPrimitive->SetFlags(
31873185
RF_Transient | RF_DuplicateTransient | RF_TextExportTransient);
31883186
SetGltfParameterValues(
31893187
model,
31903188
loadResult,
31913189
material,
31923190
pbr,
3193-
pMaterial,
3191+
pMaterialForGltfPrimitive,
31943192
EMaterialParameterAssociation::GlobalParameter,
31953193
INDEX_NONE);
31963194
SetWaterParameterValues(
31973195
model,
31983196
loadResult,
3199-
pMaterial,
3197+
pMaterialForGltfPrimitive,
32003198
EMaterialParameterAssociation::GlobalParameter,
32013199
INDEX_NONE);
32023200

3201+
// The base material might be a Material, or it might be a MaterialInstance.
3202+
// Only MaterialInstances can use the material layer system, so only
3203+
// MaterialInstances will have UCesiumMaterialUserData.
3204+
UMaterialInstance* pBaseAsMaterialInstance =
3205+
Cast<UMaterialInstance>(pBaseMaterial);
3206+
32033207
UCesiumMaterialUserData* pCesiumData =
3204-
pParentMaterialInstance
3205-
? pParentMaterialInstance
3208+
pBaseAsMaterialInstance
3209+
? pBaseAsMaterialInstance
32063210
->GetAssetUserData<UCesiumMaterialUserData>()
32073211
: nullptr;
32083212

32093213
// If possible and necessary, attach the CesiumMaterialUserData now.
32103214
#if WITH_EDITORONLY_DATA
3211-
if (pParentMaterialInstance && !pCesiumData) {
3215+
if (pBaseAsMaterialInstance && !pCesiumData) {
32123216
const FStaticParameterSet& parameters =
3213-
pParentMaterialInstance->GetStaticParameters();
3217+
pBaseAsMaterialInstance->GetStaticParameters();
32143218

32153219
bool hasLayers = parameters.bHasMaterialLayers;
32163220
if (hasLayers) {
32173221
#if WITH_EDITOR
32183222
FScopedTransaction transaction(
32193223
FText::FromString("Add Cesium User Data to Material"));
3220-
pParentMaterialInstance->Modify();
3224+
pBaseAsMaterialInstance->Modify();
32213225
#endif
32223226
pCesiumData = NewObject<UCesiumMaterialUserData>(
3223-
pParentMaterialInstance,
3227+
pBaseAsMaterialInstance,
32243228
NAME_None,
32253229
RF_Transactional);
3226-
pParentMaterialInstance->AddAssetUserData(pCesiumData);
3230+
pBaseAsMaterialInstance->AddAssetUserData(pCesiumData);
32273231
pCesiumData->PostEditChangeOwner();
32283232
}
32293233
}
@@ -3232,11 +3236,13 @@ static void loadPrimitiveGameThreadPart(
32323236
// If CesiumMaterialUserData was not attached (e.g., material was
32333237
// dynamically created at runtime), then walk the parent chain of the
32343238
// material to find it.
3235-
while (pParentMaterialInstance && !pCesiumData) {
3236-
pParentMaterialInstance =
3237-
Cast<UMaterialInstance>(pParentMaterialInstance->Parent.Get());
3238-
pCesiumData =
3239-
pParentMaterialInstance->GetAssetUserData<UCesiumMaterialUserData>();
3239+
while (pBaseAsMaterialInstance && !pCesiumData) {
3240+
pBaseAsMaterialInstance =
3241+
Cast<UMaterialInstance>(pBaseAsMaterialInstance->Parent.Get());
3242+
if (pBaseAsMaterialInstance) {
3243+
pCesiumData = pBaseAsMaterialInstance
3244+
->GetAssetUserData<UCesiumMaterialUserData>();
3245+
}
32403246
}
32413247

32423248
if (pCesiumData) {
@@ -3245,21 +3251,21 @@ static void loadPrimitiveGameThreadPart(
32453251
loadResult,
32463252
material,
32473253
pbr,
3248-
pMaterial,
3254+
pMaterialForGltfPrimitive,
32493255
EMaterialParameterAssociation::LayerParameter,
32503256
0);
32513257

32523258
// Initialize fade uniform to fully visible, in case LOD transitions
32533259
// are off.
32543260
int fadeLayerIndex = pCesiumData->LayerNames.Find("DitherFade");
32553261
if (fadeLayerIndex >= 0) {
3256-
pMaterial->SetScalarParameterValueByInfo(
3262+
pMaterialForGltfPrimitive->SetScalarParameterValueByInfo(
32573263
FMaterialParameterInfo(
32583264
"FadePercentage",
32593265
EMaterialParameterAssociation::LayerParameter,
32603266
fadeLayerIndex),
32613267
1.0f);
3262-
pMaterial->SetScalarParameterValueByInfo(
3268+
pMaterialForGltfPrimitive->SetScalarParameterValueByInfo(
32633269
FMaterialParameterInfo(
32643270
"FadingType",
32653271
EMaterialParameterAssociation::LayerParameter,
@@ -3273,7 +3279,7 @@ static void loadPrimitiveGameThreadPart(
32733279
SetWaterParameterValues(
32743280
model,
32753281
loadResult,
3276-
pMaterial,
3282+
pMaterialForGltfPrimitive,
32773283
EMaterialParameterAssociation::LayerParameter,
32783284
waterIndex);
32793285
}
@@ -3286,7 +3292,7 @@ static void loadPrimitiveGameThreadPart(
32863292
model,
32873293
*pGltf,
32883294
loadResult,
3289-
pMaterial,
3295+
pMaterialForGltfPrimitive,
32903296
EMaterialParameterAssociation::LayerParameter,
32913297
featuresMetadataIndex);
32923298
} else if (metadataIndex >= 0) {
@@ -3295,42 +3301,43 @@ static void loadPrimitiveGameThreadPart(
32953301
model,
32963302
*pGltf,
32973303
loadResult,
3298-
pMaterial,
3304+
pMaterialForGltfPrimitive,
32993305
EMaterialParameterAssociation::LayerParameter,
33003306
metadataIndex);
33013307
}
33023308
}
33033309

3304-
if (pBaseAsMaterialInstanceDynamic) {
3310+
if (pUserDesignatedMaterialAsDynamic) {
33053311
// Ensure any parameters on the original UMaterialInstanceDynamic are
33063312
// transferred to the copy.
3307-
for (auto& it : pBaseAsMaterialInstanceDynamic->ScalarParameterValues) {
3308-
pMaterial->SetScalarParameterValueByInfo(
3313+
for (auto& it : pUserDesignatedMaterialAsDynamic->ScalarParameterValues) {
3314+
pMaterialForGltfPrimitive->SetScalarParameterValueByInfo(
33093315
it.ParameterInfo,
33103316
it.ParameterValue);
33113317
}
33123318

3313-
for (auto& it : pBaseAsMaterialInstanceDynamic->VectorParameterValues) {
3314-
pMaterial->SetVectorParameterValueByInfo(
3319+
for (auto& it : pUserDesignatedMaterialAsDynamic->VectorParameterValues) {
3320+
pMaterialForGltfPrimitive->SetVectorParameterValueByInfo(
33153321
it.ParameterInfo,
33163322
it.ParameterValue);
33173323
}
33183324

33193325
for (auto& it :
3320-
pBaseAsMaterialInstanceDynamic->DoubleVectorParameterValues) {
3321-
pMaterial->SetVectorParameterValueByInfo(
3326+
pUserDesignatedMaterialAsDynamic->DoubleVectorParameterValues) {
3327+
pMaterialForGltfPrimitive->SetVectorParameterValueByInfo(
33223328
it.ParameterInfo,
33233329
it.ParameterValue);
33243330
}
33253331

3326-
for (auto& it : pBaseAsMaterialInstanceDynamic->TextureParameterValues) {
3327-
pMaterial->SetTextureParameterValueByInfo(
3332+
for (auto& it :
3333+
pUserDesignatedMaterialAsDynamic->TextureParameterValues) {
3334+
pMaterialForGltfPrimitive->SetTextureParameterValueByInfo(
33283335
it.ParameterInfo,
33293336
it.ParameterValue);
33303337
}
33313338

3332-
for (auto& it : pBaseAsMaterialInstanceDynamic->FontParameterValues) {
3333-
pMaterial->SetFontParameterValue(
3339+
for (auto& it : pUserDesignatedMaterialAsDynamic->FontParameterValues) {
3340+
pMaterialForGltfPrimitive->SetFontParameterValue(
33343341
it.ParameterInfo,
33353342
it.FontValue,
33363343
it.FontPage);
@@ -3361,9 +3368,9 @@ static void loadPrimitiveGameThreadPart(
33613368

33623369
PRAGMA_ENABLE_DEPRECATION_WARNINGS
33633370

3364-
pMaterial->TwoSided = true;
3371+
pMaterialForGltfPrimitive->TwoSided = true;
33653372

3366-
pStaticMesh->AddMaterial(pMaterial);
3373+
pStaticMesh->AddMaterial(pMaterialForGltfPrimitive);
33673374

33683375
pStaticMesh->SetLightingGuid();
33693376

0 commit comments

Comments
 (0)