2021-01-13 10:48:59 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# pragma once
# include "CoreMinimal.h"
# include "MetasoundBuilderInterface.h"
# include "MetasoundFrontendBaseClasses.h"
# include "MetasoundFrontendController.h"
# include "MetasoundFrontendDocument.h"
# include "MetasoundFrontendInvalidController.h"
# include "MetasoundLog.h"
2021-02-03 14:36:36 -04:00
# include "UObject/Object.h"
2021-01-13 10:48:59 -04:00
namespace Metasound
{
namespace Frontend
{
/** FBaseOutputController provides common functionality for multiple derived
* output controllers .
*/
2021-05-20 19:33:21 -04:00
class FBaseOutputController : public IOutputController
2021-01-13 10:48:59 -04:00
{
public :
struct FInitParams
{
2021-01-20 17:26:40 -04:00
FGuid ID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
2021-03-03 15:00:53 -04:00
FConstClassOutputAccessPtr ClassOutputPtr ;
2021-01-22 03:05:22 -04:00
FGraphAccessPtr GraphPtr ;
2021-01-13 10:48:59 -04:00
/* Node handle which owns this output. */
FNodeHandle OwningNode ;
} ;
/** Construct the output controller base. */
FBaseOutputController ( const FInitParams & InParams ) ;
virtual ~ FBaseOutputController ( ) = default ;
bool IsValid ( ) const override ;
2021-01-20 17:26:40 -04:00
FGuid GetID ( ) const override ;
2021-01-13 10:48:59 -04:00
const FName & GetDataType ( ) const override ;
const FString & GetName ( ) const override ;
2021-03-03 15:00:53 -04:00
// Output metadata
const FText & GetDisplayName ( ) const override ;
const FText & GetTooltip ( ) const override ;
2021-03-31 15:34:29 -04:00
const FMetasoundFrontendVertexMetadata & GetMetadata ( ) const override ;
2021-03-03 15:00:53 -04:00
2021-01-13 10:48:59 -04:00
// Return info on containing node.
2021-01-20 17:26:40 -04:00
FGuid GetOwningNodeID ( ) const override ;
2021-01-13 10:48:59 -04:00
FNodeHandle GetOwningNode ( ) override ;
FConstNodeHandle GetOwningNode ( ) const override ;
2021-05-20 19:33:21 -04:00
bool IsConnected ( ) const override ;
TArray < FInputHandle > GetConnectedInputs ( ) override ;
TArray < FConstInputHandle > GetConstConnectedInputs ( ) const override ;
2021-01-22 03:05:22 -04:00
bool Disconnect ( ) override ;
2021-01-13 10:48:59 -04:00
// Connection logic.
FConnectability CanConnectTo ( const IInputController & InController ) const override ;
bool Connect ( IInputController & InController ) override ;
bool ConnectWithConverterNode ( IInputController & InController , const FConverterNodeInfo & InNodeClassName ) override ;
bool Disconnect ( IInputController & InController ) override ;
protected :
2021-01-20 17:26:40 -04:00
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
2021-01-22 03:05:22 -04:00
2021-01-20 17:26:40 -04:00
FGuid ID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
2021-03-03 15:00:53 -04:00
FConstClassOutputAccessPtr ClassOutputPtr ;
2021-01-22 03:05:22 -04:00
FGraphAccessPtr GraphPtr ;
2021-01-13 10:48:59 -04:00
FNodeHandle OwningNode ;
2021-01-22 03:05:22 -04:00
private :
TArray < FMetasoundFrontendEdge > FindEdges ( ) const ;
2021-01-13 10:48:59 -04:00
} ;
/** FInputNodeOutputController represents the output vertex of an input
* node .
*
* FInputNodeOutputController is largely to represent inputs coming into
* graph .
*/
2021-05-20 19:33:21 -04:00
class FInputNodeOutputController : public FBaseOutputController
2021-01-13 10:48:59 -04:00
{
public :
struct FInitParams
{
2021-01-20 17:26:40 -04:00
FGuid ID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
2021-03-03 15:00:53 -04:00
FConstClassOutputAccessPtr ClassOutputPtr ;
2021-01-13 10:48:59 -04:00
FConstClassInputAccessPtr OwningGraphClassInputPtr ;
2021-01-22 03:05:22 -04:00
FGraphAccessPtr GraphPtr ;
2021-01-13 10:48:59 -04:00
/* Node handle which owns this output. */
FNodeHandle OwningNode ;
} ;
/** Constructs the output controller. */
FInputNodeOutputController ( const FInitParams & InParams ) ;
virtual ~ FInputNodeOutputController ( ) = default ;
bool IsValid ( ) const override ;
2021-03-31 15:34:29 -04:00
// Input metadata
2021-01-13 10:48:59 -04:00
const FText & GetDisplayName ( ) const override ;
const FText & GetTooltip ( ) const override ;
2021-03-31 15:34:29 -04:00
const FMetasoundFrontendVertexMetadata & GetMetadata ( ) const override ;
2021-01-20 17:26:40 -04:00
protected :
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
private :
2021-03-03 15:00:53 -04:00
mutable FText CachedDisplayName ;
2021-01-13 10:48:59 -04:00
FConstClassInputAccessPtr OwningGraphClassInputPtr ;
} ;
2021-03-11 21:12:31 -04:00
/** FOutputNodeOutputController represents the output vertex of an input
* node .
*
* FOutputNodeOutputController is largely to represent inputs coming into
* graph .
*/
2021-05-20 19:33:21 -04:00
class FOutputNodeOutputController : public FBaseOutputController
2021-03-11 21:12:31 -04:00
{
public :
struct FInitParams
{
FGuid ID ;
FConstVertexAccessPtr NodeVertexPtr ;
FConstClassOutputAccessPtr ClassOutputPtr ;
FConstClassOutputAccessPtr OwningGraphClassOutputPtr ;
FGraphAccessPtr GraphPtr ;
/* Node handle which owns this output. */
FNodeHandle OwningNode ;
} ;
/** Constructs the output controller. */
FOutputNodeOutputController ( const FInitParams & InParams ) ;
virtual ~ FOutputNodeOutputController ( ) = default ;
bool IsValid ( ) const override ;
// Output metadata
const FText & GetDisplayName ( ) const override ;
const FText & GetTooltip ( ) const override ;
2021-03-31 15:34:29 -04:00
const FMetasoundFrontendVertexMetadata & GetMetadata ( ) const override ;
2021-03-11 21:12:31 -04:00
FConnectability CanConnectTo ( const IInputController & InController ) const override ;
bool Connect ( IInputController & InController ) override ;
bool ConnectWithConverterNode ( IInputController & InController , const FConverterNodeInfo & InNodeClassName ) override ;
private :
FConstClassOutputAccessPtr OwningGraphClassOutputPtr ;
} ;
2021-01-13 10:48:59 -04:00
/** FBaseInputController provides common functionality for multiple derived
* input controllers .
*/
2021-05-20 19:33:21 -04:00
class FBaseInputController : public IInputController
2021-01-13 10:48:59 -04:00
{
public :
struct FInitParams
{
2021-01-20 17:26:40 -04:00
FGuid ID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
2021-03-03 15:00:53 -04:00
FConstClassInputAccessPtr ClassInputPtr ;
2021-01-13 10:48:59 -04:00
FGraphAccessPtr GraphPtr ;
FNodeHandle OwningNode ;
} ;
/** Construct the input controller base. */
FBaseInputController ( const FInitParams & InParams ) ;
virtual ~ FBaseInputController ( ) = default ;
bool IsValid ( ) const override ;
2021-01-20 17:26:40 -04:00
FGuid GetID ( ) const override ;
2021-01-13 10:48:59 -04:00
const FName & GetDataType ( ) const override ;
const FString & GetName ( ) const override ;
2021-05-28 14:09:45 -04:00
const FMetasoundFrontendLiteral * GetLiteral ( ) const override ;
void SetLiteral ( const FMetasoundFrontendLiteral & InLiteral ) override ;
const FMetasoundFrontendLiteral * GetClassDefaultLiteral ( ) const override ;
2021-03-03 15:00:53 -04:00
// Input metadata
const FText & GetDisplayName ( ) const override ;
const FText & GetTooltip ( ) const override ;
2021-03-31 15:34:29 -04:00
const FMetasoundFrontendVertexMetadata & GetMetadata ( ) const override ;
2021-02-03 14:36:36 -04:00
2021-01-13 10:48:59 -04:00
// Owning node info
2021-01-20 17:26:40 -04:00
FGuid GetOwningNodeID ( ) const override ;
2021-01-13 10:48:59 -04:00
FNodeHandle GetOwningNode ( ) override ;
FConstNodeHandle GetOwningNode ( ) const override ;
// Connection info
bool IsConnected ( ) const override ;
2021-05-20 19:33:21 -04:00
FOutputHandle GetConnectedOutput ( ) override ;
FConstOutputHandle GetConnectedOutput ( ) const override ;
2021-01-13 10:48:59 -04:00
FConnectability CanConnectTo ( const IOutputController & InController ) const override ;
bool Connect ( IOutputController & InController ) override ;
// Connection controls.
bool ConnectWithConverterNode ( IOutputController & InController , const FConverterNodeInfo & InNodeClassName ) override ;
bool Disconnect ( IOutputController & InController ) override ;
bool Disconnect ( ) override ;
protected :
2021-01-20 17:26:40 -04:00
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
const FMetasoundFrontendEdge * FindEdge ( ) const ;
FMetasoundFrontendEdge * FindEdge ( ) ;
2021-01-20 17:26:40 -04:00
FGuid ID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
2021-03-03 15:00:53 -04:00
FConstClassInputAccessPtr ClassInputPtr ;
2021-01-13 10:48:59 -04:00
FGraphAccessPtr GraphPtr ;
FNodeHandle OwningNode ;
} ;
/** FOutputNodeInputController represents the input vertex of an output
* node .
*
* FOutputNodeInputController is largely to represent outputs exposed from
* a graph .
*/
2021-05-20 19:33:21 -04:00
class FOutputNodeInputController : public FBaseInputController
2021-01-13 10:48:59 -04:00
{
public :
struct FInitParams
{
2021-01-20 17:26:40 -04:00
FGuid ID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
2021-03-03 15:00:53 -04:00
FConstClassInputAccessPtr ClassInputPtr ;
2021-01-13 10:48:59 -04:00
FConstClassOutputAccessPtr OwningGraphClassOutputPtr ;
FGraphAccessPtr GraphPtr ;
FNodeHandle OwningNode ;
} ;
/** Constructs the input controller. */
FOutputNodeInputController ( const FInitParams & InParams ) ;
bool IsValid ( ) const override ;
// Input metadata
const FText & GetDisplayName ( ) const override ;
const FText & GetTooltip ( ) const override ;
2021-03-31 15:34:29 -04:00
const FMetasoundFrontendVertexMetadata & GetMetadata ( ) const override ;
2021-01-20 17:26:40 -04:00
protected :
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
private :
2021-03-03 15:00:53 -04:00
mutable FText CachedDisplayName ;
2021-01-13 10:48:59 -04:00
FConstClassOutputAccessPtr OwningGraphClassOutputPtr ;
} ;
2021-03-11 21:12:31 -04:00
/** FInputNodeInputController represents the input vertex of an output
* node .
*
* FInputNodeInputController is largely to represent outputs exposed from
* a graph .
*/
2021-05-20 19:33:21 -04:00
class FInputNodeInputController : public FBaseInputController
2021-03-11 21:12:31 -04:00
{
public :
struct FInitParams
{
FGuid ID ;
FConstVertexAccessPtr NodeVertexPtr ;
FConstClassInputAccessPtr ClassInputPtr ;
FConstClassInputAccessPtr OwningGraphClassInputPtr ;
FGraphAccessPtr GraphPtr ;
FNodeHandle OwningNode ;
} ;
/** Constructs the input controller. */
FInputNodeInputController ( const FInitParams & InParams ) ;
bool IsValid ( ) const override ;
// Input metadata
const FText & GetDisplayName ( ) const override ;
const FText & GetTooltip ( ) const override ;
2021-03-31 15:34:29 -04:00
const FMetasoundFrontendVertexMetadata & GetMetadata ( ) const override ;
2021-03-11 21:12:31 -04:00
FConnectability CanConnectTo ( const IOutputController & InController ) const override ;
bool Connect ( IOutputController & InController ) override ;
// Connection controls.
bool ConnectWithConverterNode ( IOutputController & InController , const FConverterNodeInfo & InNodeClassName ) override ;
private :
FConstClassInputAccessPtr OwningGraphClassInputPtr ;
} ;
2021-01-13 10:48:59 -04:00
/** FBaseNodeController provides common functionality for multiple derived
* node controllers .
*/
2021-05-20 19:33:21 -04:00
class FBaseNodeController : public INodeController
2021-01-13 10:48:59 -04:00
{
public :
struct FInitParams
{
FNodeAccessPtr NodePtr ;
FConstClassAccessPtr ClassPtr ;
FGraphHandle OwningGraph ;
} ;
/** Construct a base node controller. */
FBaseNodeController ( const FInitParams & InParams ) ;
bool IsValid ( ) const override ;
// Owning graph info
2021-01-20 17:26:40 -04:00
FGuid GetOwningGraphClassID ( ) const override ;
2021-01-13 10:48:59 -04:00
FGraphHandle GetOwningGraph ( ) override ;
FConstGraphHandle GetOwningGraph ( ) const override ;
// Info about this node.
2021-01-20 17:26:40 -04:00
FGuid GetID ( ) const override ;
FGuid GetClassID ( ) const override ;
2021-01-28 19:02:51 -04:00
2021-05-28 14:09:45 -04:00
bool ClearInputLiteral ( FGuid InVertexID ) override ;
const FMetasoundFrontendLiteral * GetInputLiteral ( const FGuid & InVertexID ) const override ;
void SetInputLiteral ( const FMetasoundFrontendVertexLiteral & InVertexLiteral ) override ;
2021-05-03 17:52:04 -04:00
const FMetasoundFrontendClassInterface & GetClassInterface ( ) const override ;
const FMetasoundFrontendClassMetadata & GetClassMetadata ( ) const override ;
2021-03-02 21:39:09 -04:00
const FMetasoundFrontendInterfaceStyle & GetInputStyle ( ) const override ;
const FMetasoundFrontendInterfaceStyle & GetOutputStyle ( ) const override ;
2021-01-23 12:59:01 -04:00
const FMetasoundFrontendClassStyle & GetClassStyle ( ) const override ;
2021-03-19 15:10:57 -04:00
/** Description of the given node. */
const FText & GetDescription ( ) const override ;
2021-01-23 12:59:01 -04:00
const FMetasoundFrontendNodeStyle & GetNodeStyle ( ) const override ;
void SetNodeStyle ( const FMetasoundFrontendNodeStyle & InStyle ) override ;
2021-01-13 10:48:59 -04:00
const FString & GetNodeName ( ) const override ;
2021-03-19 15:10:57 -04:00
/** Returns the human-readable display name of the given node. */
const FText & GetDisplayName ( ) const override ;
/** Sets the description of the node. */
void SetDescription ( const FText & InDescription ) override { }
/** Sets the display name of the node. */
void SetDisplayName ( const FText & InDisplayName ) override { } ;
/** Returns the title of the given node (what to label in visual node). */
const FText & GetDisplayTitle ( ) const override ;
2021-05-20 19:33:21 -04:00
bool CanAddInput ( const FString & InVertexName ) const override ;
FInputHandle AddInput ( const FString & InVertexName , const FMetasoundFrontendLiteral * InDefault ) override ;
bool RemoveInput ( FGuid InVertexID ) override ;
bool CanAddOutput ( const FString & InVertexName ) const override ;
FInputHandle AddOutput ( const FString & InVertexName , const FMetasoundFrontendLiteral * InDefault ) override ;
bool RemoveOutput ( FGuid InVertexID ) override ;
/** Returns all node inputs. */
TArray < FInputHandle > GetInputs ( ) override ;
2021-01-13 10:48:59 -04:00
/** Returns all node inputs. */
TArray < FConstInputHandle > GetConstInputs ( ) const override ;
2021-03-19 15:10:57 -04:00
void IterateConstInputs ( TUniqueFunction < void ( FConstInputHandle ) > InFunction ) const override ;
void IterateConstOutputs ( TUniqueFunction < void ( FConstOutputHandle ) > InFunction ) const override ;
void IterateInputs ( TUniqueFunction < void ( FInputHandle ) > InFunction ) override ;
void IterateOutputs ( TUniqueFunction < void ( FOutputHandle ) > InFunction ) override ;
int32 GetNumInputs ( ) const override ;
int32 GetNumOutputs ( ) const override ;
2021-01-13 10:48:59 -04:00
TArray < FInputHandle > GetInputsWithVertexName ( const FString & InName ) override ;
2021-05-20 19:33:21 -04:00
TArray < FConstInputHandle > GetConstInputsWithVertexName ( const FString & InName ) const override ;
2021-01-13 10:48:59 -04:00
/** Returns all node outputs. */
TArray < FOutputHandle > GetOutputs ( ) override ;
/** Returns all node outputs. */
TArray < FConstOutputHandle > GetConstOutputs ( ) const override ;
TArray < FOutputHandle > GetOutputsWithVertexName ( const FString & InName ) override ;
2021-05-20 19:33:21 -04:00
TArray < FConstOutputHandle > GetConstOutputsWithVertexName ( const FString & InName ) const override ;
2021-01-13 10:48:59 -04:00
2021-06-08 10:52:31 -04:00
bool IsRequired ( const FMetasoundFrontendArchetype & InArchetype ) const override ;
2021-03-19 15:10:57 -04:00
2021-01-13 10:48:59 -04:00
/** Returns an input with the given id.
*
* If the input does not exist , an invalid handle is returned .
*/
2021-02-24 18:37:19 -04:00
FInputHandle GetInputWithID ( FGuid InVertexID ) override ;
2021-01-13 10:48:59 -04:00
/** Returns an input with the given name.
*
* If the input does not exist , an invalid handle is returned .
*/
2021-02-24 18:37:19 -04:00
FConstInputHandle GetInputWithID ( FGuid InVertexID ) const override ;
2021-01-13 10:48:59 -04:00
/** Returns an output with the given name.
*
* If the output does not exist , an invalid handle is returned .
*/
2021-02-24 18:37:19 -04:00
FOutputHandle GetOutputWithID ( FGuid InVertexID ) override ;
2021-01-13 10:48:59 -04:00
/** Returns an output with the given name.
*
* If the output does not exist , an invalid handle is returned .
*/
2021-02-24 18:37:19 -04:00
FConstOutputHandle GetOutputWithID ( FGuid InVertexID ) const override ;
2021-01-13 10:48:59 -04:00
FGraphHandle AsGraph ( ) override ;
FConstGraphHandle AsGraph ( ) const override ;
protected :
2021-01-20 17:26:40 -04:00
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
FNodeAccessPtr NodePtr ;
FConstClassAccessPtr ClassPtr ;
FGraphHandle OwningGraph ;
struct FInputControllerParams
{
2021-02-24 18:37:19 -04:00
FGuid VertexID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
FConstClassInputAccessPtr ClassInputPtr ;
} ;
struct FOutputControllerParams
{
2021-02-24 18:37:19 -04:00
FGuid VertexID ;
2021-01-13 10:48:59 -04:00
FConstVertexAccessPtr NodeVertexPtr ;
FConstClassOutputAccessPtr ClassOutputPtr ;
} ;
2021-05-20 19:33:21 -04:00
virtual TArray < FInputControllerParams > GetInputControllerParams ( ) const ;
virtual TArray < FOutputControllerParams > GetOutputControllerParams ( ) const ;
2021-01-13 10:48:59 -04:00
2021-05-20 19:33:21 -04:00
virtual TArray < FInputControllerParams > GetInputControllerParamsWithVertexName ( const FString & InName ) const ;
virtual TArray < FOutputControllerParams > GetOutputControllerParamsWithVertexName ( const FString & InName ) const ;
2021-01-13 10:48:59 -04:00
2021-05-20 19:33:21 -04:00
virtual bool FindInputControllerParamsWithID ( FGuid InVertexID , FInputControllerParams & OutParams ) const ;
virtual bool FindOutputControllerParamsWithID ( FGuid InVertexID , FOutputControllerParams & OutParams ) const ;
2021-01-13 10:48:59 -04:00
2021-05-20 19:33:21 -04:00
private :
2021-01-13 10:48:59 -04:00
2021-02-24 18:37:19 -04:00
virtual FInputHandle CreateInputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassInputAccessPtr InClassInputPtr , FNodeHandle InOwningNode ) const = 0 ;
virtual FOutputHandle CreateOutputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassOutputAccessPtr InClassOutputPtr , FNodeHandle InOwningNode ) const = 0 ;
2021-01-13 10:48:59 -04:00
} ;
/** FNodeController represents a external or subgraph node. */
2021-05-20 19:33:21 -04:00
class FNodeController : public FBaseNodeController
2021-01-13 10:48:59 -04:00
{
// Private token only allows members or friends to call constructor.
enum EPrivateToken { Token } ;
public :
struct FInitParams
{
FNodeAccessPtr NodePtr ;
FConstClassAccessPtr ClassPtr ;
FGraphAccessPtr GraphPtr ;
FGraphHandle OwningGraph ;
} ;
// Constructor takes a private token so it can only be instantiated by
// using the static creation functions. This protects against some
// error conditions which would result in a zombie object. The creation
// methods can detect the error conditions and return an invalid controller
// on error
FNodeController ( EPrivateToken InToken , const FInitParams & InParams ) ;
/** Create a node handle for a external or subgraph node.
*
* @ return A Node handle . On error , an invalid node handle is returned .
*/
static FNodeHandle CreateNodeHandle ( const FInitParams & InParams ) ;
/** Create a node handle for a external or subgraph node.
*
* @ return A Node handle . On error , an invalid node handle is returned .
*/
static FConstNodeHandle CreateConstNodeHandle ( const FInitParams & InParams ) ;
virtual ~ FNodeController ( ) = default ;
bool IsValid ( ) const override ;
2021-01-20 17:26:40 -04:00
protected :
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
private :
2021-02-24 18:37:19 -04:00
FInputHandle CreateInputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassInputAccessPtr InClassInputPtr , FNodeHandle InOwningNode ) const override ;
FOutputHandle CreateOutputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassOutputAccessPtr InClassOutputPtr , FNodeHandle InOwningNode ) const override ;
2021-01-13 10:48:59 -04:00
FGraphAccessPtr GraphPtr ;
} ;
/** FOutputNodeController represents an output node. */
2021-05-20 19:33:21 -04:00
class FOutputNodeController : public FBaseNodeController
2021-01-13 10:48:59 -04:00
{
// Private token only allows members or friends to call constructor.
enum EPrivateToken { Token } ;
public :
struct FInitParams
{
FNodeAccessPtr NodePtr ;
FConstClassAccessPtr ClassPtr ;
FConstClassOutputAccessPtr OwningGraphClassOutputPtr ;
FGraphAccessPtr GraphPtr ;
FGraphHandle OwningGraph ;
} ;
// Constructor takes a private token so it can only be instantiated by
// using the static creation functions. This protects against some
// error conditions which would result in a zombie object. The creation
// methods can detect the error conditions and return an invalid controller
// on error
FOutputNodeController ( EPrivateToken InToken , const FInitParams & InParams ) ;
/** Create a node handle for an output node.
*
* @ return A Node handle . On error , an invalid node handle is returned .
*/
static FNodeHandle CreateOutputNodeHandle ( const FInitParams & InParams ) ;
/** Create a node handle for an output node.
*
* @ return A Node handle . On error , an invalid node handle is returned .
*/
static FConstNodeHandle CreateConstOutputNodeHandle ( const FInitParams & InParams ) ;
2021-03-19 15:10:57 -04:00
2021-01-13 10:48:59 -04:00
virtual ~ FOutputNodeController ( ) = default ;
bool IsValid ( ) const override ;
2021-03-19 15:10:57 -04:00
const FText & GetDescription ( ) const override ;
const FText & GetDisplayName ( ) const override ;
void SetDescription ( const FText & InDescription ) override ;
void SetDisplayName ( const FText & InText ) override ;
const FText & GetDisplayTitle ( ) const override ;
2021-06-08 10:52:31 -04:00
bool IsRequired ( const FMetasoundFrontendArchetype & InArchetype ) const override ;
2021-01-13 10:48:59 -04:00
2021-01-20 17:26:40 -04:00
protected :
2021-01-13 10:48:59 -04:00
2021-01-20 17:26:40 -04:00
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
private :
2021-02-24 18:37:19 -04:00
FInputHandle CreateInputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassInputAccessPtr InClassInputPtr , FNodeHandle InOwningNode ) const override ;
2021-01-20 17:26:40 -04:00
2021-02-24 18:37:19 -04:00
FOutputHandle CreateOutputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassOutputAccessPtr InClassOutputPtr , FNodeHandle InOwningNode ) const override ;
2021-01-13 10:48:59 -04:00
FGraphAccessPtr GraphPtr ;
FConstClassOutputAccessPtr OwningGraphClassOutputPtr ;
} ;
/** FInputNodeController represents an input node. */
2021-05-20 19:33:21 -04:00
class FInputNodeController : public FBaseNodeController
2021-01-13 10:48:59 -04:00
{
// Private token only allows members or friends to call constructor.
enum EPrivateToken { Token } ;
public :
struct FInitParams
{
FNodeAccessPtr NodePtr ;
FConstClassAccessPtr ClassPtr ;
FConstClassInputAccessPtr OwningGraphClassInputPtr ;
FGraphAccessPtr GraphPtr ;
FGraphHandle OwningGraph ;
} ;
// Constructor takes a private token so it can only be instantiated by
// using the static creation functions. This protects against some
// error conditions which would result in a zombie object. The creation
// methods can detect the error conditions and return an invalid controller
// on error
FInputNodeController ( EPrivateToken InToken , const FInitParams & InParams ) ;
/** Create a node handle for an input node.
*
* @ return A Node handle . On error , an invalid node handle is returned .
*/
static FNodeHandle CreateInputNodeHandle ( const FInitParams & InParams ) ;
/** Create a node handle for an input node.
*
* @ return A Node handle . On error , an invalid node handle is returned .
*/
static FConstNodeHandle CreateConstInputNodeHandle ( const FInitParams & InParams ) ;
virtual ~ FInputNodeController ( ) = default ;
2021-03-19 15:10:57 -04:00
const FText & GetDescription ( ) const override ;
const FText & GetDisplayName ( ) const override ;
const FText & GetDisplayTitle ( ) const override ;
2021-06-08 10:52:31 -04:00
bool IsRequired ( const FMetasoundFrontendArchetype & InArchetype ) const override ;
2021-01-13 10:48:59 -04:00
bool IsValid ( ) const override ;
2021-03-19 15:10:57 -04:00
void SetDescription ( const FText & InDescription ) override ;
void SetDisplayName ( const FText & InText ) override ;
2021-01-13 10:48:59 -04:00
2021-05-28 14:09:45 -04:00
// No-ops as inputs do not handle literals the same way as other nodes
bool ClearInputLiteral ( FGuid InVertexID ) override { return false ; }
const FMetasoundFrontendLiteral * GetInputLiteral ( const FGuid & InVertexID ) const override { return nullptr ; }
void SetInputLiteral ( const FMetasoundFrontendVertexLiteral & InVertexLiteral ) override { }
2021-01-20 17:26:40 -04:00
protected :
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
private :
2021-02-24 18:37:19 -04:00
FInputHandle CreateInputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassInputAccessPtr InClassInputPtr , FNodeHandle InOwningNode ) const override ;
2021-01-13 10:48:59 -04:00
2021-02-24 18:37:19 -04:00
FOutputHandle CreateOutputController ( FGuid InVertexID , FConstVertexAccessPtr InNodeVertexPtr , FConstClassOutputAccessPtr InClassOutputPtr , FNodeHandle InOwningNode ) const override ;
2021-01-13 10:48:59 -04:00
FConstClassInputAccessPtr OwningGraphClassInputPtr ;
FGraphAccessPtr GraphPtr ;
} ;
/** FGraphController represents a Metasound graph class. */
2021-05-20 19:33:21 -04:00
class FGraphController : public IGraphController
2021-01-13 10:48:59 -04:00
{
2021-02-03 14:36:36 -04:00
2021-01-13 10:48:59 -04:00
// Private token only allows members or friends to call constructor.
enum EPrivateToken { Token } ;
public :
struct FInitParams
{
FGraphClassAccessPtr GraphClassPtr ;
FDocumentHandle OwningDocument ;
} ;
// Constructor takes a private token so it can only be instantiated by
// using the static creation functions. This protects against some
// error conditions which would result in a zombie object. The creation
// methods can detect the error conditions and return an invalid controller
// on error
FGraphController ( EPrivateToken InToken , const FInitParams & InParams ) ;
/** Create a graph handle.
*
* @ return A graph handle . On error , an invalid handle is returned .
*/
static FGraphHandle CreateGraphHandle ( const FInitParams & InParams ) ;
/** Create a graph handle.
*
* @ return A graph handle . On error , an invalid handle is returned .
*/
static FConstGraphHandle CreateConstGraphHandle ( const FInitParams & InParams ) ;
virtual ~ FGraphController ( ) = default ;
bool IsValid ( ) const override ;
2021-01-20 17:26:40 -04:00
FGuid GetClassID ( ) const override ;
2021-05-20 19:33:21 -04:00
const FText & GetDisplayName ( ) const override ;
2021-01-13 10:48:59 -04:00
TArray < FString > GetInputVertexNames ( ) const override ;
TArray < FString > GetOutputVertexNames ( ) const override ;
FConstClassInputAccessPtr FindClassInputWithName ( const FString & InName ) const override ;
FConstClassOutputAccessPtr FindClassOutputWithName ( const FString & InName ) const override ;
2021-02-24 18:37:19 -04:00
FGuid GetVertexIDForInputVertex ( const FString & InInputName ) const override ;
FGuid GetVertexIDForOutputVertex ( const FString & InOutputName ) const override ;
2021-01-13 10:48:59 -04:00
TArray < FNodeHandle > GetNodes ( ) override ;
TArray < FConstNodeHandle > GetConstNodes ( ) const override ;
2021-01-20 17:26:40 -04:00
FConstNodeHandle GetNodeWithID ( FGuid InNodeID ) const override ;
FNodeHandle GetNodeWithID ( FGuid InNodeID ) override ;
2021-01-13 10:48:59 -04:00
TArray < FNodeHandle > GetInputNodes ( ) override ;
TArray < FConstNodeHandle > GetConstInputNodes ( ) const override ;
2021-03-19 15:10:57 -04:00
void IterateNodes ( TUniqueFunction < void ( FNodeHandle ) > InFunction , EMetasoundFrontendClassType InClassType ) override ;
void IterateConstNodes ( TUniqueFunction < void ( FConstNodeHandle ) > InFunction , EMetasoundFrontendClassType InClassType ) const override ;
2021-01-13 10:48:59 -04:00
TArray < FNodeHandle > GetOutputNodes ( ) override ;
TArray < FConstNodeHandle > GetConstOutputNodes ( ) const override ;
2021-06-08 10:52:31 -04:00
const FMetasoundFrontendGraphStyle & GetGraphStyle ( ) const override ;
void SetGraphStyle ( const FMetasoundFrontendGraphStyle & InStyle ) override ;
2021-01-13 19:18:22 -04:00
bool ContainsInputVertexWithName ( const FString & InName ) const override ;
bool ContainsOutputVertexWithName ( const FString & InName ) const override ;
2021-01-13 10:48:59 -04:00
FConstNodeHandle GetInputNodeWithName ( const FString & InName ) const override ;
FConstNodeHandle GetOutputNodeWithName ( const FString & InName ) const override ;
FNodeHandle GetInputNodeWithName ( const FString & InName ) override ;
FNodeHandle GetOutputNodeWithName ( const FString & InName ) override ;
FNodeHandle AddInputVertex ( const FMetasoundFrontendClassInput & InDescription ) override ;
bool RemoveInputVertex ( const FString & InName ) override ;
FNodeHandle AddOutputVertex ( const FMetasoundFrontendClassOutput & InDescription ) override ;
bool RemoveOutputVertex ( const FString & InName ) override ;
// This can be used to determine what kind of property editor we should use for the data type of a given input.
// Will return Invalid if the input couldn't be found, or if the input doesn't support any kind of literals.
ELiteralType GetPreferredLiteralTypeForInputVertex ( const FString & InInputName ) const override ;
// For inputs whose preferred literal type is UObject or UObjectArray, this can be used to determine the UObject corresponding to that input's datatype.
UClass * GetSupportedClassForInputVertex ( const FString & InInputName ) override ;
2021-02-24 18:37:19 -04:00
FMetasoundFrontendLiteral GetDefaultInput ( const FGuid & InVertexID ) const override ;
2021-02-24 02:02:03 -04:00
2021-01-13 10:48:59 -04:00
// These can be used to set the default value for a given input on this graph.
// @returns false if the input name couldn't be found, or if the literal type was incompatible with the Data Type of this input.
2021-02-24 18:37:19 -04:00
bool SetDefaultInput ( const FGuid & InVertexID , const FMetasoundFrontendLiteral & InLiteral ) override ;
bool SetDefaultInputToDefaultLiteralOfType ( const FGuid & InVertexID ) override ;
2021-01-13 10:48:59 -04:00
2021-02-24 02:02:03 -04:00
// Get the description for the input with the given name.
const FText & GetInputDescription ( const FString & InName ) const override ;
// Get the description for the output with the given name.
const FText & GetOutputDescription ( const FString & InName ) const override ;
// Set the description for the input with the given name
void SetInputDescription ( const FString & InName , const FText & InDescription ) override ;
// Set the description for the input with the given name
void SetOutputDescription ( const FString & InName , const FText & InDescription ) override ;
2021-01-13 10:48:59 -04:00
// Set the display name for the input with the given name
2021-02-24 02:02:03 -04:00
void SetInputDisplayName ( const FString & InName , const FText & InDisplayName ) override ;
2021-01-13 10:48:59 -04:00
// Set the display name for the output with the given name
2021-02-24 02:02:03 -04:00
void SetOutputDisplayName ( const FString & InName , const FText & InDisplayName ) override ;
2021-01-13 10:48:59 -04:00
// This can be used to clear the current literal for a given input.
// @returns false if the input name couldn't be found.
2021-02-24 18:37:19 -04:00
bool ClearLiteralForInput ( const FString & InInputName , FGuid InVertexID ) override ;
2021-01-13 10:48:59 -04:00
FNodeHandle AddNode ( const FNodeClassInfo & InNodeClass ) override ;
FNodeHandle AddNode ( const FNodeRegistryKey & InNodeClass ) override ;
2021-01-22 03:05:22 -04:00
FNodeHandle AddNode ( const FMetasoundFrontendClassMetadata & InClassMetadata ) override ;
2021-05-20 19:33:21 -04:00
FNodeHandle AddDuplicateNode ( const INodeController & InNode ) override ;
2021-01-13 10:48:59 -04:00
// Remove the node corresponding to this node handle.
// On success, invalidates the received node handle.
bool RemoveNode ( INodeController & InNode ) override ;
// Returns the metadata for the current graph, including the name, description and author.
const FMetasoundFrontendClassMetadata & GetGraphMetadata ( ) const override ;
2021-06-08 10:52:31 -04:00
void SetGraphMetadata ( const FMetasoundFrontendClassMetadata & InClassMetadata ) override ;
2021-01-13 10:48:59 -04:00
FNodeHandle CreateEmptySubgraph ( const FMetasoundFrontendClassMetadata & InInfo ) override ;
TUniquePtr < IOperator > BuildOperator ( const FOperatorSettings & InSettings , const FMetasoundEnvironment & InEnvironment , TArray < IOperatorBuilder : : FBuildErrorPtr > & OutBuildErrors ) const override ;
FDocumentHandle GetOwningDocument ( ) override ;
FConstDocumentHandle GetOwningDocument ( ) const override ;
2021-01-20 17:26:40 -04:00
protected :
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
private :
FNodeHandle AddNode ( FConstClassAccessPtr InExistingDependency ) ;
bool RemoveNode ( const FMetasoundFrontendNode & InDesc ) ;
bool RemoveInput ( const FMetasoundFrontendNode & InNode ) ;
bool RemoveOutput ( const FMetasoundFrontendNode & InNode ) ;
FNodeHandle GetNodeByPredicate ( TFunctionRef < bool ( const FMetasoundFrontendClass & , const FMetasoundFrontendNode & ) > InPredicate ) ;
FConstNodeHandle GetNodeByPredicate ( TFunctionRef < bool ( const FMetasoundFrontendClass & , const FMetasoundFrontendNode & ) > InPredicate ) const ;
TArray < FNodeHandle > GetNodesByPredicate ( TFunctionRef < bool ( const FMetasoundFrontendClass & , const FMetasoundFrontendNode & ) > InFilterFunc ) ;
TArray < FConstNodeHandle > GetNodesByPredicate ( TFunctionRef < bool ( const FMetasoundFrontendClass & , const FMetasoundFrontendNode & ) > InFilterFunc ) const ;
struct FNodeAndClass
{
FNodeAccessPtr Node ;
FConstClassAccessPtr Class ;
bool IsValid ( ) const { return Node . IsValid ( ) & & Class . IsValid ( ) ; }
} ;
struct FConstNodeAndClass
{
FConstNodeAccessPtr Node ;
FConstClassAccessPtr Class ;
bool IsValid ( ) const { return Node . IsValid ( ) & & Class . IsValid ( ) ; }
} ;
bool ContainsNodesAndClassesByPredicate ( TFunctionRef < bool ( const FMetasoundFrontendClass & , const FMetasoundFrontendNode & ) > InPredicate ) const ;
TArray < FNodeAndClass > GetNodesAndClasses ( ) ;
TArray < FConstNodeAndClass > GetNodesAndClasses ( ) const ;
TArray < FNodeAndClass > GetNodesAndClassesByPredicate ( TFunctionRef < bool ( const FMetasoundFrontendClass & , const FMetasoundFrontendNode & ) > InPredicate ) ;
TArray < FConstNodeAndClass > GetNodesAndClassesByPredicate ( TFunctionRef < bool ( const FMetasoundFrontendClass & , const FMetasoundFrontendNode & ) > InPredicate ) const ;
TArray < FNodeHandle > GetNodeHandles ( TArrayView < const FNodeAndClass > InNodesAndClasses ) ;
TArray < FConstNodeHandle > GetNodeHandles ( TArrayView < const FConstNodeAndClass > InNodesAndClasses ) const ;
FNodeHandle GetNodeHandle ( const FNodeAndClass & InNodeAndClass ) ;
FConstNodeHandle GetNodeHandle ( const FConstNodeAndClass & InNodeAndClass ) const ;
FMetasoundFrontendClassInput * FindInputDescriptionWithName ( const FString & InName ) ;
const FMetasoundFrontendClassInput * FindInputDescriptionWithName ( const FString & InName ) const ;
2021-02-24 18:37:19 -04:00
FMetasoundFrontendClassInput * FindInputDescriptionWithVertexID ( const FGuid & InVertexID ) ;
const FMetasoundFrontendClassInput * FindInputDescriptionWithVertexID ( const FGuid & InVertexID ) const ;
2021-01-13 10:48:59 -04:00
FMetasoundFrontendClassOutput * FindOutputDescriptionWithName ( const FString & InName ) ;
const FMetasoundFrontendClassOutput * FindOutputDescriptionWithName ( const FString & InName ) const ;
2021-02-24 18:37:19 -04:00
FMetasoundFrontendClassOutput * FindOutputDescriptionWithVertexID ( const FGuid & InVertexID ) ;
const FMetasoundFrontendClassOutput * FindOutputDescriptionWithVertexID ( const FGuid & InVertexID ) const ;
2021-01-20 17:26:40 -04:00
FClassInputAccessPtr FindInputDescriptionWithNodeID ( FGuid InNodeID ) ;
FConstClassInputAccessPtr FindInputDescriptionWithNodeID ( FGuid InNodeID ) const ;
2021-01-13 10:48:59 -04:00
2021-01-20 17:26:40 -04:00
FClassOutputAccessPtr FindOutputDescriptionWithNodeID ( FGuid InNodeID ) ;
FConstClassOutputAccessPtr FindOutputDescriptionWithNodeID ( FGuid InNodeID ) const ;
2021-01-13 10:48:59 -04:00
FMetasoundFrontendClassMetadata CreateInputClassMetadata ( const FMetasoundFrontendClassInput & InClassInput ) ;
FMetasoundFrontendClassMetadata CreateOutputClassMetadata ( const FMetasoundFrontendClassOutput & InClassOutput ) ;
FGraphClassAccessPtr GraphClassPtr ;
FDocumentHandle OwningDocument ;
} ;
/** FDocumentController represents an entire Metasound document. */
2021-05-20 19:33:21 -04:00
class FDocumentController : public IDocumentController
2021-01-13 10:48:59 -04:00
{
using FRegistry = FMetasoundFrontendRegistryContainer ;
public :
/** Construct a FDocumentController.
*
* @ param InDocument - Document to be manipulated .
*/
FDocumentController ( FDocumentAccessPtr InDocumentPtr ) ;
/** Create a FDocumentController.
*
* @ param InDocument - Document to be manipulated .
*
* @ return A document handle .
*/
static FDocumentHandle CreateDocumentHandle ( FDocumentAccessPtr InDocument )
{
return MakeShared < FDocumentController > ( InDocument ) ;
}
virtual ~ FDocumentController ( ) = default ;
bool IsValid ( ) const override ;
TArray < FMetasoundFrontendClass > GetDependencies ( ) const override ;
TArray < FMetasoundFrontendGraphClass > GetSubgraphs ( ) const override ;
TArray < FMetasoundFrontendClass > GetClasses ( ) const override ;
2021-01-20 17:26:40 -04:00
FConstClassAccessPtr FindDependencyWithID ( FGuid InClassID ) const override ;
FConstGraphClassAccessPtr FindSubgraphWithID ( FGuid InClassID ) const override ;
FConstClassAccessPtr FindClassWithID ( FGuid InClassID ) const override ;
2021-01-13 10:48:59 -04:00
FConstClassAccessPtr FindClass ( const FNodeClassInfo & InNodeClass ) const override ;
FConstClassAccessPtr FindClass ( const FMetasoundFrontendClassMetadata & InMetadata ) const override ;
FConstClassAccessPtr FindOrAddClass ( const FNodeClassInfo & InNodeClass ) override ;
FConstClassAccessPtr FindOrAddClass ( const FMetasoundFrontendClassMetadata & InMetadata ) override ;
2021-05-20 19:33:21 -04:00
virtual FGraphHandle AddDuplicateSubgraph ( const IGraphController & InGraph ) override ;
2021-05-28 14:09:45 -04:00
void SetMetadata ( const FMetasoundFrontendDocumentMetadata & InMetadata ) override ;
const FMetasoundFrontendDocumentMetadata & GetMetadata ( ) const override ;
2021-05-03 17:52:04 -04:00
void SynchronizeDependencies ( ) override ;
2021-01-13 10:48:59 -04:00
FGraphHandle GetRootGraph ( ) override ;
FConstGraphHandle GetRootGraph ( ) const override ;
/** Returns an array of all subgraphs for this document. */
TArray < FGraphHandle > GetSubgraphHandles ( ) override ;
/** Returns an array of all subgraphs for this document. */
TArray < FConstGraphHandle > GetSubgraphHandles ( ) const override ;
/** Returns a graphs in the document with the given class ID.*/
2021-01-20 17:26:40 -04:00
FGraphHandle GetSubgraphWithClassID ( FGuid InClassID ) override ;
2021-01-13 10:48:59 -04:00
/** Returns a graphs in the document with the given class ID.*/
2021-01-20 17:26:40 -04:00
FConstGraphHandle GetSubgraphWithClassID ( FGuid InClassID ) const override ;
2021-01-13 10:48:59 -04:00
bool ExportToJSONAsset ( const FString & InAbsolutePath ) const override ;
FString ExportToJSON ( ) const override ;
static bool IsMatchingMetasoundClass ( const FMetasoundFrontendClassMetadata & InMetadataA , const FMetasoundFrontendClassMetadata & InMetadataB ) ;
static bool IsMatchingMetasoundClass ( const FNodeClassInfo & InNodeClass , const FMetasoundFrontendClassMetadata & InMetadata ) ;
2021-01-20 17:26:40 -04:00
protected :
FDocumentAccess ShareAccess ( ) override ;
FConstDocumentAccess ShareAccess ( ) const override ;
2021-01-13 10:48:59 -04:00
private :
2021-05-20 19:33:21 -04:00
bool AddDuplicateSubgraph ( const FMetasoundFrontendGraphClass & InGraphToCopy , const FMetasoundFrontendDocument & InOtherDocument ) ;
2021-01-13 10:48:59 -04:00
FDocumentAccessPtr DocumentPtr ;
} ;
}
}