Files
UnrealEngineUWP/Engine/Plugins/Experimental/MeshModelingToolsetExp/Source/MeshModelingToolsExp/Public/ConvertToPolygonsTool.h
lonnie li 4afd669dcb ModelingTools: Clear TargetWorld member during Shutdown of SingleSelectionMeshEditingTool and MultiSelectionMeshEditingTool
#rb ryan.schmidt michael.balzer
#rnx
#jira none
#preflight 61f435dd74510448a6865d14

#ROBOMERGE-AUTHOR: lonnie.li
#ROBOMERGE-SOURCE: CL 18777332 in //UE5/Release-5.0/... via CL 18780413 via CL 18780555
#ROBOMERGE-BOT: UE5 (Release-Engine-Test -> Main) (v903-18687472)

[CL 18780558 by lonnie li in ue5-main branch]
2022-01-28 18:40:54 -05:00

152 lines
5.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "BaseTools/SingleSelectionMeshEditingTool.h"
#include "PreviewMesh.h"
#include "ModelingOperators.h"
#include "MeshOpPreviewHelpers.h"
#include "ConvertToPolygonsTool.generated.h"
// predeclaration
class UConvertToPolygonsTool;
class FConvertToPolygonsOp;
class UPreviewGeometry;
PREDECLARE_GEOMETRY(class FDynamicMesh3);
/**
*
*/
UCLASS()
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsToolBuilder : public USingleSelectionMeshEditingToolBuilder
{
GENERATED_BODY()
public:
virtual USingleSelectionMeshEditingTool* CreateNewTool(const FToolBuilderState & SceneState) const override;
};
UENUM()
enum class EConvertToPolygonsMode
{
/** Convert based on Angle Tolerance between Face Normals */
FaceNormalDeviation UMETA(DisplayName = "Face Normal Deviation"),
/** Create PolyGroups based on UV Islands */
FromUVIslands UMETA(DisplayName = "From UV Islands"),
/** Create PolyGroups based on Hard Normal Seams */
FromNormalSeams UMETA(DisplayName = "From Hard Normal Seams"),
/** Create Polygroups based on Connected Triangles */
FromConnectedTris UMETA(DisplayName = "From Connected Tris"),
/** Create Polygroups centered on well-spaced sample points, approximating a surface Voronoi diagram */
FromFurthestPointSampling UMETA(DisplayName = "Furthest Point Sampling")
};
UCLASS()
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsToolProperties : public UInteractiveToolPropertySet
{
GENERATED_BODY()
public:
/** Strategy to use to group triangles */
UPROPERTY(EditAnywhere, Category = PolyGroups)
EConvertToPolygonsMode ConversionMode = EConvertToPolygonsMode::FaceNormalDeviation;
/** Tolerance for planarity */
UPROPERTY(EditAnywhere, Category = PolyGroups, meta = (UIMin = "0.001", UIMax = "60.0", ClampMin = "0.0", ClampMax = "90.0", EditCondition = "ConversionMode == EConvertToPolygonsMode::FaceNormalDeviation", EditConditionHides))
float AngleTolerance = 0.1f;
/** 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;
/** 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;
/** 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;
/** If true, normals are recomputed per-group, with hard edges at group boundaries */
UPROPERTY(EditAnywhere, Category = Output)
bool bCalculateNormals = false;
/** Display each group with a different auto-generated color */
UPROPERTY(EditAnywhere, Category = Display)
bool bShowGroupColors = true;
};
UCLASS()
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsOperatorFactory : public UObject, public UE::Geometry::IDynamicMeshOperatorFactory
{
GENERATED_BODY()
public:
// IDynamicMeshOperatorFactory API
virtual TUniquePtr<UE::Geometry::FDynamicMeshOperator> MakeNewOperator() override;
UPROPERTY()
TObjectPtr<UConvertToPolygonsTool> ConvertToPolygonsTool; // back pointer
};
/**
*
*/
UCLASS()
class MESHMODELINGTOOLSEXP_API UConvertToPolygonsTool : public USingleSelectionMeshEditingTool
{
GENERATED_BODY()
public:
UConvertToPolygonsTool();
virtual void Setup() override;
virtual void OnShutdown(EToolShutdownType ShutdownType) override;
virtual void OnTick(float DeltaTime) override;
virtual bool HasCancel() const override { return true; }
virtual bool HasAccept() const override { return true; }
virtual bool CanAccept() const override;
// update parameters in ConvertToPolygonsOp based on current Settings
void UpdateOpParameters(FConvertToPolygonsOp& ConvertToPolygonsOp) const;
protected:
void OnSettingsModified();
protected:
UPROPERTY()
TObjectPtr<UConvertToPolygonsToolProperties> Settings;
UPROPERTY()
TObjectPtr<UMeshOpPreviewWithBackgroundCompute> PreviewCompute = nullptr;
UPROPERTY()
TObjectPtr<UPreviewGeometry> PreviewGeometry = nullptr;
protected:
TSharedPtr<UE::Geometry::FDynamicMesh3, ESPMode::ThreadSafe> OriginalDynamicMesh;
// for visualization
TArray<int> PolygonEdges;
void UpdateVisualization();
};