// Copyright IHY. Vertical Partition Streaming plugin (editor module). #include "VerticalPartitionCommandlet.h" #include "VerticalPartitionBuilder.h" #include "VerticalPartitionVolume.h" #include "VerticalPartitionLog.h" #include "EngineUtils.h" #include "Engine/World.h" #include "FileHelpers.h" #include "Misc/PackageName.h" #include "UObject/Package.h" UVerticalPartitionCommandlet::UVerticalPartitionCommandlet() { IsClient = false; IsServer = false; IsEditor = true; LogToConsole = true; } int32 UVerticalPartitionCommandlet::Main(const FString& Params) { FString MapPath; if (!FParse::Value(*Params, TEXT("Map="), MapPath) || MapPath.IsEmpty()) { UE_LOG(LogVerticalPartition, Error, TEXT("[VP] Commandlet requires -Map=/Game/Maps/MyMap")); return 1; } UE_LOG(LogVerticalPartition, Log, TEXT("[VP] Commandlet loading map %s ..."), *MapPath); UWorld* World = UEditorLoadingAndSavingUtils::LoadMap(MapPath); if (!World) { UE_LOG(LogVerticalPartition, Error, TEXT("[VP] Failed to load map %s"), *MapPath); return 1; } AVerticalPartitionVolume* Volume = nullptr; for (TActorIterator It(World); It; ++It) { Volume = *It; break; } if (!Volume) { UE_LOG(LogVerticalPartition, Error, TEXT("[VP] No AVerticalPartitionVolume in %s"), *MapPath); return 1; } FVerticalPartitionBuildReport Report; const bool bOk = UVerticalPartitionBuilder::Build(Volume, Report); UVerticalPartitionBuilder::DumpReport(Report, FPackageName::GetShortName(MapPath)); if (bOk) { TArray ToSave; ToSave.Add(World->GetOutermost()); FEditorFileUtils::PromptForCheckoutAndSave(ToSave, /*bCheckDirty*/false, /*bPromptToSave*/false); UE_LOG(LogVerticalPartition, Log, TEXT("[VP] Commandlet build OK: %d cells."), Report.GeneratedCells); } return bOk ? 0 : 1; }