2020-08-11 01:36:57 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "ProjectToTargetTool.h"
# include "MeshDescriptionToDynamicMesh.h"
# include "InteractiveToolManager.h"
2021-11-23 09:42:40 -05:00
# include "ModelingToolTargetUtil.h"
2020-08-11 01:36:57 -04:00
2021-03-11 11:40:03 -04:00
# include "TargetInterfaces/MaterialProvider.h"
# include "TargetInterfaces/MeshDescriptionCommitter.h"
# include "TargetInterfaces/MeshDescriptionProvider.h"
# include "TargetInterfaces/PrimitiveComponentBackedTarget.h"
# include "ToolTargetManager.h"
2022-09-28 01:06:15 -04:00
# include UE_INLINE_GENERATED_CPP_BY_NAME(ProjectToTargetTool)
2021-03-09 19:33:56 -04:00
using namespace UE : : Geometry ;
2020-08-11 01:36:57 -04:00
# define LOCTEXT_NAMESPACE "UProjectToTargetTool"
bool UProjectToTargetToolBuilder : : CanBuildTool ( const FToolBuilderState & SceneState ) const
{
2021-03-11 11:40:03 -04:00
return SceneState . TargetManager - > CountSelectedAndTargetable ( SceneState , GetTargetRequirements ( ) ) = = 2 ;
2020-08-11 01:36:57 -04:00
}
2021-11-23 09:42:40 -05:00
UMultiSelectionMeshEditingTool * UProjectToTargetToolBuilder : : CreateNewTool ( const FToolBuilderState & SceneState ) const
2020-08-11 01:36:57 -04:00
{
2021-11-23 09:42:40 -05:00
return NewObject < UProjectToTargetTool > ( SceneState . ToolManager ) ;
2020-08-11 01:36:57 -04:00
}
void UProjectToTargetTool : : Setup ( )
{
// ProjectionTarget and ProjectionTargetSpatial are setup before calling the parent class's Setup
2021-03-11 11:40:03 -04:00
check ( Targets . Num ( ) = = 2 ) ;
2020-08-11 01:36:57 -04:00
ProjectionTarget = MakeUnique < FDynamicMesh3 > ( ) ;
2024-03-04 18:35:47 -05:00
* ProjectionTarget = UE : : ToolTarget : : GetDynamicMeshCopy ( Targets [ 1 ] ) ;
2020-08-11 01:36:57 -04:00
ProjectionTargetSpatial = MakeUnique < FDynamicMeshAABBTree3 > ( ProjectionTarget . Get ( ) , true ) ;
// Now setup parent RemeshMeshTool class
URemeshMeshTool : : Setup ( ) ;
2021-02-08 17:02:09 -04:00
SetToolDisplayName ( LOCTEXT ( " ProjectToTargetToolName " , " Project To Target " ) ) ;
2020-08-11 01:36:57 -04:00
GetToolManager ( ) - > DisplayMessage (
2020-10-22 19:19:16 -04:00
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. " ) ,
2020-08-11 01:36:57 -04:00
EToolMessageLevel : : UserNotification ) ;
}
TUniquePtr < FDynamicMeshOperator > UProjectToTargetTool : : MakeNewOperator ( )
{
2021-05-07 12:01:34 -04:00
UProjectToTargetToolProperties * ProjectProperties = Cast < UProjectToTargetToolProperties > ( BasicProperties ) ;
if ( ! ensure ( ProjectProperties ) )
{
return nullptr ;
}
2020-08-11 01:36:57 -04:00
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 ( ) ;
2021-11-23 09:42:40 -05:00
RemeshOp - > ToolMeshLocalToWorld = UE : : ToolTarget : : GetLocalToWorldTransform ( Targets [ 0 ] ) ;
RemeshOp - > TargetMeshLocalToWorld = UE : : ToolTarget : : GetLocalToWorldTransform ( Targets [ 1 ] ) ;
2021-05-07 12:01:34 -04:00
RemeshOp - > bUseWorldSpace = ProjectProperties - > bWorldSpace ;
2021-05-17 17:27:58 -04:00
RemeshOp - > bParallel = ProjectProperties - > bParallel ;
if ( ProjectProperties - > RemeshType = = ERemeshType : : NormalFlow )
{
RemeshOp - > FaceProjectionPassesPerRemeshIteration = ProjectProperties - > FaceProjectionPassesPerRemeshIteration ;
RemeshOp - > SurfaceProjectionSpeed = ProjectProperties - > SurfaceProjectionSpeed ;
RemeshOp - > NormalAlignmentSpeed = ProjectProperties - > NormalAlignmentSpeed ;
RemeshOp - > bSmoothInFillAreas = ProjectProperties - > bSmoothInFillAreas ;
RemeshOp - > FillAreaDistanceMultiplier = ProjectProperties - > FillAreaDistanceMultiplier ;
RemeshOp - > FillAreaSmoothMultiplier = ProjectProperties - > FillAreaSmoothMultiplier ;
2022-06-08 15:29:16 -04:00
// disable convergence check
RemeshOp - > MinActiveEdgeFraction = 0.0 ;
2021-05-17 17:27:58 -04:00
}
2021-05-07 12:01:34 -04:00
2020-08-11 01:36:57 -04:00
return Op ;
}
# undef LOCTEXT_NAMESPACE
2022-09-28 01:06:15 -04:00