2020-11-11 16:51:59 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "MetasoundFrontendQuerySteps.h"
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
|
|
|
|
#include "MetasoundFrontend.h"
|
2021-01-13 10:48:59 -04:00
|
|
|
#include "MetasoundFrontendDocument.h"
|
2021-03-30 18:22:10 -04:00
|
|
|
#include "MetasoundFrontendRegistryTransaction.h"
|
2020-11-11 16:51:59 -04:00
|
|
|
|
|
|
|
|
namespace Metasound
|
|
|
|
|
{
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
FNodeClassRegistrationEvents::FNodeClassRegistrationEvents()
|
2021-03-30 18:22:10 -04:00
|
|
|
: CurrentTransactionID(Frontend::GetOriginRegistryTransactionID())
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FNodeClassRegistrationEvents::Stream(TArray<FFrontendQueryEntry>& OutEntries)
|
2021-03-30 18:22:10 -04:00
|
|
|
{
|
|
|
|
|
const TArray<Frontend::FNodeClassInfo> ClassInfos = Frontend::GetNodeClassesRegisteredSince(CurrentTransactionID, &CurrentTransactionID);
|
|
|
|
|
|
|
|
|
|
for (const Frontend::FNodeClassInfo& ClassInfo : ClassInfos)
|
|
|
|
|
{
|
2021-05-27 14:45:41 -04:00
|
|
|
FFrontendQueryEntry::FValue Value(TInPlaceType<FMetasoundFrontendClass>(), Frontend::GenerateClassDescription(ClassInfo));
|
|
|
|
|
OutEntries.Emplace(MoveTemp(Value));
|
2021-03-30 18:22:10 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FNodeClassRegistrationEvents::Reset()
|
|
|
|
|
{
|
|
|
|
|
CurrentTransactionID = Frontend::GetOriginRegistryTransactionID();
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-11 16:51:59 -04:00
|
|
|
FFilterClassesByInputVertexDataType::FFilterClassesByInputVertexDataType(const FName& InTypeName)
|
|
|
|
|
: InputVertexTypeName(InTypeName)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByInputVertexDataType::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
2021-01-13 10:48:59 -04:00
|
|
|
check(InEntry.Value.IsType<FMetasoundFrontendClass>());
|
2020-11-11 16:51:59 -04:00
|
|
|
|
2021-01-13 10:48:59 -04:00
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().Interface.Inputs.ContainsByPredicate(
|
|
|
|
|
[this](const FMetasoundFrontendClassInput& InDesc)
|
2020-11-11 16:51:59 -04:00
|
|
|
{
|
|
|
|
|
return InDesc.TypeName == InputVertexTypeName;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FFilterClassesByOutputVertexDataType::FFilterClassesByOutputVertexDataType(const FName& InTypeName)
|
|
|
|
|
: OutputVertexTypeName(InTypeName)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByOutputVertexDataType::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
2021-01-13 10:48:59 -04:00
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().Interface.Outputs.ContainsByPredicate(
|
|
|
|
|
[this](const FMetasoundFrontendClassOutput& InDesc)
|
2020-11-11 16:51:59 -04:00
|
|
|
{
|
|
|
|
|
return InDesc.TypeName == OutputVertexTypeName;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-28 19:02:51 -04:00
|
|
|
FFilterClassesByClassName::FFilterClassesByClassName(const FMetasoundFrontendClassName& InClassName)
|
2021-01-22 03:05:22 -04:00
|
|
|
: ClassName(InClassName)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByClassName::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
2021-01-28 19:02:51 -04:00
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().Metadata.ClassName == ClassName;
|
2021-01-22 03:05:22 -04:00
|
|
|
}
|
2021-03-09 00:27:55 -04:00
|
|
|
|
|
|
|
|
FFilterClassesByClassID::FFilterClassesByClassID(const FGuid InClassID)
|
|
|
|
|
: ClassID(InClassID)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByClassID::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
|
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().ID == ClassID;
|
|
|
|
|
}
|
2020-11-11 16:51:59 -04:00
|
|
|
|
2021-05-03 17:52:04 -04:00
|
|
|
FFrontendQueryEntry::FKey FMapClassNameToMajorVersion::Map(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
|
|
|
|
const FMetasoundFrontendClass& FrontendClass = InEntry.Value.Get<FMetasoundFrontendClass>();
|
|
|
|
|
const uint32 HashKey = GetTypeHash(FrontendClass.Metadata.ClassName.GetFullName());
|
|
|
|
|
return static_cast<FFrontendQueryEntry::FKey>(HashKey);
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FReduceClassesToHighestVersion::Reduce(FFrontendQueryEntry::FKey InKey, TArrayView<FFrontendQueryEntry * const>& InEntries, FReduceOutputView& OutResult) const
|
2021-05-03 17:52:04 -04:00
|
|
|
{
|
|
|
|
|
FFrontendQueryEntry* HighestVersionEntry = nullptr;
|
|
|
|
|
int32 HighestMajorVersion = -1;
|
|
|
|
|
|
|
|
|
|
for (FFrontendQueryEntry* Entry : InEntries)
|
|
|
|
|
{
|
|
|
|
|
const int32 EntryMajorVersion = Entry->Value.Get<FMetasoundFrontendClass>().Metadata.Version.Major;
|
|
|
|
|
|
|
|
|
|
if (!HighestVersionEntry || HighestMajorVersion < EntryMajorVersion)
|
|
|
|
|
{
|
|
|
|
|
HighestVersionEntry = Entry;
|
|
|
|
|
HighestMajorVersion = EntryMajorVersion;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-04 00:03:58 -04:00
|
|
|
if (HighestVersionEntry)
|
|
|
|
|
{
|
|
|
|
|
OutResult.Add(*HighestVersionEntry);
|
|
|
|
|
}
|
2021-05-03 17:52:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FReduceClassesToMajorVersion::FReduceClassesToMajorVersion(int32 InMajorVersion)
|
|
|
|
|
: MajorVersion(InMajorVersion)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FReduceClassesToMajorVersion::Reduce(FFrontendQueryEntry::FKey InKey, TArrayView<FFrontendQueryEntry * const>& InEntries, FReduceOutputView& OutResult) const
|
2021-05-03 17:52:04 -04:00
|
|
|
{
|
|
|
|
|
for (FFrontendQueryEntry* Entry : InEntries)
|
|
|
|
|
{
|
|
|
|
|
const int32 EntryMajorVersion = Entry->Value.Get<FMetasoundFrontendClass>().Metadata.Version.Major;
|
|
|
|
|
if (MajorVersion == EntryMajorVersion)
|
|
|
|
|
{
|
|
|
|
|
OutResult.Add(*Entry);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FSortClassesByVersion::Sort(const FFrontendQueryEntry& InEntryLHS, const FFrontendQueryEntry& InEntryRHS) const
|
|
|
|
|
{
|
|
|
|
|
const FMetasoundFrontendVersionNumber& VersionLHS = InEntryLHS.Value.Get<FMetasoundFrontendClass>().Metadata.Version;
|
|
|
|
|
const FMetasoundFrontendVersionNumber& VersionRHS = InEntryRHS.Value.Get<FMetasoundFrontendClass>().Metadata.Version;
|
|
|
|
|
return VersionLHS > VersionRHS;
|
|
|
|
|
}
|
|
|
|
|
}
|