Files
UnrealEngineUWP/Engine/Plugins/Runtime/Metasound/Source/MetasoundFrontend/Public/MetasoundNodeRegistrationMacro.h
rob gay 0e4f7a7c51 MetaSound UI/UX Composition/Preset Scaffolding
- Revive UMetaSound Asset type
- Revive MS Output generation
- Fix copy pasta'ed type name so MetaSound Source shows up properly in editor
- Clean-up to dynamic doc version reporting if required (show the new version number in log)
- Add versioning to update the RootGraphClass name & add DisplayName

MetaSound Registry Scaffolding Part 1 (From Phil Popp)

#rb phil.popp
#jira UE-117108
#jira UE-117109
#jira UE-117110
#preflight 60bf11780c76f90001db5f5f


#ROBOMERGE-SOURCE: CL 16587155
#ROBOMERGE-BOT: (v828-16531559)

[CL 16587204 by rob gay in ue5-main branch]
2021-06-08 10:52:31 -04:00

76 lines
3.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "MetasoundFrontend.h"
#include "MetasoundFrontendDocument.h"
#include "MetasoundFrontendRegistries.h"
#include "MetasoundLog.h"
#include "MetasoundNodeInterface.h"
namespace Metasound
{
// Utility class to ensure that a node class can use the constructor the frontend uses.
template <typename NodeClass>
struct ConstructorTakesNodeInitData {
// Use SFINAE trick to see if we have a valid constructor:
template<typename T>
static uint16 TestForConstructor(decltype(T(::Metasound::FNodeInitData()))*);
template<typename T>
static uint8 TestForConstructor(...);
static const bool Value = sizeof(TestForConstructor<NodeClass>(nullptr)) == sizeof(uint16);
};
template <typename FNodeType>
bool RegisterNodeWithFrontend(const Metasound::FNodeClassMetadata& InMetadata)
{
// if we reenter this code (because DECLARE_METASOUND_DATA_REFERENCE_TYPES was called twice with the same type),
// we catch it here.
static bool bAlreadyRegisteredThisDataType = false;
if (bAlreadyRegisteredThisDataType)
{
UE_LOG(LogMetaSound, Display, TEXT("Tried to call METASOUND_REGISTER_NODE twice with the same class. ignoring the second call. Likely because METASOUND_REGISTER_NODE is in a header that's used in multiple modules. Consider moving it to a private header or cpp file."));
return false;
}
bAlreadyRegisteredThisDataType = true;
Frontend::FNodeRegistryKey Key = FMetasoundFrontendRegistryContainer::Get()->RegisterExternalNode(
[](const Metasound::FNodeInitData& InInitData) -> TUniquePtr<Metasound::INode>
{
return TUniquePtr<Metasound::INode>(new FNodeType(InInitData));
},
[=]() -> FMetasoundFrontendClass
{
return Metasound::Frontend::GenerateClassDescription(InMetadata);
}
);
const bool bSuccessfullyRegisteredNode = Frontend::IsValidNodeRegistryKey(Key);
ensureAlwaysMsgf(bSuccessfullyRegisteredNode, TEXT("Registering node class failed. Please check the logs."));
return bSuccessfullyRegisteredNode;
}
template <typename FNodeType>
bool RegisterNodeWithFrontend()
{
// Register a node using a prototype node.
// TODO: may want to add a warning here since we don't want to use this registration pathway.
Metasound::FNodeInitData InitData;
TUniquePtr<Metasound::INode> Node = MakeUnique<FNodeType>(InitData);
return RegisterNodeWithFrontend<FNodeType>(Node->GetMetadata());
}
}
// TODO: should remove this and force folks to use module startup/shutdown module system.
#define METASOUND_REGISTER_NODE(NodeClass, ...) \
static_assert(std::is_base_of<::Metasound::INodeBase, NodeClass>::value, "To be registered as a Metasound Node," #NodeClass "need to be a derived class from Metasound::INodeBase, Metasound::INode, or Metasound::FNode."); \
static_assert(::Metasound::ConstructorTakesNodeInitData<NodeClass>::Value, "In order to be registered as a Metasound Node, " #NodeClass " needs to implement the following public constructor: " #NodeClass "(const Metasound::FNodeInitData& InInitData);"); \
static bool bSuccessfullyRegistered##NodeClass = FMetasoundFrontendRegistryContainer::Get()->EnqueueInitCommand([](){ ::Metasound::RegisterNodeWithFrontend<NodeClass>(__VA_ARGS__); }); // This static bool is useful for debugging, but also is the only way the compiler will let us call this function outside of an expression.