Files
UnrealEngineUWP/Engine/Source/Editor/UnrealEd/Private/Commandlets/WorldPartitionCommandletHelpers.cpp
philippe deseve 8218e80ef1 UDataLayer deprecated in favor of UDataLayerInstance & UDataLayerAsset
UDeprecatedDataLayerInstance allows to boot level using deprecated UDataLayers
Worlds using DataLayer can run the DataLayerToAssetCommandlet to transition their existing DataLayers
FActorDataLayer interface is deprecated.
DataLayers Blueprint referencers should now use DataLayerAsset to retrieve DataLayerInstances.
DataLayer Code referencers should now use DataLayerAssets or DataLayerInstance FName to retrieve DataLayerInstances.
DataLayerLabels now only used for display/UI purpose
Relabeling DataLayers is not permitted anymore on new DataLayerInstances (allowed on UDeprecatedDataLayerInstance)
Added Changelist Validation for DataLayers
Added a column to the datalayer outliner showing any data layer errors.

#rb richard.mal jeanfrancois.dube
#preflight 623098c2050dc69468b6a297 (errors only related to lyra, which do not exist in this stream)

#ROBOMERGE-OWNER: philippe.deseve
#ROBOMERGE-AUTHOR: philippe.deseve
#ROBOMERGE-SOURCE: CL 19385808 via CL 19387392
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v926-19321884)

[CL 19389077 by philippe deseve in ue5-main branch]
2022-03-15 13:52:28 -04:00

