2022-08-10 14:18:10 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "MetasoundFrontendNodeTemplateRegistry.h"
|
|
|
|
|
|
|
|
|
|
#include "MetasoundFrontendDocument.h"
|
2023-12-15 13:21:12 -05:00
|
|
|
#include "MetasoundFrontendRegistryContainerImpl.h"
|
2022-08-10 14:18:10 -04:00
|
|
|
#include "MetasoundFrontendRegistryTransaction.h"
|
|
|
|
|
#include "MetasoundLog.h"
|
|
|
|
|
#include "MetasoundTrace.h"
|
|
|
|
|
|
|
|
|
|
|
2023-09-07 11:11:22 -04:00
|
|
|
namespace Metasound::Frontend
|
2022-08-10 14:18:10 -04:00
|
|
|
{
|
2023-09-07 11:11:22 -04:00
|
|
|
bool FNodeTemplateBase::IsValidNodeInterface(const FMetasoundFrontendNodeInterface& InNodeInterface) const
|
2022-08-10 14:18:10 -04:00
|
|
|
{
|
2023-09-07 11:11:22 -04:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FNodeTemplateBase::IsInputAccessTypeDynamic() const
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FNodeTemplateBase::IsOutputAccessTypeDynamic() const
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EMetasoundFrontendVertexAccessType FNodeTemplateBase::GetNodeInputAccessType(const FMetaSoundFrontendDocumentBuilder& InBuilder, const FGuid& InNodeID, const FGuid& InVertexID) const
|
|
|
|
|
{
|
|
|
|
|
return EMetasoundFrontendVertexAccessType::Unset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EMetasoundFrontendVertexAccessType FNodeTemplateBase::GetNodeOutputAccessType(const FMetaSoundFrontendDocumentBuilder& InBuilder, const FGuid& InNodeID, const FGuid& InVertexID) const
|
|
|
|
|
{
|
|
|
|
|
return EMetasoundFrontendVertexAccessType::Unset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class FNodeTemplateRegistry : public INodeTemplateRegistry
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FNodeTemplateRegistry() = default;
|
|
|
|
|
virtual ~FNodeTemplateRegistry() = default;
|
|
|
|
|
|
|
|
|
|
virtual const INodeTemplate* FindTemplate(const FNodeRegistryKey& InKey) const override;
|
|
|
|
|
|
|
|
|
|
void Register(TUniquePtr<INodeTemplate>&& InEntry);
|
|
|
|
|
void Unregister(const FNodeRegistryKey& InKey);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
TMap<FNodeRegistryKey, TUniquePtr<INodeTemplate>> Templates;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void FNodeTemplateRegistry::Register(TUniquePtr<INodeTemplate>&& InTemplate)
|
|
|
|
|
{
|
|
|
|
|
if (ensure(InTemplate.IsValid()))
|
2022-08-10 14:18:10 -04:00
|
|
|
{
|
2023-10-12 16:37:45 -04:00
|
|
|
const FNodeRegistryKey Key = FNodeRegistryKey(InTemplate->GetFrontendClass().Metadata);
|
|
|
|
|
if (ensure(Key.IsValid()))
|
2022-08-12 14:22:05 -04:00
|
|
|
{
|
2023-09-07 11:11:22 -04:00
|
|
|
Templates.Add(Key, MoveTemp(InTemplate));
|
2022-08-12 14:22:05 -04:00
|
|
|
}
|
2022-08-10 14:18:10 -04:00
|
|
|
}
|
2023-09-07 11:11:22 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FNodeTemplateRegistry::Unregister(const FNodeRegistryKey& InKey)
|
|
|
|
|
{
|
|
|
|
|
ensure(Templates.Remove(InKey) > 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const INodeTemplate* FNodeTemplateRegistry::FindTemplate(const FNodeRegistryKey& InKey) const
|
|
|
|
|
{
|
|
|
|
|
if (const TUniquePtr<INodeTemplate>* TemplatePtr = Templates.Find(InKey))
|
|
|
|
|
{
|
|
|
|
|
return TemplatePtr->Get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
INodeTemplateRegistry& INodeTemplateRegistry::Get()
|
|
|
|
|
{
|
|
|
|
|
static FNodeTemplateRegistry Registry;
|
|
|
|
|
return Registry;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RegisterNodeTemplate(TUniquePtr<INodeTemplate>&& InTemplate)
|
|
|
|
|
{
|
|
|
|
|
class FTemplateRegistryEntry : public INodeRegistryTemplateEntry
|
|
|
|
|
{
|
|
|
|
|
const FNodeClassInfo ClassInfo;
|
|
|
|
|
const FMetasoundFrontendClass FrontendClass;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
FTemplateRegistryEntry(const INodeTemplate& InNodeTemplate)
|
|
|
|
|
: ClassInfo(InNodeTemplate.GetFrontendClass().Metadata)
|
|
|
|
|
, FrontendClass(InNodeTemplate.GetFrontendClass())
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual ~FTemplateRegistryEntry() = default;
|
|
|
|
|
|
|
|
|
|
virtual const FNodeClassInfo& GetClassInfo() const override
|
|
|
|
|
{
|
|
|
|
|
return ClassInfo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Return a FMetasoundFrontendClass which describes the node. */
|
|
|
|
|
virtual const FMetasoundFrontendClass& GetFrontendClass() const override
|
|
|
|
|
{
|
|
|
|
|
return FrontendClass;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TUniquePtr<INodeRegistryTemplateEntry> RegEntry = TUniquePtr<INodeRegistryTemplateEntry>(new FTemplateRegistryEntry(*InTemplate.Get()));
|
|
|
|
|
FRegistryContainerImpl::Get().RegisterNodeTemplate(MoveTemp(RegEntry));
|
|
|
|
|
|
|
|
|
|
static_cast<FNodeTemplateRegistry&>(INodeTemplateRegistry::Get()).Register(MoveTemp(InTemplate));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UnregisterNodeTemplate(const FMetasoundFrontendVersion& InVersion)
|
|
|
|
|
{
|
2023-10-12 16:37:45 -04:00
|
|
|
FMetasoundFrontendClassName ClassName;
|
|
|
|
|
FMetasoundFrontendClassName::Parse(InVersion.Name.ToString(), ClassName);
|
|
|
|
|
const FNodeRegistryKey Key = FNodeRegistryKey(EMetasoundFrontendClassType::Template, ClassName, InVersion.Number);
|
|
|
|
|
if (ensure(Key.IsValid()))
|
|
|
|
|
{
|
|
|
|
|
FRegistryContainerImpl::Get().UnregisterNodeTemplate(Key);
|
|
|
|
|
static_cast<FNodeTemplateRegistry&>(INodeTemplateRegistry::Get()).Unregister(Key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UnregisterNodeTemplate(const FMetasoundFrontendClassName& InClassName, const FMetasoundFrontendVersionNumber& InTemplateVersion)
|
|
|
|
|
{
|
|
|
|
|
const FNodeRegistryKey Key = FNodeRegistryKey(EMetasoundFrontendClassType::Template, InClassName, InTemplateVersion);
|
|
|
|
|
if (ensure(Key.IsValid()))
|
2023-09-07 11:11:22 -04:00
|
|
|
{
|
|
|
|
|
FRegistryContainerImpl::Get().UnregisterNodeTemplate(Key);
|
|
|
|
|
static_cast<FNodeTemplateRegistry&>(INodeTemplateRegistry::Get()).Unregister(Key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} // namespace Metasound::Frontend
|