2021-08-18 06:18:21 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "RigVMModel/Nodes/RigVMArrayNode.h"
# include "RigVMModel/RigVMGraph.h"
2022-04-21 09:10:19 -04:00
# include "RigVMCore/RigVMStruct.h"
2021-08-18 06:18:21 -04:00
2022-09-24 13:31:25 -04:00
# include UE_INLINE_GENERATED_CPP_BY_NAME(RigVMArrayNode)
2021-08-18 06:18:21 -04:00
const FString URigVMArrayNode : : ArrayName = TEXT ( " Array " ) ;
const FString URigVMArrayNode : : NumName = TEXT ( " Num " ) ;
const FString URigVMArrayNode : : IndexName = TEXT ( " Index " ) ;
const FString URigVMArrayNode : : ElementName = TEXT ( " Element " ) ;
const FString URigVMArrayNode : : SuccessName = TEXT ( " Success " ) ;
const FString URigVMArrayNode : : OtherName = TEXT ( " Other " ) ;
const FString URigVMArrayNode : : CloneName = TEXT ( " Clone " ) ;
const FString URigVMArrayNode : : CountName = TEXT ( " Count " ) ;
const FString URigVMArrayNode : : RatioName = TEXT ( " Ratio " ) ;
const FString URigVMArrayNode : : ResultName = TEXT ( " Result " ) ;
const FString URigVMArrayNode : : ContinueName = TEXT ( " Continue " ) ;
const FString URigVMArrayNode : : CompletedName = TEXT ( " Completed " ) ;
URigVMArrayNode : : URigVMArrayNode ( )
: OpCode ( ERigVMOpCode : : Invalid )
{
}
FString URigVMArrayNode : : GetNodeTitle ( ) const
{
return GetNodeTitle ( OpCode ) ;
}
FString URigVMArrayNode : : GetNodeTitle ( ERigVMOpCode InOpCode )
{
if ( InOpCode = = ERigVMOpCode : : ArrayGetAtIndex )
{
static const FString ArrayGetAtIndexNodeTitle = TEXT ( " At " ) ;
return ArrayGetAtIndexNodeTitle ;
}
else if ( InOpCode = = ERigVMOpCode : : ArraySetAtIndex )
{
static const FString ArraySetAtIndexNodeTitle = TEXT ( " Set At " ) ;
return ArraySetAtIndexNodeTitle ;
}
else if ( InOpCode = = ERigVMOpCode : : ArrayGetNum )
{
static const FString ArrayGetNumNodeTitle = TEXT ( " Num " ) ;
return ArrayGetNumNodeTitle ;
}
else if ( InOpCode = = ERigVMOpCode : : ArrayIterator )
{
static const FString ArrayIteratorNodeTitle = TEXT ( " For Each " ) ;
return ArrayIteratorNodeTitle ;
}
FString OpCodeString = StaticEnum < ERigVMOpCode > ( ) - > GetDisplayNameTextByValue ( ( int64 ) InOpCode ) . ToString ( ) ;
OpCodeString . RemoveFromStart ( URigVMArrayNode : : ArrayName ) ;
return OpCodeString ;
}
FText URigVMArrayNode : : GetToolTipText ( ) const
{
switch ( OpCode )
{
case ERigVMOpCode : : ArrayReset :
{
return FText : : FromString ( TEXT ( " Removes all elements from an array. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayGetNum :
{
return FText : : FromString ( TEXT ( " Returns the number of elements of an array " ) ) ;
}
case ERigVMOpCode : : ArraySetNum :
{
return FText : : FromString ( TEXT ( " Sets the numbers of elements of an array. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayGetAtIndex :
{
return FText : : FromString ( TEXT ( " Returns an element of an array by index. " ) ) ;
}
case ERigVMOpCode : : ArraySetAtIndex :
{
return FText : : FromString ( TEXT ( " Sets an element of an array by index. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayAdd :
{
return FText : : FromString ( TEXT ( " Adds an element to an array and returns the new element's index. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayInsert :
{
return FText : : FromString ( TEXT ( " Inserts an element into an array at a given index. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayRemove :
{
return FText : : FromString ( TEXT ( " Removes an element from an array by index. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayFind :
{
return FText : : FromString ( TEXT ( " Searchs a potential element in an array and returns its index. " ) ) ;
}
case ERigVMOpCode : : ArrayAppend :
{
return FText : : FromString ( TEXT ( " Appends the another array to the main one. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayClone :
{
return FText : : FromString ( TEXT ( " Clones an array and returns a duplicate. " ) ) ;
}
case ERigVMOpCode : : ArrayIterator :
{
return FText : : FromString ( TEXT ( " Loops over the elements in an array. " ) ) ;
}
case ERigVMOpCode : : ArrayUnion :
{
return FText : : FromString ( TEXT ( " Merges two arrays while ensuring unique elements. \n Modifies the input array. " ) ) ;
}
case ERigVMOpCode : : ArrayDifference :
{
return FText : : FromString ( TEXT ( " Creates a new array containing the difference between the two input arrays. \n Difference here means elements that are only contained in either A or B. " ) ) ;
}
case ERigVMOpCode : : ArrayIntersection :
{
return FText : : FromString ( TEXT ( " Creates a new array containing the intersection between the two input arrays. \n Difference here means elements that are contained in both A and B. " ) ) ;
}
case ERigVMOpCode : : ArrayReverse :
{
return FText : : FromString ( TEXT ( " Reverses the order of the elements of an array. \n Modifies the input array. " ) ) ;
}
default :
{
ensure ( false ) ;
break ;
}
}
return Super : : GetToolTipText ( ) ;
}
2022-04-21 09:10:19 -04:00
FName URigVMArrayNode : : GetNotation ( ) const
{
const FString TemplateName = StaticEnum < ERigVMOpCode > ( ) - > GetDisplayNameTextByValue ( ( int64 ) OpCode ) . ToString ( ) ;
switch ( OpCode )
{
case ERigVMOpCode : : ArrayReset :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayGetNum :
{
2022-10-25 05:45:35 -04:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(in %s,out %s) " ) ;
2022-04-21 09:10:19 -04:00
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * NumName ) ;
return Notation ;
}
case ERigVMOpCode : : ArraySetNum :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s,in %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * NumName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayGetAtIndex :
{
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
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * IndexName , * ElementName ) ;
return Notation ;
}
case ERigVMOpCode : : ArraySetAtIndex :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s,in %s,in %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * IndexName , * ElementName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayAdd :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s,in %s,out %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * ElementName , * IndexName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayInsert :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s,in %s,in %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * IndexName , * ElementName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayRemove :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s,in %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * IndexName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayFind :
{
2022-10-25 05:45:35 -04:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(in %s,in %s,out %s,out %s) " ) ;
2022-04-21 09:10:19 -04:00
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * ElementName , * IndexName , * SuccessName ) ;
return Notation ;
}
case ERigVMOpCode : : ArrayAppend :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s,in %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * OtherName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayClone :
{
2022-10-25 05:45:35 -04:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(in %s,out %s) " ) ;
2022-04-21 09:10:19 -04:00
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * CloneName ) ;
return Notation ;
}
case ERigVMOpCode : : ArrayIterator :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(in %s,out %s,out %s,out %s,out %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName ,
* ArrayName , * ElementName , * IndexName , * CountName , * RatioName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayUnion :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s,in %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * OtherName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
case ERigVMOpCode : : ArrayDifference :
{
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
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * OtherName , * ResultName ) ;
return Notation ;
}
case ERigVMOpCode : : ArrayIntersection :
{
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
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName , * OtherName , * ResultName ) ;
return Notation ;
}
case ERigVMOpCode : : ArrayReverse :
{
2022-11-10 04:36:01 -05:00
static constexpr TCHAR Format [ ] = TEXT ( " %s(io %s) " ) ;
const FName Notation = * FString : : Printf ( Format , * TemplateName , * ArrayName ) ;
2022-04-21 09:10:19 -04:00
return Notation ;
}
default :
{
ensure ( false ) ;
break ;
}
}
return Super : : GetNotation ( ) ;
}
const FRigVMTemplate * URigVMArrayNode : : GetTemplate ( ) const
{
if ( const FRigVMTemplate * SuperTemplate = Super : : GetTemplate ( ) )
{
return SuperTemplate ;
}
if ( CachedTemplate = = nullptr )
2022-06-22 08:37:48 -04:00
{
static TArray < const FRigVMTemplate * > TemplatesPerOpCode ;
static TArray < TArray < FRigVMTemplateArgument > > ArgumentsPerOpCode ;
if ( TemplatesPerOpCode . IsEmpty ( ) | | ArgumentsPerOpCode . IsEmpty ( ) )
{
constexpr int32 NumArrayOpCodes = int32 ( ERigVMOpCode : : LastArrayOpCode ) - int32 ( ERigVMOpCode : : FirstArrayOpCode ) + 1 ;
TemplatesPerOpCode . SetNumZeroed ( NumArrayOpCodes ) ;
ArgumentsPerOpCode . SetNum ( NumArrayOpCodes ) ;
}
2022-05-20 11:00:38 -04:00
2022-06-22 08:37:48 -04:00
const int32 OpCodeIndex = int32 ( OpCode ) - int32 ( ERigVMOpCode : : FirstArrayOpCode ) ;
2022-04-21 09:10:19 -04:00
2022-06-22 08:37:48 -04:00
if ( TemplatesPerOpCode [ OpCodeIndex ] )
{
2022-06-28 13:41:23 -04:00
CachedTemplate = TemplatesPerOpCode [ OpCodeIndex ] ;
2022-06-22 08:37:48 -04:00
return TemplatesPerOpCode [ OpCodeIndex ] ;
}
2022-06-29 09:31:30 -04:00
static const FName ArrayFName = * ArrayName ;
static const FName NumFName = * NumName ;
static const FName IndexFName = * IndexName ;
static const FName ElementFName = * ElementName ;
static const FName SuccessFName = * SuccessName ;
static const FName OtherFName = * OtherName ;
static const FName CloneFName = * CloneName ;
static const FName CountFName = * CountName ;
static const FName RatioFName = * RatioName ;
static const FName ResultFName = * ResultName ;
static const FName ContinueFName = * ContinueName ;
2022-04-21 09:10:19 -04:00
2022-06-22 08:37:48 -04:00
TArray < FRigVMTemplateArgument > & Arguments = ArgumentsPerOpCode [ OpCodeIndex ] ;
2022-04-21 09:10:19 -04:00
2022-06-22 08:37:48 -04:00
if ( Arguments . IsEmpty ( ) )
{
Arguments . Reserve ( 8 ) ;
2022-06-29 09:31:30 -04:00
static const TArray < FRigVMTemplateArgument : : ETypeCategory > SingleCategory = { FRigVMTemplateArgument : : ETypeCategory_SingleAnyValue } ;
static const TArray < FRigVMTemplateArgument : : ETypeCategory > ArrayCategory = { FRigVMTemplateArgument : : ETypeCategory_ArrayAnyValue } ;
2022-06-22 08:37:48 -04:00
switch ( OpCode )
{
case ERigVMOpCode : : ArrayReset :
case ERigVMOpCode : : ArrayReverse :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : IO , ArrayCategory ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayGetNum :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
Arguments . Emplace ( NumFName , ERigVMPinDirection : : Output , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArraySetNum :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : IO , ArrayCategory ) ;
Arguments . Emplace ( NumFName , ERigVMPinDirection : : Input , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayGetAtIndex :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
Arguments . Emplace ( IndexFName , ERigVMPinDirection : : Input , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Arguments . Emplace ( ElementFName , ERigVMPinDirection : : Output , SingleCategory ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArraySetAtIndex :
case ERigVMOpCode : : ArrayInsert :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : IO , ArrayCategory ) ;
Arguments . Emplace ( IndexFName , ERigVMPinDirection : : Input , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Arguments . Emplace ( ElementFName , ERigVMPinDirection : : Input , SingleCategory ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayAdd :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : IO , ArrayCategory ) ;
Arguments . Emplace ( ElementFName , ERigVMPinDirection : : Input , SingleCategory ) ;
Arguments . Emplace ( IndexFName , ERigVMPinDirection : : Output , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayRemove :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : IO , ArrayCategory ) ;
Arguments . Emplace ( IndexFName , ERigVMPinDirection : : Input , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayFind :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
Arguments . Emplace ( ElementFName , ERigVMPinDirection : : Input , SingleCategory ) ;
Arguments . Emplace ( IndexFName , ERigVMPinDirection : : Output , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Arguments . Emplace ( SuccessFName , ERigVMPinDirection : : Output , RigVMTypeUtils : : TypeIndex : : Bool ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayAppend :
case ERigVMOpCode : : ArrayUnion :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : IO , ArrayCategory ) ;
Arguments . Emplace ( OtherFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayClone :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
Arguments . Emplace ( CloneFName , ERigVMPinDirection : : Output , ArrayCategory ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayIterator :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
Arguments . Emplace ( ElementFName , ERigVMPinDirection : : Output , SingleCategory ) ;
Arguments . Emplace ( IndexFName , ERigVMPinDirection : : Output , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Arguments . Emplace ( CountFName , ERigVMPinDirection : : Output , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Arguments . Emplace ( RatioFName , ERigVMPinDirection : : Output , RigVMTypeUtils : : TypeIndex : : Float ) ;
2022-08-17 19:07:05 -04:00
Arguments . Emplace ( ContinueFName , ERigVMPinDirection : : Hidden , RigVMTypeUtils : : TypeIndex : : Bool ) ;
2022-06-22 08:37:48 -04:00
break ;
}
case ERigVMOpCode : : ArrayDifference :
case ERigVMOpCode : : ArrayIntersection :
{
2022-06-29 09:31:30 -04:00
Arguments . Emplace ( ArrayFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
Arguments . Emplace ( OtherFName , ERigVMPinDirection : : Input , ArrayCategory ) ;
Arguments . Emplace ( ResultFName , ERigVMPinDirection : : Output , ArrayCategory ) ;
2022-06-22 08:37:48 -04:00
break ;
}
default :
{
ensure ( false ) ;
break ;
}
}
}
2022-06-29 09:31:30 -04:00
const FRigVMTemplateArgumentType ExecuteType ( GetGraph ( ) - > GetExecuteContextStruct ( ) ) ;
const int32 ExecuteTypeIndex = FRigVMRegistry : : Get ( ) . FindOrAddType ( ExecuteType ) ;
2022-04-21 09:10:19 -04:00
const FString TemplateName = StaticEnum < ERigVMOpCode > ( ) - > GetDisplayNameTextByValue ( ( int64 ) OpCode ) . ToString ( ) ;
2022-06-29 09:31:30 -04:00
FRigVMTemplateDelegates Delegates ;
Delegates . NewArgumentTypeDelegate =
FRigVMTemplate_NewArgumentTypeDelegate : : CreateLambda ( [ OpCodeIndex , ExecuteTypeIndex ] ( const FRigVMTemplate * , const FName & InArgumentName , int32 InTypeIndex )
{
FRigVMTemplateTypeMap Types ;
const ERigVMOpCode CurrentOpCode = ( ERigVMOpCode ) ( OpCodeIndex + int32 ( ERigVMOpCode : : FirstArrayOpCode ) ) ;
const FRigVMRegistry & Registry = FRigVMRegistry : : Get ( ) ;
switch ( CurrentOpCode )
{
case ERigVMOpCode : : ArrayReset :
case ERigVMOpCode : : ArrayReverse :
{
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
}
break ;
}
case ERigVMOpCode : : ArrayGetNum :
{
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( NumFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
}
break ;
}
case ERigVMOpCode : : ArraySetNum :
{
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( NumFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
}
break ;
}
case ERigVMOpCode : : ArrayGetAtIndex :
{
Types . Add ( IndexFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( ElementFName , Registry . GetBaseTypeFromArrayTypeIndex ( InTypeIndex ) ) ;
}
else if ( InArgumentName = = ElementFName )
{
Types . Add ( ArrayFName , Registry . GetArrayTypeFromBaseTypeIndex ( InTypeIndex ) ) ;
Types . Add ( ElementFName , InTypeIndex ) ;
}
break ;
}
case ERigVMOpCode : : ArraySetAtIndex :
case ERigVMOpCode : : ArrayInsert :
case ERigVMOpCode : : ArrayAdd :
{
Types . Add ( IndexFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( ElementFName , Registry . GetBaseTypeFromArrayTypeIndex ( InTypeIndex ) ) ;
}
else if ( InArgumentName = = ElementFName )
{
Types . Add ( ArrayFName , Registry . GetArrayTypeFromBaseTypeIndex ( InTypeIndex ) ) ;
Types . Add ( ElementFName , InTypeIndex ) ;
}
break ;
}
case ERigVMOpCode : : ArrayRemove :
{
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( IndexFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
}
break ;
}
case ERigVMOpCode : : ArrayFind :
{
Types . Add ( IndexFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Types . Add ( SuccessFName , RigVMTypeUtils : : TypeIndex : : Bool ) ;
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( ElementFName , Registry . GetBaseTypeFromArrayTypeIndex ( InTypeIndex ) ) ;
}
else if ( InArgumentName = = ElementFName )
{
Types . Add ( ArrayFName , Registry . GetArrayTypeFromBaseTypeIndex ( InTypeIndex ) ) ;
Types . Add ( ElementFName , InTypeIndex ) ;
}
break ;
}
case ERigVMOpCode : : ArrayAppend :
case ERigVMOpCode : : ArrayUnion :
{
if ( InArgumentName = = ArrayFName | | InArgumentName = = OtherFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( OtherFName , InTypeIndex ) ;
}
break ;
}
case ERigVMOpCode : : ArrayClone :
{
if ( InArgumentName = = ArrayFName | | InArgumentName = = CloneFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( CloneFName , InTypeIndex ) ;
}
break ;
}
case ERigVMOpCode : : ArrayIterator :
{
2022-08-17 19:07:05 -04:00
Types . Add ( ContinueFName , RigVMTypeUtils : : TypeIndex : : Bool ) ;
2022-06-29 09:31:30 -04:00
Types . Add ( IndexFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Types . Add ( CountFName , RigVMTypeUtils : : TypeIndex : : Int32 ) ;
Types . Add ( RatioFName , RigVMTypeUtils : : TypeIndex : : Float ) ;
if ( InArgumentName = = ArrayFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( ElementFName , Registry . GetBaseTypeFromArrayTypeIndex ( InTypeIndex ) ) ;
}
else if ( InArgumentName = = ElementFName )
{
Types . Add ( ArrayFName , Registry . GetArrayTypeFromBaseTypeIndex ( InTypeIndex ) ) ;
Types . Add ( ElementFName , InTypeIndex ) ;
}
break ;
}
case ERigVMOpCode : : ArrayDifference :
case ERigVMOpCode : : ArrayIntersection :
{
if ( InArgumentName = = ArrayFName | | InArgumentName = = OtherFName | | InArgumentName = = ResultFName )
{
Types . Add ( ArrayFName , InTypeIndex ) ;
Types . Add ( OtherFName , InTypeIndex ) ;
Types . Add ( ResultFName , InTypeIndex ) ;
}
break ;
}
default :
{
ensure ( false ) ;
break ;
}
}
return Types ;
} ) ;
TemplatesPerOpCode [ OpCodeIndex ] = CachedTemplate = FRigVMRegistry : : Get ( ) . GetOrAddTemplateFromArguments ( * TemplateName , Arguments , Delegates ) ;
2022-04-21 09:10:19 -04:00
}
return CachedTemplate ;
}
2022-11-18 06:25:07 -05:00
const TArray < FName > & URigVMArrayNode : : GetControlFlowBlocks ( ) const
2021-08-18 06:18:21 -04:00
{
2022-11-18 06:25:07 -05:00
if ( GetOpCode ( ) = = ERigVMOpCode : : ArrayIterator )
{
static const TArray < FName > LoopBlocks = { FRigVMStruct : : ExecuteContextName , FRigVMStruct : : ForLoopCompletedPinName } ;
return LoopBlocks ;
}
return Super : : GetControlFlowBlocks ( ) ;
2021-08-18 06:18:21 -04:00
}
FText URigVMArrayNode : : GetToolTipTextForPin ( const URigVMPin * InPin ) const
{
switch ( OpCode )
{
case ERigVMOpCode : : ArrayReset :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to be cleared. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayGetNum :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to retrieve the size for. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : NumName )
{
return FText : : FromString ( TEXT ( " The size of the input array. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArraySetNum :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to set the size for. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : NumName )
{
return FText : : FromString ( TEXT ( " The new size of the array. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayGetAtIndex :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to retrieve an element from. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : IndexName )
{
return FText : : FromString ( TEXT ( " The index of the element to retrieve. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ElementName )
{
return FText : : FromString ( TEXT ( " The element at the given index. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArraySetAtIndex :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to set an element for. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : IndexName )
{
return FText : : FromString ( TEXT ( " The index of the element to set. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ElementName )
{
return FText : : FromString ( TEXT ( " The new value for element to set. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayAdd :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to add an element to. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ElementName )
{
return FText : : FromString ( TEXT ( " The element to add to the array. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : IndexName )
{
return FText : : FromString ( TEXT ( " The index of the newly added element. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayInsert :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to insert an element into. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : IndexName )
{
return FText : : FromString ( TEXT ( " The index at which to insert the element. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ElementName )
{
return FText : : FromString ( TEXT ( " The element to insert into the array. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayRemove :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to remove an element from. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : IndexName )
{
return FText : : FromString ( TEXT ( " The index at which to remove the element. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayFind :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to search within. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ElementName )
{
return FText : : FromString ( TEXT ( " The element to look for. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : IndexName )
{
return FText : : FromString ( TEXT ( " The index of the found element (or -1). " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : SuccessName )
{
return FText : : FromString ( TEXT ( " True if the element has been found. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayAppend :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to append the other array to. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : OtherName )
{
return FText : : FromString ( TEXT ( " The second array to append to the first one. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayClone :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to clone " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : CloneName )
{
return FText : : FromString ( TEXT ( " The duplicate of the input array. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayIterator :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to iterate over " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : IndexName )
{
return FText : : FromString ( TEXT ( " The index of the current element. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : CountName )
{
return FText : : FromString ( TEXT ( " The count of all elements in the array. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ElementName )
{
return FText : : FromString ( TEXT ( " The current element. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : RatioName )
{
return FText : : FromString ( TEXT ( " A float ratio from 0.0 (first element) to 1.0 (last element). " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : CompletedName )
{
return FText : : FromString ( TEXT ( " The execute block to run once the loop has completed. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayUnion :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array to merge the other array with. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : OtherName )
{
return FText : : FromString ( TEXT ( " The second array to merge to the first one. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayDifference :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The first array to compare the other array with. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : OtherName )
{
return FText : : FromString ( TEXT ( " The second array to compare the other array with. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ResultName )
{
return FText : : FromString ( TEXT ( " The resulting difference array. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayIntersection :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The first array to compare the other array with. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : OtherName )
{
return FText : : FromString ( TEXT ( " The second array to compare the other array with. " ) ) ;
}
else if ( InPin - > GetName ( ) = = URigVMArrayNode : : ResultName )
{
return FText : : FromString ( TEXT ( " The resulting intersecting array. " ) ) ;
}
break ;
}
case ERigVMOpCode : : ArrayReverse :
{
if ( InPin - > GetName ( ) = = URigVMArrayNode : : ArrayName )
{
return FText : : FromString ( TEXT ( " The array reverse. " ) ) ;
}
break ;
}
default :
{
ensure ( false ) ;
break ;
}
}
return Super : : GetToolTipTextForPin ( InPin ) ;
}
FLinearColor URigVMArrayNode : : GetNodeColor ( ) const
{
return FLinearColor : : White ;
}
ERigVMOpCode URigVMArrayNode : : GetOpCode ( ) const
{
return OpCode ;
}
FString URigVMArrayNode : : GetCPPType ( ) const
{
URigVMPin * ArrayPin = FindPin ( ArrayName ) ;
if ( ArrayPin = = nullptr )
{
return FString ( ) ;
}
2021-11-24 05:34:30 -05:00
return RigVMTypeUtils : : BaseTypeFromArrayType ( ArrayPin - > GetCPPType ( ) ) ;
2021-08-18 06:18:21 -04:00
}
UObject * URigVMArrayNode : : GetCPPTypeObject ( ) const
{
URigVMPin * ArrayPin = FindPin ( ArrayName ) ;
if ( ArrayPin = = nullptr )
{
return nullptr ;
}
return ArrayPin - > GetCPPTypeObject ( ) ;
}
2022-09-24 13:31:25 -04:00