// Copyright Epic Games, Inc. All Rights Reserved. #include "MetasoundFrontendQuerySteps.h" #include "CoreMinimal.h" #include "MetasoundFrontend.h" #include "MetasoundFrontendDocument.h" #include "MetasoundFrontendRegistryTransaction.h" namespace Metasound { FNodeClassRegistrationEvents::FNodeClassRegistrationEvents() : CurrentTransactionID(Frontend::GetOriginRegistryTransactionID()) { } void FNodeClassRegistrationEvents::Stream(TArray& OutValues) { using namespace Frontend; auto AddEntry = [&OutValues](const FNodeRegistryTransaction& InTransaction) { OutValues.Emplace(TInPlaceType(), InTransaction); }; if (FMetasoundFrontendRegistryContainer* Registry = FMetasoundFrontendRegistryContainer::Get()) { Registry->ForEachNodeRegistryTransactionSince(CurrentTransactionID, &CurrentTransactionID, AddEntry); } } FFrontendQueryKey FMapRegistrationEventsToNodeRegistryKeys::Map(const FFrontendQueryEntry& InEntry) const { using namespace Frontend; FNodeRegistryKey RegistryKey; if (ensure(InEntry.Value.IsType())) { RegistryKey = InEntry.Value.Get().GetNodeRegistryKey(); } return FFrontendQueryKey(RegistryKey); } void FReduceRegistrationEventsToCurrentStatus::Reduce(const FFrontendQueryKey& InKey, FFrontendQueryPartition& InOutEntries) const { using namespace Frontend; int32 State = 0; FFrontendQueryEntry* FinalEntry = nullptr; for (FFrontendQueryEntry& Entry : InOutEntries) { if (ensure(Entry.Value.IsType())) { const FNodeRegistryTransaction& Transaction = Entry.Value.Get(); switch (Transaction.GetTransactionType()) { case FNodeRegistryTransaction::ETransactionType::NodeRegistration: State++; FinalEntry = &Entry; break; case FNodeRegistryTransaction::ETransactionType::NodeUnregistration: State--; break; default: break; } } } if ((nullptr != FinalEntry) && (State > 0)) { FFrontendQueryEntry Entry = *FinalEntry; InOutEntries.Reset(); InOutEntries.Add(Entry); } else { InOutEntries.Reset(); } } void FTransformRegistrationEventsToClasses::Transform(FFrontendQueryEntry::FValue& InValue) const { using namespace Frontend; FMetasoundFrontendClass FrontendClass; if (ensure(InValue.IsType())) { const FNodeRegistryTransaction& Transaction = InValue.Get(); bool bSuccess = FMetasoundFrontendRegistryContainer::Get()->FindFrontendClassFromRegistered(Transaction.GetNodeRegistryKey(), FrontendClass); check(bSuccess); } InValue.Set(MoveTemp(FrontendClass)); } FFilterClassesByInputVertexDataType::FFilterClassesByInputVertexDataType(const FName& InTypeName) : InputVertexTypeName(InTypeName) { } bool FFilterClassesByInputVertexDataType::Filter(const FFrontendQueryEntry& InEntry) const { check(InEntry.Value.IsType()); return InEntry.Value.Get().Interface.Inputs.ContainsByPredicate( [this](const FMetasoundFrontendClassInput& InDesc) { return InDesc.TypeName == InputVertexTypeName; } ); } FFilterClassesByOutputVertexDataType::FFilterClassesByOutputVertexDataType(const FName& InTypeName) : OutputVertexTypeName(InTypeName) { } bool FFilterClassesByOutputVertexDataType::Filter(const FFrontendQueryEntry& InEntry) const { return InEntry.Value.Get().Interface.Outputs.ContainsByPredicate( [this](const FMetasoundFrontendClassOutput& InDesc) { return InDesc.TypeName == OutputVertexTypeName; } ); } FFrontendQueryKey FMapClassesToClassName::Map(const FFrontendQueryEntry& InEntry) const { return FFrontendQueryKey(InEntry.Value.Get().Metadata.GetClassName().GetFullName()); } FFilterClassesByClassID::FFilterClassesByClassID(const FGuid InClassID) : ClassID(InClassID) { } bool FFilterClassesByClassID::Filter(const FFrontendQueryEntry& InEntry) const { return InEntry.Value.Get().ID == ClassID; } FFrontendQueryKey FMapToFullClassName::Map(const FFrontendQueryEntry& InEntry) const { const FMetasoundFrontendClass& FrontendClass = InEntry.Value.Get(); return FFrontendQueryKey(FrontendClass.Metadata.GetClassName().GetFullName()); } void FReduceClassesToHighestVersion::Reduce(const FFrontendQueryKey& InKey, FFrontendQueryPartition& InOutEntries) const { FFrontendQueryEntry* HighestVersionEntry = nullptr; FMetasoundFrontendVersionNumber HighestVersion; for (FFrontendQueryEntry& Entry : InOutEntries) { const FMetasoundFrontendVersionNumber& Version = Entry.Value.Get().Metadata.GetVersion(); if (!HighestVersionEntry || HighestVersion < Version) { HighestVersionEntry = &Entry; HighestVersion = Version; } } if (HighestVersionEntry) { FFrontendQueryEntry Entry = *HighestVersionEntry; InOutEntries.Reset(); InOutEntries.Add(Entry); } } bool FSortClassesByVersion::Sort(const FFrontendQueryEntry& InEntryLHS, const FFrontendQueryEntry& InEntryRHS) const { const FMetasoundFrontendVersionNumber& VersionLHS = InEntryLHS.Value.Get().Metadata.GetVersion(); const FMetasoundFrontendVersionNumber& VersionRHS = InEntryRHS.Value.Get().Metadata.GetVersion(); return VersionLHS > VersionRHS; } }