@@ -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