Files
UnrealEngine/Engine/Plugins/Experimental/MeshResizing/Source/MeshResizingNodes/Private/MeshResizing/BaseBodyDataflowNodes.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

195 lines
6.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Dataflow/DataflowEngine.h"
#include "DynamicMesh/DynamicMesh3.h"
#include "DynamicMeshProcessor.h"
#include "BaseBodyDataflowNodes.generated.h"
class USkeletalMesh;
class UDynamicMesh;
class UMaterialInterface;
/**
*
* Converts a SkeletalMesh into a DynamicMesh with Imported Vertex information
*
*/
USTRUCT(meta = (MeshResizing, Experimental))
struct FSkeletalMeshToMeshDataflowNode final : public FDataflowNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FSkeletalMeshToMeshDataflowNode, "SkeletalMeshToMesh", "Mesh|Utilities", "")
DATAFLOW_NODE_RENDER_TYPE("SurfaceRender",FName("FDynamicMesh3"), {"Mesh", "MaterialArray"})
public:
/** SkeletalMesh to convert */
UPROPERTY(EditAnywhere, Category = "SkeletalMesh", meta = (DataflowInput));
TObjectPtr<const USkeletalMesh> SkeletalMesh;
/** Output mesh */
UPROPERTY(meta = (DataflowOutput))
TObjectPtr<UDynamicMesh> Mesh;
/** Output materials */
UPROPERTY(meta = (DataflowOutput))
TArray<TObjectPtr<UMaterialInterface>> MaterialArray;
FSkeletalMeshToMeshDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid())
: FDataflowNode(InParam, InGuid)
{
RegisterInputConnection(&SkeletalMesh);
RegisterOutputConnection(&Mesh);
RegisterOutputConnection(&MaterialArray);
}
private:
virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const override;
/** Specifies the LOD level to use */
UPROPERTY(EditAnywhere, Category = "SkeletalMesh", meta = (DisplayName = "LOD Level"));
int32 LODLevel = 0;
#if WITH_EDITORONLY_DATA
/** Generate from the SkeletalMeshLODModel (vertex order will match SKM vertex order). Record ImportedVertices (if available) as NonManifold mapping data. This requires Editor-Only data.*/
UPROPERTY(EditAnywhere, Category = "SkeletalMesh")
bool bRecordImportedVertices = true;
/** Generate from mesh description (vertex order will match mesh description / ImportedVertices). Requires Editor-Only data.*/
UPROPERTY(EditAnywhere, Category = "SkeletalMesh", meta = (EditCondition = "!bRecordImportedVertices"))
bool bUseMeshDescription = false;
#endif
};
/**
*
* Generate a pair of Dynamic Meshes with the same topology that can be interpolated.
*
* Currently, this node relies on the vertex mapping data existing on the input source and target meshes,
* and that the mapped vertices on both meshes match.
*/
USTRUCT(meta = (MeshResizing, Experimental))
struct FGenerateResizableProxyDataflowNode final : public FDataflowNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FGenerateResizableProxyDataflowNode, "GenerateResizableProxy", "MeshResizing", "")
DATAFLOW_NODE_RENDER_TYPE("SurfaceRender",FName("FDynamicMesh3"), {"TargetProxyMesh", "ProxyMaterialArray"})
public:
/** Source mesh */
UPROPERTY(meta = (DataflowInput))
TObjectPtr<UDynamicMesh> SourceMesh;
/** Source materials.*/
UPROPERTY(meta = (DataflowInput))
TArray<TObjectPtr<UMaterialInterface>> SourceMaterialArray;
/** Target mesh */
UPROPERTY(meta = (DataflowInput))
TObjectPtr<UDynamicMesh> TargetMesh;
/** Output source proxy mesh */
UPROPERTY(meta = (DataflowOutput, DataflowPassthrough = "SourceMesh"))
TObjectPtr<UDynamicMesh> SourceProxyMesh;
/** Output source proxy mesh */
UPROPERTY(meta = (DataflowOutput, DataflowPassthrough = "SourceMesh"))
TObjectPtr<UDynamicMesh> TargetProxyMesh;
/** Target materials.*/
UPROPERTY(meta = (DataflowOutput, DataflowPassthrough = "SourceMaterialArray"))
TArray<TObjectPtr<UMaterialInterface>> ProxyMaterialArray;
FGenerateResizableProxyDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid())
: FDataflowNode(InParam, InGuid)
{
RegisterInputConnection(&SourceMesh);
RegisterInputConnection(&SourceMaterialArray);
RegisterInputConnection(&TargetMesh);
RegisterOutputConnection(&SourceProxyMesh, &SourceMesh);
RegisterOutputConnection(&TargetProxyMesh, &SourceMesh);
RegisterOutputConnection(&ProxyMaterialArray, &SourceMaterialArray);
}
private:
/** Source vertex mapping data. TODO: only have two choices that work currently. Make this an enum or something */
UPROPERTY(EditAnywhere, Category = "Resizable Proxy")
FString SourceMappingData = "ImportedVertexVIDsAttr";
/** Target vertex mapping data. TODO: only have two choices that work currently. Make this an enum or something */
UPROPERTY(EditAnywhere, Category = "Resizable Proxy")
FString TargetMappingData = "ImportedVertexVIDsAttr";
virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const override;
};
/**
*
* Generate a pair of Dynamic Meshes with the same topology that can be interpolated.
*
* Currently, this node relies on the vertex mapping data existing on the input source and target meshes,
* and that the mapped vertices on both meshes match.
*/
USTRUCT(meta = (MeshResizing, Experimental))
struct FGenerateInterpolatedProxyDataflowNode final : public FDataflowNode
{
GENERATED_USTRUCT_BODY()
DATAFLOW_NODE_DEFINE_INTERNAL(FGenerateInterpolatedProxyDataflowNode, "GenerateInterpolatedProxy", "MeshResizing", "")
DATAFLOW_NODE_RENDER_TYPE("SurfaceRender", FName("FDynamicMesh3"), { "ProxyMesh", "ProxyMaterialArray" })
public:
/** Source mesh */
UPROPERTY(meta = (DataflowInput))
TObjectPtr<UDynamicMesh> SourceMesh;
/** Source materials.*/
UPROPERTY(meta = (DataflowInput))
TArray<TObjectPtr<UMaterialInterface>> SourceMaterialArray;
/** Target mesh */
UPROPERTY(meta = (DataflowInput))
TObjectPtr<UDynamicMesh> TargetMesh;
/** Output proxy mesh */
UPROPERTY(meta = (DataflowOutput, DataflowPassthrough = "SourceMesh"))
TObjectPtr<UDynamicMesh> ProxyMesh;
/** Proxy materials.*/
UPROPERTY(meta = (DataflowOutput, DataflowPassthrough = "SourceMaterialArray"))
TArray<TObjectPtr<UMaterialInterface>> ProxyMaterialArray;
FGenerateInterpolatedProxyDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid = FGuid::NewGuid())
: FDataflowNode(InParam, InGuid)
{
RegisterInputConnection(&SourceMesh);
RegisterInputConnection(&SourceMaterialArray);
RegisterInputConnection(&TargetMesh);
RegisterOutputConnection(&ProxyMesh, &SourceMesh);
RegisterOutputConnection(&ProxyMaterialArray, &SourceMaterialArray);
}
private:
/** Alpha between source (0) and target (1) */
UPROPERTY(EditAnywhere, Category = "Interpolate Proxy", meta = (ClampMin = "0", ClampMax = "1"))
float BlendAlpha = 1.f;
virtual void Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const override;
};
namespace UE::MeshResizing
{
void RegisterBaseBodyDataflowNodes();
}