2020-08-11 01:36:57 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "RemeshMeshTool.h"
|
|
|
|
|
#include "ToolBuilderUtil.h"
|
|
|
|
|
#include "ProjectToTargetTool.generated.h"
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Determine if/how we can build UProjectToTargetTool. It requires two selected mesh components.
|
|
|
|
|
*/
|
|
|
|
|
UCLASS()
|
2021-11-23 09:42:40 -05:00
|
|
|
class MESHMODELINGTOOLSEXP_API UProjectToTargetToolBuilder : public UMultiSelectionMeshEditingToolBuilder
|
2020-08-11 01:36:57 -04:00
|
|
|
{
|
|
|
|
|
GENERATED_BODY()
|
|
|
|
|
public:
|
|
|
|
|
virtual bool CanBuildTool(const FToolBuilderState& SceneState) const override;
|
2021-11-23 09:42:40 -05:00
|
|
|
virtual UMultiSelectionMeshEditingTool* CreateNewTool(const FToolBuilderState& SceneState) const override;
|
2020-08-11 01:36:57 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Subclass URemeshMeshToolProperties just so we can set default values for some properties. Setting these values in the
|
|
|
|
|
* Setup function of UProjectToTargetTool turns out to be tricky to achieve with the property cache.
|
|
|
|
|
*/
|
|
|
|
|
UCLASS()
|
2021-07-29 20:08:48 -04:00
|
|
|
class MESHMODELINGTOOLSEXP_API UProjectToTargetToolProperties : public URemeshMeshToolProperties
|
2020-08-11 01:36:57 -04:00
|
|
|
{
|
|
|
|
|
GENERATED_BODY()
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
2021-05-07 12:01:34 -04:00
|
|
|
UPROPERTY(EditAnywhere, Category = ProjectionSpace)
|
|
|
|
|
bool bWorldSpace = true;
|
|
|
|
|
|
2021-05-17 17:27:58 -04:00
|
|
|
UPROPERTY(EditAnywhere, Category = Remeshing)
|
|
|
|
|
bool bParallel = true;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(EditAnywhere, Category = NormalFlow, meta = (EditCondition = "RemeshType == ERemeshType::NormalFlow", UIMin = "0", UIMax = "100", ClampMin = "0", ClampMax = "100"))
|
|
|
|
|
int FaceProjectionPassesPerRemeshIteration = 1;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(EditAnywhere, Category = NormalFlow, meta = (EditCondition = "RemeshType == ERemeshType::NormalFlow", UIMin = "0", UIMax = "1.0", ClampMin = "0", ClampMax = "10.0"))
|
|
|
|
|
float SurfaceProjectionSpeed = 0.2f;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(EditAnywhere, Category = NormalFlow, meta = (EditCondition = "RemeshType == ERemeshType::NormalFlow", UIMin = "0", UIMax = "1.0", ClampMin = "0", ClampMax = "10.0"))
|
|
|
|
|
float NormalAlignmentSpeed = 0.2f;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(EditAnywhere, Category = NormalFlow, meta = (EditCondition = "RemeshType == ERemeshType::NormalFlow"))
|
|
|
|
|
bool bSmoothInFillAreas = true;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(EditAnywhere, Category = NormalFlow, meta = (EditCondition = "RemeshType == ERemeshType::NormalFlow", UIMin = "0", UIMax = "1.0", ClampMin = "0", ClampMax = "10.0"))
|
|
|
|
|
float FillAreaDistanceMultiplier = 0.25f;
|
|
|
|
|
|
|
|
|
|
UPROPERTY(EditAnywhere, Category = NormalFlow, meta = (EditCondition = "RemeshType == ERemeshType::NormalFlow", UIMin = "0", UIMax = "1.0", ClampMin = "0", ClampMax = "10.0"))
|
|
|
|
|
float FillAreaSmoothMultiplier = 0.25f;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UProjectToTargetToolProperties()
|
|
|
|
|
: URemeshMeshToolProperties()
|
2020-08-11 01:36:57 -04:00
|
|
|
{
|
|
|
|
|
bPreserveSharpEdges = false;
|
|
|
|
|
RemeshType = ERemeshType::NormalFlow;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Project one mesh surface onto another, while undergoing remeshing. Subclass of URemeshMeshTool to avoid duplication.
|
|
|
|
|
*/
|
|
|
|
|
UCLASS()
|
2021-07-29 20:08:48 -04:00
|
|
|
class MESHMODELINGTOOLSEXP_API UProjectToTargetTool : public URemeshMeshTool
|
2020-08-11 01:36:57 -04:00
|
|
|
{
|
|
|
|
|
GENERATED_BODY()
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
UProjectToTargetTool(const FObjectInitializer& ObjectInitializer) :
|
|
|
|
|
Super(ObjectInitializer.SetDefaultSubobjectClass<UProjectToTargetToolProperties>(TEXT("RemeshProperties")))
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
virtual void Setup() override;
|
|
|
|
|
|
2021-03-09 19:33:56 -04:00
|
|
|
virtual TUniquePtr<UE::Geometry::FDynamicMeshOperator> MakeNewOperator() override;
|
2020-08-11 01:36:57 -04:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
2021-03-09 19:33:56 -04:00
|
|
|
TUniquePtr<UE::Geometry::FDynamicMesh3> ProjectionTarget;
|
|
|
|
|
TUniquePtr<UE::Geometry::FDynamicMeshAABBTree3> ProjectionTargetSpatial;
|
2020-08-11 01:36:57 -04:00
|
|
|
|
|
|
|
|
};
|