Files
UnrealEngine/Engine/Plugins/Runtime/MeshModelingToolset/Source/ModelingComponents/Public/Selection/ToolSelectionUtil.h
2025-05-18 13:04:45 +08:00

106 lines
3.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Selections/GeometrySelection.h"
#include "Selections/GeometrySelectionUtil.h"
#include "CoreMinimal.h"
#define UE_API MODELINGCOMPONENTS_API
class UInteractiveToolManager;
class IToolsContextRenderAPI;
class AActor;
namespace UE::Geometry
{
class FDynamicMesh3;
class FGroupTopology;
struct FGeometrySelection;
}
/**
* Utility functions for Tool implementations to use when doing selection
*/
namespace ToolSelectionUtil
{
/**
* Change the active selection to the given Actor, via given ToolManager. Replaces existing selection.
*/
MODELINGCOMPONENTS_API void SetNewActorSelection(UInteractiveToolManager* ToolManager, AActor* Actor);
/**
* Change the active selection to the given Actors, via given ToolManager. Replaces existing selection.
*/
MODELINGCOMPONENTS_API void SetNewActorSelection(UInteractiveToolManager* ToolManager, const TArray<AActor*>& Actors);
/** Prefer AccumulateSelectionElements with Flags parameter. */
UE_DEPRECATED(5.5, "AccumulateSelectionElements which takes a bMapFacesToEdges boolean is deprecated."
"Please use the function of the same name which takes EEnumerateSelectionMapping flags instead")
MODELINGCOMPONENTS_API bool AccumulateSelectionElements(
UE::Geometry::FGeometrySelectionElements& Elements,
const UE::Geometry::FGeometrySelection& Selection,
const UE::Geometry::FDynamicMesh3& SourceMesh,
const UE::Geometry::FGroupTopology* Topology = nullptr,
const FTransform* ApplyTransform = nullptr,
bool bMapFacesToEdges = false);
/**
* Add the geometry selection elements corresponding to the given Selection to Elements. This function does not
* reset Elements before adding elements. If the Selection has Polygroup topology then use the given Topology to
* accumulate elements if it isn't null, otherwise compute a FGroupTopology from SourceMesh.TriangleGroups and use
* that to accumulate elements. If the Selection has Triangle topology then the Topology argument is ignored.
* Return false if there was an error and true otherwise
*/
MODELINGCOMPONENTS_API bool AccumulateSelectionElements(
UE::Geometry::FGeometrySelectionElements& Elements,
const UE::Geometry::FGeometrySelection& Selection,
const UE::Geometry::FDynamicMesh3& SourceMesh,
const UE::Geometry::FGroupTopology* Topology = nullptr,
const FTransform* ApplyTransform = nullptr,
const UE::Geometry::EEnumerateSelectionMapping Flags = UE::Geometry::EEnumerateSelectionMapping::Default);
/**
* Render the given Elements using FPrimitiveDrawInterface
*/
MODELINGCOMPONENTS_API void DebugRenderGeometrySelectionElements(
IToolsContextRenderAPI* RenderAPI,
const UE::Geometry::FGeometrySelectionElements& Elements,
bool bIsPreview = false);
// todo [nickolas.drake]: remove this function when no longer used by GeometrySelectionManager
void DebugRender(
IToolsContextRenderAPI* RenderAPI,
const UE::Geometry::FGeometrySelectionElements& Elements,
float LineThickness,
FLinearColor LineColor,
float PointSize,
FLinearColor PointColor,
float DepthBias = 0.f,
FLinearColor FillColor = FLinearColor(1.0f, 0.0f, 0.0f));
}
namespace UE::Geometry
{
struct FSelectionRenderHelper
{
UE_API void Initialize(const FGeometrySelection& Selection,
const FDynamicMesh3& SourceMesh,
const FGroupTopology* Topology = nullptr,
const FTransform* ApplyTransform = nullptr);
UE_API void Render(IToolsContextRenderAPI* RenderAPI) const;
protected:
FGeometrySelectionElements Elements;
};
}
#undef UE_API