Files
UnrealEngineUWP/Engine/Plugins/Runtime/Metasound/Source/MetasoundFrontend/Public/MetasoundOutputNode.h
rob gay e26ac0345b - Migrate MetaSound InputLiterals to DefaultLiterals housed on FrontendNodes
- Add FrontendGraphBuilder support for generating VariableNodes for DefaultLiterals if no connection is provided on External/Output nodes
- Move node names to be guids (they're never seen by the user and this will be easier to migrate later)
- Fix DisplayName logic to be unique against one another SEPARATELY from node name logic
- Fix for MetaSounds not compiling if trigger outputs do not have input connected
- MetaSound Document Transform Support
- Fix for for MetaSound Generators not stopping source if failed to create generator due to build errors
#rb phil.popp
#jira UE-112951
#jira UE-116172
#jira UE-116174
#jira UE-116176
#jira UE-116178
#preflight 60b11e7b7e4e6a0001b81c21
#preflight 60b1292d072a1d000164b470

#ROBOMERGE-SOURCE: CL 16502735 in //UE5/Private-Frosty/...
#ROBOMERGE-BOT: STARSHIP (Private-Frosty -> Main) (v826-16501804)

[CL 16502750 by rob gay in ue5-main branch]
2021-05-28 14:09:45 -04:00

180 lines
5.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "MetasoundBuildError.h"
#include "MetasoundBuilderInterface.h"
#include "MetasoundNodeInterface.h"
#include "MetasoundOperatorInterface.h"
#include "MetasoundNode.h"
#define LOCTEXT_NAMESPACE "MetasoundGraphCore"
namespace Metasound
{
/** 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(
"MetasoundMissingOutputDataReferenceError",
FText::Format(LOCTEXT("MissingOutputNodeInputReferenceError", "Missing required output node input reference for type {0}."), InDataType))
{
AddNode(InNode);
}
virtual ~FMissingOutputNodeInputReferenceError() = default;
};
template<typename DataType>
class TOutputNode : public FNode
{
class FOutputOperator : public IOperator
{
public:
using FDataReadReference = TDataReadReference<DataType>;
FOutputOperator(const FString& InDataReferenceName, FDataReadReference InDataReference)
{
Outputs.AddDataReadReference<DataType>(InDataReferenceName, InDataReference);
}
virtual ~FOutputOperator() {}
virtual FDataReferenceCollection GetInputs() const override
{
return {};
}
virtual FDataReferenceCollection GetOutputs() const override
{
return Outputs;
}
virtual FExecuteFunction GetExecuteFunction() override
{
return nullptr;
}
private:
FDataReferenceCollection Outputs;
};
class FOutputOperatorFactory : public IOperatorFactory
{
public:
FOutputOperatorFactory(const FString& InDataReferenceName)
: DataReferenceName(InDataReferenceName)
{
}
virtual TUniquePtr<IOperator> CreateOperator(const FCreateOperatorParams& InParams, FBuildErrorArray& OutErrors) override
{
const bool bContainsRef = InParams.InputDataReferences.ContainsDataReadReference<DataType>(DataReferenceName);
if (bContainsRef)
{
TDataReadReference<DataType> InputReadRef = InParams.InputDataReferences.GetDataReadReference<DataType>(DataReferenceName);
return MakeUnique<FOutputOperator>(DataReferenceName, InputReadRef);
}
// Only construct default if default construction is supported
if constexpr (TIsParsable<DataType>::Value)
{
TDataReadReference<DataType> DefaultReadRef = TDataReadReferenceFactory<DataType>::CreateAny(InParams.OperatorSettings);
return MakeUnique<FOutputOperator>(DataReferenceName, DefaultReadRef);
}
OutErrors.Emplace(MakeUnique<FMissingOutputNodeInputReferenceError>(InParams.Node, GetMetasoundDataTypeDisplayText<DataType>()));
return TUniquePtr<IOperator>(nullptr);
}
private:
FString DataReferenceName;
};
static FVertexInterface GetVertexInterface(const FString& InVertexName)
{
return FVertexInterface(
FInputVertexInterface(
TInputDataVertexModel<DataType>(InVertexName, LOCTEXT("Metasound_OutputVertexDescription", "Output from the parent Metasound graph."))
),
FOutputVertexInterface(
TOutputDataVertexModel<DataType>(InVertexName, LOCTEXT("Metasound_OutputVertexDescription", "Output from the parent Metasound graph."))
)
);
}
static FNodeClassMetadata GetNodeInfo(const FString& InVertexName)
{
FNodeClassMetadata Info;
Info.ClassName = {TEXT("Output"), GetMetasoundDataTypeName<DataType>(), TEXT("")};
Info.MajorVersion = 1;
Info.MinorVersion = 0;
Info.DisplayName = FText::Format(LOCTEXT("Metasound_OutputNodeDisplayNameFormat", "Output {0}"), FText::FromName(GetMetasoundDataTypeName<DataType>()));
Info.Description = LOCTEXT("Metasound_OutputNodeDescription", "Output from the parent Metasound graph.");
Info.Author = PluginAuthor;
Info.PromptIfMissing = PluginNodeMissingPrompt;
Info.DefaultInterface = GetVertexInterface(InVertexName);
return Info;
};
public:
TOutputNode(const FString& InInstanceName, const FGuid& InInstanceID, const FString& InVertexName)
: FNode(InInstanceName, InInstanceID, GetNodeInfo(InVertexName))
, VertexInterface(GetVertexInterface(InVertexName))
, Factory(MakeShared<FOutputOperatorFactory, ESPMode::ThreadSafe>(InVertexName))
{
}
/** Return the current vertex interface. */
virtual const FVertexInterface& GetVertexInterface() const override
{
return VertexInterface;
}
/** 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
{
return VertexInterface == InInterface;
}
/** 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
{
return VertexInterface == InInterface;
}
virtual TSharedRef<IOperatorFactory, ESPMode::ThreadSafe> GetDefaultOperatorFactory() const override
{
return Factory;
}
private:
FVertexInterface VertexInterface;
TSharedRef<FOutputOperatorFactory, ESPMode::ThreadSafe> Factory;
};
}
#undef LOCTEXT_NAMESPACE // MetasoundOutputNode