Files
UnrealEngineUWP/Engine/Source/Developer/VisualGraphUtils/Public/VisualGraph.h
helge mathee 3f416b5d4d Graph Visualizer: Replacing Control Rig AST visualizer with common service
#rb halfdan.ingvarsson
#jira na
#preflight https://horde.devtools.epicgames.com/job/614382398169560001036499

#ROBOMERGE-AUTHOR: helge.mathee
#ROBOMERGE-SOURCE: CL 17735754 in //UE5/Main/...
#ROBOMERGE-BOT: STARSHIP (Main -> Release-Engine-Test) (v879-17706426)

[CL 17735765 by helge mathee in ue5-release-engine-test branch]
2021-10-06 11:19:48 -04:00

136 lines
3.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "VisualGraphElement.h"
#include "VisualGraphNode.h"
#include "VisualGraphEdge.h"
class FVisualGraph;
class VISUALGRAPHUTILS_API FVisualGraphSubGraph : public FVisualGraphElement
{
public:
FVisualGraphSubGraph()
: FVisualGraphElement()
, ParentGraphIndex(INDEX_NONE)
{}
virtual ~FVisualGraphSubGraph() override {}
int32 GetParentGraphIndex() const { return ParentGraphIndex; }
const TArray<int32>& GetNodes() const { return Nodes; }
protected:
virtual FString DumpDot(const FVisualGraph* InGraph, int32 InIndendation) const override;
int32 ParentGraphIndex;
TArray<int32> Nodes;
friend class FVisualGraph;
};
class VISUALGRAPHUTILS_API FVisualGraph : public FVisualGraphElement
{
public:
FVisualGraph()
: FVisualGraphElement()
{}
virtual ~FVisualGraph() override {}
FVisualGraph(const FName& InName, const FName& InDisplayName = NAME_None);
const TArray<FVisualGraphNode>& GetNodes() const { return Nodes; }
const TArray<FVisualGraphEdge>& GetEdges() const { return Edges; }
const TArray<FVisualGraphSubGraph>& GetSubGraphs() const { return SubGraphs; }
int32 AddNode(
const FName& InName,
TOptional<FName> InDisplayName = TOptional<FName>(),
TOptional<FLinearColor> InColor = TOptional<FLinearColor>(),
TOptional<EVisualGraphShape> InShape = TOptional<EVisualGraphShape>(),
TOptional<EVisualGraphStyle> InStyle = TOptional<EVisualGraphStyle>());
int32 AddEdge(
int32 InSourceNode,
int32 InTargetNode,
EVisualGraphEdgeDirection InDirection,
const FName& InName = NAME_None,
TOptional<FName> InDisplayName = TOptional<FName>(),
TOptional<FLinearColor> InColor = TOptional<FLinearColor>(),
TOptional<EVisualGraphStyle> InStyle = TOptional<EVisualGraphStyle>());
int32 AddSubGraph(
const FName& InName,
TOptional<FName> InDisplayName = TOptional<FName>(),
int32 InParentGraphIndex = INDEX_NONE,
TOptional<FLinearColor> InColor = TOptional<FLinearColor>(),
TOptional<EVisualGraphStyle> InStyle = TOptional<EVisualGraphStyle>(),
const TArray<int32> InNodes = TArray<int32>());
int32 FindNode(const FName& InName) const;
int32 FindEdge(const FName& InName) const;
int32 FindSubGraph(const FName& InName) const;
bool AddNodeToSubGraph(int32 InNodeIndex, int32 InSubGraphIndex);
bool RemoveNodeFromSubGraph(int32 InNodeIndex);
void TransitiveReduction(TFunction<bool(FVisualGraphEdge&)> KeepEdgeFunction);
FORCEINLINE FString DumpDot() const
{
return DumpDot(this, 0);
}
protected:
virtual FString DumpDot(const FVisualGraph* InGraph, int32 InIndendation) const override;
template<typename T>
FORCEINLINE static void RefreshNameMap(const TArray<T>& InElements, TMap<FName, int32>& OutMap)
{
OutMap.Reset();
for(const T& Element: InElements)
{
OutMap.Add(Element.Name, Element.Index);
}
}
template<typename T>
FORCEINLINE static void RefreshNameMapIfNeeded(const TArray<T>& InElements, TMap<FName, int32>& OutMap)
{
if(OutMap.Num() == InElements.Num())
{
return;
}
RefreshNameMap(InElements, OutMap);
}
template<typename T>
FORCEINLINE static int32 AddElement(const T& InElement, TArray<T>& OutElements, TMap<FName, int32>& OutMap)
{
const int32 AddedIndex = OutElements.Add(InElement);
if(OutElements.IsValidIndex(AddedIndex))
{
OutElements[AddedIndex].Index = AddedIndex;
OutMap.Add(InElement.Name, AddedIndex);
}
return AddedIndex;
}
static bool IsNameAvailable(const FName& InName, const TMap<FName, int32>& InMap);
static FName GetUniqueName(const FName& InName, const TMap<FName, int32>& InMap);
TArray<FVisualGraphNode> Nodes;
TArray<FVisualGraphEdge> Edges;
TArray<FVisualGraphSubGraph> SubGraphs;
TMap<FName,int32> NodeNameMap;
TMap<FName,int32> EdgeNameMap;
TMap<FName,int32> SubGraphNameMap;
};