2022-08-10 14:18:10 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "MetasoundFrontendNodeTemplateRegistry.h"
|
|
|
|
|
|
|
|
|
|
#include "MetasoundFrontendDocument.h"
|
2022-08-12 14:22:05 -04:00
|
|
|
#include "MetasoundFrontendNodeRegistryPrivate.h"
|
2022-08-10 14:18:10 -04:00
|
|
|
#include "MetasoundFrontendRegistries.h"
|
|
|
|
|
#include "MetasoundFrontendRegistryTransaction.h"
|
|
|
|
|
#include "MetasoundLog.h"
|
|
|
|
|
#include "MetasoundTrace.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Metasound
|
|
|
|
|
{
|
|
|
|
|
namespace Frontend
|
|
|
|
|
{
|
|
|
|
|
class FNodeTemplateRegistry : public INodeTemplateRegistry
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FNodeTemplateRegistry() = default;
|
|
|
|
|
virtual ~FNodeTemplateRegistry() = default;
|
|
|
|
|
|
|
|
|
|
virtual const INodeTemplate* FindTemplate(const FNodeRegistryKey& InKey) const override;
|
|
|
|
|
|
|
|
|
|
void Register(TUniquePtr<INodeTemplate>&& InEntry);
|
2022-08-12 14:22:05 -04:00
|
|
|
void Unregister(const FNodeRegistryKey& InKey);
|
2022-08-10 14:18:10 -04:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
TMap<FNodeRegistryKey, TUniquePtr<INodeTemplate>> Templates;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void FNodeTemplateRegistry::Register(TUniquePtr<INodeTemplate>&& InTemplate)
|
|
|
|
|
{
|
|
|
|
|
if (ensure(InTemplate.IsValid()))
|
|
|
|
|
{
|
|
|
|
|
const FMetasoundFrontendVersion& Version = InTemplate->GetVersion();
|
|
|
|
|
const FNodeRegistryKey Key = NodeRegistryKey::CreateKey(InTemplate->GetFrontendClass().Metadata);
|
|
|
|
|
if (ensure(NodeRegistryKey::IsValid(Key)))
|
|
|
|
|
{
|
|
|
|
|
Templates.Add(Key, MoveTemp(InTemplate));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-12 14:22:05 -04:00
|
|
|
void FNodeTemplateRegistry::Unregister(const FNodeRegistryKey& InKey)
|
2022-08-10 14:18:10 -04:00
|
|
|
{
|
2022-08-12 14:22:05 -04:00
|
|
|
ensure(Templates.Remove(InKey) > 0);
|
2022-08-10 14:18:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
{
|
2022-08-12 14:22:05 -04:00
|
|
|
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));
|
|
|
|
|
|
2022-08-10 14:18:10 -04:00
|
|
|
static_cast<FNodeTemplateRegistry&>(INodeTemplateRegistry::Get()).Register(MoveTemp(InTemplate));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UnregisterNodeTemplate(const FMetasoundFrontendVersion& InVersion)
|
|
|
|
|
{
|
2022-08-12 14:22:05 -04:00
|
|
|
const FNodeRegistryKey Key = NodeRegistryKey::CreateKey(EMetasoundFrontendClassType::Template, InVersion.Name.ToString(), InVersion.Number.Major, InVersion.Number.Minor);
|
|
|
|
|
if (ensure(NodeRegistryKey::IsValid(Key)))
|
|
|
|
|
{
|
|
|
|
|
FRegistryContainerImpl::Get().UnregisterNodeTemplate(Key);
|
|
|
|
|
static_cast<FNodeTemplateRegistry&>(INodeTemplateRegistry::Get()).Unregister(Key);
|
|
|
|
|
}
|
2022-08-10 14:18:10 -04:00
|
|
|
}
|
|
|
|
|
} // namespace Frontend
|
|
|
|
|
} // namespace Metasound
|