Files
UnrealEngineUWP/Engine/Source/Runtime/Experimental/InteractiveToolsFramework/Private/ToolTargetManager.cpp
Ryan Schmidt bca2b32ac7 ModeingMode: restore EditingLOD functionality lost in ToolTarget transition. Port EditingLOD functionality from FStaticMeshComponentTarget/Factory to UStaticMeshComponentToolTarget/Factory. Add UToolTargetManager::FindFirstFactoryByPredicate() and FindFirstFactoryByType(). ModelingToolsEditorModeToolkit now also looks up the StaticMeshFactory and updates the EditingLOD when it changes in the UI.
EStaticMeshEditingLOD enum moved to ComponentSourceInterfaces.h to make it more widely available.

Add ToolBuilderUtil::EnumerateComponents() and ToolTargetManager::EnumerateSelectedAndTargetableComponents(), this allows ToolBuilders to do additional checks on the valid Targets without having to make local arrays/etc. Fix SetCollisionGeometryTool to not build ToolTargets every frame just to check if one is a StaticMeshComponent.

#rb lonnie.li
#rnx
#jira none
#preflight 6092e932242f6600012445b0

[CL 16213180 by Ryan Schmidt in ue5-main branch]
2021-05-05 16:43:24 -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;
}