Files
UnrealEngineUWP/Engine/Source/Runtime/InteractiveToolsFramework/Private/ToolTargetManager.cpp
michael balzer 5a20a5e3d0 Move InteractiveToolsFramework and GeometryFramework out of Experimental
#jira UETOOL-3823
#rb brooke.hubert
#preflight 6109d1e9b4288d0001acb7ef

#ROBOMERGE-SOURCE: CL 17055606 in //UE5/Main/...
#ROBOMERGE-BOT: STARSHIP (Main -> Release-Engine-Test) (v850-17047176)

[CL 17055619 by michael balzer in ue5-release-engine-test branch]
2021-08-04 13:59:17 -04:00

119 lines
3.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ToolTargetManager.h"
#include "InteractiveToolsContext.h"
#include "ToolBuilderUtil.h"
void UToolTargetManager::Initialize()
{
bIsActive = true;
}
void UToolTargetManager::Shutdown()
{
Factories.Empty();
bIsActive = false;
}
void UToolTargetManager::AddTargetFactory(UToolTargetFactory* Factory)
{
// If this type of factory has already been added, skip it.
if (Factories.ContainsByPredicate(
[Factory](UToolTargetFactory* ExistingFactory) {
return ExistingFactory->GetClass() == Factory->GetClass();
}))
{
return;
}
Factories.Add(Factory);
}
UToolTargetFactory* UToolTargetManager::FindFirstFactoryByPredicate(TFunctionRef<bool(UToolTargetFactory*)> Predicate)
{
TObjectPtr<UToolTargetFactory>* Found = Factories.FindByPredicate(Predicate);
return (Found) ? Found->Get() : nullptr;
}
bool UToolTargetManager::CanBuildTarget(UObject* SourceObject, const FToolTargetTypeRequirements& TargetType) const
{
for (UToolTargetFactory* Factory : Factories)
{
if (Factory->CanBuildTarget(SourceObject, TargetType))
{
return true;
}
}
return false;
}
UToolTarget* UToolTargetManager::BuildTarget(UObject* SourceObject, const FToolTargetTypeRequirements& TargetType)
{
for (UToolTargetFactory* Factory : Factories)
{
if (Factory->CanBuildTarget(SourceObject, TargetType))
{
UToolTarget* Result = Factory->BuildTarget(SourceObject, TargetType);
if (Result != nullptr)
{
return Result;
}
}
}
return nullptr;
}
int32 UToolTargetManager::CountSelectedAndTargetable(const FToolBuilderState& SceneState, const FToolTargetTypeRequirements& TargetType) const
{
return ToolBuilderUtil::CountComponents(SceneState, [&](UActorComponent* Object)
{
return CanBuildTarget(Object, TargetType);
});
}
void UToolTargetManager::EnumerateSelectedAndTargetableComponents(const FToolBuilderState& SceneState,
const FToolTargetTypeRequirements& TargetRequirements,
TFunctionRef<void(UActorComponent*)> ComponentFunc) const
{
ToolBuilderUtil::EnumerateComponents(SceneState, [&](UActorComponent* Component)
{
if (CanBuildTarget(Component, TargetRequirements))
{
ComponentFunc(Component);
}
});
}
UToolTarget* UToolTargetManager::BuildFirstSelectedTargetable(const FToolBuilderState& SceneState, const FToolTargetTypeRequirements& TargetType)
{
return BuildTarget(
ToolBuilderUtil::FindFirstComponent(SceneState, [&](UActorComponent* Object)
{
return CanBuildTarget(Object, TargetType);
}),
TargetType);
}
TArray<TObjectPtr<UToolTarget>> UToolTargetManager::BuildAllSelectedTargetable(const FToolBuilderState& SceneState,
const FToolTargetTypeRequirements& TargetType)
{
TArray<UActorComponent*> Components = ToolBuilderUtil::FindAllComponents(SceneState, [&](UActorComponent* Object)
{
return CanBuildTarget(Object, TargetType);
});
TArray<TObjectPtr<UToolTarget>> Targets;
Targets.Reserve(Components.Num());
for (UActorComponent* Component : Components)
{
Targets.Add(BuildTarget(Component, TargetType));
}
return Targets;
}