ue4 Batch Modify Mesh Lods

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();
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值