2014-03-14 14:13:41 -04:00
|
|
|
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "AnimGraphPrivatePCH.h"
|
|
|
|
|
|
|
|
|
|
#include "GraphEditorActions.h"
|
|
|
|
|
#include "ScopedTransaction.h"
|
|
|
|
|
#include "EdGraphUtilities.h"
|
|
|
|
|
#include "Kismet2NameValidators.h"
|
2014-04-24 14:34:01 -04:00
|
|
|
|
|
|
|
|
#include "AnimationGraph.h"
|
|
|
|
|
#include "AnimationStateMachineGraph.h"
|
|
|
|
|
#include "AnimationStateMachineSchema.h"
|
|
|
|
|
#include "AnimGraphNode_StateMachine.h"
|
2014-04-24 08:49:31 -04:00
|
|
|
#include "AnimGraphNode_StateMachineBase.h"
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
// FAnimStateMachineNodeNameValidator
|
|
|
|
|
|
|
|
|
|
class FAnimStateMachineNodeNameValidator : public FStringSetNameValidator
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FAnimStateMachineNodeNameValidator(const UAnimGraphNode_StateMachineBase* InStateMachineNode)
|
|
|
|
|
: FStringSetNameValidator(FString())
|
|
|
|
|
{
|
|
|
|
|
TArray<UAnimGraphNode_StateMachineBase*> Nodes;
|
|
|
|
|
|
|
|
|
|
UAnimationGraph* StateMachine = CastChecked<UAnimationGraph>(InStateMachineNode->GetOuter());
|
|
|
|
|
StateMachine->GetNodesOfClassEx<UAnimGraphNode_StateMachine, UAnimGraphNode_StateMachineBase>(Nodes);
|
|
|
|
|
|
2014-04-24 08:49:31 -04:00
|
|
|
for (auto Node : Nodes)
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
|
|
|
|
if (Node != InStateMachineNode)
|
|
|
|
|
{
|
|
|
|
|
Names.Add(Node->GetStateMachineName());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
// UAnimGraphNode_StateMachineBase
|
|
|
|
|
|
2014-04-23 18:30:37 -04:00
|
|
|
#define LOCTEXT_NAMESPACE "A3Nodes"
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
UAnimGraphNode_StateMachineBase::UAnimGraphNode_StateMachineBase(const FPostConstructInitializeProperties& PCIP)
|
|
|
|
|
: Super(PCIP)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FLinearColor UAnimGraphNode_StateMachineBase::GetNodeTitleColor() const
|
|
|
|
|
{
|
|
|
|
|
return FLinearColor(0.8f, 0.8f, 0.8f);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-03 18:14:09 -04:00
|
|
|
FText UAnimGraphNode_StateMachineBase::GetTooltipText() const
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-09-03 18:14:09 -04:00
|
|
|
return LOCTEXT("StateMachineTooltip", "Animation State Machine");
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2014-04-23 18:30:37 -04:00
|
|
|
FText UAnimGraphNode_StateMachineBase::GetNodeTitle(ENodeTitleType::Type TitleType) const
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-09-25 17:42:57 -04:00
|
|
|
if ((TitleType == ENodeTitleType::MenuTitle || TitleType == ENodeTitleType::ListView) && (EditorStateMachineGraph == nullptr))
|
2014-08-21 18:50:33 -04:00
|
|
|
{
|
|
|
|
|
return LOCTEXT("AddNewStateMachine", "Add New State Machine...");
|
|
|
|
|
}
|
2014-09-04 11:25:05 -04:00
|
|
|
else if (EditorStateMachineGraph == nullptr)
|
2014-04-23 18:30:37 -04:00
|
|
|
{
|
2014-09-04 11:25:05 -04:00
|
|
|
if (TitleType == ENodeTitleType::FullTitle)
|
|
|
|
|
{
|
|
|
|
|
return LOCTEXT("NullStateMachineFullTitle", "Error: No Graph\nState Machine");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return LOCTEXT("ErrorNoGraph", "Error: No Graph");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (TitleType == ENodeTitleType::FullTitle)
|
|
|
|
|
{
|
2014-09-24 14:15:13 -04:00
|
|
|
// @TODO: don't know enough about this node type to comfortably assert that
|
|
|
|
|
// the EditorStateMachineGraph won't change after the node has
|
|
|
|
|
// spawned... until then, we'll leave this optimization off
|
|
|
|
|
//if (CachedFullTitle.IsOutOfDate())
|
2014-09-04 11:25:05 -04:00
|
|
|
{
|
|
|
|
|
FFormatNamedArguments Args;
|
|
|
|
|
Args.Add(TEXT("Title"), FText::FromName(EditorStateMachineGraph->GetFName()));
|
|
|
|
|
// FText::Format() is slow, so we cache this to save on performance
|
|
|
|
|
CachedFullTitle = FText::Format(LOCTEXT("StateMachineFullTitle", "{Title}\nState Machine"), Args);
|
|
|
|
|
}
|
|
|
|
|
return CachedFullTitle;
|
2014-04-23 18:30:37 -04:00
|
|
|
}
|
|
|
|
|
|
2014-09-04 11:25:05 -04:00
|
|
|
return FText::FromName(EditorStateMachineGraph->GetFName());
|
2014-04-23 18:30:37 -04:00
|
|
|
}
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
FString UAnimGraphNode_StateMachineBase::GetNodeCategory() const
|
|
|
|
|
{
|
|
|
|
|
return TEXT("State Machines");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UAnimGraphNode_StateMachineBase::GetMenuEntries(FGraphContextMenuBuilder& ContextMenuBuilder) const
|
|
|
|
|
{
|
|
|
|
|
if ((ContextMenuBuilder.FromPin == NULL) || ((ContextMenuBuilder.FromPin->Direction == EGPD_Input) && (ContextMenuBuilder.FromPin->PinType.PinSubCategoryObject == FPoseLink::StaticStruct())))
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FEdGraphSchemaAction_K2NewNode> MenuEntry = CreateDefaultMenuEntry(ContextMenuBuilder);
|
|
|
|
|
|
2014-04-23 18:30:37 -04:00
|
|
|
MenuEntry->MenuDescription = LOCTEXT("AddNewStateMachine", "Add New State Machine...");
|
|
|
|
|
MenuEntry->TooltipDescription = LOCTEXT("AddNewStateMachine_Tooltip", "Create a new state machine").ToString();
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UAnimGraphNode_StateMachineBase::PostPlacedNewNode()
|
|
|
|
|
{
|
|
|
|
|
// Create a new animation graph
|
|
|
|
|
check(EditorStateMachineGraph == NULL);
|
|
|
|
|
EditorStateMachineGraph = CastChecked<UAnimationStateMachineGraph>(FBlueprintEditorUtils::CreateNewGraph(this, NAME_None, UAnimationStateMachineGraph::StaticClass(), UAnimationStateMachineSchema::StaticClass()));
|
|
|
|
|
check(EditorStateMachineGraph);
|
|
|
|
|
EditorStateMachineGraph->OwnerAnimGraphNode = this;
|
|
|
|
|
|
|
|
|
|
// Find an interesting name
|
|
|
|
|
TSharedPtr<INameValidatorInterface> NameValidator = FNameValidatorFactory::MakeValidator(this);
|
|
|
|
|
FBlueprintEditorUtils::RenameGraphWithSuggestion(EditorStateMachineGraph, NameValidator, TEXT("New State Machine"));
|
|
|
|
|
|
|
|
|
|
// Initialize the anim graph
|
|
|
|
|
const UEdGraphSchema* Schema = EditorStateMachineGraph->GetSchema();
|
|
|
|
|
Schema->CreateDefaultNodesForGraph(*EditorStateMachineGraph);
|
|
|
|
|
|
|
|
|
|
// Add the new graph as a child of our parent graph
|
|
|
|
|
GetGraph()->SubGraphs.Add(EditorStateMachineGraph);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UObject* UAnimGraphNode_StateMachineBase::GetJumpTargetForDoubleClick() const
|
|
|
|
|
{
|
|
|
|
|
// Open the state machine graph
|
|
|
|
|
return EditorStateMachineGraph;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UAnimGraphNode_StateMachineBase::DestroyNode()
|
|
|
|
|
{
|
|
|
|
|
UEdGraph* GraphToRemove = EditorStateMachineGraph;
|
|
|
|
|
|
|
|
|
|
EditorStateMachineGraph = NULL;
|
|
|
|
|
Super::DestroyNode();
|
|
|
|
|
|
|
|
|
|
if (GraphToRemove)
|
|
|
|
|
{
|
|
|
|
|
UBlueprint* Blueprint = GetBlueprint();
|
|
|
|
|
GraphToRemove->Modify();
|
|
|
|
|
FBlueprintEditorUtils::RemoveGraph(Blueprint, GraphToRemove, EGraphRemoveFlags::Recompile);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UAnimGraphNode_StateMachineBase::PostPasteNode()
|
|
|
|
|
{
|
|
|
|
|
Super::PostPasteNode();
|
|
|
|
|
|
|
|
|
|
// Add the new graph as a child of our parent graph
|
|
|
|
|
UEdGraph* ParentGraph = CastChecked<UEdGraph>(GetGraph());
|
|
|
|
|
ParentGraph->SubGraphs.Add(EditorStateMachineGraph);
|
|
|
|
|
|
|
|
|
|
// Find an interesting name
|
|
|
|
|
TSharedPtr<INameValidatorInterface> NameValidator = FNameValidatorFactory::MakeValidator(this);
|
|
|
|
|
FBlueprintEditorUtils::RenameGraphWithSuggestion(EditorStateMachineGraph, NameValidator, EditorStateMachineGraph->GetName());
|
|
|
|
|
|
|
|
|
|
//restore transactional flag that is lost during copy/paste process
|
|
|
|
|
EditorStateMachineGraph->SetFlags(RF_Transactional);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FString UAnimGraphNode_StateMachineBase::GetStateMachineName()
|
|
|
|
|
{
|
|
|
|
|
return (EditorStateMachineGraph != NULL) ? *(EditorStateMachineGraph->GetName()) : TEXT("(null)");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSharedPtr<class INameValidatorInterface> UAnimGraphNode_StateMachineBase::MakeNameValidator() const
|
|
|
|
|
{
|
|
|
|
|
return MakeShareable(new FAnimStateMachineNodeNameValidator(this));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FString UAnimGraphNode_StateMachineBase::GetDocumentationLink() const
|
|
|
|
|
{
|
|
|
|
|
return TEXT("Shared/GraphNodes/AnimationStateMachine");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UAnimGraphNode_StateMachineBase::OnRenameNode(const FString& NewName)
|
|
|
|
|
{
|
|
|
|
|
FBlueprintEditorUtils::RenameGraph(EditorStateMachineGraph, NewName);
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-23 18:30:37 -04:00
|
|
|
#undef LOCTEXT_NAMESPACE
|