You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
- FGuid IDs are used to identify unique verticies within an entire graph (currently may be duplicated if graph is duplicated). - FNames are used to be readible vertex identifiers that are only unique within a node's API. - FText is only for ***OPTIONAL*** DisplayNames that can be provided as a more descriptive, readible descriptor of a given vertex (But are not necessarily unique). Currently disabled until loc tool on FText property in MetaSoundDetailsCustomization is properly displayed. #rb phil.popp #jira UE-123982 #preflight 613f6ff892b32b00016cf188 #ROBOMERGE-AUTHOR: rob.gay #ROBOMERGE-SOURCE: CL 17494445 in //UE5/Main/... #ROBOMERGE-BOT: STARSHIP (Main -> Release-Engine-Test) (v870-17433530) [CL 17494469 by rob gay in ue5-release-engine-test branch]
213 lines
6.1 KiB
C++
213 lines
6.1 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "Internationalization/Text.h"
|
|
#include "MetasoundExecutableOperator.h"
|
|
#include "MetasoundFacade.h"
|
|
#include "MetasoundNodeRegistrationMacro.h"
|
|
#include "MetasoundStandardNodesCategories.h"
|
|
#include "MetasoundStandardNodesNames.h"
|
|
#include "MetasoundTrigger.h"
|
|
#include "MetasoundVertex.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "MetasoundStandardNodes_TriggerAny"
|
|
|
|
#define REGISTER_TRIGGER_ANY_NODE(Number) \
|
|
using FTriggerAnyNode_##Number = TTriggerAnyNode<Number>; \
|
|
METASOUND_REGISTER_NODE(FTriggerAnyNode_##Number) \
|
|
|
|
|
|
namespace Metasound
|
|
{
|
|
namespace MetasoundTriggerAnyNodePrivate
|
|
{
|
|
METASOUNDSTANDARDNODES_API FNodeClassMetadata CreateNodeClassMetadata(const FName& InOperatorName, const FText& InDisplayName, const FText& InDescription, const FVertexInterface& InDefaultInterface)
|
|
{
|
|
FNodeClassMetadata Metadata
|
|
{
|
|
FNodeClassName { "TriggerAny", InOperatorName, FName() },
|
|
1, // Major Version
|
|
0, // Minor Version
|
|
InDisplayName,
|
|
InDescription,
|
|
PluginAuthor,
|
|
PluginNodeMissingPrompt,
|
|
InDefaultInterface,
|
|
{ NodeCategories::Trigger },
|
|
{ },
|
|
FNodeDisplayStyle{}
|
|
};
|
|
|
|
return Metadata;
|
|
}
|
|
}
|
|
|
|
namespace TriggerAnyVertexNames
|
|
{
|
|
METASOUNDSTANDARDNODES_API const FVertexName GetInputTriggerName(uint32 InIndex)
|
|
{
|
|
return *FString::Format(TEXT("In {0}"), { InIndex });
|
|
}
|
|
|
|
METASOUNDSTANDARDNODES_API const FText GetInputTriggerDescription(uint32 InIndex)
|
|
{
|
|
return FText::Format(LOCTEXT("TriggerAnyInputTriggerDesc", "Trigger {0} input. The output trigger is hit when any of the input triggers are hit."), InIndex);
|
|
}
|
|
|
|
METASOUNDSTANDARDNODES_API const FVertexName& GetOutputTriggerName()
|
|
{
|
|
static const FVertexName Name = TEXT("Out");
|
|
return Name;
|
|
}
|
|
|
|
METASOUNDSTANDARDNODES_API const FText& GetOutputTriggerDescription()
|
|
{
|
|
static const FText Desc = LOCTEXT("TriggerAnyOutputTriggerDesc", "Triggered when any of the input triggers have been triggered. ");
|
|
return Desc;
|
|
}
|
|
}
|
|
|
|
template<uint32 NumInputs>
|
|
class TTriggerAnyOperator : public TExecutableOperator<TTriggerAnyOperator<NumInputs>>
|
|
{
|
|
public:
|
|
static const FVertexInterface& GetDefaultInterface()
|
|
{
|
|
using namespace TriggerAnyVertexNames;
|
|
|
|
auto CreateDefaultInterface = []() -> FVertexInterface
|
|
{
|
|
FInputVertexInterface InputInterface;
|
|
|
|
for (uint32 i = 0; i < NumInputs; ++i)
|
|
{
|
|
InputInterface.Add(TInputDataVertexModel<FTrigger>(GetInputTriggerName(i), GetInputTriggerDescription(i)));
|
|
}
|
|
|
|
FOutputVertexInterface OutputInterface;
|
|
OutputInterface.Add(TOutputDataVertexModel<FTrigger>(GetOutputTriggerName(), GetOutputTriggerDescription()));
|
|
|
|
return FVertexInterface(InputInterface, OutputInterface);
|
|
};
|
|
|
|
static const FVertexInterface DefaultInterface = CreateDefaultInterface();
|
|
return DefaultInterface;
|
|
}
|
|
|
|
static const FNodeClassMetadata& GetNodeInfo()
|
|
{
|
|
auto CreateNodeClassMetadata = []() -> FNodeClassMetadata
|
|
{
|
|
FName OperatorName = *FString::Printf(TEXT("Trigger Any (%d)"), NumInputs);
|
|
FText NodeDisplayName = FText::Format(LOCTEXT("TriggerAnyDisplayNamePattern", "Trigger Any ({0})"), NumInputs);
|
|
FText NodeDescription = LOCTEXT("TriggerAnyDescription", "Will trigger output on any of the input triggers.");
|
|
FVertexInterface NodeInterface = GetDefaultInterface();
|
|
|
|
return MetasoundTriggerAnyNodePrivate::CreateNodeClassMetadata(OperatorName, NodeDisplayName, NodeDescription, NodeInterface);
|
|
};
|
|
|
|
static const FNodeClassMetadata Metadata = CreateNodeClassMetadata();
|
|
return Metadata;
|
|
}
|
|
|
|
static TUniquePtr<IOperator> CreateOperator(const FCreateOperatorParams& InParams, TArray<TUniquePtr<IOperatorBuildError>>& OutErrors)
|
|
{
|
|
using namespace TriggerAnyVertexNames;
|
|
|
|
const FInputVertexInterface& InputInterface = InParams.Node.GetVertexInterface().GetInputInterface();
|
|
const FDataReferenceCollection& InputCollection = InParams.InputDataReferences;
|
|
|
|
TArray<FTriggerReadRef> InputTriggers;
|
|
|
|
for (uint32 i = 0; i < NumInputs; ++i)
|
|
{
|
|
InputTriggers.Add(InputCollection.GetDataReadReferenceOrConstruct<FTrigger>(GetInputTriggerName(i), InParams.OperatorSettings));
|
|
}
|
|
|
|
return MakeUnique<TTriggerAnyOperator<NumInputs>>(InParams.OperatorSettings, MoveTemp(InputTriggers));
|
|
}
|
|
|
|
TTriggerAnyOperator(const FOperatorSettings& InSettings, const TArray<FTriggerReadRef>&& InInputTriggers)
|
|
: InputTriggers(InInputTriggers)
|
|
, OutputTrigger(FTriggerWriteRef::CreateNew(InSettings))
|
|
{
|
|
}
|
|
|
|
virtual ~TTriggerAnyOperator() = default;
|
|
|
|
|
|
virtual FDataReferenceCollection GetInputs() const override
|
|
{
|
|
using namespace TriggerAnyVertexNames;
|
|
|
|
FDataReferenceCollection Inputs;
|
|
for (uint32 i = 0; i < NumInputs; ++i)
|
|
{
|
|
Inputs.AddDataReadReference(GetInputTriggerName(i), InputTriggers[i]);
|
|
}
|
|
|
|
return Inputs;
|
|
}
|
|
|
|
virtual FDataReferenceCollection GetOutputs() const override
|
|
{
|
|
using namespace TriggerAnyVertexNames;
|
|
|
|
FDataReferenceCollection Outputs;
|
|
Outputs.AddDataReadReference(GetOutputTriggerName(), OutputTrigger);
|
|
|
|
return Outputs;
|
|
}
|
|
|
|
void Execute()
|
|
{
|
|
OutputTrigger->AdvanceBlock();
|
|
|
|
for (uint32 i = 0; i < NumInputs; ++i)
|
|
{
|
|
InputTriggers[i]->ExecuteBlock(
|
|
[&](int32 StartFrame, int32 EndFrame)
|
|
{
|
|
},
|
|
[this, i](int32 StartFrame, int32 EndFrame)
|
|
{
|
|
OutputTrigger->TriggerFrame(StartFrame);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
private:
|
|
|
|
TArray<FTriggerReadRef> InputTriggers;
|
|
FTriggerWriteRef OutputTrigger;
|
|
};
|
|
|
|
/** TTriggerAnyNode
|
|
*
|
|
* Will output a trigger whenever any of its input triggers are set.
|
|
*/
|
|
template<uint32 NumInputs>
|
|
class METASOUNDSTANDARDNODES_API TTriggerAnyNode : public FNodeFacade
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor used by the Metasound Frontend.
|
|
*/
|
|
TTriggerAnyNode(const FNodeInitData& InInitData)
|
|
: FNodeFacade(InInitData.InstanceName, InInitData.InstanceID, TFacadeOperatorClass<TTriggerAnyOperator<NumInputs>>())
|
|
{}
|
|
|
|
virtual ~TTriggerAnyNode() = default;
|
|
};
|
|
|
|
REGISTER_TRIGGER_ANY_NODE(2)
|
|
REGISTER_TRIGGER_ANY_NODE(3)
|
|
REGISTER_TRIGGER_ANY_NODE(4)
|
|
REGISTER_TRIGGER_ANY_NODE(5)
|
|
REGISTER_TRIGGER_ANY_NODE(6)
|
|
REGISTER_TRIGGER_ANY_NODE(7)
|
|
REGISTER_TRIGGER_ANY_NODE(8)
|
|
}
|
|
|
|
#undef LOCTEXT_NAMESPACE
|