@@ -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
0 commit comments