2022-05-10 16:51:39 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "Analysis/MetasoundFrontendGraphAnalyzer.h"
# include "Analysis/MetasoundFrontendAnalyzerFactory.h"
# include "Analysis/MetasoundFrontendAnalyzerRegistry.h"
# include "Analysis/MetasoundFrontendVertexAnalyzer.h"
# include "MetasoundDataReference.h"
# include "MetasoundPrimitives.h"
namespace Metasound
{
namespace Frontend
{
2022-05-12 13:47:17 -04:00
FGraphAnalyzer : : FGraphAnalyzer ( const FOperatorSettings & InSettings , uint64 InInstanceID , FNodeVertexDataReferenceMap & & InReferences )
2022-05-10 16:51:39 -04:00
: OperatorSettings ( InSettings )
, InstanceID ( InInstanceID )
, InternalDataReferences ( MoveTemp ( InReferences ) )
{
using namespace Frontend ;
2022-08-17 19:01:34 -04:00
FGraphAnalyzerAddress GraphAddress ( InstanceID ) ;
ActiveAnalyzerReceiver = FDataTransmissionCenter : : Get ( ) . RegisterNewReceiver ( GraphAddress , FReceiverInitParams { InSettings } ) ;
2022-05-10 16:51:39 -04:00
}
void FGraphAnalyzer : : Execute ( )
{
// 1. Check if any message has been received that determines what analyzers are active.
2022-08-17 19:01:34 -04:00
TSet < FAnalyzerAddress > ReceiverAddresses ;
2022-05-10 16:51:39 -04:00
bool bUpdateReceivers = false ;
if ( ActiveAnalyzerReceiver . IsValid ( ) )
{
2022-08-17 19:01:34 -04:00
TReceiver < TArray < FAnalyzerAddress > > & AnalyzerReceiver = ActiveAnalyzerReceiver - > GetAs < TReceiver < TArray < FAnalyzerAddress > > > ( ) ;
2022-05-10 16:51:39 -04:00
if ( AnalyzerReceiver . CanPop ( ) )
{
bUpdateReceivers = true ;
2022-08-17 19:01:34 -04:00
TArray < FAnalyzerAddress > AnalyzerAddresses ;
2022-05-10 16:51:39 -04:00
AnalyzerReceiver . Pop ( AnalyzerAddresses ) ;
2022-08-17 19:01:34 -04:00
ReceiverAddresses . Append ( AnalyzerAddresses ) ;
2022-05-10 16:51:39 -04:00
}
}
// 2. Check if any message has been received that determines what analyzers are active and remove stale analyzers.
2022-08-17 19:01:34 -04:00
if ( bUpdateReceivers )
2022-05-10 16:51:39 -04:00
{
2022-08-17 19:01:34 -04:00
for ( int32 i = Analyzers . Num ( ) - 1 ; i > = 0 ; - - i )
2022-05-10 16:51:39 -04:00
{
2022-08-17 19:01:34 -04:00
TUniquePtr < IVertexAnalyzer > & Analyzer = Analyzers [ i ] ;
check ( Analyzer . IsValid ( ) ) ;
const FAnalyzerAddress & AnalyzerAddress = Analyzer - > GetAnalyzerAddress ( ) ;
if ( ReceiverAddresses . Contains ( AnalyzerAddress ) )
2022-05-10 16:51:39 -04:00
{
2022-08-17 19:01:34 -04:00
ReceiverAddresses . Remove ( AnalyzerAddress ) ;
2022-05-10 16:51:39 -04:00
}
2024-01-19 16:41:35 -05:00
Analyzers . RemoveAtSwap ( i , 1 , EAllowShrinking : : No ) ;
2022-05-10 16:51:39 -04:00
}
}
// 3. If message received to update analyzers, create missing analyzers
if ( bUpdateReceivers )
{
2022-08-17 19:01:34 -04:00
for ( const FAnalyzerAddress & AnalyzerAddress : ReceiverAddresses )
2022-05-10 16:51:39 -04:00
{
2022-08-17 19:01:34 -04:00
const FDataReferenceCollection * Collection = InternalDataReferences . Find ( AnalyzerAddress . NodeID ) ;
// TODO: This currently fails for composed graphs. Figure out how to differentiate addresses for composed graphs or refactor to only support parent graph analysis.
2022-05-10 16:51:39 -04:00
// if (ensureMsgf(Collection != nullptr, TEXT("Failed to create MetaSoundAnalyzer: DataReferenceCollection for node analyzer at address '%s' not found."), *AnalyzerKey))
2022-08-17 19:01:34 -04:00
if ( Collection )
{
if ( const IVertexAnalyzerFactory * Factory = IVertexAnalyzerRegistry : : Get ( ) . FindAnalyzerFactory ( AnalyzerAddress . AnalyzerName ) )
2022-05-10 16:51:39 -04:00
{
2022-08-17 19:01:34 -04:00
if ( const FAnyDataReference * DataRef = Collection - > FindDataReference ( AnalyzerAddress . OutputName ) )
2022-05-10 16:51:39 -04:00
{
2022-08-17 19:01:34 -04:00
FCreateAnalyzerParams Params { AnalyzerAddress , OperatorSettings , * DataRef } ;
TUniquePtr < IVertexAnalyzer > NewAnalyzer = Factory - > CreateAnalyzer ( Params ) ;
Analyzers . Add ( MoveTemp ( NewAnalyzer ) ) ;
2022-05-10 16:51:39 -04:00
}
}
}
}
}
// 4. Execute active analyzers post update.
for ( TUniquePtr < Frontend : : IVertexAnalyzer > & Analyzer : Analyzers )
{
Analyzer - > Execute ( ) ;
}
}
} // namespace Frontend
} // namespace Metasound