// Copyright Epic Games, Inc. All Rights Reserved. #include "Dataflow/GeometryCollectionStaticMeshToCollectionNode.h" #include "Dataflow/DataflowCore.h" #include "Engine/StaticMesh.h" #include "Materials/MaterialInterface.h" #include "Materials/Material.h" #include "GeometryCollection/GeometryCollection.h" #include "GeometryCollection/GeometryCollectionEngineConversion.h" #include "GeometryCollection/GeometryCollectionObject.h" #include "GeometryCollection/ManagedArrayCollection.h" #include "GeometryCollection/Facades/CollectionTransformFacade.h" namespace UE::Dataflow { void RegisterGeometryStaticMeshToCollectionNodes() { DATAFLOW_NODE_REGISTER_CREATION_FACTORY(FStaticMeshToCollectionDataflowNode_v2); // Deprecated nodes (Need to stay registered) DATAFLOW_NODE_REGISTER_CREATION_FACTORY(FStaticMeshToCollectionDataflowNode); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// FStaticMeshToCollectionDataflowNode_v2::FStaticMeshToCollectionDataflowNode_v2(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&StaticMesh); RegisterInputConnection(&MeshTransform); RegisterOutputConnection(&Collection); RegisterOutputConnection(&Materials); RegisterOutputConnection(&InstancedMeshes); RegisterOutputConnection(&RootProxyMeshes); } void FStaticMeshToCollectionDataflowNode_v2::Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const { ensure(Out->IsA(&Collection) || Out->IsA(&Materials) || Out->IsA(&InstancedMeshes) || Out->IsA(&RootProxyMeshes)); FManagedArrayCollection OutCollection; TArray> OutMaterials; TArray OutInstancedMeshes; TArray OutRootProxyMeshes; TObjectPtr StaticMeshVal = GetValue(Context, &StaticMesh, StaticMesh); const FTransform& InMeshTransform = GetValue(Context, &MeshTransform, MeshTransform); if (StaticMeshVal) { FGeometryCollectionEngineConversion::ConvertStaticMeshToGeometryCollection(StaticMeshVal, InMeshTransform, OutCollection, OutMaterials, OutInstancedMeshes, bSetInternalFromMaterialIndex, bSplitComponents); FDataflowRootProxyMesh RootProxyMesh; RootProxyMesh.Mesh = StaticMeshVal; RootProxyMesh.Transform = InMeshTransform; OutRootProxyMeshes.Add(RootProxyMesh); } // Set Outputs SetValue(Context, MoveTemp(OutCollection), &Collection); SetValue(Context, MoveTemp(OutMaterials), &Materials); SetValue(Context, MoveTemp(OutInstancedMeshes), &InstancedMeshes); SetValue(Context, MoveTemp(OutRootProxyMeshes), &RootProxyMeshes); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Deprecated version FStaticMeshToCollectionDataflowNode::FStaticMeshToCollectionDataflowNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid) : FDataflowNode(InParam, InGuid) { RegisterInputConnection(&StaticMesh); RegisterInputConnection(&MeshTransform); RegisterOutputConnection(&Collection); RegisterOutputConnection(&Materials); RegisterOutputConnection(&MaterialInstances); RegisterOutputConnection(&InstancedMeshes); } void FStaticMeshToCollectionDataflowNode::Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const { ensure(Out->IsA(&Collection) || Out->IsA(&Materials) || Out->IsA(&MaterialInstances) || Out->IsA(&InstancedMeshes)); FManagedArrayCollection OutCollection; TArray> OutMaterialInstances; TArray OutInstancedMeshes; TObjectPtr StaticMeshVal = GetValue(Context, &StaticMesh, StaticMesh); const FTransform& InMeshTransform = GetValue(Context, &MeshTransform, MeshTransform); if (StaticMeshVal) { FGeometryCollectionEngineConversion::ConvertStaticMeshToGeometryCollection(StaticMeshVal, InMeshTransform, OutCollection, OutMaterialInstances, OutInstancedMeshes, bSetInternalFromMaterialIndex, bSplitComponents); } TArray> OutMaterials; FGeometryCollectionEngineConversion::GetMaterialsFromInstances(OutMaterialInstances, OutMaterials); // Set Outputs SetValue(Context, MoveTemp(OutCollection), &Collection); SetValue(Context, MoveTemp(OutMaterials), &Materials); SetValue(Context, MoveTemp(OutMaterialInstances), &MaterialInstances); SetValue(Context, MoveTemp(OutInstancedMeshes), &InstancedMeshes); }