Files
UnrealEngineUWP/Engine/Source/Runtime/Experimental/InteractiveToolsFramework/Private/ToolTargetManager.cpp
lonnie li c4b0e521f2 MeshModelingTools: Replace MultiSelectionTool PrimitiveComponentTarget usage with ToolTargets (pt.1)
#rb semion.piskarev

[CL 15508149 by lonnie li in ue5-main branch]
2021-02-23 18:03:26 -04:00

85 lines
2.1 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)
{
Factories.AddUnique(Factory);
}
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);
});
}
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;
}