2021-10-12 21:21:22 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "EditorWorldUtils.h"
|
|
|
|
|
#include "Editor.h"
|
|
|
|
|
|
2021-11-07 23:43:01 -05:00
|
|
|
FScopedEditorWorld::FScopedEditorWorld()
|
|
|
|
|
: World(nullptr)
|
|
|
|
|
, PrevGWorld(nullptr)
|
|
|
|
|
{
|
|
|
|
|
}
|
2021-10-12 21:21:22 -04:00
|
|
|
|
|
|
|
|
FScopedEditorWorld::FScopedEditorWorld(UWorld* InWorld, const UWorld::InitializationValues& InInitializationValues)
|
2021-11-07 23:43:01 -05:00
|
|
|
: FScopedEditorWorld()
|
|
|
|
|
{
|
|
|
|
|
Init(InWorld, InInitializationValues);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FScopedEditorWorld::FScopedEditorWorld(const FStringView InLongPackageName, const UWorld::InitializationValues& InInitializationValues)
|
|
|
|
|
: FScopedEditorWorld()
|
|
|
|
|
{
|
2022-01-20 15:27:20 -05:00
|
|
|
if (UPackage* WorldPackage = LoadWorldPackageForEditor(InLongPackageName))
|
2021-11-07 23:43:01 -05:00
|
|
|
{
|
2022-01-20 15:27:20 -05:00
|
|
|
if (UWorld* RuntimeWorld = UWorld::FindWorldInPackage(WorldPackage))
|
|
|
|
|
{
|
|
|
|
|
Init(RuntimeWorld, InInitializationValues);
|
|
|
|
|
}
|
2021-11-07 23:43:01 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FScopedEditorWorld::FScopedEditorWorld(const TSoftObjectPtr<UWorld>& InSoftWorld, const UWorld::InitializationValues& InInitializationValues)
|
|
|
|
|
: FScopedEditorWorld(InSoftWorld.ToSoftObjectPath().GetLongPackageName(), InInitializationValues)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FScopedEditorWorld::Init(UWorld* InWorld, const UWorld::InitializationValues& InInitializationValues)
|
2021-10-12 21:21:22 -04:00
|
|
|
{
|
|
|
|
|
check(InWorld);
|
2021-11-07 23:43:01 -05:00
|
|
|
check(!InWorld->bIsWorldInitialized);
|
2021-10-12 21:21:22 -04:00
|
|
|
|
2021-11-07 23:43:01 -05:00
|
|
|
World = InWorld;
|
2021-10-12 21:21:22 -04:00
|
|
|
|
2021-11-07 23:43:01 -05:00
|
|
|
// Add to root
|
|
|
|
|
World->AddToRoot();
|
2021-10-12 21:21:22 -04:00
|
|
|
|
2021-11-07 23:43:01 -05:00
|
|
|
// Set current GWorld / WorldContext
|
2021-10-12 21:21:22 -04:00
|
|
|
FWorldContext& WorldContext = GEditor->GetEditorWorldContext(true);
|
|
|
|
|
WorldContext.SetCurrentWorld(World);
|
|
|
|
|
PrevGWorld = GWorld;
|
|
|
|
|
GWorld = World;
|
2021-11-07 23:43:01 -05:00
|
|
|
|
|
|
|
|
// 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;
|
2021-10-12 21:21:22 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FScopedEditorWorld::~FScopedEditorWorld()
|
|
|
|
|
{
|
2021-11-07 23:43:01 -05:00
|
|
|
if (World)
|
2021-10-12 21:21:22 -04:00
|
|
|
{
|
2021-11-07 23:43:01 -05:00
|
|
|
// Destroy world
|
2021-10-12 21:21:22 -04:00
|
|
|
World->DestroyWorld(false /*bBroadcastWorldDestroyedEvent*/);
|
2021-11-07 23:43:01 -05:00
|
|
|
|
2021-10-12 21:21:22 -04:00
|
|
|
// Unroot world
|
|
|
|
|
World->RemoveFromRoot();
|
|
|
|
|
|
2021-11-07 23:43:01 -05:00
|
|
|
// Restore previous GWorld / WorldContext
|
|
|
|
|
FWorldContext& WorldContext = GEditor->GetEditorWorldContext(true);
|
|
|
|
|
WorldContext.SetCurrentWorld(PrevGWorld);
|
|
|
|
|
GWorld = PrevGWorld;
|
|
|
|
|
}
|
2021-10-12 21:21:22 -04:00
|
|
|
}
|
2021-11-07 23:43:01 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|