@@ -3151,79 +3151,83 @@ static void loadPrimitiveGameThreadPart(
3151
3151
? pGltf->BaseMaterialWithTranslucency
3152
3152
: pGltf->BaseMaterial ;
3153
3153
#else
3154
- UMaterialInterface* pBaseMaterial ;
3154
+ UMaterialInterface* pUserDesignatedMaterial ;
3155
3155
if (loadResult.onlyWater || !loadResult.onlyLand ) {
3156
- pBaseMaterial = pGltf->BaseMaterialWithWater ;
3156
+ pUserDesignatedMaterial = pGltf->BaseMaterialWithWater ;
3157
3157
} 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 ;
3161
3161
}
3162
3162
#endif
3163
3163
3164
- UMaterialInstanceDynamic* pMaterial ;
3164
+ UMaterialInstanceDynamic* pMaterialForGltfPrimitive ;
3165
3165
{
3166
3166
TRACE_CPUPROFILER_EVENT_SCOPE (Cesium::SetupMaterial)
3167
3167
3168
- UMaterialInstanceDynamic* pBaseAsMaterialInstanceDynamic =
3169
- Cast<UMaterialInstanceDynamic>(pBaseMaterial);
3170
- UMaterialInstance* pParentMaterialInstance =
3171
- Cast<UMaterialInstance>(pBaseMaterial);
3168
+ UMaterialInstanceDynamic* pUserDesignatedMaterialAsDynamic =
3169
+ Cast<UMaterialInstanceDynamic>(pUserDesignatedMaterial);
3172
3170
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;
3180
3178
3181
- pMaterial = UMaterialInstanceDynamic::Create (
3182
- pParentMaterialInstance ,
3179
+ pMaterialForGltfPrimitive = UMaterialInstanceDynamic::Create (
3180
+ pBaseMaterial ,
3183
3181
nullptr ,
3184
3182
ImportedSlotName);
3185
3183
3186
- pMaterial ->SetFlags (
3184
+ pMaterialForGltfPrimitive ->SetFlags (
3187
3185
RF_Transient | RF_DuplicateTransient | RF_TextExportTransient);
3188
3186
SetGltfParameterValues (
3189
3187
model,
3190
3188
loadResult,
3191
3189
material,
3192
3190
pbr,
3193
- pMaterial ,
3191
+ pMaterialForGltfPrimitive ,
3194
3192
EMaterialParameterAssociation::GlobalParameter,
3195
3193
INDEX_NONE);
3196
3194
SetWaterParameterValues (
3197
3195
model,
3198
3196
loadResult,
3199
- pMaterial ,
3197
+ pMaterialForGltfPrimitive ,
3200
3198
EMaterialParameterAssociation::GlobalParameter,
3201
3199
INDEX_NONE);
3202
3200
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
+
3203
3207
UCesiumMaterialUserData* pCesiumData =
3204
- pParentMaterialInstance
3205
- ? pParentMaterialInstance
3208
+ pBaseAsMaterialInstance
3209
+ ? pBaseAsMaterialInstance
3206
3210
->GetAssetUserData <UCesiumMaterialUserData>()
3207
3211
: nullptr ;
3208
3212
3209
3213
// If possible and necessary, attach the CesiumMaterialUserData now.
3210
3214
#if WITH_EDITORONLY_DATA
3211
- if (pParentMaterialInstance && !pCesiumData) {
3215
+ if (pBaseAsMaterialInstance && !pCesiumData) {
3212
3216
const FStaticParameterSet& parameters =
3213
- pParentMaterialInstance ->GetStaticParameters ();
3217
+ pBaseAsMaterialInstance ->GetStaticParameters ();
3214
3218
3215
3219
bool hasLayers = parameters.bHasMaterialLayers ;
3216
3220
if (hasLayers) {
3217
3221
#if WITH_EDITOR
3218
3222
FScopedTransaction transaction (
3219
3223
FText::FromString (" Add Cesium User Data to Material" ));
3220
- pParentMaterialInstance ->Modify ();
3224
+ pBaseAsMaterialInstance ->Modify ();
3221
3225
#endif
3222
3226
pCesiumData = NewObject<UCesiumMaterialUserData>(
3223
- pParentMaterialInstance ,
3227
+ pBaseAsMaterialInstance ,
3224
3228
NAME_None,
3225
3229
RF_Transactional);
3226
- pParentMaterialInstance ->AddAssetUserData (pCesiumData);
3230
+ pBaseAsMaterialInstance ->AddAssetUserData (pCesiumData);
3227
3231
pCesiumData->PostEditChangeOwner ();
3228
3232
}
3229
3233
}
@@ -3232,11 +3236,13 @@ static void loadPrimitiveGameThreadPart(
3232
3236
// If CesiumMaterialUserData was not attached (e.g., material was
3233
3237
// dynamically created at runtime), then walk the parent chain of the
3234
3238
// 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
+ }
3240
3246
}
3241
3247
3242
3248
if (pCesiumData) {
@@ -3245,21 +3251,21 @@ static void loadPrimitiveGameThreadPart(
3245
3251
loadResult,
3246
3252
material,
3247
3253
pbr,
3248
- pMaterial ,
3254
+ pMaterialForGltfPrimitive ,
3249
3255
EMaterialParameterAssociation::LayerParameter,
3250
3256
0 );
3251
3257
3252
3258
// Initialize fade uniform to fully visible, in case LOD transitions
3253
3259
// are off.
3254
3260
int fadeLayerIndex = pCesiumData->LayerNames .Find (" DitherFade" );
3255
3261
if (fadeLayerIndex >= 0 ) {
3256
- pMaterial ->SetScalarParameterValueByInfo (
3262
+ pMaterialForGltfPrimitive ->SetScalarParameterValueByInfo (
3257
3263
FMaterialParameterInfo (
3258
3264
" FadePercentage" ,
3259
3265
EMaterialParameterAssociation::LayerParameter,
3260
3266
fadeLayerIndex),
3261
3267
1 .0f );
3262
- pMaterial ->SetScalarParameterValueByInfo (
3268
+ pMaterialForGltfPrimitive ->SetScalarParameterValueByInfo (
3263
3269
FMaterialParameterInfo (
3264
3270
" FadingType" ,
3265
3271
EMaterialParameterAssociation::LayerParameter,
@@ -3273,7 +3279,7 @@ static void loadPrimitiveGameThreadPart(
3273
3279
SetWaterParameterValues (
3274
3280
model,
3275
3281
loadResult,
3276
- pMaterial ,
3282
+ pMaterialForGltfPrimitive ,
3277
3283
EMaterialParameterAssociation::LayerParameter,
3278
3284
waterIndex);
3279
3285
}
@@ -3286,7 +3292,7 @@ static void loadPrimitiveGameThreadPart(
3286
3292
model,
3287
3293
*pGltf,
3288
3294
loadResult,
3289
- pMaterial ,
3295
+ pMaterialForGltfPrimitive ,
3290
3296
EMaterialParameterAssociation::LayerParameter,
3291
3297
featuresMetadataIndex);
3292
3298
} else if (metadataIndex >= 0 ) {
@@ -3295,42 +3301,43 @@ static void loadPrimitiveGameThreadPart(
3295
3301
model,
3296
3302
*pGltf,
3297
3303
loadResult,
3298
- pMaterial ,
3304
+ pMaterialForGltfPrimitive ,
3299
3305
EMaterialParameterAssociation::LayerParameter,
3300
3306
metadataIndex);
3301
3307
}
3302
3308
}
3303
3309
3304
- if (pBaseAsMaterialInstanceDynamic ) {
3310
+ if (pUserDesignatedMaterialAsDynamic ) {
3305
3311
// Ensure any parameters on the original UMaterialInstanceDynamic are
3306
3312
// transferred to the copy.
3307
- for (auto & it : pBaseAsMaterialInstanceDynamic ->ScalarParameterValues ) {
3308
- pMaterial ->SetScalarParameterValueByInfo (
3313
+ for (auto & it : pUserDesignatedMaterialAsDynamic ->ScalarParameterValues ) {
3314
+ pMaterialForGltfPrimitive ->SetScalarParameterValueByInfo (
3309
3315
it.ParameterInfo ,
3310
3316
it.ParameterValue );
3311
3317
}
3312
3318
3313
- for (auto & it : pBaseAsMaterialInstanceDynamic ->VectorParameterValues ) {
3314
- pMaterial ->SetVectorParameterValueByInfo (
3319
+ for (auto & it : pUserDesignatedMaterialAsDynamic ->VectorParameterValues ) {
3320
+ pMaterialForGltfPrimitive ->SetVectorParameterValueByInfo (
3315
3321
it.ParameterInfo ,
3316
3322
it.ParameterValue );
3317
3323
}
3318
3324
3319
3325
for (auto & it :
3320
- pBaseAsMaterialInstanceDynamic ->DoubleVectorParameterValues ) {
3321
- pMaterial ->SetVectorParameterValueByInfo (
3326
+ pUserDesignatedMaterialAsDynamic ->DoubleVectorParameterValues ) {
3327
+ pMaterialForGltfPrimitive ->SetVectorParameterValueByInfo (
3322
3328
it.ParameterInfo ,
3323
3329
it.ParameterValue );
3324
3330
}
3325
3331
3326
- for (auto & it : pBaseAsMaterialInstanceDynamic->TextureParameterValues ) {
3327
- pMaterial->SetTextureParameterValueByInfo (
3332
+ for (auto & it :
3333
+ pUserDesignatedMaterialAsDynamic->TextureParameterValues ) {
3334
+ pMaterialForGltfPrimitive->SetTextureParameterValueByInfo (
3328
3335
it.ParameterInfo ,
3329
3336
it.ParameterValue );
3330
3337
}
3331
3338
3332
- for (auto & it : pBaseAsMaterialInstanceDynamic ->FontParameterValues ) {
3333
- pMaterial ->SetFontParameterValue (
3339
+ for (auto & it : pUserDesignatedMaterialAsDynamic ->FontParameterValues ) {
3340
+ pMaterialForGltfPrimitive ->SetFontParameterValue (
3334
3341
it.ParameterInfo ,
3335
3342
it.FontValue ,
3336
3343
it.FontPage );
@@ -3361,9 +3368,9 @@ static void loadPrimitiveGameThreadPart(
3361
3368
3362
3369
PRAGMA_ENABLE_DEPRECATION_WARNINGS
3363
3370
3364
- pMaterial ->TwoSided = true ;
3371
+ pMaterialForGltfPrimitive ->TwoSided = true ;
3365
3372
3366
- pStaticMesh->AddMaterial (pMaterial );
3373
+ pStaticMesh->AddMaterial (pMaterialForGltfPrimitive );
3367
3374
3368
3375
pStaticMesh->SetLightingGuid ();
3369
3376
0 commit comments