// Copyright Epic Games, Inc. All Rights Reserved. #include "RigVMModel/Nodes/RigVMLibraryNode.h" #include "RigVMModel/Nodes/RigVMFunctionEntryNode.h" #include "RigVMModel/Nodes/RigVMFunctionReturnNode.h" #include "RigVMModel/RigVMGraph.h" #include "RigVMModel/Nodes/RigVMCollapseNode.h" #include "RigVMModel/Nodes/RigVMFunctionReferenceNode.h" const TArray URigVMLibraryNode::EmptyNodes; const TArray URigVMLibraryNode::EmptyLinks; bool URigVMLibraryNode::IsDefinedAsConstant() const { return !IsDefinedAsVarying(); } bool URigVMLibraryNode::IsDefinedAsVarying() const { if (URigVMGraph* Graph = GetContainedGraph()) { const TArray& Nodes = Graph->GetNodes(); for(URigVMNode* Node : Nodes) { if (Node->IsDefinedAsVarying()) { return true; } } } return false; } TArray URigVMLibraryNode::GetInstructionsForVMImpl(URigVM* InVM, const FRigVMASTProxy& InProxy) const { TArray Instructions; #if WITH_EDITOR if(InVM == nullptr) { return Instructions; } const FRigVMASTProxy Proxy = InProxy.GetChild((UObject*)this); for(URigVMNode* ContainedNode : GetContainedNodes()) { Instructions.Append(ContainedNode->GetInstructionsForVM(InVM, Proxy)); } #endif return Instructions; } /* int32 URigVMLibraryNode::GetInstructionVisitedCount(URigVM* InVM, const FRigVMASTProxy& InProxy, bool bConsolidatePerNode) const { int32 Count = 0; #if WITH_EDITOR if(InVM == nullptr) { return Count; } const FRigVMASTProxy Proxy = InProxy.GetChild((UObject*)this); for(URigVMNode* ContainedNode : GetContainedNodes()) { const int32 CountPerNode = ContainedNode->GetInstructionVisitedCount(InVM, Proxy, bConsolidatePerNode); Count += CountPerNode; } #endif return Count; } */ const TArray& URigVMLibraryNode::GetContainedNodes() const { if(URigVMGraph* Graph = GetContainedGraph()) { return Graph->GetNodes(); } return EmptyNodes; } const TArray& URigVMLibraryNode::GetContainedLinks() const { if (URigVMGraph* Graph = GetContainedGraph()) { return Graph->GetLinks(); } return EmptyLinks; } URigVMFunctionEntryNode* URigVMLibraryNode::GetEntryNode() const { if (URigVMGraph* Graph = GetContainedGraph()) { return Graph->GetEntryNode(); } return nullptr; } URigVMFunctionReturnNode* URigVMLibraryNode::GetReturnNode() const { if (URigVMGraph* Graph = GetContainedGraph()) { return Graph->GetReturnNode(); } return nullptr; } bool URigVMLibraryNode::Contains(URigVMLibraryNode* InContainedNode, bool bRecursive) const { if(InContainedNode == nullptr) { return false; } for(URigVMNode* ContainedNode : GetContainedNodes()) { if(ContainedNode == InContainedNode) { return true; } if(URigVMFunctionReferenceNode* FunctionReferenceNode = Cast(ContainedNode)) { if(URigVMLibraryNode* ReferencedNode = FunctionReferenceNode->GetReferencedNode()) { if(ReferencedNode == InContainedNode) { return true; } } } if(URigVMLibraryNode* ContainedLibraryNode = Cast(ContainedNode)) { if(ContainedLibraryNode->Contains(InContainedNode)) { return true; } } } return false; } TArray URigVMLibraryNode::GetExternalVariables() const { TArray Variables; if(URigVMGraph* ContainedGraph = GetContainedGraph()) { TArray ContainedVariables = ContainedGraph->GetExternalVariables(); for(const FRigVMExternalVariable& ContainedVariable : ContainedVariables) { FRigVMExternalVariable::MergeExternalVariable(Variables, ContainedVariable); } } return Variables; }