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