Files
UnrealEngineUWP/Engine/Plugins/Experimental/MeshModelingToolset/Source/MeshModelingTools/Public/ConvertToPolygonsTool.h
lonnie li 71d5092007 ModelingTools: Refactor SingleSelectionTool to ToolTargets (pt.2)
#rb ryan.schmidt jimmy.andrews
#jira none
#rnx
#preflight 605a54c0e8944a0001585162

[CL 15799514 by lonnie li in ue5-main branch]
2021-03-24 11:11:02 -04:00

130 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "SingleSelectionTool.h"
#include "InteractiveToolBuilder.h"
#include "DynamicMesh3.h"
#include "FindPolygonsAlgorithm.h"
#include "PreviewMesh.h"
#include "ModelingOperators.h"
#include "MeshOpPreviewHelpers.h"
#include "BaseTools/SingleSelectionMeshEditingTool.h"
#include "ConvertToPolygonsTool.generated.h"
// predeclaration
class UConvertToPolygonsTool;
class FConvertToPolygonsOp;
/**
*
*/
UCLASS()
class MESHMODELINGTOOLS_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 Connected Triangles */
FromConnectedTris UMETA(DisplayName = "From Connected Tris")
};
UCLASS()
class MESHMODELINGTOOLS_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 = "20.0", ClampMin = "0.0", ClampMax = "90.0", EditCondition = "ConversionMode == EConvertToPolygonsMode::FaceNormalDeviation", EditConditionHides))
float AngleTolerance = 0.1f;
/** If true, normals are recomputed per-group, with hard edges at group boundaries */
UPROPERTY(EditAnywhere, Category = PolyGroups, meta = (EditCondition = "ConversionMode == EConvertToPolygonsMode::FaceNormalDeviation", EditConditionHides))
bool bCalculateNormals = true;
/** Display each group with a different auto-generated color */
UPROPERTY(EditAnywhere, Category = Display)
bool bShowGroupColors = true;
};
UCLASS()
class MESHMODELINGTOOLS_API UConvertToPolygonsOperatorFactory : public UObject, public UE::Geometry::IDynamicMeshOperatorFactory
{
GENERATED_BODY()
public:
// IDynamicMeshOperatorFactory API
virtual TUniquePtr<UE::Geometry::FDynamicMeshOperator> MakeNewOperator() override;
UPROPERTY()
UConvertToPolygonsTool* ConvertToPolygonsTool; // back pointer
};
/**
*
*/
UCLASS()
class MESHMODELINGTOOLS_API UConvertToPolygonsTool : public USingleSelectionMeshEditingTool
{
GENERATED_BODY()
public:
UConvertToPolygonsTool();
virtual void Setup() override;
virtual void Shutdown(EToolShutdownType ShutdownType) override;
virtual void Render(IToolsContextRenderAPI* RenderAPI) 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()
UConvertToPolygonsToolProperties* Settings;
UPROPERTY()
UMeshOpPreviewWithBackgroundCompute* PreviewWithBackgroundCompute = nullptr;
protected:
TSharedPtr<UE::Geometry::FDynamicMesh3, ESPMode::ThreadSafe> OriginalDynamicMesh;
// for visualization
TArray<int> PolygonEdges;
void UpdateVisualization();
void GenerateAsset(const FDynamicMeshOpResult& Result);
};