Files
UnrealEngine/Engine/Source/Runtime/InteractiveToolsFramework/Private/ToolTargetManager.cpp
2025-05-18 13:04:45 +08:00

130 lines
3.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ToolTargetManager.h"
#include "InteractiveToolsContext.h"
#include "ToolBuilderUtil.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(ToolTargetManager)
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);
}
});
}
int32 UToolTargetManager::CountSelectedAndTargetableWithPredicate(const FToolBuilderState& SceneState,
const FToolTargetTypeRequirements& TargetRequirements,
TFunctionRef<bool(UActorComponent&)> ComponentPred) const
{
return ToolBuilderUtil::CountComponents(SceneState, [&](UActorComponent* Object)
{
return CanBuildTarget(Object, TargetRequirements) && ComponentPred(*Object);
});
}
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;
}