2021-03-12 02:39:09 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
2021-09-13 14:13:39 -04:00
2021-03-12 02:39:09 -04:00
# include "Internationalization/Text.h"
2021-09-13 14:13:39 -04:00
# include "MetasoundExecutableOperator.h"
# include "MetasoundFacade.h"
2021-03-12 02:39:09 -04:00
# include "MetasoundNodeRegistrationMacro.h"
# include "MetasoundStandardNodesCategories.h"
2021-09-13 14:13:39 -04:00
# include "MetasoundStandardNodesNames.h"
2022-03-17 13:14:50 -04:00
# include "MetasoundParamHelper.h"
2021-09-13 14:13:39 -04:00
# include "MetasoundTrigger.h"
# include "MetasoundVertex.h"
2021-03-12 02:39:09 -04:00
2021-04-06 18:56:44 -04:00
# define LOCTEXT_NAMESPACE "MetasoundStandardNodes_TriggerAny"
2021-03-12 02:39:09 -04:00
# define REGISTER_TRIGGER_ANY_NODE(Number) \
using FTriggerAnyNode_ # # Number = TTriggerAnyNode < Number > ; \
METASOUND_REGISTER_NODE ( FTriggerAnyNode_ # # Number ) \
2021-09-13 14:13:39 -04:00
2021-03-12 02:39:09 -04:00
namespace Metasound
{
namespace MetasoundTriggerAnyNodePrivate
{
2021-04-06 18:56:44 -04:00
METASOUNDSTANDARDNODES_API FNodeClassMetadata CreateNodeClassMetadata ( const FName & InOperatorName , const FText & InDisplayName , const FText & InDescription , const FVertexInterface & InDefaultInterface )
2021-03-12 02:39:09 -04:00
{
FNodeClassMetadata Metadata
{
2021-08-09 15:08:37 -04:00
FNodeClassName { " TriggerAny " , InOperatorName , FName ( ) } ,
2021-03-12 02:39:09 -04:00
1 , // Major Version
0 , // Minor Version
InDisplayName ,
InDescription ,
PluginAuthor ,
PluginNodeMissingPrompt ,
InDefaultInterface ,
2021-08-09 15:08:37 -04:00
{ NodeCategories : : Trigger } ,
{ } ,
2021-03-12 02:39:09 -04:00
FNodeDisplayStyle { }
} ;
return Metadata ;
}
}
namespace TriggerAnyVertexNames
{
2022-03-17 13:14:50 -04:00
METASOUND_PARAM ( OutputTrigger , " Out " , " Triggered when any of the input triggers have been triggered. " )
2021-09-13 14:13:39 -04:00
METASOUNDSTANDARDNODES_API const FVertexName GetInputTriggerName ( uint32 InIndex )
2021-03-12 02:39:09 -04:00
{
2021-09-13 14:13:39 -04:00
return * FString : : Format ( TEXT ( " In {0} " ) , { InIndex } ) ;
2021-03-12 02:39:09 -04:00
}
2021-04-06 18:56:44 -04:00
METASOUNDSTANDARDNODES_API const FText GetInputTriggerDescription ( uint32 InIndex )
2021-03-12 02:39:09 -04:00
{
2022-02-10 18:36:47 -05:00
return METASOUND_LOCTEXT_FORMAT ( " TriggerAnyInputTriggerDesc " , " Trigger {0} input. The output trigger is hit when any of the input triggers are hit. " , InIndex ) ;
2021-03-12 02:39:09 -04:00
}
2022-03-17 13:14:50 -04:00
METASOUNDSTANDARDNODES_API const FText GetInputTriggerDisplayName ( uint32 InIndex )
2021-03-12 02:39:09 -04:00
{
2022-03-17 13:14:50 -04:00
return METASOUND_LOCTEXT_FORMAT ( " TriggerAnyInputTriggerDisplayName " , " In {0} " , InIndex ) ;
2021-03-12 02:39:09 -04:00
}
}
2021-04-06 18:56:44 -04:00
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 )
{
2022-03-17 13:14:50 -04:00
const FDataVertexMetadata InputTriggerMetadata
{
GetInputTriggerDescription ( i ) // description
, GetInputTriggerDisplayName ( i ) // display name
} ;
2022-03-31 16:49:59 -04:00
InputInterface . Add ( TInputDataVertex < FTrigger > ( GetInputTriggerName ( i ) , InputTriggerMetadata ) ) ;
2021-04-06 18:56:44 -04:00
}
FOutputVertexInterface OutputInterface ;
2022-03-31 16:49:59 -04:00
OutputInterface . Add ( TOutputDataVertex < FTrigger > ( METASOUND_GET_PARAM_NAME_AND_METADATA ( OutputTrigger ) ) ) ;
2021-04-06 18:56:44 -04:00
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 ) ;
2022-02-10 18:36:47 -05:00
FText NodeDisplayName = METASOUND_LOCTEXT_FORMAT ( " TriggerAnyDisplayNamePattern " , " Trigger Any ({0}) " , NumInputs ) ;
const FText NodeDescription = METASOUND_LOCTEXT ( " TriggerAnyDescription " , " Will trigger output on any of the input triggers. " ) ;
2021-04-06 18:56:44 -04:00
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 ;
2023-05-22 13:28:27 -04:00
virtual void BindInputs ( FInputVertexInterfaceData & InOutVertexData ) override
2021-04-06 18:56:44 -04:00
{
using namespace TriggerAnyVertexNames ;
for ( uint32 i = 0 ; i < NumInputs ; + + i )
{
2023-05-22 13:28:27 -04:00
InOutVertexData . BindReadVertex ( GetInputTriggerName ( i ) , InputTriggers [ i ] ) ;
2021-04-06 18:56:44 -04:00
}
2023-05-22 13:28:27 -04:00
}
2021-04-06 18:56:44 -04:00
2023-05-22 13:28:27 -04:00
virtual void BindOutputs ( FOutputVertexInterfaceData & InOutVertexData ) override
{
using namespace TriggerAnyVertexNames ;
InOutVertexData . BindReadVertex ( METASOUND_GET_PARAM_NAME ( OutputTrigger ) , OutputTrigger ) ;
}
virtual FDataReferenceCollection GetInputs ( ) const override
{
// This should never be called. Bind(...) is called instead. This method
// exists as a stop-gap until the API can be deprecated and removed.
checkNoEntry ( ) ;
return { } ;
2021-04-06 18:56:44 -04:00
}
virtual FDataReferenceCollection GetOutputs ( ) const override
{
2023-05-22 13:28:27 -04:00
// This should never be called. Bind(...) is called instead. This method
// exists as a stop-gap until the API can be deprecated and removed.
checkNoEntry ( ) ;
return { } ;
2021-04-06 18:56:44 -04:00
}
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 ) ;
}
) ;
}
}
2023-03-02 14:40:35 -05:00
void Reset ( const IOperator : : FResetParams & InParams )
{
OutputTrigger - > Reset ( ) ;
}
2021-04-06 18:56:44 -04:00
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 ;
} ;
2021-03-12 02:39:09 -04:00
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