2020-05-22 23:46:09 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2022-06-02 10:50:07 -04:00
|
|
|
#include "Internationalization/Text.h"
|
2021-05-28 14:09:45 -04:00
|
|
|
#include "MetasoundBuildError.h"
|
2020-07-20 00:05:22 -04:00
|
|
|
#include "MetasoundBuilderInterface.h"
|
2023-04-05 17:38:47 -04:00
|
|
|
#include "MetasoundExecutableOperator.h"
|
2022-06-02 10:50:07 -04:00
|
|
|
#include "MetasoundFrontendDataTypeTraits.h"
|
2020-05-22 23:46:09 -04:00
|
|
|
#include "MetasoundNodeInterface.h"
|
2022-06-02 10:50:07 -04:00
|
|
|
#include "MetasoundNodeRegistrationMacro.h"
|
2020-07-22 14:52:03 -04:00
|
|
|
#include "MetasoundOperatorInterface.h"
|
2020-08-24 10:57:03 -04:00
|
|
|
#include "MetasoundNode.h"
|
2021-09-13 14:13:39 -04:00
|
|
|
#include "MetasoundVertex.h"
|
2022-06-02 10:50:07 -04:00
|
|
|
#include "Templates/SharedPointer.h"
|
|
|
|
|
#include "UObject/NameTypes.h"
|
2020-07-22 14:52:03 -04:00
|
|
|
|
|
|
|
|
#define LOCTEXT_NAMESPACE "MetasoundGraphCore"
|
2020-05-22 23:46:09 -04:00
|
|
|
|
|
|
|
|
namespace Metasound
|
|
|
|
|
{
|
2021-05-28 14:09:45 -04:00
|
|
|
/** FMissingOutputNodeInputReferenceError
|
|
|
|
|
*
|
|
|
|
|
* Caused by Output not being able to generate an IOperator instance due to
|
|
|
|
|
* the type requiring an input reference (i.e. it is not default constructable).
|
|
|
|
|
*/
|
|
|
|
|
class FMissingOutputNodeInputReferenceError : public FBuildErrorBase
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FMissingOutputNodeInputReferenceError(const INode& InNode, const FText& InDataType)
|
|
|
|
|
: FBuildErrorBase(
|
2024-09-03 21:59:17 -04:00
|
|
|
"MetasoundMissingOutputDataReferenceForTypeError",
|
|
|
|
|
METASOUND_LOCTEXT_FORMAT("MissingOutputNodeInputReferenceForTypeError", "Missing required output node input reference for type {0}.", InDataType))
|
2021-05-28 14:09:45 -04:00
|
|
|
{
|
|
|
|
|
AddNode(InNode);
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-07 15:36:39 -05:00
|
|
|
FMissingOutputNodeInputReferenceError(const INode& InNode)
|
|
|
|
|
: FBuildErrorBase(
|
|
|
|
|
"MetasoundMissingOutputDataReferenceError",
|
|
|
|
|
METASOUND_LOCTEXT("MissingOutputNodeInputReferenceError", "Missing required output node input reference."))
|
|
|
|
|
{
|
|
|
|
|
AddNode(InNode);
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-28 14:09:45 -04:00
|
|
|
virtual ~FMissingOutputNodeInputReferenceError() = default;
|
|
|
|
|
};
|
|
|
|
|
|
2022-06-02 10:50:07 -04:00
|
|
|
namespace OutputNodePrivate
|
2020-05-22 23:46:09 -04:00
|
|
|
{
|
2023-04-05 17:38:47 -04:00
|
|
|
class METASOUNDFRONTEND_API FOutputOperator : public FNoOpOperator
|
2020-07-22 14:52:03 -04:00
|
|
|
{
|
|
|
|
|
public:
|
2022-06-02 10:50:07 -04:00
|
|
|
FOutputOperator(const FVertexName& InVertexName, const FAnyDataReference& InDataReference);
|
|
|
|
|
virtual ~FOutputOperator() = default;
|
2020-07-22 14:52:03 -04:00
|
|
|
|
2022-06-02 10:50:07 -04:00
|
|
|
virtual FDataReferenceCollection GetInputs() const override;
|
|
|
|
|
virtual FDataReferenceCollection GetOutputs() const override;
|
2023-05-16 16:02:58 -04:00
|
|
|
virtual void BindInputs(FInputVertexInterfaceData& InVertexData) override;
|
|
|
|
|
virtual void BindOutputs(FOutputVertexInterfaceData& InVertexData) override;
|
2020-07-22 14:52:03 -04:00
|
|
|
|
|
|
|
|
private:
|
2022-06-02 10:50:07 -04:00
|
|
|
FVertexName VertexName;
|
|
|
|
|
FAnyDataReference DataReference;
|
2020-07-22 14:52:03 -04:00
|
|
|
};
|
2023-03-07 15:36:39 -05:00
|
|
|
|
|
|
|
|
class METASOUNDFRONTEND_API FOutputNode : public FNode
|
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
|
|
class FOutputOperatorFactory : public IOperatorFactory
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
FOutputOperatorFactory(const FVertexName& InVertexName, const FName& InDataTypeName, EVertexAccessType InVertexAccessType);
|
|
|
|
|
virtual TUniquePtr<IOperator> CreateOperator(const FBuildOperatorParams& InParams, FBuildResults& OutResults) override;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
FVertexName VertexName;
|
|
|
|
|
FName DataTypeName;
|
|
|
|
|
EVertexAccessType VertexAccessType;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static FName GetVariantName(EVertexAccessType InVertexAccessType);
|
|
|
|
|
static FVertexInterface GetVertexInterface(const FVertexName& InVertexName, const FName& InDataTypeName, EVertexAccessType InVertexAccessType);
|
|
|
|
|
static FNodeClassMetadata GetNodeInfo(const FVertexName& InVertexName, const FName& InDataTypeName, EVertexAccessType InVertexAccessType);
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
FOutputNode(const FName& InInstanceName, const FGuid& InInstanceID, const FVertexName& InVertexName, const FName& InDataType, EVertexAccessType InVertexAccessType);
|
|
|
|
|
|
|
|
|
|
/** Return the current vertex interface. */
|
|
|
|
|
virtual const FVertexInterface& GetVertexInterface() const override;
|
|
|
|
|
|
|
|
|
|
/** Set the vertex interface. If the vertex was successfully changed, returns true.
|
|
|
|
|
*
|
|
|
|
|
* @param InInterface - New interface for node.
|
|
|
|
|
*
|
|
|
|
|
* @return True on success, false otherwise.
|
|
|
|
|
*/
|
|
|
|
|
virtual bool SetVertexInterface(const FVertexInterface& InInterface) override;
|
|
|
|
|
|
|
|
|
|
/** Expresses whether a specific vertex interface is supported.
|
|
|
|
|
*
|
|
|
|
|
* @param InInterface - New interface.
|
|
|
|
|
*
|
|
|
|
|
* @return True if the interface is supported, false otherwise.
|
|
|
|
|
*/
|
|
|
|
|
virtual bool IsVertexInterfaceSupported(const FVertexInterface& InInterface) const;
|
|
|
|
|
|
|
|
|
|
virtual TSharedRef<IOperatorFactory, ESPMode::ThreadSafe> GetDefaultOperatorFactory() const override;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
TSharedRef<FOutputOperatorFactory, ESPMode::ThreadSafe> Factory;
|
|
|
|
|
};
|
2022-06-02 10:50:07 -04:00
|
|
|
}
|
|
|
|
|
|
2023-03-07 15:36:39 -05:00
|
|
|
/** Output nodes are used to expose graph data to external entities. */
|
2022-06-02 10:50:07 -04:00
|
|
|
template<typename DataType, EVertexAccessType VertexAccess=EVertexAccessType::Reference>
|
2023-03-07 15:36:39 -05:00
|
|
|
class TOutputNode : public OutputNodePrivate::FOutputNode
|
2022-06-02 10:50:07 -04:00
|
|
|
{
|
2023-03-07 15:36:39 -05:00
|
|
|
public:
|
|
|
|
|
TOutputNode(const FVertexName& InInstanceName, const FGuid& InInstanceID, const FVertexName& InVertexName)
|
|
|
|
|
: FOutputNode(InInstanceName, InInstanceID, InVertexName, GetMetasoundDataTypeName<DataType>(), VertexAccess)
|
2022-06-02 10:50:07 -04:00
|
|
|
{
|
|
|
|
|
}
|
2020-05-22 23:46:09 -04:00
|
|
|
};
|
|
|
|
|
}
|
2020-07-22 14:52:03 -04:00
|
|
|
#undef LOCTEXT_NAMESPACE // MetasoundOutputNode
|