Files
UnrealEngine/Engine/Plugins/Experimental/GeometryCollectionPlugin/Source/GeometryCollectionNodes/Public/Dataflow/GeometryCollectionUVNodes.h
2025-05-18 13:04:45 +08:00

170 lines
6.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Dataflow/DataflowEngine.h"
#include "Dataflow/DataflowSelection.h"
#include "GeometryCollection/ManagedArrayCollection.h"
#include "GeometryCollectionUVNodes.generated.h"
/*
* Add a new UV channel to the collection
* note that there's a maximum of 8 channels that can be handled by a collection
*/
USTRUCT()
struct FAddUVChannelDataflowNode : public FDataflowNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FAddUVChannelDataflowNode, "AddUVChannel", "GeometryCollection|UV", "")
DATAFLOW_NODE_RENDER_TYPE("SurfaceRender", FGeometryCollection::StaticType(), "Collection", "UVChannel")
private:
/** Target Collection */
UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection", DataflowIntrinsic))
FManagedArrayCollection Collection;
/** Index of the added UV channel */
UPROPERTY(meta = (DataflowOutput))
int32 UVChannel = 0;
/** Value to initialize the UV with */
UPROPERTY(EditAnywhere, Category = Options)
FVector2f DefaultValue = { 0, 0 };
virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const override;
public:
FAddUVChannelDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid());
};
/**
* Auto unwrap UVs for a specific UV channel
*/
USTRUCT()
struct FAutoUnwrapUVDataflowNode : public FDataflowNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FAutoUnwrapUVDataflowNode, "AutoUnwrapUV", "GeometryCollection|UV", "")
DATAFLOW_NODE_RENDER_TYPE("SurfaceRender", FGeometryCollection::StaticType(), "Collection", "UVChannel")
private:
/** Target Collection */
UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection", DataflowIntrinsic))
FManagedArrayCollection Collection;
/** Faces to auto unwrap, no selection means all faces */
UPROPERTY(meta = (DataflowInput))
FDataflowFaceSelection FaceSelection;
/** UV channel to unwrap into ( 0 by default ) */
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "UVChannel", ClampMin = 0, ClampMax = 7, UIMin = 0, UIMax = 7))
int32 UVChannel = 0;
/** Approximate space to leave between UV islands, measured in texels for 512x512 texture */
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput, ClampMin = 1, UIMin = 1))
int32 GutterSize = 1;
virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const override;
public:
FAutoUnwrapUVDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid());
};
/**
* Merge adjacent UV Islands with similar normals for a specific UV channel
*/
USTRUCT()
struct FMergeUVIslandsDataflowNode : public FDataflowNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FMergeUVIslandsDataflowNode, "MergeUVIslands", "GeometryCollection|UV", "")
DATAFLOW_NODE_RENDER_TYPE("SurfaceRender", FGeometryCollection::StaticType(), "Collection", "UVChannel")
private:
/** Target Collection */
UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection", DataflowIntrinsic))
FManagedArrayCollection Collection;
/** Faces to auto unwrap, no selection means all faces */
UPROPERTY(meta = (DataflowInput))
FDataflowFaceSelection FaceSelection;
/** UV channel to unwrap into ( 0 by default ) */
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "UVChannel", ClampMin = 0, ClampMax = 7, UIMin = 0, UIMax = 7))
int32 UVChannel = 0;
// Threshold for allowed area distortion from merging islands (when we use ExpMap to compute new UVs for the merged island)
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput, ClampMin = 0, ClampMax = 10, UIMin = 0, UIMax = 10))
double AreaDistortionThreshold = 1.5;
// Threshold for allowed normal deviation between merge-able islands
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput, ClampMin = 0, ClampMax = 180, UIMin = 0, UIMax = 90))
double MaxNormalDeviationDeg = 45.0;
// Amount of normal smoothing to apply when computing new UVs for merged islands. More smoothing will result in UV maps that are less sensitive to local surface shape.
UPROPERTY(EditAnywhere, Category = Options, AdvancedDisplay, meta = (DataflowInput, ClampMin = 0, ClampMax = 500, UIMin = 0, UIMax = 100))
int32 NormalSmoothingRounds = 0;
// Strength of normal smoothing to apply when computing new UVs for merged islands. Stronger smoothing will result in UV maps that are less sensitive to local surface shape.
UPROPERTY(EditAnywhere, Category = Options, AdvancedDisplay, meta = (DataflowInput, ClampMin = 0, ClampMax = 1, UIMin = 0, UIMax = 1))
double NormalSmoothingAlpha = 0.25;
virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const override;
public:
FMergeUVIslandsDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid());
};
/**
* Generates UVs using a box projection
*/
USTRUCT()
struct FBoxProjectUVDataflowNode : public FDataflowNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FBoxProjectUVDataflowNode, "BoxProjectUV", "GeometryCollection|UV", "")
DATAFLOW_NODE_RENDER_TYPE("SurfaceRender", FGeometryCollection::StaticType(), "Collection", "UVChannel")
private:
/** Target Collection */
UPROPERTY(meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "Collection", DataflowIntrinsic))
FManagedArrayCollection Collection;
/** Faces to auto unwrap, no selection means all faces */
//UPROPERTY(meta = (DataflowInput))
//FDataflowFaceSelection FaceSelection;
/** UV channel to unwrap into ( 0 by default ) */
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput, DataflowOutput, DataflowPassthrough = "UVChannel", ClampMin = 0, ClampMax = 7, UIMin = 0, UIMax = 7))
int32 UVChannel = 0;
/** Approximate space to leave between UV islands, measured in texels for 512x512 texture */
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput, ClampMin = 1, UIMin = 1))
int32 GutterSize = 1;
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput))
FVector ProjectionScale = { 100, 100, 100 };
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput))
FVector2f UVOffset = { 0.5, 0.5 };
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput))
bool bAutoFitToBounds = false;
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput))
bool bCenterBoxAtPivot = false;
UPROPERTY(EditAnywhere, Category = Options, meta = (DataflowInput))
bool bUniformProjectionScale = false;
virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const override;
public:
FBoxProjectUVDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid());
};
namespace UE::Dataflow
{
void RegisterGeometryCollectionUVNodes();
}