// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "MetasoundBuilderInterface.h" #include "MetasoundFrontendController.h" #include "MetasoundFrontendDocument.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(); } const FMetasoundFrontendVertexMetadata& GetMetadata() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } FGuid GetOwningNodeID() const override { return Metasound::FrontendInvalidID; } TSharedRef GetOwningNode() override; TSharedRef GetOwningNode() const override; bool IsConnected() const override { return false; } TArray GetConnectedInputs() override { return TArray(); } TArray GetConstConnectedInputs() 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 MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetTooltip() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FMetasoundFrontendVertexMetadata& GetMetadata() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FMetasoundFrontendLiteral* GetLiteral() const override { return nullptr; } void SetLiteral(const FMetasoundFrontendLiteral& InLiteral) { }; const FMetasoundFrontendLiteral* GetClassDefaultLiteral() const override { return nullptr; } FGuid GetOwningNodeID() const override { return Metasound::FrontendInvalidID; } TSharedRef GetOwningNode() override; TSharedRef GetOwningNode() const override; virtual TSharedRef GetConnectedOutput() override { return FInvalidOutputController::GetInvalid(); } virtual TSharedRef GetConnectedOutput() 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 GetConstInputsWithVertexName(const FString& InName) const override { return TArray(); } TArray GetOutputsWithVertexName(const FString& InName) override { return TArray(); } TArray GetConstOutputsWithVertexName(const FString& InName) const override { return TArray(); } TSharedRef GetInputWithID(FGuid InVertexID) override { return FInvalidInputController::GetInvalid(); } TSharedRef GetOutputWithID(FGuid InVertexID) override { return FInvalidOutputController::GetInvalid(); } TSharedRef GetInputWithID(FGuid InVertexID) const override { return FInvalidInputController::GetInvalid(); } TSharedRef GetOutputWithID(FGuid InVertexID) 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 InVertexID) 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 InVertexID) override { return false; } bool ClearInputLiteral(FGuid InVertexID) override { return false; }; const FMetasoundFrontendLiteral* GetInputLiteral(const FGuid& InVertexID) const { return nullptr; } void SetInputLiteral(const FMetasoundFrontendVertexLiteral& InVertexLiteral) override { } const FMetasoundFrontendClassInterface& GetClassInterface() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FMetasoundFrontendClassMetadata& GetClassMetadata() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FMetasoundFrontendInterfaceStyle& GetInputStyle() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FMetasoundFrontendInterfaceStyle& GetOutputStyle() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FMetasoundFrontendClassStyle& GetClassStyle() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetDescription() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } bool IsRequired() const override { return false; } 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; void IterateInputs(TUniqueFunction InFunction) override { } void IterateConstInputs(TUniqueFunction InFunction) const override { } void IterateOutputs(TUniqueFunction InFunction) override { } void IterateConstOutputs(TUniqueFunction InFunction) const override { } int32 GetNumInputs() const override { return 0; } int32 GetNumOutputs() const override { return 0; } const FString& GetNodeName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetDisplayName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } const FText& GetDisplayTitle() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } void SetDescription(const FText& InDescription) override { } void SetDisplayName(const FText& InText) override { } 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 GetClassID() const override { return Metasound::FrontendInvalidID; } const FText& GetDisplayName() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } TArray GetInputVertexNames() const override { return TArray(); } TArray GetOutputVertexNames() const override { return TArray(); } TArray> GetNodes() override { return TArray>(); } TArray> GetConstNodes() const override { return TArray>(); } 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>(); } const FMetasoundFrontendGraphStyle& GetGraphStyle() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } void SetGraphStyle(const FMetasoundFrontendGraphStyle& InStyle) override { } void IterateConstNodes(TUniqueFunction InFunction, EMetasoundFrontendClassType InClassType /* = EMetasoundFrontendClassType::Invalid */) const override { } void IterateNodes(TUniqueFunction InFunction, EMetasoundFrontendClassType InClassType /* = EMetasoundFrontendClassType::Invalid */) override { } 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; } FGuid GetVertexIDForInputVertex(const FString& InInputName) const { return Metasound::FrontendInvalidID; } FGuid GetVertexIDForOutputVertex(const FString& InInputName) const { return Metasound::FrontendInvalidID; } FMetasoundFrontendLiteral GetDefaultInput(const FGuid& InVertexID) const override { return FMetasoundFrontendLiteral{}; } // 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 SetDefaultInput(const FGuid& InVertexID, const FMetasoundFrontendLiteral& InLiteral) override { return false; } bool SetDefaultInputToDefaultLiteralOfType(const FGuid& InVertexID) override { return false; } const FText& GetInputDescription(const FString& InName) const override { return FText::GetEmpty(); } const FText& GetOutputDescription(const FString& InName) const override { return FText::GetEmpty(); } void SetInputDescription(const FString& InName, const FText& InDescription) override { } void SetOutputDescription(const FString& InName, const FText& InDescription) override { } void SetInputDisplayName(const FString& InName, const FText& InDisplayName) override { } void SetOutputDisplayName(const 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 InVertexID) override { return false; } TSharedRef AddNode(const FNodeRegistryKey& InNodeClass) override { return FInvalidNodeController::GetInvalid(); } TSharedRef AddNode(const FMetasoundFrontendClassMetadata& InNodeClass) override { return FInvalidNodeController::GetInvalid(); } TSharedRef AddDuplicateNode(const INodeController& InNode) 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(); } void SetGraphMetadata(const FMetasoundFrontendClassMetadata& InMetadata) { } 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; } TArray GetDependencies() const override { return TArray(); } TArray GetSubgraphs() const override { return TArray(); } TArray GetClasses() const override { return TArray(); } const FMetasoundFrontendGraphClass& GetRootGraphClass() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } 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 FNodeRegistryKey& InKey) const override { return FConstClassAccessPtr(); } FConstClassAccessPtr FindOrAddClass(const FNodeRegistryKey& InKey) override { return FConstClassAccessPtr(); } FConstClassAccessPtr FindClass(const FMetasoundFrontendClassMetadata& InMetadata) const override{ return FConstClassAccessPtr(); } FConstClassAccessPtr FindOrAddClass(const FMetasoundFrontendClassMetadata& InMetadata) override{ return FConstClassAccessPtr(); } FGraphHandle AddDuplicateSubgraph(const IGraphController& InGraph) override { return FInvalidGraphController::GetInvalid(); } virtual const FMetasoundFrontendVersion& GetArchetypeVersion() const override { return FMetasoundFrontendVersion::GetInvalid(); } virtual void SetArchetypeVersion(const FMetasoundFrontendVersion& InVersion) override {} void SetMetadata(const FMetasoundFrontendDocumentMetadata& InMetadata) override { } const FMetasoundFrontendDocumentMetadata& GetMetadata() const override { return MetasoundFrontendInvalidControllerPrivate::GetInvalid(); } void SynchronizeDependencies() 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(); } }; } }