@@ -643,6 +643,7 @@ static void mikkSetTSpaceBasic(
643643
644644 TangentX.Y = -TangentX.Y ;
645645 TangentY.Y = -TangentY.Y ;
646+ TangentZ.Y = -TangentZ.Y ;
646647
647648 vertexBuffer.SetVertexTangents (vertexIndex, TangentX, TangentY, TangentZ);
648649}
@@ -3147,83 +3148,87 @@ static void loadPrimitiveGameThreadPart(
31473148
31483149#if PLATFORM_MAC
31493150 // TODO: figure out why water material crashes mac
3150- UMaterialInterface* pBaseMaterial = is_in_blend_mode (loadResult)
3151- ? pGltf->BaseMaterialWithTranslucency
3152- : pGltf->BaseMaterial ;
3151+ UMaterialInterface* pUserDesignatedMaterial =
3152+ is_in_blend_mode (loadResult) ? pGltf->BaseMaterialWithTranslucency
3153+ : pGltf->BaseMaterial ;
31533154#else
3154- UMaterialInterface* pBaseMaterial ;
3155+ UMaterialInterface* pUserDesignatedMaterial ;
31553156 if (loadResult.onlyWater || !loadResult.onlyLand ) {
3156- pBaseMaterial = pGltf->BaseMaterialWithWater ;
3157+ pUserDesignatedMaterial = pGltf->BaseMaterialWithWater ;
31573158 } else {
3158- pBaseMaterial = is_in_blend_mode (loadResult)
3159- ? pGltf->BaseMaterialWithTranslucency
3160- : pGltf->BaseMaterial ;
3159+ pUserDesignatedMaterial = is_in_blend_mode (loadResult)
3160+ ? pGltf->BaseMaterialWithTranslucency
3161+ : pGltf->BaseMaterial ;
31613162 }
31623163#endif
31633164
3164- UMaterialInstanceDynamic* pMaterial ;
3165+ UMaterialInstanceDynamic* pMaterialForGltfPrimitive ;
31653166 {
31663167 TRACE_CPUPROFILER_EVENT_SCOPE (Cesium::SetupMaterial)
31673168
3168- UMaterialInstanceDynamic* pBaseAsMaterialInstanceDynamic =
3169- Cast<UMaterialInstanceDynamic>(pBaseMaterial);
3170- UMaterialInstance* pParentMaterialInstance =
3171- Cast<UMaterialInstance>(pBaseMaterial);
3169+ UMaterialInstanceDynamic* pUserDesignatedMaterialAsDynamic =
3170+ Cast<UMaterialInstanceDynamic>(pUserDesignatedMaterial);
31723171
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- }
3172+ // If the user-designated material is a UMaterialInstanceDynamic, Create()
3173+ // will reject it as a valid instance parent. Defer to its non-dynamic
3174+ // parent instead.
3175+ UMaterialInterface* pBaseMaterial =
3176+ pUserDesignatedMaterialAsDynamic
3177+ ? pUserDesignatedMaterialAsDynamic ->Parent .Get ()
3178+ : pUserDesignatedMaterial;
31803179
3181- pMaterial = UMaterialInstanceDynamic::Create (
3182- pParentMaterialInstance ,
3180+ pMaterialForGltfPrimitive = UMaterialInstanceDynamic::Create (
3181+ pBaseMaterial ,
31833182 nullptr ,
31843183 ImportedSlotName);
31853184
3186- pMaterial ->SetFlags (
3185+ pMaterialForGltfPrimitive ->SetFlags (
31873186 RF_Transient | RF_DuplicateTransient | RF_TextExportTransient);
31883187 SetGltfParameterValues (
31893188 model,
31903189 loadResult,
31913190 material,
31923191 pbr,
3193- pMaterial ,
3192+ pMaterialForGltfPrimitive ,
31943193 EMaterialParameterAssociation::GlobalParameter,
31953194 INDEX_NONE);
31963195 SetWaterParameterValues (
31973196 model,
31983197 loadResult,
3199- pMaterial ,
3198+ pMaterialForGltfPrimitive ,
32003199 EMaterialParameterAssociation::GlobalParameter,
32013200 INDEX_NONE);
32023201
3202+ // The base material might be a Material, or it might be a MaterialInstance.
3203+ // Only MaterialInstances can use the material layer system, so only
3204+ // MaterialInstances will have UCesiumMaterialUserData.
3205+ UMaterialInstance* pBaseAsMaterialInstance =
3206+ Cast<UMaterialInstance>(pBaseMaterial);
3207+
32033208 UCesiumMaterialUserData* pCesiumData =
3204- pParentMaterialInstance
3205- ? pParentMaterialInstance
3209+ pBaseAsMaterialInstance
3210+ ? pBaseAsMaterialInstance
32063211 ->GetAssetUserData <UCesiumMaterialUserData>()
32073212 : nullptr ;
32083213
32093214 // If possible and necessary, attach the CesiumMaterialUserData now.
32103215#if WITH_EDITORONLY_DATA
3211- if (pParentMaterialInstance && !pCesiumData) {
3216+ if (pBaseAsMaterialInstance && !pCesiumData) {
32123217 const FStaticParameterSet& parameters =
3213- pParentMaterialInstance ->GetStaticParameters ();
3218+ pBaseAsMaterialInstance ->GetStaticParameters ();
32143219
32153220 bool hasLayers = parameters.bHasMaterialLayers ;
32163221 if (hasLayers) {
32173222#if WITH_EDITOR
32183223 FScopedTransaction transaction (
32193224 FText::FromString (" Add Cesium User Data to Material" ));
3220- pParentMaterialInstance ->Modify ();
3225+ pBaseAsMaterialInstance ->Modify ();
32213226#endif
32223227 pCesiumData = NewObject<UCesiumMaterialUserData>(
3223- pParentMaterialInstance ,
3228+ pBaseAsMaterialInstance ,
32243229 NAME_None,
32253230 RF_Transactional);
3226- pParentMaterialInstance ->AddAssetUserData (pCesiumData);
3231+ pBaseAsMaterialInstance ->AddAssetUserData (pCesiumData);
32273232 pCesiumData->PostEditChangeOwner ();
32283233 }
32293234 }
@@ -3232,11 +3237,13 @@ static void loadPrimitiveGameThreadPart(
32323237 // If CesiumMaterialUserData was not attached (e.g., material was
32333238 // dynamically created at runtime), then walk the parent chain of the
32343239 // material to find it.
3235- while (pParentMaterialInstance && !pCesiumData) {
3236- pParentMaterialInstance =
3237- Cast<UMaterialInstance>(pParentMaterialInstance->Parent .Get ());
3238- pCesiumData =
3239- pParentMaterialInstance->GetAssetUserData <UCesiumMaterialUserData>();
3240+ while (pBaseAsMaterialInstance && !pCesiumData) {
3241+ pBaseAsMaterialInstance =
3242+ Cast<UMaterialInstance>(pBaseAsMaterialInstance->Parent .Get ());
3243+ if (pBaseAsMaterialInstance) {
3244+ pCesiumData = pBaseAsMaterialInstance
3245+ ->GetAssetUserData <UCesiumMaterialUserData>();
3246+ }
32403247 }
32413248
32423249 if (pCesiumData) {
@@ -3245,21 +3252,21 @@ static void loadPrimitiveGameThreadPart(
32453252 loadResult,
32463253 material,
32473254 pbr,
3248- pMaterial ,
3255+ pMaterialForGltfPrimitive ,
32493256 EMaterialParameterAssociation::LayerParameter,
32503257 0 );
32513258
32523259 // Initialize fade uniform to fully visible, in case LOD transitions
32533260 // are off.
32543261 int fadeLayerIndex = pCesiumData->LayerNames .Find (" DitherFade" );
32553262 if (fadeLayerIndex >= 0 ) {
3256- pMaterial ->SetScalarParameterValueByInfo (
3263+ pMaterialForGltfPrimitive ->SetScalarParameterValueByInfo (
32573264 FMaterialParameterInfo (
32583265 " FadePercentage" ,
32593266 EMaterialParameterAssociation::LayerParameter,
32603267 fadeLayerIndex),
32613268 1 .0f );
3262- pMaterial ->SetScalarParameterValueByInfo (
3269+ pMaterialForGltfPrimitive ->SetScalarParameterValueByInfo (
32633270 FMaterialParameterInfo (
32643271 " FadingType" ,
32653272 EMaterialParameterAssociation::LayerParameter,
@@ -3273,7 +3280,7 @@ static void loadPrimitiveGameThreadPart(
32733280 SetWaterParameterValues (
32743281 model,
32753282 loadResult,
3276- pMaterial ,
3283+ pMaterialForGltfPrimitive ,
32773284 EMaterialParameterAssociation::LayerParameter,
32783285 waterIndex);
32793286 }
@@ -3286,7 +3293,7 @@ static void loadPrimitiveGameThreadPart(
32863293 model,
32873294 *pGltf,
32883295 loadResult,
3289- pMaterial ,
3296+ pMaterialForGltfPrimitive ,
32903297 EMaterialParameterAssociation::LayerParameter,
32913298 featuresMetadataIndex);
32923299 } else if (metadataIndex >= 0 ) {
@@ -3295,42 +3302,43 @@ static void loadPrimitiveGameThreadPart(
32953302 model,
32963303 *pGltf,
32973304 loadResult,
3298- pMaterial ,
3305+ pMaterialForGltfPrimitive ,
32993306 EMaterialParameterAssociation::LayerParameter,
33003307 metadataIndex);
33013308 }
33023309 }
33033310
3304- if (pBaseAsMaterialInstanceDynamic ) {
3311+ if (pUserDesignatedMaterialAsDynamic ) {
33053312 // Ensure any parameters on the original UMaterialInstanceDynamic are
33063313 // transferred to the copy.
3307- for (auto & it : pBaseAsMaterialInstanceDynamic ->ScalarParameterValues ) {
3308- pMaterial ->SetScalarParameterValueByInfo (
3314+ for (auto & it : pUserDesignatedMaterialAsDynamic ->ScalarParameterValues ) {
3315+ pMaterialForGltfPrimitive ->SetScalarParameterValueByInfo (
33093316 it.ParameterInfo ,
33103317 it.ParameterValue );
33113318 }
33123319
3313- for (auto & it : pBaseAsMaterialInstanceDynamic ->VectorParameterValues ) {
3314- pMaterial ->SetVectorParameterValueByInfo (
3320+ for (auto & it : pUserDesignatedMaterialAsDynamic ->VectorParameterValues ) {
3321+ pMaterialForGltfPrimitive ->SetVectorParameterValueByInfo (
33153322 it.ParameterInfo ,
33163323 it.ParameterValue );
33173324 }
33183325
33193326 for (auto & it :
3320- pBaseAsMaterialInstanceDynamic ->DoubleVectorParameterValues ) {
3321- pMaterial ->SetVectorParameterValueByInfo (
3327+ pUserDesignatedMaterialAsDynamic ->DoubleVectorParameterValues ) {
3328+ pMaterialForGltfPrimitive ->SetVectorParameterValueByInfo (
33223329 it.ParameterInfo ,
33233330 it.ParameterValue );
33243331 }
33253332
3326- for (auto & it : pBaseAsMaterialInstanceDynamic->TextureParameterValues ) {
3327- pMaterial->SetTextureParameterValueByInfo (
3333+ for (auto & it :
3334+ pUserDesignatedMaterialAsDynamic->TextureParameterValues ) {
3335+ pMaterialForGltfPrimitive->SetTextureParameterValueByInfo (
33283336 it.ParameterInfo ,
33293337 it.ParameterValue );
33303338 }
33313339
3332- for (auto & it : pBaseAsMaterialInstanceDynamic ->FontParameterValues ) {
3333- pMaterial ->SetFontParameterValue (
3340+ for (auto & it : pUserDesignatedMaterialAsDynamic ->FontParameterValues ) {
3341+ pMaterialForGltfPrimitive ->SetFontParameterValue (
33343342 it.ParameterInfo ,
33353343 it.FontValue ,
33363344 it.FontPage );
@@ -3361,9 +3369,9 @@ static void loadPrimitiveGameThreadPart(
33613369
33623370 PRAGMA_ENABLE_DEPRECATION_WARNINGS
33633371
3364- pMaterial ->TwoSided = true ;
3372+ pMaterialForGltfPrimitive ->TwoSided = true ;
33653373
3366- pStaticMesh->AddMaterial (pMaterial );
3374+ pStaticMesh->AddMaterial (pMaterialForGltfPrimitive );
33673375
33683376 pStaticMesh->SetLightingGuid ();
33693377
0 commit comments