2019-12-27 09:26:59 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2019-09-12 13:55:17 -04:00
# pragma once
# include "CoreMinimal.h"
# include "UObject/NoExportTypes.h"
2021-03-24 11:11:02 -04:00
# include "BaseTools/SingleSelectionMeshEditingTool.h"
2021-06-15 17:05:25 -04:00
# include "MeshOpPreviewHelpers.h"
# include "Properties/RemeshProperties.h"
# include "CleaningOps/SimplifyMeshOp.h" // required in header for enum types
2019-09-12 13:55:17 -04:00
# include "SimplifyMeshTool.generated.h"
2021-06-15 17:05:25 -04:00
class UMeshStatisticsProperties ;
class UMeshElementsVisualizer ;
PREDECLARE_GEOMETRY ( class FDynamicMesh3 ) ;
PREDECLARE_GEOMETRY ( typedef TMeshAABBTree3 < FDynamicMesh3 > FDynamicMeshAABBTree3 ) ;
2019-09-12 13:55:17 -04:00
/**
*
*/
UCLASS ( )
2022-02-01 09:52:56 -05:00
class MESHMODELINGTOOLSEDITORONLYEXP_API USimplifyMeshToolBuilder : public USingleSelectionMeshEditingToolBuilder
2019-09-12 13:55:17 -04:00
{
GENERATED_BODY ( )
public :
2021-03-24 11:11:02 -04:00
virtual USingleSelectionMeshEditingTool * CreateNewTool ( const FToolBuilderState & SceneState ) const override ;
2019-09-12 13:55:17 -04:00
} ;
2019-09-16 17:52:14 -04:00
/**
* Standard properties of the Simplify operation
*/
UCLASS ( )
2022-02-01 09:52:56 -05:00
class MESHMODELINGTOOLSEDITORONLYEXP_API USimplifyMeshToolProperties : public UMeshConstraintProperties
2019-09-16 17:52:14 -04:00
{
GENERATED_BODY ( )
public :
USimplifyMeshToolProperties ( ) ;
/** Simplification Scheme */
UPROPERTY ( EditAnywhere , Category = Options )
ESimplifyType SimplifierType ;
2020-09-24 00:43:27 -04:00
/** Simplification Target Type */
2021-09-17 19:38:50 -04:00
UPROPERTY ( EditAnywhere , Category = Options , meta = ( EditCondition = " SimplifierType != ESimplifyType::MinimalPlanar && SimplifierType != ESimplifyType::MinimalPolygroup " ) )
2020-09-24 00:43:27 -04:00
ESimplifyTargetType TargetMode ;
2019-09-16 17:52:14 -04:00
/** Target percentage of original triangle count */
2021-09-17 19:38:50 -04:00
UPROPERTY ( EditAnywhere , Category = Options , meta = ( UIMin = " 0 " , UIMax = " 100 " ,
EditCondition = " SimplifierType != ESimplifyType::MinimalPolygroup && SimplifierType != ESimplifyType::MinimalPlanar && TargetMode == ESimplifyTargetType::Percentage " ) )
2019-09-16 17:52:14 -04:00
int TargetPercentage ;
/** Target edge length */
2021-09-17 19:38:50 -04:00
UPROPERTY ( EditAnywhere , Category = Options , meta = ( UIMin = " 3.0 " , UIMax = " 10.0 " , ClampMin = " 0.001 " , ClampMax = " 1000.0 " ,
EditCondition = " TargetMode == ESimplifyTargetType::EdgeLength && SimplifierType != ESimplifyType::UEStandard && SimplifierType != ESimplifyType::MinimalPlanar && SimplifierType != ESimplifyType::MinimalPolygroup " ) )
2019-09-16 17:52:14 -04:00
float TargetEdgeLength ;
/** Target triangle count */
2021-09-17 19:38:50 -04:00
UPROPERTY ( EditAnywhere , Category = Options , meta = ( UIMin = " 4 " , UIMax = " 10000 " , ClampMin = " 1 " , ClampMax = " 9999999999 " ,
EditCondition = " TargetMode == ESimplifyTargetType::TriangleCount && SimplifierType != ESimplifyType::MinimalPlanar && SimplifierType != ESimplifyType::MinimalPolygroup " ) )
2021-09-17 17:03:55 -04:00
int TargetTriangleCount ;
/** Target vertex count */
2021-09-17 19:38:50 -04:00
UPROPERTY ( EditAnywhere , Category = Options , meta = ( UIMin = " 4 " , UIMax = " 10000 " , ClampMin = " 1 " , ClampMax = " 9999999999 " ,
EditCondition = " TargetMode == ESimplifyTargetType::VertexCount && SimplifierType != ESimplifyType::MinimalPlanar " ) )
2021-09-17 17:03:55 -04:00
int TargetVertexCount ;
/** Angle threshold in degrees used for testing if two triangles should be considered coplanar, or two lines collinear */
UPROPERTY ( )
float MinimalAngleThreshold = 0.01 ;
2019-09-16 17:52:14 -04:00
2021-09-17 19:38:50 -04:00
//~ Note PolyEdgeAngleTolerance is very similar to MinimalAngleThreshold, but not redundant b/c the useful ranges are very different (MinimalAngleThreshold should generally be kept very small)
/** Threshold angle change (in degrees) along a polygroup edge, above which a vertex must be added */
UPROPERTY ( EditAnywhere , Category = Options , meta = ( UIMin = " 0.001 " , ClampMin = " 0.0 " , UIMax = " 90.0 " , ClampMax = " 180.0 " , EditCondition = " SimplifierType == ESimplifyType::MinimalPolygroup " ) )
float PolyEdgeAngleTolerance = .1 ;
2019-09-16 17:52:14 -04:00
/** If true, UVs and Normals are discarded */
UPROPERTY ( EditAnywhere , Category = Options )
bool bDiscardAttributes ;
2021-05-11 13:17:19 -04:00
/** If true, then simplification will consider geometric deviation with the input mesh */
2021-09-17 19:38:50 -04:00
UPROPERTY ( EditAnywhere , Category = Options , meta = ( EditCondition = " SimplifierType != ESimplifyType::MinimalPolygroup " ) )
2021-05-11 13:17:19 -04:00
bool bGeometricConstraint ;
/** Geometric deviation tolerance used when bGeometricConstraint is enabled, to limit the geometric deviation between the simplified and original meshes */
2021-09-17 19:38:50 -04:00
UPROPERTY ( EditAnywhere , Category = Options , meta = ( UIMin = " 0.0 " , UIMax = " 10.0 " , ClampMin = " 0.0 " , ClampMax = " 10000000.0 " ,
EditCondition = " bGeometricConstraint && SimplifierType != ESimplifyType::UEStandard && SimplifierType != ESimplifyType::MinimalPolygroup " ) )
2021-05-11 13:17:19 -04:00
float GeometricTolerance ;
2020-01-27 20:11:15 -05:00
/** Display colors corresponding to the mesh's polygon groups */
UPROPERTY ( EditAnywhere , Category = Display )
bool bShowGroupColors = false ;
2019-09-16 17:52:14 -04:00
/** Enable projection back to input mesh */
UPROPERTY ( EditAnywhere , Category = Options , AdvancedDisplay )
bool bReproject ;
} ;
2019-09-12 13:55:17 -04:00
/**
* Simple Mesh Simplifying Tool
*/
UCLASS ( )
2022-02-01 09:52:56 -05:00
class MESHMODELINGTOOLSEDITORONLYEXP_API USimplifyMeshTool : public USingleSelectionMeshEditingTool , public UE : : Geometry : : IDynamicMeshOperatorFactory
2019-09-12 13:55:17 -04:00
{
GENERATED_BODY ( )
public :
virtual void Setup ( ) override ;
2022-01-28 18:40:54 -05:00
virtual void OnShutdown ( EToolShutdownType ShutdownType ) override ;
2019-09-12 13:55:17 -04:00
2020-04-18 18:42:59 -04:00
virtual void OnTick ( float DeltaTime ) override ;
2019-09-12 13:55:17 -04:00
virtual bool HasCancel ( ) const override { return true ; }
2020-11-24 18:42:39 -04:00
virtual bool HasAccept ( ) const override { return true ; }
2019-09-12 13:55:17 -04:00
virtual bool CanAccept ( ) const override ;
2020-01-07 15:54:23 -05:00
virtual void OnPropertyModified ( UObject * PropertySet , FProperty * Property ) override ;
2019-09-12 13:55:17 -04:00
2019-10-17 20:26:57 -04:00
// IDynamicMeshOperatorFactory API
2021-03-09 19:33:56 -04:00
virtual TUniquePtr < UE : : Geometry : : FDynamicMeshOperator > MakeNewOperator ( ) override ;
2019-09-12 13:55:17 -04:00
2020-01-27 20:11:15 -05:00
private :
2019-09-16 17:52:14 -04:00
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < USimplifyMeshToolProperties > SimplifyProperties ;
2019-09-12 13:55:17 -04:00
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < UMeshStatisticsProperties > MeshStatisticsProperties ;
2019-09-12 13:55:17 -04:00
2019-10-17 20:26:57 -04:00
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < UMeshOpPreviewWithBackgroundCompute > Preview ;
2019-09-12 13:55:17 -04:00
2021-06-15 17:05:25 -04:00
UPROPERTY ( )
2021-07-20 00:21:34 -04:00
TObjectPtr < UMeshElementsVisualizer > MeshElementsDisplay ;
2021-06-15 17:05:25 -04:00
2021-02-17 11:50:23 -04:00
TSharedPtr < FMeshDescription , ESPMode : : ThreadSafe > OriginalMeshDescription ;
2019-10-17 20:26:57 -04:00
// Dynamic Mesh versions precomputed in Setup (rather than recomputed for every simplify op)
2021-03-09 19:33:56 -04:00
TSharedPtr < UE : : Geometry : : FDynamicMesh3 , ESPMode : : ThreadSafe > OriginalMesh ;
TSharedPtr < UE : : Geometry : : FDynamicMeshAABBTree3 , ESPMode : : ThreadSafe > OriginalMeshSpatial ;
2019-10-17 20:26:57 -04:00
2020-01-27 20:11:15 -05:00
void UpdateVisualization ( ) ;
2019-09-12 13:55:17 -04:00
} ;