2019-12-27 09:26:59 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
2018-04-12 16:57:51 -04:00
|
|
|
|
2019-01-08 11:38:48 -05:00
|
|
|
#include "Graph/ControlRigGraph.h"
|
2018-04-12 16:57:51 -04:00
|
|
|
#include "ControlRigBlueprint.h"
|
2019-04-02 11:26:55 -04:00
|
|
|
#include "ControlRigBlueprintGeneratedClass.h"
|
2019-01-08 11:38:48 -05:00
|
|
|
#include "Graph/ControlRigGraphSchema.h"
|
2019-04-02 11:26:55 -04:00
|
|
|
#include "ControlRig.h"
|
2020-01-22 17:58:55 -05:00
|
|
|
#include "RigVMModel/RigVMGraph.h"
|
2019-04-02 11:26:55 -04:00
|
|
|
#include "ControlRigObjectVersion.h"
|
|
|
|
|
#include "Units/RigUnit.h"
|
2019-05-31 18:25:32 -04:00
|
|
|
#include "EdGraphNode_Comment.h"
|
2019-04-02 11:26:55 -04:00
|
|
|
#include "ControlRig/Private/Units/Execution/RigUnit_BeginExecution.h"
|
|
|
|
|
|
|
|
|
|
#if WITH_EDITOR
|
|
|
|
|
#include "Kismet2/BlueprintEditorUtils.h"
|
|
|
|
|
#include "ControlRigBlueprintUtils.h"
|
|
|
|
|
#include "BlueprintCompilationManager.h"
|
|
|
|
|
#include "Widgets/Notifications/SNotificationList.h"
|
|
|
|
|
#include "Framework/Notifications/NotificationManager.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define LOCTEXT_NAMESPACE "ControlRigGraph"
|
2018-04-12 16:57:51 -04:00
|
|
|
|
|
|
|
|
UControlRigGraph::UControlRigGraph()
|
|
|
|
|
{
|
2019-05-21 19:25:23 -04:00
|
|
|
bSuspendModelNotifications = false;
|
|
|
|
|
bIsTemporaryGraphForCopyPaste = false;
|
2020-01-22 17:58:55 -05:00
|
|
|
bIsSelecting = false;
|
2021-01-14 15:00:40 -04:00
|
|
|
bIsFunctionDefinition = false;
|
2018-04-12 16:57:51 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UControlRigGraph::Initialize(UControlRigBlueprint* InBlueprint)
|
|
|
|
|
{
|
2019-07-16 11:49:59 -04:00
|
|
|
DECLARE_SCOPE_HIERARCHICAL_COUNTER_FUNC()
|
|
|
|
|
|
2019-05-21 19:25:23 -04:00
|
|
|
InBlueprint->OnModified().RemoveAll(this);
|
2020-01-22 17:58:55 -05:00
|
|
|
InBlueprint->OnModified().AddUObject(this, &UControlRigGraph::HandleModifiedEvent);
|
2018-04-12 16:57:51 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const UControlRigGraphSchema* UControlRigGraph::GetControlRigGraphSchema()
|
|
|
|
|
{
|
|
|
|
|
return CastChecked<const UControlRigGraphSchema>(GetSchema());
|
|
|
|
|
}
|
2019-04-02 11:26:55 -04:00
|
|
|
|
|
|
|
|
#if WITH_EDITORONLY_DATA
|
|
|
|
|
void UControlRigGraph::Serialize(FArchive& Ar)
|
|
|
|
|
{
|
|
|
|
|
Super::Serialize(Ar);
|
|
|
|
|
|
|
|
|
|
Ar.UsingCustomVersion(FControlRigObjectVersion::GUID);
|
2020-12-14 08:58:12 -04:00
|
|
|
|
|
|
|
|
if (Ar.IsLoading())
|
|
|
|
|
{
|
|
|
|
|
Schema = UControlRigGraphSchema::StaticClass();
|
|
|
|
|
}
|
2019-04-02 11:26:55 -04:00
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if WITH_EDITOR
|
2020-01-22 17:58:55 -05:00
|
|
|
|
|
|
|
|
void UControlRigGraph::CacheNameLists(const FRigHierarchyContainer* HierarchyContainer, const FControlRigDrawContainer* DrawContainer)
|
2019-04-02 11:26:55 -04:00
|
|
|
{
|
2021-01-14 15:00:40 -04:00
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-22 17:58:55 -05:00
|
|
|
check(HierarchyContainer);
|
|
|
|
|
check(DrawContainer);
|
2019-07-16 11:49:59 -04:00
|
|
|
|
2020-01-22 17:58:55 -05:00
|
|
|
CacheNameList<FRigBoneHierarchy>(HierarchyContainer->BoneHierarchy, BoneNameList);
|
|
|
|
|
CacheNameList<FRigControlHierarchy>(HierarchyContainer->ControlHierarchy, ControlNameList);
|
|
|
|
|
CacheNameList<FRigSpaceHierarchy>(HierarchyContainer->SpaceHierarchy, SpaceNameList);
|
|
|
|
|
CacheNameList<FRigCurveContainer>(HierarchyContainer->CurveContainer, CurveNameList);
|
|
|
|
|
CacheNameList<FControlRigDrawContainer>(*DrawContainer, DrawingNameList);
|
2019-04-02 11:26:55 -04:00
|
|
|
}
|
|
|
|
|
|
2020-09-24 00:43:27 -04:00
|
|
|
const TArray<TSharedPtr<FString>>& UControlRigGraph::GetBoneNameList(URigVMPin* InPin) const
|
2019-04-02 11:26:55 -04:00
|
|
|
{
|
2021-01-14 15:00:40 -04:00
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return OuterGraph->GetBoneNameList(InPin);
|
|
|
|
|
}
|
2019-04-02 11:26:55 -04:00
|
|
|
return BoneNameList;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-24 00:43:27 -04:00
|
|
|
const TArray<TSharedPtr<FString>>& UControlRigGraph::GetControlNameList(URigVMPin* InPin) const
|
2019-09-17 19:12:19 -04:00
|
|
|
{
|
2021-01-14 15:00:40 -04:00
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return OuterGraph->GetControlNameList(InPin);
|
|
|
|
|
}
|
2019-09-17 19:12:19 -04:00
|
|
|
return ControlNameList;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-24 00:43:27 -04:00
|
|
|
const TArray<TSharedPtr<FString>>& UControlRigGraph::GetSpaceNameList(URigVMPin* InPin) const
|
2019-09-17 19:12:19 -04:00
|
|
|
{
|
2021-01-14 15:00:40 -04:00
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return OuterGraph->GetSpaceNameList(InPin);
|
|
|
|
|
}
|
2019-09-17 19:12:19 -04:00
|
|
|
return SpaceNameList;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-24 00:43:27 -04:00
|
|
|
const TArray<TSharedPtr<FString>>& UControlRigGraph::GetCurveNameList(URigVMPin* InPin) const
|
2019-09-17 19:12:19 -04:00
|
|
|
{
|
2021-01-14 15:00:40 -04:00
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return OuterGraph->GetCurveNameList(InPin);
|
|
|
|
|
}
|
2019-09-17 19:12:19 -04:00
|
|
|
return CurveNameList;
|
|
|
|
|
}
|
2019-05-21 19:25:23 -04:00
|
|
|
|
2020-09-24 00:43:27 -04:00
|
|
|
const TArray<TSharedPtr<FString>>& UControlRigGraph::GetElementNameList(URigVMPin* InPin) const
|
|
|
|
|
{
|
|
|
|
|
if (InPin)
|
|
|
|
|
{
|
|
|
|
|
if (URigVMPin* ParentPin = InPin->GetParentPin())
|
|
|
|
|
{
|
|
|
|
|
if (ParentPin->GetCPPTypeObject() == FRigElementKey::StaticStruct())
|
|
|
|
|
{
|
|
|
|
|
if (URigVMPin* TypePin = ParentPin->FindSubPin(TEXT("Type")))
|
|
|
|
|
{
|
|
|
|
|
FString DefaultValue = TypePin->GetDefaultValue();
|
|
|
|
|
if (!DefaultValue.IsEmpty())
|
|
|
|
|
{
|
|
|
|
|
ERigElementType Type = (ERigElementType)StaticEnum<ERigElementType>()->GetValueByNameString(DefaultValue);
|
|
|
|
|
return GetElementNameList(Type);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GetBoneNameList(nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TArray<TSharedPtr<FString>>& UControlRigGraph::GetElementNameList(ERigElementType InElementType) const
|
|
|
|
|
{
|
2021-01-14 15:00:40 -04:00
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return OuterGraph->GetElementNameList(InElementType);
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-24 00:43:27 -04:00
|
|
|
switch (InElementType)
|
|
|
|
|
{
|
|
|
|
|
case ERigElementType::Bone:
|
|
|
|
|
{
|
|
|
|
|
return GetBoneNameList();
|
|
|
|
|
}
|
|
|
|
|
case ERigElementType::Control:
|
|
|
|
|
{
|
|
|
|
|
return GetControlNameList();
|
|
|
|
|
}
|
|
|
|
|
case ERigElementType::Space:
|
|
|
|
|
{
|
|
|
|
|
return GetSpaceNameList();
|
|
|
|
|
}
|
|
|
|
|
case ERigElementType::Curve:
|
|
|
|
|
{
|
|
|
|
|
return GetCurveNameList();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GetBoneNameList(nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TArray<TSharedPtr<FString>>& UControlRigGraph::GetDrawingNameList(URigVMPin* InPin) const
|
2020-01-22 17:58:55 -05:00
|
|
|
{
|
2021-01-14 15:00:40 -04:00
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return OuterGraph->GetDrawingNameList(InPin);
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
return DrawingNameList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UControlRigGraph::HandleModifiedEvent(ERigVMGraphNotifType InNotifType, URigVMGraph* InGraph, UObject* InSubject)
|
2019-05-21 19:25:23 -04:00
|
|
|
{
|
2019-07-16 11:49:59 -04:00
|
|
|
DECLARE_SCOPE_HIERARCHICAL_COUNTER_FUNC()
|
|
|
|
|
|
2019-05-21 19:25:23 -04:00
|
|
|
if (bSuspendModelNotifications)
|
|
|
|
|
{
|
|
|
|
|
return;
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
2019-05-21 19:25:23 -04:00
|
|
|
|
2020-12-14 08:58:12 -04:00
|
|
|
// only make sure to receive notifs for this graph - unless
|
|
|
|
|
// we are on a template graph (used by node spawners)
|
|
|
|
|
if (GetModel() != InGraph && TemplateController == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-22 17:58:55 -05:00
|
|
|
switch (InNotifType)
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
Reimplementing FProperty changes from //UE4/Main
+ Reimplemented FProperty related fixed from //UE4/Main:
CL#10791312, 10804850, 10851666, 10855122, 10855198, 10942138, 11030611, 11030639, 11032261, 11061515, 11136964,11138881, 11214238, 11214865
#rb none (previously reviewed in Dev-Core)
[FYI] Chris.Bunnner, Daniel.Lamb
#ROBOMERGE-OWNER: robert.manuszewski
#ROBOMERGE-AUTHOR: robert.manuszewski
#ROBOMERGE-SOURCE: CL 11302985 via CL 11303011 via CL 11303019
#ROBOMERGE-BOT: (v0-11244347)
[CL 11303183 by robert manuszewski in Main branch]
2020-02-10 08:06:56 -05:00
|
|
|
case ERigVMGraphNotifType::GraphChanged:
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
Reimplementing FProperty changes from //UE4/Main
+ Reimplemented FProperty related fixed from //UE4/Main:
CL#10791312, 10804850, 10851666, 10855122, 10855198, 10942138, 11030611, 11030639, 11032261, 11061515, 11136964,11138881, 11214238, 11214865
#rb none (previously reviewed in Dev-Core)
[FYI] Chris.Bunnner, Daniel.Lamb
#ROBOMERGE-OWNER: robert.manuszewski
#ROBOMERGE-AUTHOR: robert.manuszewski
#ROBOMERGE-SOURCE: CL 11302985 via CL 11303011 via CL 11303019
#ROBOMERGE-BOT: (v0-11244347)
[CL 11303183 by robert manuszewski in Main branch]
2020-02-10 08:06:56 -05:00
|
|
|
for (URigVMNode* Node : InGraph->GetNodes())
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
UEdGraphNode* EdNode = FindNodeForModelNodeName(Node->GetFName());
|
2019-05-31 18:25:32 -04:00
|
|
|
if (EdNode != nullptr)
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2019-05-31 18:25:32 -04:00
|
|
|
RemoveNode(EdNode);
|
2019-05-21 19:25:23 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
case ERigVMGraphNotifType::NodeSelectionChanged:
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (bIsSelecting)
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
return;
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
TGuardValue<bool> SelectionGuard(bIsSelecting, true);
|
|
|
|
|
|
|
|
|
|
TSet<const UEdGraphNode*> NodeSelection;
|
|
|
|
|
for (FName NodeName : InGraph->GetSelectNodes())
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (UEdGraphNode* EdNode = FindNodeForModelNodeName(NodeName))
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
NodeSelection.Add(EdNode);
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
SelectNodeSet(NodeSelection);
|
|
|
|
|
break;
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
case ERigVMGraphNotifType::NodeAdded:
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
Reimplementing FProperty changes from //UE4/Main
+ Reimplemented FProperty related fixed from //UE4/Main:
CL#10791312, 10804850, 10851666, 10855122, 10855198, 10942138, 11030611, 11030639, 11032261, 11061515, 11136964,11138881, 11214238, 11214865
#rb none (previously reviewed in Dev-Core)
[FYI] Chris.Bunnner, Daniel.Lamb
#ROBOMERGE-OWNER: robert.manuszewski
#ROBOMERGE-AUTHOR: robert.manuszewski
#ROBOMERGE-SOURCE: CL 11302985 via CL 11303011 via CL 11303019
#ROBOMERGE-BOT: (v0-11244347)
[CL 11303183 by robert manuszewski in Main branch]
2020-02-10 08:06:56 -05:00
|
|
|
if (URigVMNode* ModelNode = Cast<URigVMNode>(InSubject))
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (!ModelNode->IsVisibleInUI())
|
|
|
|
|
{
|
|
|
|
|
if (URigVMInjectionInfo* Injection = ModelNode->GetInjectionInfo())
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (URigVMPin* ModelPin = Injection->GetPin())
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
URigVMNode* ParentModelNode = ModelPin->GetNode();
|
|
|
|
|
if (ParentModelNode)
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
UEdGraphNode* EdNode = FindNodeForModelNodeName(ParentModelNode->GetFName());
|
|
|
|
|
if (EdNode)
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(EdNode))
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
RigNode->ReconstructNode_Internal(true);
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
}
|
Reimplementing FProperty changes from //UE4/Main
+ Reimplemented FProperty related fixed from //UE4/Main:
CL#10791312, 10804850, 10851666, 10855122, 10855198, 10942138, 11030611, 11030639, 11032261, 11061515, 11136964,11138881, 11214238, 11214865
#rb none (previously reviewed in Dev-Core)
[FYI] Chris.Bunnner, Daniel.Lamb
#ROBOMERGE-OWNER: robert.manuszewski
#ROBOMERGE-AUTHOR: robert.manuszewski
#ROBOMERGE-SOURCE: CL 11302985 via CL 11303011 via CL 11303019
#ROBOMERGE-BOT: (v0-11244347)
[CL 11303183 by robert manuszewski in Main branch]
2020-02-10 08:06:56 -05:00
|
|
|
break;
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
2019-05-21 19:25:23 -04:00
|
|
|
|
2020-01-22 17:58:55 -05:00
|
|
|
if (URigVMCommentNode* CommentModelNode = Cast<URigVMCommentNode>(ModelNode))
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
UEdGraphNode_Comment* NewNode = NewObject<UEdGraphNode_Comment>(this, CommentModelNode->GetFName());
|
|
|
|
|
AddNode(NewNode, false);
|
|
|
|
|
|
|
|
|
|
NewNode->CreateNewGuid();
|
|
|
|
|
NewNode->PostPlacedNewNode();
|
|
|
|
|
NewNode->AllocateDefaultPins();
|
|
|
|
|
|
|
|
|
|
NewNode->NodePosX = ModelNode->GetPosition().X;
|
|
|
|
|
NewNode->NodePosY = ModelNode->GetPosition().Y;
|
|
|
|
|
NewNode->NodeWidth = ModelNode->GetSize().X;
|
|
|
|
|
NewNode->NodeHeight = ModelNode->GetSize().Y;
|
|
|
|
|
NewNode->CommentColor = ModelNode->GetNodeColor();
|
|
|
|
|
NewNode->NodeComment = CommentModelNode->GetCommentText();
|
|
|
|
|
NewNode->SetFlags(RF_Transactional);
|
|
|
|
|
NewNode->GetNodesUnderComment();
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
else if (URigVMRerouteNode* RerouteModelNode = Cast<URigVMRerouteNode>(ModelNode))
|
|
|
|
|
{
|
|
|
|
|
UControlRigGraphNode* NewNode = NewObject<UControlRigGraphNode>(this, ModelNode->GetFName());
|
|
|
|
|
AddNode(NewNode, false);
|
|
|
|
|
|
|
|
|
|
NewNode->ModelNodePath = ModelNode->GetNodePath();
|
|
|
|
|
NewNode->CreateNewGuid();
|
|
|
|
|
NewNode->PostPlacedNewNode();
|
|
|
|
|
NewNode->AllocateDefaultPins();
|
|
|
|
|
|
|
|
|
|
NewNode->NodePosX = ModelNode->GetPosition().X;
|
|
|
|
|
NewNode->NodePosY = ModelNode->GetPosition().Y;
|
|
|
|
|
|
|
|
|
|
NewNode->SetFlags(RF_Transactional);
|
|
|
|
|
NewNode->AllocateDefaultPins();
|
|
|
|
|
|
|
|
|
|
if (UEdGraphPin* ValuePin = NewNode->FindPin(ModelNode->FindPin("Value")->GetPinPath()))
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
NewNode->SetColorFromModel(GetSchema()->GetPinTypeColor(ValuePin->PinType));
|
|
|
|
|
}
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
|
|
|
|
else // struct, library, parameter + variable
|
2020-01-22 17:58:55 -05:00
|
|
|
{
|
|
|
|
|
UControlRigGraphNode* NewNode = NewObject<UControlRigGraphNode>(this, ModelNode->GetFName());
|
|
|
|
|
AddNode(NewNode, false);
|
|
|
|
|
|
|
|
|
|
NewNode->ModelNodePath = ModelNode->GetNodePath();
|
|
|
|
|
NewNode->CreateNewGuid();
|
|
|
|
|
NewNode->PostPlacedNewNode();
|
|
|
|
|
NewNode->AllocateDefaultPins();
|
|
|
|
|
|
|
|
|
|
NewNode->NodePosX = ModelNode->GetPosition().X;
|
|
|
|
|
NewNode->NodePosY = ModelNode->GetPosition().Y;
|
|
|
|
|
NewNode->SetColorFromModel(ModelNode->GetNodeColor());
|
|
|
|
|
NewNode->SetFlags(RF_Transactional);
|
|
|
|
|
NewNode->AllocateDefaultPins();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case ERigVMGraphNotifType::NodeRemoved:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMNode* ModelNode = Cast<URigVMNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
if (URigVMInjectionInfo* Injection = ModelNode->GetInjectionInfo())
|
|
|
|
|
{
|
|
|
|
|
if (URigVMPin* ModelPin = Injection->GetPin())
|
|
|
|
|
{
|
|
|
|
|
URigVMNode* ParentModelNode = ModelPin->GetNode();
|
|
|
|
|
if (ParentModelNode)
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
UEdGraphNode* EdNode = FindNodeForModelNodeName(ParentModelNode->GetFName());
|
|
|
|
|
if (EdNode)
|
|
|
|
|
{
|
2020-12-07 07:55:48 -04:00
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(EdNode))
|
|
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
RigNode->ReconstructNode_Internal(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-12-07 07:55:48 -04:00
|
|
|
break;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
|
|
|
|
|
UEdGraphNode* EdNode = FindNodeForModelNodeName(ModelNode->GetFName());
|
|
|
|
|
if (EdNode)
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-02-04 11:06:23 -05:00
|
|
|
RemoveNode(EdNode, true);
|
|
|
|
|
NotifyGraphChanged();
|
2020-01-22 17:58:55 -05:00
|
|
|
}
|
|
|
|
|
}
|
2020-12-07 07:55:48 -04:00
|
|
|
break;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
case ERigVMGraphNotifType::NodePositionChanged:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMNode* ModelNode = Cast<URigVMNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
UEdGraphNode* EdNode = FindNodeForModelNodeName(ModelNode->GetFName());
|
|
|
|
|
if (EdNode)
|
2020-12-03 10:58:31 -04:00
|
|
|
{
|
|
|
|
|
// No need to call Node->Modify(), since control rig has its own undo/redo system see RigVMControllerActions.cpp
|
2020-01-22 17:58:55 -05:00
|
|
|
EdNode->NodePosX = (int32)ModelNode->GetPosition().X;
|
|
|
|
|
EdNode->NodePosY = (int32)ModelNode->GetPosition().Y;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case ERigVMGraphNotifType::NodeSizeChanged:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMNode* ModelNode = Cast<URigVMNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
UEdGraphNode_Comment* EdNode = Cast<UEdGraphNode_Comment>(FindNodeForModelNodeName(ModelNode->GetFName()));
|
|
|
|
|
if (EdNode)
|
|
|
|
|
{
|
2020-12-03 10:58:31 -04:00
|
|
|
// No need to call Node->Modify(), since control rig has its own undo/redo system see RigVMControllerActions.cpp
|
2020-01-22 17:58:55 -05:00
|
|
|
EdNode->NodeWidth = (int32)ModelNode->GetSize().X;
|
|
|
|
|
EdNode->NodeHeight = (int32)ModelNode->GetSize().Y;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-02-04 11:06:23 -05:00
|
|
|
case ERigVMGraphNotifType::RerouteCompactnessChanged:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMRerouteNode* ModelNode = Cast<URigVMRerouteNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
UEdGraphNode* EdNode = Cast<UEdGraphNode>(FindNodeForModelNodeName(ModelNode->GetFName()));
|
|
|
|
|
if (EdNode)
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(EdNode))
|
|
|
|
|
{
|
|
|
|
|
// start at index 2 (the subpins below the top level value pin)
|
|
|
|
|
// and hide the pins (or show them if they were hidden previously)
|
|
|
|
|
for (int32 PinIndex = 2; PinIndex < RigNode->Pins.Num(); PinIndex++)
|
|
|
|
|
{
|
|
|
|
|
RigNode->Pins[PinIndex]->bHidden = !ModelNode->GetShowsAsFullNode();
|
|
|
|
|
}
|
|
|
|
|
NotifyGraphChanged();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
case ERigVMGraphNotifType::NodeColorChanged:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMNode* ModelNode = Cast<URigVMNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
UEdGraphNode_Comment* EdNode = Cast<UEdGraphNode_Comment>(FindNodeForModelNodeName(ModelNode->GetFName()));
|
|
|
|
|
if (EdNode)
|
|
|
|
|
{
|
|
|
|
|
EdNode->CommentColor = ModelNode->GetNodeColor();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case ERigVMGraphNotifType::CommentTextChanged:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMCommentNode* ModelNode = Cast<URigVMCommentNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
UEdGraphNode_Comment* EdNode = Cast<UEdGraphNode_Comment>(FindNodeForModelNodeName(ModelNode->GetFName()));
|
|
|
|
|
if (EdNode)
|
|
|
|
|
{
|
|
|
|
|
EdNode->OnUpdateCommentText(ModelNode->GetCommentText());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case ERigVMGraphNotifType::LinkAdded:
|
|
|
|
|
case ERigVMGraphNotifType::LinkRemoved:
|
|
|
|
|
{
|
|
|
|
|
bool AddLink = InNotifType == ERigVMGraphNotifType::LinkAdded;
|
|
|
|
|
|
|
|
|
|
if (URigVMLink* Link = Cast<URigVMLink>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
URigVMPin* SourcePin = Link->GetSourcePin();
|
|
|
|
|
URigVMPin* TargetPin = Link->GetTargetPin();
|
|
|
|
|
|
2020-12-14 08:58:12 -04:00
|
|
|
if (SourcePin)
|
|
|
|
|
{
|
|
|
|
|
SourcePin = SourcePin->GetOriginalPinFromInjectedNode();
|
|
|
|
|
}
|
|
|
|
|
if (TargetPin)
|
|
|
|
|
{
|
|
|
|
|
TargetPin = TargetPin->GetOriginalPinFromInjectedNode();
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
|
|
|
|
|
if (SourcePin && TargetPin && SourcePin != TargetPin)
|
|
|
|
|
{
|
|
|
|
|
UControlRigGraphNode* SourceRigNode = Cast<UControlRigGraphNode>(FindNodeForModelNodeName(SourcePin->GetNode()->GetFName()));
|
|
|
|
|
UControlRigGraphNode* TargetRigNode = Cast<UControlRigGraphNode>(FindNodeForModelNodeName(TargetPin->GetNode()->GetFName()));
|
|
|
|
|
|
2020-12-07 07:55:48 -04:00
|
|
|
if (SourceRigNode != nullptr && TargetRigNode != nullptr)
|
|
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
FString SourcePinPath = SourcePin->GetPinPath();
|
|
|
|
|
FString TargetPinPath = TargetPin->GetPinPath();
|
2020-12-07 07:55:48 -04:00
|
|
|
UEdGraphPin* SourceRigPin = SourceRigNode->FindPin(*SourcePinPath, EGPD_Output);
|
|
|
|
|
UEdGraphPin* TargetRigPin = TargetRigNode->FindPin(*TargetPinPath, EGPD_Input);
|
2020-01-22 17:58:55 -05:00
|
|
|
|
2020-12-07 07:55:48 -04:00
|
|
|
if (SourceRigPin != nullptr && TargetRigPin != nullptr)
|
2020-01-22 17:58:55 -05:00
|
|
|
{
|
2020-12-07 07:55:48 -04:00
|
|
|
if (AddLink)
|
|
|
|
|
{
|
|
|
|
|
SourceRigPin->MakeLinkTo(TargetRigPin);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SourceRigPin->BreakLinkTo(TargetRigPin);
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
|
2020-02-04 11:06:23 -05:00
|
|
|
for (int32 LinkedPinIndex = 0; LinkedPinIndex < SourceRigPin->LinkedTo.Num();)
|
|
|
|
|
{
|
|
|
|
|
if (SourceRigPin->LinkedTo[LinkedPinIndex])
|
|
|
|
|
{
|
|
|
|
|
++LinkedPinIndex;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SourceRigPin->LinkedTo.RemoveAtSwap(LinkedPinIndex);
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
|
|
|
|
}
|
2020-02-04 11:06:23 -05:00
|
|
|
|
|
|
|
|
for (int32 LinkedPinIndex = 0; LinkedPinIndex < TargetRigPin->LinkedTo.Num();)
|
|
|
|
|
{
|
|
|
|
|
if (TargetRigPin->LinkedTo[LinkedPinIndex])
|
|
|
|
|
{
|
|
|
|
|
++LinkedPinIndex;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
TargetRigPin->LinkedTo.RemoveAtSwap(LinkedPinIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case ERigVMGraphNotifType::PinDefaultValueChanged:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMPin* ModelPin = Cast<URigVMPin>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(FindNodeForModelNodeName(ModelPin->GetNode()->GetFName())))
|
|
|
|
|
{
|
|
|
|
|
UEdGraphPin* RigNodePin = RigNode->FindPin(ModelPin->GetPinPath());
|
2020-09-24 00:43:27 -04:00
|
|
|
if (RigNodePin == nullptr)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-22 17:58:55 -05:00
|
|
|
RigNode->SetupPinDefaultsFromModel(RigNodePin);
|
|
|
|
|
|
|
|
|
|
if (Cast<URigVMVariableNode>(ModelPin->GetNode()))
|
|
|
|
|
{
|
|
|
|
|
if (ModelPin->GetName() == TEXT("Variable"))
|
|
|
|
|
{
|
|
|
|
|
RigNode->InvalidateNodeTitle();
|
|
|
|
|
RigNode->ReconstructNode_Internal(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-09-24 00:43:27 -04:00
|
|
|
else if (Cast<URigVMParameterNode>(ModelPin->GetNode()))
|
|
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (ModelPin->GetName() == TEXT("Parameter"))
|
2020-09-24 00:43:27 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
RigNode->InvalidateNodeTitle();
|
|
|
|
|
RigNode->ReconstructNode_Internal(true);
|
|
|
|
|
}
|
2020-09-24 00:43:27 -04:00
|
|
|
}
|
2020-12-02 10:59:58 -04:00
|
|
|
else if (Cast<URigVMUnitNode>(ModelPin->GetNode()))
|
2020-09-24 00:43:27 -04:00
|
|
|
{
|
|
|
|
|
RigNode->InvalidateNodeTitle();
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
else if (URigVMInjectionInfo* Injection = ModelPin->GetNode()->GetInjectionInfo())
|
2020-12-07 07:55:48 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (Injection->InputPin != ModelPin->GetRootPin())
|
|
|
|
|
{
|
|
|
|
|
if (URigVMPin* InjectionPin = Injection->GetPin())
|
|
|
|
|
{
|
|
|
|
|
URigVMNode* ParentModelNode = InjectionPin->GetNode();
|
|
|
|
|
if (ParentModelNode)
|
|
|
|
|
{
|
|
|
|
|
UEdGraphNode* HostEdNode = FindNodeForModelNodeName(ParentModelNode->GetFName());
|
|
|
|
|
if (HostEdNode)
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigGraphNode* HostRigNode = Cast<UControlRigGraphNode>(HostEdNode))
|
|
|
|
|
{
|
|
|
|
|
HostRigNode->ReconstructNode_Internal(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-21 19:25:23 -04:00
|
|
|
}
|
|
|
|
|
}
|
Reimplementing FProperty changes from //UE4/Main
+ Reimplemented FProperty related fixed from //UE4/Main:
CL#10791312, 10804850, 10851666, 10855122, 10855198, 10942138, 11030611, 11030639, 11032261, 11061515, 11136964,11138881, 11214238, 11214865
#rb none (previously reviewed in Dev-Core)
[FYI] Chris.Bunnner, Daniel.Lamb
#ROBOMERGE-OWNER: robert.manuszewski
#ROBOMERGE-AUTHOR: robert.manuszewski
#ROBOMERGE-SOURCE: CL 11302985 via CL 11303011 via CL 11303019
#ROBOMERGE-BOT: (v0-11244347)
[CL 11303183 by robert manuszewski in Main branch]
2020-02-10 08:06:56 -05:00
|
|
|
}
|
2020-12-07 07:55:48 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
case ERigVMGraphNotifType::PinArraySizeChanged:
|
|
|
|
|
case ERigVMGraphNotifType::PinDirectionChanged:
|
|
|
|
|
case ERigVMGraphNotifType::PinTypeChanged:
|
2020-10-21 03:46:35 -04:00
|
|
|
case ERigVMGraphNotifType::PinBoundVariableChanged:
|
2020-12-14 08:58:12 -04:00
|
|
|
case ERigVMGraphNotifType::PinAdded:
|
|
|
|
|
case ERigVMGraphNotifType::PinRemoved:
|
|
|
|
|
case ERigVMGraphNotifType::PinRenamed:
|
2020-01-22 17:58:55 -05:00
|
|
|
{
|
|
|
|
|
if (URigVMPin* ModelPin = Cast<URigVMPin>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(FindNodeForModelNodeName(ModelPin->GetNode()->GetFName())))
|
|
|
|
|
{
|
|
|
|
|
RigNode->ReconstructNode_Internal(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-12-14 08:58:12 -04:00
|
|
|
case ERigVMGraphNotifType::NodeRenamed:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMNode* ModelNode = Cast<URigVMNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(FindNodeForModelNodeName(ModelNode->GetPreviousFName())))
|
|
|
|
|
{
|
|
|
|
|
RigNode->Rename(*ModelNode->GetName());
|
|
|
|
|
RigNode->ModelNodePath = ModelNode->GetNodePath();
|
|
|
|
|
RigNode->InvalidateNodeTitle();
|
|
|
|
|
RigNode->ReconstructNode_Internal(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-09-24 00:43:27 -04:00
|
|
|
case ERigVMGraphNotifType::VariableRenamed:
|
|
|
|
|
{
|
|
|
|
|
if (URigVMNode* ModelNode = Cast<URigVMNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(FindNodeForModelNodeName(ModelNode->GetFName())))
|
|
|
|
|
{
|
|
|
|
|
RigNode->InvalidateNodeTitle();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
case ERigVMGraphNotifType::NodeSelected:
|
2020-09-24 00:43:27 -04:00
|
|
|
{
|
|
|
|
|
if (URigVMCommentNode* ModelNode = Cast<URigVMCommentNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
// UEdGraphNode_Comment cannot access RigVMCommentNode's selection state, so we have to manually toggle its selection state
|
|
|
|
|
// UControlRigGraphNode does not need this step because it overrides the IsSelectedInEditor() method
|
|
|
|
|
UEdGraphNode_Comment* EdNode = Cast<UEdGraphNode_Comment>(FindNodeForModelNodeName(ModelNode->GetFName()));
|
|
|
|
|
if (EdNode)
|
|
|
|
|
{
|
|
|
|
|
GSelectedObjectAnnotation.Set(EdNode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
case ERigVMGraphNotifType::NodeDeselected:
|
2020-09-24 00:43:27 -04:00
|
|
|
{
|
|
|
|
|
if (URigVMCommentNode* ModelNode = Cast<URigVMCommentNode>(InSubject))
|
|
|
|
|
{
|
|
|
|
|
UEdGraphNode_Comment* EdNode = Cast<UEdGraphNode_Comment>(FindNodeForModelNodeName(ModelNode->GetFName()));
|
|
|
|
|
if (EdNode)
|
|
|
|
|
{
|
|
|
|
|
GSelectedObjectAnnotation.Clear(EdNode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case ERigVMGraphNotifType::PinExpansionChanged:
|
2019-05-21 19:25:23 -04:00
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-22 17:58:55 -05:00
|
|
|
UEdGraphNode* UControlRigGraph::FindNodeForModelNodeName(const FName& InModelNodeName)
|
2019-05-21 19:25:23 -04:00
|
|
|
{
|
2019-07-16 11:49:59 -04:00
|
|
|
DECLARE_SCOPE_HIERARCHICAL_COUNTER_FUNC()
|
|
|
|
|
|
2019-05-21 19:25:23 -04:00
|
|
|
for (UEdGraphNode* EdNode : Nodes)
|
|
|
|
|
{
|
2019-05-31 18:25:32 -04:00
|
|
|
if (UControlRigGraphNode* RigNode = Cast<UControlRigGraphNode>(EdNode))
|
2019-05-21 19:25:23 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (RigNode->ModelNodePath == InModelNodeName.ToString())
|
2019-05-21 19:25:23 -04:00
|
|
|
{
|
2019-05-31 18:25:32 -04:00
|
|
|
return EdNode;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (EdNode->GetFName() == InModelNodeName)
|
2019-05-31 18:25:32 -04:00
|
|
|
{
|
|
|
|
|
return EdNode;
|
2019-05-21 19:25:23 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-07 07:55:48 -04:00
|
|
|
UControlRigBlueprint* UControlRigGraph::GetBlueprint() const
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigGraph* OuterGraph = Cast<UControlRigGraph>(GetOuter()))
|
|
|
|
|
{
|
|
|
|
|
return OuterGraph->GetBlueprint();
|
|
|
|
|
}
|
|
|
|
|
return Cast<UControlRigBlueprint>(GetOuter());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
URigVMGraph* UControlRigGraph::GetModel() const
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigBlueprint* Blueprint = GetBlueprint())
|
|
|
|
|
{
|
|
|
|
|
return Blueprint->GetModel(this);
|
|
|
|
|
}
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
URigVMController* UControlRigGraph::GetController() const
|
|
|
|
|
{
|
|
|
|
|
if (UControlRigBlueprint* Blueprint = GetBlueprint())
|
|
|
|
|
{
|
|
|
|
|
return Blueprint->GetOrCreateController(this);
|
|
|
|
|
}
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
|
|
|
|
|
URigVMController* UControlRigGraph::GetTemplateController()
|
2019-07-16 11:49:59 -04:00
|
|
|
{
|
2020-01-22 17:58:55 -05:00
|
|
|
if (TemplateController == nullptr)
|
2019-07-16 11:49:59 -04:00
|
|
|
{
|
2020-12-14 08:58:12 -04:00
|
|
|
TemplateController = GetBlueprint()->GetTemplateController();
|
|
|
|
|
TemplateController->OnModified().RemoveAll(this);
|
2020-01-22 17:58:55 -05:00
|
|
|
TemplateController->OnModified().AddUObject(this, &UControlRigGraph::HandleModifiedEvent);
|
2019-07-16 11:49:59 -04:00
|
|
|
}
|
2020-01-22 17:58:55 -05:00
|
|
|
return TemplateController;
|
2019-07-16 11:49:59 -04:00
|
|
|
}
|
|
|
|
|
|
2019-04-02 11:26:55 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#undef LOCTEXT_NAMESPACE
|