Hi,
I have few issues with this change:
https://github.com/EpicGames/UnrealEngine/commit/fa1a7542ca2168b5f9b41b297544f677a6860a8d
int32 USkinnedMeshComponent::GetNumMaterials() const
{
- return SkeletalMesh ? SkeletalMesh->Materials.Num() : 0;
+ if (Materials.Num() > 0)
+ {
+ return Materials.Num();
+ }
+ else if (SkeletalMesh)
+ {
+ return SkeletalMesh->Materials.Num();
+ }
+
+ return 0;
In pre 4.6 i could do something like this:
HeadMaterialInstances.AddUninitialized(Head->GetNumMaterials());
for (int32 matIdx = 0; matIdx < Head->GetNumMaterials(); matIdx++)
{
HeadMaterialInstances[matIdx] = Head->CreateAndSetMaterialInstanceDynamic(matIdx);
if (HeadMaterialInstances[matIdx])
{
HeadMaterialInstances[matIdx]->SetScalarParameterValue(Color1Name, Color1Value);
HeadMaterialInstances[matIdx]->SetScalarParameterValue(Color2Name, Color2Value);
}
}
For mesh containing 3 materials Head->GetNumMaterials() always returns 3, but in 4.6 after first loop iteration
Head->GetNumMaterials() is returning 1.
Because of this:
+ if (Materials.Num() > 0)
+ {
+ return Materials.Num();
+ }
Fine I can remember number of materials before loop and use this counter.
int32 NumMaterials = Head->GetNumMaterials();
if (NumMaterials > 0)
{
HeadMaterialInstances.AddUninitialized(NumMaterials);
for (int32 matIdx = 0; matIdx < NumMaterials; matIdx++)
{
HeadMaterialInstances[matIdx] = Head->CreateAndSetMaterialInstanceDynamic(matIdx);
if (HeadMaterialInstances[matIdx])
{
HeadMaterialInstances[matIdx]->SetScalarParameterValue(Color1Name, Color1Value);
HeadMaterialInstances[matIdx]->SetScalarParameterValue(Color2Name, Color2Value);
}
}
}
Another issue is with meshes placed on map with replaced materials.
If in pre 4.6 someone changeg material on object placed on level everything was fine. But now in 4.6 when I;m trying to change material on the same object, the engine will crash in
AssetSelection.cpp at this assert
check(OptionalMaterialSlot < MaterialCount);
Because faulty working GetNumMaterials() which should return 3 but it is returning 1,
the OptionalMaterialSlot = 1…
When I commented out
if (Materials.Num() > 0)
{
return Materials.Num();
}
In USkinnedMeshComponent::GetNumMaterials() everything seems to be alright.
What do you guys think about it?
Best regards
Pierdek