Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Private/AssetEditorModeManager.cpp
2025-05-18 13:04:45 +08:00

94 lines
3.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "AssetEditorModeManager.h"
#include "Engine/Selection.h"
#include "PreviewScene.h"
#include "Elements/Framework/TypedElementSelectionSet.h"
//////////////////////////////////////////////////////////////////////////
// FAssetEditorModeManager
FAssetEditorModeManager::FAssetEditorModeManager()
{
{
UTypedElementSelectionSet* ActorAndComponentsSelectionSet = NewObject<UTypedElementSelectionSet>(GetTransientPackage(), NAME_None, RF_Transactional);
ActorSet = USelection::CreateActorSelection(GetTransientPackage(), NAME_None, RF_Transactional);
ActorSet->SetElementSelectionSet(ActorAndComponentsSelectionSet);
ActorSet->AddToRoot();
ComponentSet = USelection::CreateComponentSelection(GetTransientPackage(), NAME_None, RF_Transactional);
ComponentSet->SetElementSelectionSet(ActorAndComponentsSelectionSet);
ComponentSet->AddToRoot();
}
ObjectSet = USelection::CreateObjectSelection(GetTransientPackage(), NAME_None, RF_Transactional);
ObjectSet->SetElementSelectionSet(NewObject<UTypedElementSelectionSet>(ObjectSet, NAME_None, RF_Transactional));
ObjectSet->AddToRoot();
}
FAssetEditorModeManager::~FAssetEditorModeManager()
{
// We may be destroyed after the UObject system has already shutdown,
// which would mean that these instances will be garbage
if (UObjectInitialized())
{
if (!ActorSet->HasAnyFlags(RF_BeginDestroyed | RF_FinishDestroyed))
{
check(ActorSet->GetElementSelectionSet() == ComponentSet->GetElementSelectionSet());
if (UTypedElementSelectionSet* ActorAndComponentsSelectionSet = ActorSet->GetElementSelectionSet())
{
ActorAndComponentsSelectionSet->ClearSelection(FTypedElementSelectionOptions());
}
}
ActorSet->RemoveFromRoot();
ComponentSet->RemoveFromRoot();
if (!ObjectSet->HasAnyFlags(RF_BeginDestroyed | RF_FinishDestroyed))
{
if (UTypedElementSelectionSet* ObjectSelectionSet = ObjectSet->GetElementSelectionSet())
{
ObjectSelectionSet->ClearSelection(FTypedElementSelectionOptions());
}
}
ObjectSet->RemoveFromRoot();
}
}
USelection* FAssetEditorModeManager::GetSelectedActors() const
{
return ActorSet;
}
USelection* FAssetEditorModeManager::GetSelectedObjects() const
{
return ObjectSet;
}
USelection* FAssetEditorModeManager::GetSelectedComponents() const
{
return ComponentSet;
}
UWorld* FAssetEditorModeManager::GetWorld() const
{
return (PreviewSceneWorld.IsValid()) ? PreviewSceneWorld.Get() : GEditor->GetEditorWorldContext().World();
}
void FAssetEditorModeManager::SetPreviewScene(FPreviewScene* NewPreviewScene)
{
PreviewScene = NewPreviewScene;
// Due to destruction order, we might get a call from FEditorModeTools::OnWorldCleanup with an already destoyed PreviewScene,
// but we sill have to return the correct World the editor was using to perform a correct shutdown,
// so caching the PreviewScene World when assigning (and clearing if null preview is set)
PreviewSceneWorld = (NewPreviewScene != nullptr) ? NewPreviewScene->GetWorld() : nullptr;
}
FPreviewScene* FAssetEditorModeManager::GetPreviewScene() const
{
return PreviewScene;
}