2020-09-24 00:43:27 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "RigVMModel/Nodes/RigVMSelectNode.h"
|
|
|
|
|
|
2022-09-24 13:31:25 -04:00
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(RigVMSelectNode)
|
|
|
|
|
|
2020-09-24 00:43:27 -04:00
|
|
|
const FString URigVMSelectNode::SelectName = TEXT("Select");
|
|
|
|
|
const FString URigVMSelectNode::IndexName = TEXT("Index");
|
|
|
|
|
const FString URigVMSelectNode::ValueName = TEXT("Values");
|
|
|
|
|
const FString URigVMSelectNode::ResultName = TEXT("Result");
|
|
|
|
|
|
|
|
|
|
bool URigVMSelectNode::AllowsLinksOn(const URigVMPin* InPin) const
|
|
|
|
|
{
|
|
|
|
|
if(InPin->GetRootPin() == InPin)
|
|
|
|
|
{
|
|
|
|
|
if(InPin->GetName() == ValueName)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2022-04-21 09:10:19 -04:00
|
|
|
|
|
|
|
|
FName URigVMSelectNode::GetNotation() const
|
|
|
|
|
{
|
2022-10-25 05:45:35 -04:00
|
|
|
static constexpr TCHAR Format[] = TEXT("%s(in %s,in %s,out %s)");
|
2022-04-21 09:10:19 -04:00
|
|
|
static const FName Notation = *FString::Printf(Format, *SelectName, *IndexName, *ValueName, *ResultName);
|
|
|
|
|
return Notation;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const FRigVMTemplate* URigVMSelectNode::GetTemplate() const
|
|
|
|
|
{
|
|
|
|
|
if(const FRigVMTemplate* SuperTemplate = Super::GetTemplate())
|
|
|
|
|
{
|
|
|
|
|
return SuperTemplate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(CachedTemplate == nullptr)
|
|
|
|
|
{
|
2022-06-22 08:37:48 -04:00
|
|
|
static const FRigVMTemplate* SelectNodeTemplate = nullptr;
|
|
|
|
|
if(SelectNodeTemplate)
|
|
|
|
|
{
|
|
|
|
|
return SelectNodeTemplate;
|
|
|
|
|
}
|
2022-05-20 11:00:38 -04:00
|
|
|
|
2022-06-29 09:31:30 -04:00
|
|
|
static const FName IndexFName = *IndexName;
|
|
|
|
|
static const FName ValueFName = *ValueName;
|
|
|
|
|
static const FName ResultFName = *ResultName;
|
|
|
|
|
|
2022-06-22 08:37:48 -04:00
|
|
|
static TArray<FRigVMTemplateArgument> Arguments;
|
|
|
|
|
if(Arguments.IsEmpty())
|
|
|
|
|
{
|
2022-06-29 09:31:30 -04:00
|
|
|
static const TArray<FRigVMTemplateArgument::ETypeCategory> ValueTypeCategories = {
|
|
|
|
|
FRigVMTemplateArgument::ETypeCategory_ArrayAnyValue,
|
|
|
|
|
FRigVMTemplateArgument::ETypeCategory_ArrayArrayAnyValue
|
|
|
|
|
};
|
|
|
|
|
static const TArray<FRigVMTemplateArgument::ETypeCategory> ResultTypeCategories = {
|
|
|
|
|
FRigVMTemplateArgument::ETypeCategory_SingleAnyValue,
|
|
|
|
|
FRigVMTemplateArgument::ETypeCategory_ArrayAnyValue
|
|
|
|
|
};
|
2022-06-22 08:37:48 -04:00
|
|
|
Arguments.Reserve(3);
|
2022-06-29 09:31:30 -04:00
|
|
|
Arguments.Emplace(IndexFName, ERigVMPinDirection::Input, RigVMTypeUtils::TypeIndex::Int32);
|
|
|
|
|
Arguments.Emplace(ValueFName, ERigVMPinDirection::Input, ValueTypeCategories);
|
|
|
|
|
Arguments.Emplace(ResultFName, ERigVMPinDirection::Output, ResultTypeCategories);
|
2022-06-22 08:37:48 -04:00
|
|
|
}
|
2022-06-29 09:31:30 -04:00
|
|
|
|
|
|
|
|
FRigVMTemplateDelegates Delegates;
|
|
|
|
|
Delegates.NewArgumentTypeDelegate =
|
|
|
|
|
FRigVMTemplate_NewArgumentTypeDelegate::CreateLambda([](const FRigVMTemplate*, const FName& InArgumentName, int32 InTypeIndex)
|
|
|
|
|
{
|
|
|
|
|
FRigVMTemplateTypeMap Types;
|
|
|
|
|
|
|
|
|
|
int32 ValueTypeIndex = INDEX_NONE;
|
|
|
|
|
int32 ResultTypeIndex = INDEX_NONE;
|
|
|
|
|
|
|
|
|
|
if(InArgumentName == ValueFName)
|
|
|
|
|
{
|
|
|
|
|
ValueTypeIndex = InTypeIndex;
|
|
|
|
|
ResultTypeIndex = FRigVMRegistry::Get().GetBaseTypeFromArrayTypeIndex(InTypeIndex);
|
|
|
|
|
}
|
2022-07-01 04:49:47 -04:00
|
|
|
else if(InArgumentName == ResultFName)
|
2022-06-29 09:31:30 -04:00
|
|
|
{
|
|
|
|
|
ValueTypeIndex = FRigVMRegistry::Get().GetArrayTypeFromBaseTypeIndex(InTypeIndex);;
|
|
|
|
|
ResultTypeIndex = InTypeIndex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(ValueTypeIndex != INDEX_NONE && ResultTypeIndex != INDEX_NONE)
|
|
|
|
|
{
|
|
|
|
|
Types.Add(IndexFName, RigVMTypeUtils::TypeIndex::Int32);
|
|
|
|
|
Types.Add(ValueFName, ValueTypeIndex);
|
|
|
|
|
Types.Add(ResultFName, ResultTypeIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Types;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
SelectNodeTemplate = CachedTemplate = FRigVMRegistry::Get().GetOrAddTemplateFromArguments(*SelectName, Arguments, Delegates);
|
2022-04-21 09:10:19 -04:00
|
|
|
}
|
|
|
|
|
return CachedTemplate;
|
2022-09-24 13:31:25 -04:00
|
|
|
}
|