Files
UnrealEngineUWP/Engine/Source/Editor/UnrealEd/Private/EditorWorldUtils.cpp
sebastien lussier 4908a65c53 FScopedEditorWorld - Check if package is null to prevent an assert in UWorld::FindWorldInPackage()
#rb patrick.enfedaque, jeanfrancois.dube

#ROBOMERGE-AUTHOR: sebastien.lussier
#ROBOMERGE-SOURCE: CL 18675446 via CL 18675453 via CL 18675468 via CL 18675741 via CL 18675875 via CL 18675946
#ROBOMERGE-BOT: UE5 (Release-Engine-Test -> Main) (v902-18672795)

[CL 18679797 by sebastien lussier in ue5-main branch]
2022-01-20 15:27:20 -05:00

89 lines
2.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "EditorWorldUtils.h"
#include "Editor.h"
FScopedEditorWorld::FScopedEditorWorld()
: World(nullptr)
, PrevGWorld(nullptr)
{
}
FScopedEditorWorld::FScopedEditorWorld(UWorld* InWorld, const UWorld::InitializationValues& InInitializationValues)
: FScopedEditorWorld()
{
Init(InWorld, InInitializationValues);
}
FScopedEditorWorld::FScopedEditorWorld(const FStringView InLongPackageName, const UWorld::InitializationValues& InInitializationValues)
: FScopedEditorWorld()
{
if (UPackage* WorldPackage = LoadWorldPackageForEditor(InLongPackageName))
{
if (UWorld* RuntimeWorld = UWorld::FindWorldInPackage(WorldPackage))
{
Init(RuntimeWorld, InInitializationValues);
}
}
}
FScopedEditorWorld::FScopedEditorWorld(const TSoftObjectPtr<UWorld>& InSoftWorld, const UWorld::InitializationValues& InInitializationValues)
: FScopedEditorWorld(InSoftWorld.ToSoftObjectPath().GetLongPackageName(), InInitializationValues)
{
}
void FScopedEditorWorld::Init(UWorld* InWorld, const UWorld::InitializationValues& InInitializationValues)
{
check(InWorld);
check(!InWorld->bIsWorldInitialized);
World = InWorld;
// Add to root
World->AddToRoot();
// Set current GWorld / WorldContext
FWorldContext& WorldContext = GEditor->GetEditorWorldContext(true);
WorldContext.SetCurrentWorld(World);
PrevGWorld = GWorld;
GWorld = World;
// Initialize the world
World->WorldType = EWorldType::Editor;
World->InitWorld(InInitializationValues);
World->PersistentLevel->UpdateModelComponents();
World->UpdateWorldComponents(true /*bRerunConstructionScripts*/, false /*bCurrentLevelOnly*/);
World->UpdateLevelStreaming();
}
UWorld* FScopedEditorWorld::GetWorld() const
{
return World;
}
FScopedEditorWorld::~FScopedEditorWorld()
{
if (World)
{
// Destroy world
World->DestroyWorld(false /*bBroadcastWorldDestroyedEvent*/);
// Unroot world
World->RemoveFromRoot();
// Restore previous GWorld / WorldContext
FWorldContext& WorldContext = GEditor->GetEditorWorldContext(true);
WorldContext.SetCurrentWorld(PrevGWorld);
GWorld = PrevGWorld;
}
}
UPackage* LoadWorldPackageForEditor(const FStringView InLongPackageName, EWorldType::Type InWorldType, uint32 InLoadFlags)
{
FName WorldPackageFName(InLongPackageName);
UWorld::WorldTypePreLoadMap.FindOrAdd(WorldPackageFName) = InWorldType;
UPackage* WorldPackage = LoadPackage(nullptr, InLongPackageName.GetData(), InLoadFlags);
UWorld::WorldTypePreLoadMap.Remove(WorldPackageFName);
return WorldPackage;
}