void FBatchLODToolModule::SortMesh(TArray<UStaticMesh*>& InOutStaticMeshArray, TArray<USkeletalMesh*>& InOutSkeletalMeshArray)
{
FContentBrowserModule& AssetContextModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
AssetContextModule.Get().GetSelectedAssets(AssetData);
FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
for (int32 i = 0; i < AssetData.Num(); i++)
{
UStaticMesh* StaticMesh = Cast<UStaticMesh>(AssetData[i].ToSoftObjectPath().TryLoad());
if(StaticMesh != nullptr)
InOutStaticMeshArray.Add(StaticMesh);
USkeletalMesh* SkeletalStaticMesh = Cast<USkeletalMesh>(AssetData[i].ToSoftObjectPath().TryLoad());
if(SkeletalStaticMesh != nullptr)
InOutSkeletalMeshArray.Add(SkeletalStaticMesh);
}
}
void FBatchLODToolModule::ApplyChangeLODSetting(TArray<FLODSetting>& LodSetting)
{
//UBatchLODSetting* Settings = GetMutableDefault<UBatchLODSetting>();
AssetData.Empty();
TArray<UStaticMesh*> StaticMeshArray;
StaticMeshArray.Empty();
TArray<USkeletalMesh*> SkeletalMeshArray;
SkeletalMeshArray.Empty();
SortMesh(StaticMeshArray, SkeletalMeshArray);
int32 LODCount = LodSetting.Num();
UStaticMesh* StaticMesh = nullptr;
for (int32 i = 0; i < StaticMeshArray.Num(); i++)
{
/*
StaticMesh = StaticMeshArray[i];
StaticMesh->Modify();
TArray<FStaticMeshSourceModel>& SourceModels = StaticMesh->GetSourceModels();
if (SourceModels.Num() > LODCount)
{
int32 NumToRemove = SourceModels.Num() - LODCount;
SourceModels.RemoveAt(LODCount, NumToRemove);
}
while (SourceModels.Num() < LODCount)
{
new(SourceModels) FStaticMeshSourceModel();
}
check(SourceModels.Num() == LODCount);
*/
StaticMesh = StaticMeshArray[i];
TArray<FStaticMeshSourceModel>& SourceModels = StaticMesh->GetSourceModels();
if(SourceModels.Num() != LODCount)
{
FString strMsg = StaticMesh->GetPathName() + FString(TEXT("LODS Setting Error。"));
FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(strMsg));
return;
}
for (int32 LODIndex = 0; LODIndex < LODCount; ++LODIndex)
{
FStaticMeshSourceModel& SrcModel = SourceModels[LODIndex];
if(LodSetting[LODIndex].PercentTriangles > 0.0f)
SrcModel.ReductionSettings.PercentTriangles = LodSetting[LODIndex].PercentTriangles;
SrcModel.ReductionSettings.TextureImportance = LodSetting[LODIndex].TextureImportance;
SrcModel.ReductionSettings.ShadingImportance = LodSetting[LODIndex].ShadingImportance;
StaticMesh->bAutoComputeLODScreenSize = false;
SrcModel.ScreenSize = LodSetting[LODIndex].ScreenSize;
//StaticMeshEditorTools.cpp 3320
}
StaticMesh->PostEditChange();
}
USkeletalMesh* SkeletalMesh = nullptr;
for (int32 i = 0; i < SkeletalMeshArray.Num(); i++)
{
SkeletalMesh = SkeletalMeshArray[i];
TArray<struct FSkeletalMeshLODInfo>& MeshLodInfos = SkeletalMesh->GetLODInfoArray();
if(MeshLodInfos.Num() != LODCount)
{
FString strMsg = SkeletalMesh->GetPathName() + FString(TEXT("LODS Setting Error。"));
FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(strMsg));
return;
}
if(MeshLodInfos.Num() <= 1)
{
continue;
}
for (int32 LODIndex = 1; LODIndex < LODCount; ++LODIndex)
{
MeshLodInfos[LODIndex].ReductionSettings.NumOfTrianglesPercentage = LodSetting[LODIndex].PercentTriangles;
MeshLodInfos[LODIndex].ScreenSize = LodSetting[LODIndex].ScreenSize;
}
SkeletalMesh->MarkPackageDirty();
SkeletalMesh->PostEditChange();
}