Skip to content

Commit ed38004

Browse files
authored
Merge pull request #1687 from CesiumGS/non-instance-materials
Support Materials, not just MaterialInstances, and fix normal flip when computing tangents
2 parents c673662 + 3e17502 commit ed38004

File tree

1 file changed

+64
-56
lines changed

1 file changed

+64
-56
lines changed

Source/CesiumRuntime/Private/CesiumGltfComponent.cpp

Lines changed: 64 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)