181 lines
5.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Commandlets/WorldPartitionCommandletHelpers.h"
#include "Engine/World.h"
#include "HAL/PlatformFileManager.h"
#include "PackageSourceControlHelper.h"
#include "SourceControlHelpers.h"
#include "UObject/SavePackage.h"
namespace WorldPartitionCommandletHelpers
{
DEFINE_LOG_CATEGORY(LogWorldParitionCommandletUtils)
UWorld* LoadAndInitWorld(const FString& LevelToLoad)
{
UWorld* World = LoadWorld(LevelToLoad);
if (World != nullptr)
{
if (InitLevel(World) != nullptr)
{
return World;
}
}
return nullptr;
}
UWorld* LoadWorld(const FString& LevelToLoad)
{
TRACE_CPUPROFILER_EVENT_SCOPE(UWorldPartitionConvertCommandlet::LoadWorld);
SET_WARN_COLOR(COLOR_WHITE);
UE_LOG(LogWorldParitionCommandletUtils, Log, TEXT("Loading level %s."), *LevelToLoad);
CLEAR_WARN_COLOR();
// This will convert incomplete package name to a fully qualified path, avoiding calling it several times (takes ~50s)
FString FullLevelToLoadPath;
if (!FPackageName::SearchForPackageOnDisk(LevelToLoad, &FullLevelToLoadPath))
{
UE_LOG(LogWorldParitionCommandletUtils, Error, TEXT("Unknown level '%s'"), *LevelToLoad);
return nullptr;
}
UPackage* MapPackage = LoadPackage(nullptr, *FullLevelToLoadPath, LOAD_None);
if (!MapPackage)
{
UE_LOG(LogWorldParitionCommandletUtils, Error, TEXT("Error loading %s."), *FullLevelToLoadPath);
return nullptr;
}
return UWorld::FindWorldInPackage(MapPackage);
}
ULevel* InitLevel(UWorld* World)
{
TRACE_CPUPROFILER_EVENT_SCOPE(UWorldPartitionConvertCommandlet::InitWorld);
SET_WARN_COLOR(COLOR_WHITE);
UE_LOG(LogWorldParitionCommandletUtils, Log, TEXT("Initializing level %s."), *World->GetName());
CLEAR_WARN_COLOR();
// Setup the world.
World->WorldType = EWorldType::Editor;
World->AddToRoot();
if (!World->bIsWorldInitialized)
{
UWorld::InitializationValues IVS;
IVS.RequiresHitProxies(false);
IVS.ShouldSimulatePhysics(false);
IVS.EnableTraceCollision(false);
IVS.CreateNavigation(false);
IVS.CreateAISystem(false);
IVS.AllowAudioPlayback(false);
IVS.CreatePhysicsScene(true);
World->InitWorld(IVS);
World->PersistentLevel->UpdateModelComponents();
World->UpdateWorldComponents(true, false);
World->FlushLevelStreaming(EFlushLevelStreamingType::Full);
}
return World->PersistentLevel;
}
bool Checkout(const TArray<UPackage*>& PackagesToCheckout, FPackageSourceControlHelper& SCHelper)
{
TRACE_CPUPROFILER_EVENT_SCOPE(CheckoutPackages);
UE_LOG(LogWorldParitionCommandletUtils, Log, TEXT("Checking out %d Packages."), PackagesToCheckout.Num());
for (UPackage* Package : PackagesToCheckout)
{
if (!Checkout(Package, SCHelper))
{
return false;
}
}
return true;
}
bool Checkout(UPackage* PackagesToCheckout, FPackageSourceControlHelper& SCHelper)
{
UE_LOG(LogWorldParitionCommandletUtils, Verbose, TEXT("Checking out Package %s."), *SourceControlHelpers::PackageFilename(PackagesToCheckout));
FString PackageFileName = SourceControlHelpers::PackageFilename(PackagesToCheckout);
if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*PackageFileName))
{
if (!SCHelper.Checkout(PackagesToCheckout))
{
return false;
}
}
return true;
}
bool Save(const TArray<UPackage*>& PackagesToSave)
{
TRACE_CPUPROFILER_EVENT_SCOPE(SavePackages);
UE_LOG(LogWorldParitionCommandletUtils, Log, TEXT("Saving %d packages."), PackagesToSave.Num());
for (UPackage* PackageToSave : PackagesToSave)
{
if (!Save(PackagesToSave))
{
return false;
}
}
return true;
}
bool Save(UPackage* PackageToSave)
{
FString PackageFileName = SourceControlHelpers::PackageFilename(PackageToSave);
FSavePackageArgs SaveArgs;
SaveArgs.TopLevelFlags = RF_Standalone;
UE_LOG(LogWorldParitionCommandletUtils, Verbose, TEXT("Saving Package %s."), *PackageFileName);
return UPackage::SavePackage(PackageToSave, nullptr, *PackageFileName, SaveArgs);
}
bool AddToSourceControl(const TArray<UPackage*>& PackagesToAdd, FPackageSourceControlHelper& SCHelper)
{
TRACE_CPUPROFILER_EVENT_SCOPE(AddPackagesToSourceControl);
for (UPackage* PackageToAdd : PackagesToAdd)
{
if (!AddToSourceControl(PackageToAdd, SCHelper))
{
return false;
}
}
return true;
}
bool AddToSourceControl(UPackage* PackageToAdd, FPackageSourceControlHelper& SCHelper)
{
UE_LOG(LogWorldParitionCommandletUtils, Verbose, TEXT("Adding Package %s."), *SourceControlHelpers::PackageFilename(PackageToAdd));
return SCHelper.AddToSourceControl(PackageToAdd);
}
bool Delete(const TArray<UPackage*>& PackagesToDelete, FPackageSourceControlHelper& SCHelper)
{
TRACE_CPUPROFILER_EVENT_SCOPE(DeletePackages);
return SCHelper.Delete(PackagesToDelete);
}
bool Delete(UPackage* PackageToDelete, FPackageSourceControlHelper& SCHelper)
{
UE_LOG(LogWorldParitionCommandletUtils, Verbose, TEXT("Deleting Package %s."), *SourceControlHelpers::PackageFilename(PackageToDelete));
return SCHelper.Delete(PackageToDelete);
}
}