You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#rb: none #fyi: Laurent.Delayen, Thomas.Sarkanen [CL 11088765 by Lina Halper in Main branch]
334 lines
5.8 KiB
C++
334 lines
5.8 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "RigVMModel/RigVMNode.h"
|
|
#include "RigVMModel/RigVMGraph.h"
|
|
#include "RigVMCore/RigVMExecuteContext.h"
|
|
|
|
const FString URigVMNode::ExecuteName = TEXT("Execute");
|
|
const FString URigVMNode::ExecuteContextName = TEXT("ExecuteContext");
|
|
const FString URigVMNode::NodeColorName = TEXT("NodeColor");
|
|
|
|
URigVMNode::URigVMNode()
|
|
: UObject()
|
|
, Position(FVector2D::ZeroVector)
|
|
, Size(FVector2D::ZeroVector)
|
|
, NodeColor(FLinearColor::Black)
|
|
, InstructionIndex(INDEX_NONE)
|
|
{
|
|
|
|
}
|
|
|
|
URigVMNode::~URigVMNode()
|
|
{
|
|
}
|
|
|
|
FString URigVMNode::GetNodePath() const
|
|
{
|
|
return GetName();
|
|
}
|
|
|
|
int32 URigVMNode::GetNodeIndex() const
|
|
{
|
|
int32 Index = INDEX_NONE;
|
|
URigVMGraph* Graph = GetGraph();
|
|
if (Graph != nullptr)
|
|
{
|
|
Graph->GetNodes().Find((URigVMNode*)this, Index);
|
|
}
|
|
return Index;
|
|
}
|
|
|
|
int32 URigVMNode::GetInstructionIndex() const
|
|
{
|
|
return InstructionIndex;
|
|
}
|
|
|
|
const TArray<URigVMPin*>& URigVMNode::GetPins() const
|
|
{
|
|
return Pins;
|
|
}
|
|
|
|
TArray<URigVMPin*> URigVMNode::GetAllPinsRecursively() const
|
|
{
|
|
struct Local
|
|
{
|
|
static void VisitPinRecursively(URigVMPin* InPin, TArray<URigVMPin*>& OutPins)
|
|
{
|
|
OutPins.Add(InPin);
|
|
for (URigVMPin* SubPin : InPin->GetSubPins())
|
|
{
|
|
VisitPinRecursively(SubPin, OutPins);
|
|
}
|
|
}
|
|
};
|
|
|
|
TArray<URigVMPin*> Result;
|
|
for (URigVMPin* Pin : Pins)
|
|
{
|
|
Local::VisitPinRecursively(Pin, Result);
|
|
}
|
|
return Result;
|
|
}
|
|
|
|
URigVMPin* URigVMNode::FindPin(const FString& InPinPath) const
|
|
{
|
|
FString Left, Right;
|
|
if (!URigVMPin::SplitPinPathAtStart(InPinPath, Left, Right))
|
|
{
|
|
Left = InPinPath;
|
|
}
|
|
|
|
for (URigVMPin* Pin : Pins)
|
|
{
|
|
if (Pin->GetName() == Left)
|
|
{
|
|
if (Right.IsEmpty())
|
|
{
|
|
return Pin;
|
|
}
|
|
return Pin->FindSubPin(Right);
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
URigVMGraph* URigVMNode::GetGraph() const
|
|
{
|
|
if (URigVMGraph* Graph = Cast<URigVMGraph>(GetOuter()))
|
|
{
|
|
return Graph;
|
|
}
|
|
if (URigVMInjectionInfo* InjectionInfo = GetInjectionInfo())
|
|
{
|
|
return InjectionInfo->GetGraph();
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
URigVMInjectionInfo* URigVMNode::GetInjectionInfo() const
|
|
{
|
|
return Cast<URigVMInjectionInfo>(GetOuter());
|
|
}
|
|
|
|
FString URigVMNode::GetNodeTitle() const
|
|
{
|
|
if (!NodeTitle.IsEmpty())
|
|
{
|
|
return NodeTitle;
|
|
}
|
|
return GetName();
|
|
}
|
|
|
|
FVector2D URigVMNode::GetPosition() const
|
|
{
|
|
return Position;
|
|
}
|
|
|
|
FVector2D URigVMNode::GetSize() const
|
|
{
|
|
return Size;
|
|
}
|
|
|
|
FLinearColor URigVMNode::GetNodeColor() const
|
|
{
|
|
return NodeColor;
|
|
}
|
|
|
|
FText URigVMNode::GetToolTipText() const
|
|
{
|
|
return FText::FromName(GetFName());
|
|
}
|
|
|
|
FText URigVMNode::GetToolTipTextForPin(const URigVMPin* InPin) const
|
|
{
|
|
return FText::FromName(InPin->GetFName());
|
|
}
|
|
|
|
bool URigVMNode::IsSelected() const
|
|
{
|
|
URigVMGraph* Graph = GetGraph();
|
|
if (Graph)
|
|
{
|
|
return Graph->IsNodeSelected(GetFName());
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool URigVMNode::IsInjected() const
|
|
{
|
|
return Cast<URigVMInjectionInfo>(GetOuter()) != nullptr;
|
|
}
|
|
|
|
bool URigVMNode::IsVisibleInUI() const
|
|
{
|
|
return !IsInjected();
|
|
}
|
|
|
|
bool URigVMNode::IsPure() const
|
|
{
|
|
if(IsMutable())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
for (URigVMPin* Pin : Pins)
|
|
{
|
|
if(Pin->GetDirection() == ERigVMPinDirection::Hidden)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool URigVMNode::IsMutable() const
|
|
{
|
|
URigVMPin* ExecutePin = FindPin(ExecuteContextName);
|
|
if (ExecutePin)
|
|
{
|
|
if (ExecutePin->GetScriptStruct()->IsChildOf(FRigVMExecuteContext::StaticStruct()))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool URigVMNode::IsEvent() const
|
|
{
|
|
return IsMutable() && !HasInputPin(true /* include io */);
|
|
}
|
|
|
|
FName URigVMNode::GetEventName() const
|
|
{
|
|
return TEXT("Update");
|
|
}
|
|
|
|
bool URigVMNode::HasInputPin(bool bIncludeIO) const
|
|
{
|
|
if (HasPinOfDirection(ERigVMPinDirection::Input))
|
|
{
|
|
return true;
|
|
}
|
|
if (bIncludeIO)
|
|
{
|
|
return HasPinOfDirection(ERigVMPinDirection::IO);
|
|
}
|
|
return false;
|
|
|
|
}
|
|
|
|
bool URigVMNode::HasIOPin() const
|
|
{
|
|
return HasPinOfDirection(ERigVMPinDirection::IO);
|
|
}
|
|
|
|
bool URigVMNode::HasOutputPin(bool bIncludeIO) const
|
|
{
|
|
if (HasPinOfDirection(ERigVMPinDirection::Output))
|
|
{
|
|
return true;
|
|
}
|
|
if (bIncludeIO)
|
|
{
|
|
return HasPinOfDirection(ERigVMPinDirection::IO);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool URigVMNode::HasPinOfDirection(ERigVMPinDirection InDirection) const
|
|
{
|
|
for (URigVMPin* Pin : Pins)
|
|
{
|
|
if (Pin->GetDirection() == InDirection)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool URigVMNode::IsLinkedTo(URigVMNode* InNode) const
|
|
{
|
|
if (InNode == nullptr)
|
|
{
|
|
return false;
|
|
}
|
|
if (InNode == this)
|
|
{
|
|
return false;
|
|
}
|
|
if (GetGraph() != InNode->GetGraph())
|
|
{
|
|
return false;
|
|
}
|
|
for (URigVMPin* Pin : Pins)
|
|
{
|
|
if (IsLinkedToRecursive(Pin, InNode))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool URigVMNode::IsLinkedToRecursive(URigVMPin* InPin, URigVMNode* InNode) const
|
|
{
|
|
for (URigVMPin* LinkedPin : InPin->GetLinkedSourcePins())
|
|
{
|
|
if (LinkedPin->GetNode() == InNode)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
for (URigVMPin* LinkedPin : InPin->GetLinkedTargetPins())
|
|
{
|
|
if (LinkedPin->GetNode() == InNode)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
for (URigVMPin* SubPin : InPin->GetSubPins())
|
|
{
|
|
if (IsLinkedToRecursive(SubPin, InNode))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
TArray<URigVMNode*> URigVMNode::GetLinkedSourceNodes() const
|
|
{
|
|
TArray<URigVMNode*> Nodes;
|
|
for (URigVMPin* Pin : Pins)
|
|
{
|
|
GetLinkedNodesRecursive(Pin, true, Nodes);
|
|
}
|
|
return Nodes;
|
|
}
|
|
|
|
TArray<URigVMNode*> URigVMNode::GetLinkedTargetNodes() const
|
|
{
|
|
TArray<URigVMNode*> Nodes;
|
|
for (URigVMPin* Pin : Pins)
|
|
{
|
|
GetLinkedNodesRecursive(Pin, false, Nodes);
|
|
}
|
|
return Nodes;
|
|
}
|
|
|
|
void URigVMNode::GetLinkedNodesRecursive(URigVMPin* InPin, bool bLookForSources, TArray<URigVMNode*>& OutNodes) const
|
|
{
|
|
TArray<URigVMPin*> LinkedPins = bLookForSources ? InPin->GetLinkedSourcePins() : InPin->GetLinkedTargetPins();
|
|
for (URigVMPin* LinkedPin : LinkedPins)
|
|
{
|
|
OutNodes.AddUnique(LinkedPin->GetNode());
|
|
}
|
|
for (URigVMPin* SubPin : InPin->GetSubPins())
|
|
{
|
|
GetLinkedNodesRecursive(SubPin, bLookForSources, OutNodes);
|
|
}
|
|
}
|