2019-12-27 09:26:59 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2019-10-01 20:41:42 -04:00
# pragma once
# include "CoreMinimal.h"
2021-06-15 17:05:25 -04:00
# include "BaseTools/SingleSelectionMeshEditingTool.h"
2019-10-01 20:41:42 -04:00
# include "PreviewMesh.h"
2021-03-02 13:00:46 -04:00
# include "ModelingOperators.h"
# include "MeshOpPreviewHelpers.h"
2019-10-01 20:41:42 -04:00
# include "ConvertToPolygonsTool.generated.h"
// predeclaration
2021-03-02 13:00:46 -04:00
class UConvertToPolygonsTool ;
class FConvertToPolygonsOp ;
2021-06-15 17:05:25 -04:00
class UPreviewGeometry ;
PREDECLARE_GEOMETRY ( class FDynamicMesh3 ) ;
2019-10-01 20:41:42 -04:00
/**
*
*/
UCLASS ( )
2021-07-29 20:04:58 -04:00
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsToolBuilder : public USingleSelectionMeshEditingToolBuilder
2019-10-01 20:41:42 -04:00
{
GENERATED_BODY ( )
public :
2021-03-18 18:26:33 -04:00
virtual USingleSelectionMeshEditingTool * CreateNewTool ( const FToolBuilderState & SceneState ) const override ;
2019-10-01 20:41:42 -04:00
} ;
2019-12-19 18:07:47 -05:00
UENUM ( )
enum class EConvertToPolygonsMode
{
/** Convert based on Angle Tolerance between Face Normals */
2021-02-22 19:16:24 -04:00
FaceNormalDeviation UMETA ( DisplayName = " Face Normal Deviation " ) ,
2019-12-19 18:07:47 -05:00
/** Create PolyGroups based on UV Islands */
2021-02-22 19:16:24 -04:00
FromUVIslands UMETA ( DisplayName = " From UV Islands " ) ,
2021-09-15 22:40:38 -04:00
/** Create PolyGroups based on Hard Normal Seams */
FromNormalSeams UMETA ( DisplayName = " From Hard Normal Seams " ) ,
2021-02-22 19:16:24 -04:00
/** Create Polygroups based on Connected Triangles */
2021-07-27 18:17:48 -04:00
FromConnectedTris UMETA ( DisplayName = " From Connected Tris " ) ,
2021-08-11 10:42:17 -04:00
/** Create Polygroups centered on well-spaced sample points, approximating a surface Voronoi diagram */
2021-07-27 18:17:48 -04:00
FromFurthestPointSampling UMETA ( DisplayName = " Furthest Point Sampling " )
2019-12-19 18:07:47 -05:00
} ;
2019-10-01 20:41:42 -04:00
UCLASS ( )
2021-07-29 20:04:58 -04:00
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsToolProperties : public UInteractiveToolPropertySet
2019-10-01 20:41:42 -04:00
{
GENERATED_BODY ( )
public :
2020-09-24 00:43:27 -04:00
/** Strategy to use to group triangles */
2019-12-19 18:07:47 -05:00
UPROPERTY ( EditAnywhere , Category = PolyGroups )
2021-07-29 03:03:07 -04:00
EConvertToPolygonsMode ConversionMode = EConvertToPolygonsMode : : FaceNormalDeviation ;
2019-12-19 18:07:47 -05:00
2019-10-01 20:41:42 -04:00
/** Tolerance for planarity */
2021-09-15 22:40:38 -04:00
UPROPERTY ( EditAnywhere , Category = PolyGroups , meta = ( UIMin = " 0.001 " , UIMax = " 60.0 " , ClampMin = " 0.0 " , ClampMax = " 90.0 " , EditCondition = " ConversionMode == EConvertToPolygonsMode::FaceNormalDeviation " , EditConditionHides ) )
2019-10-01 20:41:42 -04:00
float AngleTolerance = 0.1f ;
2021-07-27 18:17:48 -04:00
/** Furthest-Point Sample count, approximately this number of polygroups will be generated */
UPROPERTY ( EditAnywhere , Category = PolyGroups , meta = ( UIMin = " 1 " , UIMax = " 100 " , ClampMin = " 1 " , ClampMax = " 10000 " , EditCondition = " ConversionMode == EConvertToPolygonsMode::FromFurthestPointSampling " , EditConditionHides ) )
int32 NumPoints = 100 ;
2021-09-15 22:40:38 -04:00
/** If enabled, then furthest-point sampling happens with respect to existing Polygroups, ie the existing groups are further subdivided */
UPROPERTY ( EditAnywhere , Category = PolyGroups , meta = ( EditCondition = " ConversionMode == EConvertToPolygonsMode::FromFurthestPointSampling " , EditConditionHides ) )
bool bSplitExisting = false ;
2021-07-27 18:17:48 -04:00
/** If true, region-growing in Sampling modes will be controlled by face normals, resulting in regions with borders that are more-aligned with curvature ridges */
UPROPERTY ( EditAnywhere , Category = PolyGroups , meta = ( EditCondition = " ConversionMode == EConvertToPolygonsMode::FromFurthestPointSampling " , EditConditionHides ) )
bool bNormalWeighted = true ;
/** This parameter modulates the effect of normal weighting during region-growing */
UPROPERTY ( EditAnywhere , Category = PolyGroups , meta = ( UIMin = " 0.1 " , UIMax = " 2.0 " , ClampMin = " 0.01 " , ClampMax = " 100.0 " , EditCondition = " ConversionMode == EConvertToPolygonsMode::FromFurthestPointSampling " , EditConditionHides ) )
float NormalWeighting = 1.0f ;
/** group filtering */
UPROPERTY ( EditAnywhere , Category = Filtering , meta = ( UIMin = " 1 " , UIMax = " 100 " , ClampMin = " 1 " , ClampMax = " 10000 " ) )
int32 MinGroupSize = 2 ;
2020-09-24 00:43:27 -04:00
/** If true, normals are recomputed per-group, with hard edges at group boundaries */
2021-07-27 18:17:48 -04:00
UPROPERTY ( EditAnywhere , Category = Output )
bool bCalculateNormals = false ;
2020-09-24 00:43:27 -04:00
/** Display each group with a different auto-generated color */
2020-01-27 20:11:15 -05:00
UPROPERTY ( EditAnywhere , Category = Display )
bool bShowGroupColors = true ;
2019-10-01 20:41:42 -04:00
} ;
2021-03-02 13:00:46 -04:00
UCLASS ( )
2021-07-29 20:04:58 -04:00
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsOperatorFactory : public UObject , public UE : : Geometry : : IDynamicMeshOperatorFactory
2021-03-02 13:00:46 -04:00
{
GENERATED_BODY ( )
public :
// IDynamicMeshOperatorFactory API
2021-03-09 19:33:56 -04:00
virtual TUniquePtr < UE : : Geometry : : FDynamicMeshOperator > MakeNewOperator ( ) override ;
2021-03-02 13:00:46 -04:00
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < UConvertToPolygonsTool > ConvertToPolygonsTool ; // back pointer
2021-03-02 13:00:46 -04:00
} ;
2019-10-01 20:41:42 -04:00
/**
*
*/
UCLASS ( )
2021-07-29 20:04:58 -04:00
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsTool : public USingleSelectionMeshEditingTool
2019-10-01 20:41:42 -04:00
{
GENERATED_BODY ( )
public :
2020-01-27 20:11:15 -05:00
UConvertToPolygonsTool ( ) ;
2019-10-01 20:41:42 -04:00
virtual void Setup ( ) override ;
2022-01-28 18:40:54 -05:00
virtual void OnShutdown ( EToolShutdownType ShutdownType ) override ;
2019-10-01 20:41:42 -04:00
2020-04-18 18:42:59 -04:00
virtual void OnTick ( float DeltaTime ) override ;
2019-10-01 20:41:42 -04:00
virtual bool HasCancel ( ) const override { return true ; }
2020-11-24 18:42:39 -04:00
virtual bool HasAccept ( ) const override { return true ; }
2021-03-02 13:00:46 -04:00
virtual bool CanAccept ( ) const override ;
2019-10-01 20:41:42 -04:00
2021-03-02 13:00:46 -04:00
// update parameters in ConvertToPolygonsOp based on current Settings
void UpdateOpParameters ( FConvertToPolygonsOp & ConvertToPolygonsOp ) const ;
protected :
void OnSettingsModified ( ) ;
2019-10-01 20:41:42 -04:00
protected :
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < UConvertToPolygonsToolProperties > Settings ;
2019-10-01 20:41:42 -04:00
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < UMeshOpPreviewWithBackgroundCompute > PreviewCompute = nullptr ;
2021-06-15 17:05:25 -04:00
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < UPreviewGeometry > PreviewGeometry = nullptr ;
2019-10-01 20:41:42 -04:00
protected :
2021-03-09 19:33:56 -04:00
TSharedPtr < UE : : Geometry : : FDynamicMesh3 , ESPMode : : ThreadSafe > OriginalDynamicMesh ;
2021-03-02 13:00:46 -04:00
// for visualization
TArray < int > PolygonEdges ;
2020-01-27 20:11:15 -05:00
void UpdateVisualization ( ) ;
2019-10-01 20:41:42 -04:00
} ;