// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/Array.h" #include "HAL/Platform.h" #include "MetasoundFrontendDocumentModifyDelegates.h" #include "MetasoundFrontendRegistryKey.h" #include "Templates/SharedPointer.h" #include "UObject/Interface.h" // Forward Declarations struct FMetasoundFrontendClass; struct FMetasoundFrontendClassMetadata; struct FMetasoundFrontendDocument; struct FMetaSoundFrontendDocumentBuilder; struct FMetasoundFrontendEdge; struct FMetasoundFrontendGraph; struct FMetasoundFrontendNode; struct FMetasoundFrontendVertex; namespace Metasound::Frontend { /** Interface for querying cached document nodes. */ class IDocumentGraphNodeCache : public TSharedFromThis { public: virtual ~IDocumentGraphNodeCache() = default; virtual bool ContainsNode(const FGuid& InNodeID) const = 0; virtual bool ContainsNodesOfClassID(const FGuid& InClassID) const = 0; virtual const int32* FindNodeIndex(const FGuid& InNodeID) const = 0; virtual TArray FindNodesOfClassID(const FGuid& InClassID) const = 0; virtual const FMetasoundFrontendNode* FindNode(const FGuid& InNodeID) const = 0; virtual TArray FindNodeInputs(const FGuid& InNodeID, FName TypeName = FName()) const = 0; virtual TArray FindNodeOutputs(const FGuid& InNodeID, FName TypeName = FName()) const = 0; // Returns corresponding input vertex if it exists virtual const FMetasoundFrontendVertex* FindInputVertex(const FGuid& InNodeID, const FGuid& InVertexID) const = 0; // Returns corresponding input vertex if it exists virtual const FMetasoundFrontendVertex* FindInputVertex(const FGuid& InNodeID, FName InVertexName) const = 0; // Returns corresponding output vertex if it exists virtual const FMetasoundFrontendVertex* FindOutputVertex(const FGuid& InNodeID, const FGuid& InVertexID) const = 0; // Returns corresponding output vertex if it exists virtual const FMetasoundFrontendVertex* FindOutputVertex(const FGuid& InNodeID, FName InVertexName) const = 0; // Recursively finds rerouted input vertices if they exist. Returns corresponding nodes to vertices if array provided. Sets boolean determining if connected to reroute if provided (optional). virtual TArray FindReroutedInputVertices(const FGuid& InNodeID, const FGuid& InVertexID, TArray* ConnectedNodes = nullptr, bool* bOutIsRerouted = nullptr) const = 0; // Recursively finds rerouted input vertices if they exist. Returns corresponding nodes to vertices if array provided. Sets boolean determining if connected to reroute if provided (optional). virtual TArray FindReroutedInputVertices(const FGuid& InNodeID, FName InVertexName, TArray* ConnectedNodes = nullptr, bool* bOutIsRerouted = nullptr) const = 0; // Recursively finds rerouted output vertex if it exist. Returns corresponding nodes to vertices if pointer provided. Sets boolean determining if connected to reroute if provided (optional). virtual const FMetasoundFrontendVertex* FindReroutedOutputVertex(const FGuid& InNodeID, const FGuid& InVertexID, const FMetasoundFrontendNode** ConnectedNodes = nullptr, bool* bOutIsRerouted = nullptr) const = 0; // Recursively finds rerouted output vertex if it exist. Returns corresponding node to vertices if pointer provided. Sets boolean determining if connected to reroute if provided (optional). virtual const FMetasoundFrontendVertex* FindReroutedOutputVertex(const FGuid& InNodeID, FName InVertexName, const FMetasoundFrontendNode** ConnectedNodes = nullptr, bool* bOutIsRerouted = nullptr) const = 0; }; /** Interface for querying cached document edges. */ class IDocumentGraphEdgeCache : public TSharedFromThis { public: virtual ~IDocumentGraphEdgeCache() = default; virtual bool ContainsEdge(const FMetasoundFrontendEdge& InEdge) const = 0; virtual bool IsNodeInputConnected(const FGuid& InNodeID, const FGuid& InVertexID) const = 0; virtual bool IsNodeOutputConnected(const FGuid& InNodeID, const FGuid& InVertexID) const = 0; virtual TArray FindEdges(const FGuid& InNodeID, const FGuid& InVertexID) const = 0; virtual const int32* FindEdgeIndexToNodeInput(const FGuid& InNodeID, const FGuid& InVertexID) const = 0; virtual const TArrayView FindEdgeIndicesFromNodeOutput(const FGuid& InNodeID, const FGuid& InVertexID) const = 0; }; /** Interface for querying cached document interface. */ class IDocumentGraphInterfaceCache : public TSharedFromThis { public: virtual ~IDocumentGraphInterfaceCache() = default; virtual const FMetasoundFrontendClassInput* FindInput(FName InputName) const = 0; virtual const int32* FindInputIndex(FName InputName) const = 0; virtual const FMetasoundFrontendClassOutput* FindOutput(FName OutputName) const = 0; virtual const int32* FindOutputIndex(FName OutputName) const = 0; }; /** Interface for querying cached document dependencies. */ class IDocumentCache : public TSharedFromThis { public: virtual ~IDocumentCache() = default; virtual bool ContainsDependency(const FNodeRegistryKey& InClassKey) const = 0; virtual bool ContainsDependencyOfType(EMetasoundFrontendClassType ClassType) const = 0; virtual const FMetasoundFrontendClass* FindDependency(const Metasound::Frontend::FNodeRegistryKey& InClassKey) const = 0; virtual const FMetasoundFrontendClass* FindDependency(const FGuid& InClassID) const = 0; virtual const int32* FindDependencyIndex(const Metasound::Frontend::FNodeRegistryKey& InClassKey) const = 0; virtual const int32* FindDependencyIndex(const FGuid& InClassID) const = 0; virtual const FMetasoundFrontendDocument& GetDocument() const = 0; UE_DEPRECATED(5.5, "Use overload providing pageID") virtual const IDocumentGraphNodeCache& GetNodeCache() const { return GetNodeCache(::Metasound::Frontend::DefaultPageID); } // Returns NodeCache associated with the given PageID virtual const IDocumentGraphNodeCache& GetNodeCache(const FGuid& InPageID) const = 0; UE_DEPRECATED(5.5, "Use overload providing pageID") virtual const IDocumentGraphEdgeCache& GetEdgeCache() const { return GetEdgeCache(::Metasound::Frontend::DefaultPageID); } // Returns EdgeCache associated with the given PageID virtual const IDocumentGraphEdgeCache& GetEdgeCache(const FGuid& InPageID) const = 0; // Returns InterfaceCache for the given document virtual const IDocumentGraphInterfaceCache& GetInterfaceCache() const = 0; #if WITH_EDITORONLY_DATA // Sets the default BuildPageID for the given document virtual void SetBuildPageID(const FGuid& InPageID) = 0; #endif // WITH_EDITORONLY_DATA }; } // namespace Metasound::Frontend