2014-12-07 19:09:38 -05:00
|
|
|
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
2014-03-14 14:13:41 -04:00
|
|
|
#include "WorldBrowserPrivatePCH.h"
|
|
|
|
|
|
Remove more headers from Engine.h (StaticMeshResources.h, AnimTree.h, SkeletalMeshTypes.h, SkeletalMeshActor.h, LightingBuildOptions.h, PixelFormat.h, WorldComposition.h, VisualLog.h, StaticLighting.h, Lightmap.h, ShadowMap.h, Model.h)
[CL 2086772 by James Golding in Main branch]
2014-05-29 17:21:47 -04:00
|
|
|
#include "Engine/WorldComposition.h"
|
2014-03-14 14:13:41 -04:00
|
|
|
#include "ModuleManager.h"
|
|
|
|
|
#include "StreamingLevels/StreamingLevelEdMode.h"
|
2014-05-14 02:16:14 -04:00
|
|
|
#include "Tiles/WorldTileCollectionModel.h"
|
|
|
|
|
#include "StreamingLevels/StreamingLevelCollectionModel.h"
|
|
|
|
|
#include "SWorldHierarchy.h"
|
|
|
|
|
#include "SWorldDetails.h"
|
|
|
|
|
#include "Tiles/SWorldComposition.h"
|
2014-04-23 20:18:55 -04:00
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
IMPLEMENT_MODULE( FWorldBrowserModule, WorldBrowser );
|
|
|
|
|
|
2014-05-14 02:16:14 -04:00
|
|
|
#define LOCTEXT_NAMESPACE "WorldBrowser"
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
void FWorldBrowserModule::StartupModule()
|
|
|
|
|
{
|
|
|
|
|
FLevelCollectionCommands::Register();
|
|
|
|
|
|
|
|
|
|
// register the editor mode
|
2014-06-18 10:16:16 -04:00
|
|
|
FEditorModeRegistry::Get().RegisterMode<FStreamingLevelEdMode>(
|
|
|
|
|
FBuiltinEditorModes::EM_StreamingLevel,
|
|
|
|
|
NSLOCTEXT("WorldBrowser", "StreamingLevelMode", "Level Transform Editing"));
|
2014-05-14 02:16:14 -04:00
|
|
|
|
2014-08-21 20:30:51 -04:00
|
|
|
if (ensure(GEngine))
|
|
|
|
|
{
|
|
|
|
|
GEngine->OnWorldAdded().AddRaw(this, &FWorldBrowserModule::OnWorldCreated);
|
|
|
|
|
GEngine->OnWorldDestroyed().AddRaw(this, &FWorldBrowserModule::OnWorldDestroyed);
|
|
|
|
|
}
|
2015-01-15 05:25:45 -05:00
|
|
|
|
2015-01-18 23:08:42 -05:00
|
|
|
UWorldComposition::WorldCompositionChangedEvent.AddRaw(this, &FWorldBrowserModule::OnWorldCompositionChanged);
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FWorldBrowserModule::ShutdownModule()
|
|
|
|
|
{
|
2014-08-21 20:30:51 -04:00
|
|
|
if (GEngine)
|
|
|
|
|
{
|
|
|
|
|
GEngine->OnWorldAdded().RemoveAll(this);
|
|
|
|
|
GEngine->OnWorldDestroyed().RemoveAll(this);
|
|
|
|
|
}
|
2014-05-14 02:16:14 -04:00
|
|
|
|
2015-01-18 23:08:42 -05:00
|
|
|
UWorldComposition::WorldCompositionChangedEvent.RemoveAll(this);
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
FLevelCollectionCommands::Unregister();
|
|
|
|
|
|
|
|
|
|
// unregister the editor mode
|
2014-06-18 10:16:16 -04:00
|
|
|
FEditorModeRegistry::Get().UnregisterMode(FBuiltinEditorModes::EM_StreamingLevel);
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2014-05-14 02:16:14 -04:00
|
|
|
TSharedRef<SWidget> FWorldBrowserModule::CreateWorldBrowserHierarchy()
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-05-14 02:16:14 -04:00
|
|
|
UWorld* EditorWorld = GEditor->GetEditorWorldContext().World();
|
|
|
|
|
return SNew(SWorldHierarchy).InWorld(EditorWorld);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSharedRef<SWidget> FWorldBrowserModule::CreateWorldBrowserDetails()
|
|
|
|
|
{
|
|
|
|
|
UWorld* EditorWorld = GEditor->GetEditorWorldContext().World();
|
|
|
|
|
return SNew(SWorldDetails).InWorld(EditorWorld);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSharedRef<SWidget> FWorldBrowserModule::CreateWorldBrowserComposition()
|
|
|
|
|
{
|
|
|
|
|
UWorld* EditorWorld = GEditor->GetEditorWorldContext().World();
|
|
|
|
|
return SNew(SWorldComposition).InWorld(EditorWorld);
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-21 20:30:51 -04:00
|
|
|
void FWorldBrowserModule::OnWorldCreated(UWorld* InWorld)
|
2014-05-14 02:16:14 -04:00
|
|
|
{
|
|
|
|
|
if (InWorld &&
|
|
|
|
|
InWorld->WorldType == EWorldType::Editor)
|
|
|
|
|
{
|
|
|
|
|
OnBrowseWorld.Broadcast(InWorld);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FWorldBrowserModule::OnWorldCompositionChanged(UWorld* InWorld)
|
|
|
|
|
{
|
|
|
|
|
if (InWorld &&
|
|
|
|
|
InWorld->WorldType == EWorldType::Editor)
|
|
|
|
|
{
|
|
|
|
|
OnBrowseWorld.Broadcast(NULL);
|
|
|
|
|
OnBrowseWorld.Broadcast(InWorld);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-21 20:30:51 -04:00
|
|
|
void FWorldBrowserModule::OnWorldDestroyed(UWorld* InWorld)
|
2014-05-14 02:16:14 -04:00
|
|
|
{
|
2014-08-21 20:30:51 -04:00
|
|
|
TSharedPtr<FLevelCollectionModel> SharedWorldModel = WorldModel.Pin();
|
|
|
|
|
// Is there any editors alive?
|
|
|
|
|
if (SharedWorldModel.IsValid())
|
2014-05-14 02:16:14 -04:00
|
|
|
{
|
2014-08-21 20:30:51 -04:00
|
|
|
UWorld* ManagedWorld = SharedWorldModel->GetWorld(/*bEvenIfPendingKill*/true);
|
|
|
|
|
// Is it our world gets cleaned up?
|
|
|
|
|
if (ManagedWorld == InWorld)
|
2014-05-14 02:16:14 -04:00
|
|
|
{
|
2014-08-21 20:30:51 -04:00
|
|
|
// Will reset all references to a shared world model
|
|
|
|
|
OnBrowseWorld.Broadcast(NULL);
|
|
|
|
|
// So we have to be the last owner of this model
|
|
|
|
|
check(SharedWorldModel.IsUnique());
|
2014-05-14 02:16:14 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSharedPtr<FLevelCollectionModel> FWorldBrowserModule::SharedWorldModel(UWorld* InWorld)
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FLevelCollectionModel> SharedWorldModel = WorldModel.Pin();
|
|
|
|
|
if (!SharedWorldModel.IsValid() || SharedWorldModel->GetWorld() != InWorld)
|
|
|
|
|
{
|
|
|
|
|
if (InWorld)
|
|
|
|
|
{
|
|
|
|
|
if (InWorld->WorldComposition)
|
|
|
|
|
{
|
2014-07-14 23:07:15 -04:00
|
|
|
SharedWorldModel = FWorldTileCollectionModel::Create(GEditor, InWorld);
|
2014-05-14 02:16:14 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2014-07-14 23:07:15 -04:00
|
|
|
SharedWorldModel = FStreamingLevelCollectionModel::Create(GEditor, InWorld);
|
2014-05-14 02:16:14 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Hold weak reference to shared world model
|
|
|
|
|
WorldModel = SharedWorldModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return SharedWorldModel;
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2014-06-18 10:16:16 -04:00
|
|
|
#undef LOCTEXT_NAMESPACE
|