You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#rb none #rnx #jira none #ROBOMERGE-OWNER: ryan.schmidt #ROBOMERGE-AUTHOR: ryan.schmidt #ROBOMERGE-SOURCE: CL 15348621 in //UE5/Release-5.0-EarlyAccess/... #ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v771-15082668) #ROBOMERGE-CONFLICT from-shelf [CL 15360215 by ryan schmidt in ue5-main branch]
74 lines
2.5 KiB
C++
74 lines
2.5 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "ProjectToTargetTool.h"
|
|
#include "MeshDescriptionToDynamicMesh.h"
|
|
#include "InteractiveToolManager.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "UProjectToTargetTool"
|
|
|
|
bool UProjectToTargetToolBuilder::CanBuildTool(const FToolBuilderState& SceneState) const
|
|
{
|
|
return ToolBuilderUtil::CountComponents(SceneState, CanMakeComponentTarget) == 2;
|
|
}
|
|
|
|
UInteractiveTool* UProjectToTargetToolBuilder::BuildTool(const FToolBuilderState& SceneState) const
|
|
{
|
|
UProjectToTargetTool* NewTool = NewObject<UProjectToTargetTool>(SceneState.ToolManager);
|
|
|
|
TArray<UActorComponent*> Components = ToolBuilderUtil::FindAllComponents(SceneState, CanMakeComponentTarget);
|
|
check(Components.Num() == 2);
|
|
|
|
TArray<TUniquePtr<FPrimitiveComponentTarget>> ComponentTargets;
|
|
for (UActorComponent* ActorComponent : Components)
|
|
{
|
|
auto* MeshComponent = Cast<UPrimitiveComponent>(ActorComponent);
|
|
if (MeshComponent)
|
|
{
|
|
ComponentTargets.Add(MakeComponentTarget(MeshComponent));
|
|
}
|
|
}
|
|
|
|
NewTool->SetSelection(MoveTemp(ComponentTargets));
|
|
NewTool->SetWorld(SceneState.World);
|
|
NewTool->SetAssetAPI(AssetAPI);
|
|
|
|
return NewTool;
|
|
}
|
|
|
|
void UProjectToTargetTool::Setup()
|
|
{
|
|
// ProjectionTarget and ProjectionTargetSpatial are setup before calling the parent class's Setup
|
|
FMeshDescriptionToDynamicMesh ProjectionConverter;
|
|
check(ComponentTargets.Num() == 2);
|
|
FPrimitiveComponentTarget* TargetComponentTarget = ComponentTargets[1].Get();
|
|
ProjectionTarget = MakeUnique<FDynamicMesh3>();
|
|
ProjectionConverter.Convert(TargetComponentTarget->GetMesh(), *ProjectionTarget);
|
|
ProjectionTargetSpatial = MakeUnique<FDynamicMeshAABBTree3>(ProjectionTarget.Get(), true);
|
|
|
|
// Now setup parent RemeshMeshTool class
|
|
URemeshMeshTool::Setup();
|
|
|
|
SetToolDisplayName(LOCTEXT("ProjectToTargetToolName", "Project To Target"));
|
|
GetToolManager()->DisplayMessage(
|
|
LOCTEXT("ProjectToTargetToolDescription", "Incrementally deform the first selected mesh towards the second, while applying Remeshing. This can be used to improve the accuracy of shrink-wrapping strategies."),
|
|
EToolMessageLevel::UserNotification);
|
|
}
|
|
|
|
|
|
TUniquePtr<FDynamicMeshOperator> UProjectToTargetTool::MakeNewOperator()
|
|
{
|
|
TUniquePtr<FDynamicMeshOperator> Op = URemeshMeshTool::MakeNewOperator();
|
|
|
|
FDynamicMeshOperator* RawOp = Op.Get();
|
|
FRemeshMeshOp* RemeshOp = static_cast<FRemeshMeshOp*>(RawOp);
|
|
check(RemeshOp);
|
|
|
|
RemeshOp->ProjectionTarget = ProjectionTarget.Get();
|
|
RemeshOp->ProjectionTargetSpatial = ProjectionTargetSpatial.Get();
|
|
|
|
return Op;
|
|
}
|
|
|
|
|
|
#undef LOCTEXT_NAMESPACE
|