// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "MetasoundBuilderInterface.h" #include "MetasoundFrontendBaseClasses.h" #include "MetasoundFrontendController.h" #include "MetasoundGraph.h" namespace Metasound { namespace Frontend { namespace MetasoundFrontendInvalidControllerPrivate { // Helper to create a functional local static. Used when the interface requires // a const reference returned. template const Type& GetInvalid() { static const Type InvalidValue; return InvalidValue; } } /** FInvalidOutputController is a controller which is always invalid. * * All methods return defaults and return error flags or invalid values. */ class METASOUNDFRONTEND_API FInvalidOutputController : public IOutputController { public: FInvalidOutputController() = default; virtual ~FInvalidOutputController() = default; static TSharedRef GetInvalid() { static TSharedRef InvalidController = MakeShared(); return MakeShared(); } bool IsValid() const override { return false; } FGuid GetID() const override { return Metasound::FrontendInvalidID; } const FName& GetDataType() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FString& GetName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetDisplayName() const override { return FText::GetEmpty(); } const FText& GetTooltip() const override { return FText::GetEmpty(); } FGuid GetOwningNodeID() const override { return Metasound::FrontendInvalidID; } TSharedRef GetOwningNode() override; TSharedRef GetOwningNode() const override; TArray GetCurrentlyConnectedInputs() override { return TArray(); } TArray GetCurrentlyConnectedInputs() const override { return TArray(); } bool Disconnect() override { return false; } FConnectability CanConnectTo(const IInputController& InController) const override { return FConnectability(); } bool Connect(IInputController& InController) override { return false; } bool ConnectWithConverterNode(IInputController& InController, const FConverterNodeInfo& InNodeClassName) override { return false; } bool Disconnect(IInputController& InController) override { return false; } protected: FDocumentAccess ShareAccess() override { return FDocumentAccess(); } FConstDocumentAccess ShareAccess() const override { return FConstDocumentAccess(); } }; /** FInvalidInputController is a controller which is always invalid. * * All methods return defaults and return error flags or invalid values. */ class METASOUNDFRONTEND_API FInvalidInputController : public IInputController { public: FInvalidInputController() = default; virtual ~FInvalidInputController() = default; static TSharedRef GetInvalid() { static TSharedRef InvalidController = MakeShared(); return InvalidController; } bool IsValid() const override { return false; } FGuid GetID() const override { return Metasound::FrontendInvalidID; } bool IsConnected() const override { return false; } const FName& GetDataType() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FString& GetName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetDisplayName() const override { return FText::GetEmpty(); } const FText& GetTooltip() const override { return FText::GetEmpty(); } const TArray& GetDefaults() const override { static const TArray InvalidDefaults; return InvalidDefaults; } FGuid GetOwningNodeID() const override { return Metasound::FrontendInvalidID; } TSharedRef GetOwningNode() override; TSharedRef GetOwningNode() const override; virtual TSharedRef GetCurrentlyConnectedOutput() override { return FInvalidOutputController::GetInvalid(); } virtual TSharedRef GetCurrentlyConnectedOutput() const override { return FInvalidOutputController::GetInvalid(); } bool Disconnect() override { return false; } virtual FConnectability CanConnectTo(const IOutputController& InController) const override { return FConnectability(); } virtual bool Connect(IOutputController& InController) override { return false; } virtual bool ConnectWithConverterNode(IOutputController& InController, const FConverterNodeInfo& InNodeClassName) override { return false; } virtual bool Disconnect(IOutputController& InController) override { return false; } protected: FDocumentAccess ShareAccess() override { return FDocumentAccess(); } FConstDocumentAccess ShareAccess() const override { return FConstDocumentAccess(); } }; /** FInvalidNodeController is a controller which is always invalid. * * All methods return defaults and return error flags or invalid values. */ class METASOUNDFRONTEND_API FInvalidNodeController : public INodeController { public: FInvalidNodeController() = default; virtual ~FInvalidNodeController() = default; static TSharedRef GetInvalid() { static TSharedRef InvalidValue = MakeShared(); return InvalidValue; } bool IsValid() const override { return false; } TArray> GetInputs() override { return TArray>(); } TArray> GetOutputs() override { return TArray>(); } TArray> GetConstInputs() const override { return TArray>(); } TArray> GetConstOutputs() const override { return TArray>(); } TArray GetInputsWithVertexName(const FString& InName) override { return TArray(); } TArray GetInputsWithVertexName(const FString& InName) const override { return TArray(); } TArray GetOutputsWithVertexName(const FString& InName) override { return TArray(); } TArray GetOutputsWithVertexName(const FString& InName) const override { return TArray(); } TSharedRef GetInputWithID(FGuid InPointID) override { return FInvalidInputController::GetInvalid(); } TSharedRef GetOutputWithID(FGuid InPointID) override { return FInvalidOutputController::GetInvalid(); } TSharedRef GetInputWithID(FGuid InPointID) const override { return FInvalidInputController::GetInvalid(); } TSharedRef GetOutputWithID(FGuid InPointID) const override { return FInvalidOutputController::GetInvalid(); } const FMetasoundFrontendNodeStyle& GetNodeStyle() const override { static const FMetasoundFrontendNodeStyle Invalid; return Invalid; } void SetNodeStyle(const FMetasoundFrontendNodeStyle& InNodeStyle) { }; bool CanAddInput(const FString& InVertexName) const override { return false; } FInputHandle AddInput(const FString& InVertexName, const FMetasoundFrontendLiteral* InDefault) override { return FInvalidInputController::GetInvalid(); } bool RemoveInput(FGuid InPointID) override { return false; } bool CanAddOutput(const FString& InVertexName) const override { return false; } FInputHandle AddOutput(const FString& InVertexName, const FMetasoundFrontendLiteral* InDefault) override { return FInvalidInputController::GetInvalid(); } bool RemoveOutput(FGuid InPointID) override { return false; } EMetasoundFrontendClassType GetClassType() const override { return EMetasoundFrontendClassType::Invalid; } const FMetasoundFrontendClassName& GetClassName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } FMetasoundFrontendVersionNumber GetClassVersionNumber() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetClassDisplayName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetClassDescription() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FMetasoundFrontendClassStyle& GetClassStyle() const override { static const FMetasoundFrontendClassStyle Invalid; return Invalid; } TSharedRef AsGraph() override; TSharedRef AsGraph() const override; FGuid GetID() const override { return Metasound::FrontendInvalidID; } FGuid GetClassID() const override { return Metasound::FrontendInvalidID; } FGuid GetOwningGraphClassID() const override { return Metasound::FrontendInvalidID; } TSharedRef GetOwningGraph() override; TSharedRef GetOwningGraph() const override; const FString& GetNodeName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } protected: FDocumentAccess ShareAccess() override { return FDocumentAccess(); } FConstDocumentAccess ShareAccess() const override { return FConstDocumentAccess(); } }; /** FInvalidGraphController is a controller which is always invalid. * * All methods return defaults and return error flags or invalid values. */ class METASOUNDFRONTEND_API FInvalidGraphController : public IGraphController { public: FInvalidGraphController() = default; virtual ~FInvalidGraphController() = default; static TSharedRef GetInvalid() { static TSharedRef InvalidGraph = MakeShared(); return InvalidGraph; } bool IsValid() const override { return false; } FGuid GetNewPointID() const override { return Metasound::FrontendInvalidID; } TArray GetInputVertexNames() const override { return TArray(); } TArray GetOutputVertexNames() const override { return TArray(); } TArray> GetNodes() override { return TArray>(); } TArray> GetConstNodes() const override { return TArray>(); } FGuid GetClassID() const override { return Metasound::FrontendInvalidID; } TSharedRef GetNodeWithID(FGuid InNodeID) const override { return FInvalidNodeController::GetInvalid(); } TSharedRef GetNodeWithID(FGuid InNodeID) override { return FInvalidNodeController::GetInvalid(); } TArray> GetOutputNodes() override { return TArray>(); } TArray> GetInputNodes() override { return TArray>(); } TArray> GetConstOutputNodes() const override { return TArray>(); } TArray> GetConstInputNodes() const override { return TArray>(); } bool ContainsOutputVertexWithName(const FString& InName) const override { return false; } bool ContainsInputVertexWithName(const FString& InName) const override { return false; } TSharedRef GetOutputNodeWithName(const FString& InName) const override { return FInvalidNodeController::GetInvalid(); } TSharedRef GetInputNodeWithName(const FString& InName) const override { return FInvalidNodeController::GetInvalid(); } TSharedRef GetOutputNodeWithName(const FString& InName) override { return FInvalidNodeController::GetInvalid(); } TSharedRef GetInputNodeWithName(const FString& InName) override { return FInvalidNodeController::GetInvalid(); } FConstClassInputAccessPtr FindClassInputWithName(const FString& InName) const override { return FConstClassInputAccessPtr(); } FConstClassOutputAccessPtr FindClassOutputWithName(const FString& InName) const override { return FConstClassOutputAccessPtr(); } TSharedRef AddInputVertex(const FMetasoundFrontendClassInput& InDescription) override { return FInvalidNodeController::GetInvalid(); } bool RemoveInputVertex(const FString& InputName) override { return false; } TSharedRef AddOutputVertex(const FMetasoundFrontendClassOutput& InDescription) override { return FInvalidNodeController::GetInvalid(); } bool RemoveOutputVertex(const FString& OutputName) override { return false; } // 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 { return ELiteralType::Invalid; } // 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 { return nullptr; } TArray GetDefaultIDsForInputVertex(const FString& InInputName) const { return TArray(); } TArray GetDefaultIDsForOutputVertex(const FString& InInputName) const { return TArray(); } // 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. bool SetDefaultInputToFrontendLiteral(const FString& InInputName, FGuid InPointID, FName InDataTypeName, const FMetasoundFrontendLiteral& InLiteral) override { return false; } bool SetDefaultInputToTypeDefaultLiteral(const FString& InInputName, FGuid InPointID, FName InDataTypeName) override { return false; } // Set the display name for the input with the given name void SetInputDisplayName(FString InName, const FText& InDisplayName) override {} // Set the display name for the output with the given name void SetOutputDisplayName(FString InName, const FText& InDisplayName) override {} // This can be used to clear the current literal for a given input. // @returns false if the input name couldn't be found. bool ClearLiteralForInput(const FString& InInputName, FGuid InPointID) override { return false; } TSharedRef AddNode(const FNodeClassInfo& InNodeClass) override { return FInvalidNodeController::GetInvalid(); } TSharedRef AddNode(const FNodeRegistryKey& InNodeClass) override { return FInvalidNodeController::GetInvalid(); } TSharedRef AddNode(const FMetasoundFrontendClassMetadata& InNodeClass) override { return FInvalidNodeController::GetInvalid(); } // Remove the node corresponding to this node handle. // On success, invalidates the received node handle. bool RemoveNode(INodeController& InNode) override { return false; } // Returns the metadata for the current graph, including the name, description and author. const FMetasoundFrontendClassMetadata& GetGraphMetadata() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } // If the FNodeController given is itself a Metasound graph, // and the FNodeController is a direct member of this FGraphController, // If successful, this will invalidate the FNodeController and paste the graph for this node directly // into the graph. // If not successful, InNode will not be affected. // @returns true on success, false on failure. bool InflateNodeDirectlyIntoGraph(const INodeController& InNode) override { return false; } TSharedRef CreateEmptySubgraph(const FMetasoundFrontendClassMetadata& InInfo) override { return FInvalidNodeController::GetInvalid(); } TUniquePtr BuildOperator(const FOperatorSettings& InSettings, const FMetasoundEnvironment& InEnvironment, TArray& OutBuildErrors) const override { return TUniquePtr(nullptr); } TSharedRef GetOwningDocument() override; TSharedRef GetOwningDocument() const override; protected: FDocumentAccess ShareAccess() override { return FDocumentAccess(); } FConstDocumentAccess ShareAccess() const override { return FConstDocumentAccess(); } }; /** FInvalidDocumentController is a controller which is always invalid. * * All methods return defaults and return error flags or invalid values. */ class METASOUNDFRONTEND_API FInvalidDocumentController : public IDocumentController { public: FInvalidDocumentController() = default; virtual ~FInvalidDocumentController() = default; static TSharedRef GetInvalid() { static TSharedRef InvalidDocument = MakeShared(); return InvalidDocument; } bool IsValid() const override { return false; } bool IsRequiredInput(const FString& InInputName) const override { return false; } bool IsRequiredOutput(const FString& InOutputName) const override { return false; } TArray GetRequiredInputs() const override { return TArray(); } TArray GetRequiredOutputs() const override { return TArray(); } TArray GetDependencies() const override { return TArray(); } TArray GetSubgraphs() const override { return TArray(); } TArray GetClasses() const override { return TArray(); } FConstClassAccessPtr FindDependencyWithID(FGuid InClassID) const override { return FConstClassAccessPtr(); } FConstGraphClassAccessPtr FindSubgraphWithID(FGuid InClassID) const override { return FConstGraphClassAccessPtr(); } FConstClassAccessPtr FindClassWithID(FGuid InClassID) const override { return FConstClassAccessPtr(); } FConstClassAccessPtr FindClass(const FNodeClassInfo& InNodeClass) const override { return FConstClassAccessPtr(); } FConstClassAccessPtr FindOrAddClass(const FNodeClassInfo& InNodeClass) override { return FConstClassAccessPtr(); } FConstClassAccessPtr FindClass(const FMetasoundFrontendClassMetadata& InMetadata) const override{ return FConstClassAccessPtr(); } FConstClassAccessPtr FindOrAddClass(const FMetasoundFrontendClassMetadata& InMetadata) override{ return FConstClassAccessPtr(); } void RemoveUnreferencedDependencies() override {} TArray GetSubgraphHandles() override { return TArray(); } TArray GetSubgraphHandles() const override { return TArray(); } FGraphHandle GetSubgraphWithClassID(FGuid InClassID) { return FInvalidGraphController::GetInvalid(); } FConstGraphHandle GetSubgraphWithClassID(FGuid InClassID) const { return FInvalidGraphController::GetInvalid(); } TSharedRef GetRootGraph() override; TSharedRef GetRootGraph() const override; bool ExportToJSONAsset(const FString& InAbsolutePath) const override { return false; } FString ExportToJSON() const override { return FString(); } protected: FDocumentAccess ShareAccess() override { return FDocumentAccess(); } FConstDocumentAccess ShareAccess() const override { return FConstDocumentAccess(); } }; } }