Skip to content

Commit

Permalink
GraphEditor - Delete Nodes/Links
Browse files Browse the repository at this point in the history
  • Loading branch information
Daethalus committed May 18, 2024
1 parent a22283f commit 7325e6a
Show file tree
Hide file tree
Showing 5 changed files with 135 additions and 87 deletions.
84 changes: 50 additions & 34 deletions Editor/Source/Fyrion/Editor/Editor/GraphEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ namespace Fyrion
.label = nodeObject[GraphNodeAsset::Label].Value<String>(),
.initialized = false
})).first->second.Get();
m_nodesArray.EmplaceBack(graphEditorNode);

if (graphEditorNode->functionHandler)
{
Expand All @@ -38,45 +37,36 @@ namespace Fyrion
{
if (param.HasAttribute<GraphInput>())
{
u32 pinId = m_pinsArray.Size();
graphEditorNode->inputs.EmplaceBack(pinId);

GraphEditorNodePin* pin = m_pins.Emplace(GraphEditorNodePinLookup{
.node = node,
.name = param.GetName()
}, MakeUnique<GraphEditorNodePin>(GraphEditorNodePin{
.node = node,
.pin = pinId,
.label = FormatName(param.GetName()),
.name = param.GetName(),
.typeId = param.GetFieldInfo().typeInfo.typeId,
.kind = GraphEditorPinKind::Input
})).first->second.Get();

m_pinsArray.EmplaceBack(pin);
graphEditorNode->inputs.EmplaceBack(pin);
}
}

for (const ParamHandler& param : params)
{
if (param.HasAttribute<GraphOutput>())
{
u32 pinId = m_pinsArray.Size();
graphEditorNode->outputs.EmplaceBack(pinId);

GraphEditorNodePin* pin = m_pins.Emplace(GraphEditorNodePinLookup{
.node = node,
.name = param.GetName(),
}, MakeUnique<GraphEditorNodePin>(GraphEditorNodePin{
.node = node,
.pin = pinId,
.label = FormatName(param.GetName()),
.name = param.GetName(),
.typeId = param.GetFieldInfo().typeInfo.typeId,
.kind = GraphEditorPinKind::Output
})).first->second.Get();

m_pinsArray.EmplaceBack(pin);
graphEditorNode->outputs.EmplaceBack(pin);
}
}
}
Expand All @@ -92,22 +82,19 @@ namespace Fyrion
{
if (field->HasAttribute<GraphInput>())
{
u32 pinId = m_pinsArray.Size();
graphEditorNode->inputs.EmplaceBack(pinId);

GraphEditorNodePin* pin = m_pins.Emplace(GraphEditorNodePinLookup{
.node = node,
.name = field->GetName(),
}, MakeUnique<GraphEditorNodePin>(GraphEditorNodePin{
.node = node,
.pin = pinId,
.label = FormatName(field->GetName()),
.name = field->GetName(),
.typeId = field->GetFieldInfo().typeInfo.typeId,
.kind = GraphEditorPinKind::Input
})).first->second.Get();

m_pinsArray.EmplaceBack(pin);
graphEditorNode->inputs.EmplaceBack(pin);
}
}
}
Expand All @@ -131,25 +118,31 @@ namespace Fyrion
return;
}

m_links.EmplaceBack(GraphEditorLink{
.linkId = m_links.Size(),
.inputPin = inputPin->pin,
.outputPin = outputPin->pin,
GraphEditorLink* editorLink = m_links.Emplace(link, MakeUnique<GraphEditorLink>(GraphEditorLink{
.rid = link,
.index = m_linksArray.Size(),
.inputPin = inputPin,
.outputPin = outputPin,
.linkType = outputPin->typeId
});
}
})).first->second.Get();

GraphEditorNodePin* GraphEditor::GetPin(u64 left, u64 right, GraphEditorPinKind disiredKind)
{
if (GraphEditorNodePin* pin = m_pinsArray[left]; pin->kind == disiredKind)
m_linksArray.EmplaceBack(editorLink);

if (const auto& it = m_nodes.Find(inputPin->node))
{
return pin;
it->second->links.Insert(link);
}

if (GraphEditorNodePin* pin = m_pinsArray[right]; pin->kind == disiredKind)
if (const auto& it = m_nodes.Find(outputPin->node))
{
return pin;
it->second->links.Insert(link);
}
}

GraphEditorNodePin* GraphEditor::GetPin(GraphEditorNodePin* left, GraphEditorNodePin* right, GraphEditorPinKind disiredKind)
{
if (left->kind == disiredKind) return left;
if (right->kind == disiredKind) return right;
return nullptr;
}

Expand All @@ -172,11 +165,7 @@ namespace Fyrion

void GraphEditor::OpenGraph(RID rid)
{
m_nodesArray.Clear();
m_nodes.Clear();

m_pinsArray.Clear();
m_pinsArray.EmplaceBack();
m_pins.Clear();

m_asset = rid;
Expand Down Expand Up @@ -241,14 +230,14 @@ namespace Fyrion
m_assetTree.MarkDirty();
}

bool GraphEditor::ValidateLink(u64 inputPin, u64 outputPin)
bool GraphEditor::ValidateLink(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin)
{
GraphEditorNodePin* input = GetPin(inputPin, outputPin, GraphEditorPinKind::Input);
GraphEditorNodePin* output = GetPin(inputPin, outputPin, GraphEditorPinKind::Output);
return input && output && input->kind != output->kind && input->typeId == output->typeId;
}

void GraphEditor::AddLink(u64 inputPin, u64 outputPin)
void GraphEditor::AddLink(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin)
{
GraphEditorNodePin* input = GetPin(inputPin, outputPin, GraphEditorPinKind::Input);
GraphEditorNodePin* output = GetPin(inputPin, outputPin, GraphEditorPinKind::Output);
Expand All @@ -271,7 +260,34 @@ namespace Fyrion
m_assetTree.MarkDirty();

AddLinkCache(linkAsset);
}

void GraphEditor::DeleteLink(RID link)
{
Repository::DestroyResource(link);
m_links.Erase(link);
m_assetTree.MarkDirty();
}

void GraphEditor::DeleteNode(RID node)
{
Repository::DestroyResource(node);
if (auto it = m_nodes.Find(node))
{
ForEach(it->second->inputs.begin(), it->second->inputs.end(), this, &GraphEditor::DeletePin);
ForEach(it->second->outputs.begin(), it->second->outputs.end(), this, &GraphEditor::DeletePin);

m_nodes.Erase(it);
}
m_assetTree.MarkDirty();
}

void GraphEditor::DeletePin(GraphEditorNodePin* pin)
{
m_pins.Erase(GraphEditorNodePinLookup{
.node = pin->node,
.name = pin->name,
});
}

bool GraphEditor::IsGraphLoaded() const
Expand Down
69 changes: 38 additions & 31 deletions Editor/Source/Fyrion/Editor/Editor/GraphEditor.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
#include "Fyrion/Core/HashMap.hpp"
#include "Fyrion/Core/HashSet.hpp"
#include "Fyrion/Core/Math.hpp"
#include "Fyrion/Core/String.hpp"
#include "Fyrion/Core/UniquePtr.hpp"
Expand All @@ -21,7 +22,6 @@ namespace Fyrion
struct GraphEditorNodePin
{
RID node;
u64 pin;
String label;
String name;
TypeID typeId;
Expand All @@ -30,16 +30,16 @@ namespace Fyrion

struct GraphEditorNodePinLookup
{
RID node;
String name;
RID node;
String name;

friend bool operator==(const GraphEditorNodePinLookup& lhs, const GraphEditorNodePinLookup& rhs)
{
return lhs.node == rhs.node && lhs.name == rhs.name;
}
};

template<>
template <>
struct Hash<GraphEditorNodePinLookup>
{
constexpr static bool hasHash = true;
Expand All @@ -54,25 +54,30 @@ namespace Fyrion

struct GraphEditorNode
{
RID rid;
TypeHandler* typeHandler;
FunctionHandler* functionHandler;
Vec2 position;
String label;
bool initialized;

Array<u32> inputs;
Array<u32> outputs;
RID rid{};
TypeHandler* typeHandler{};
FunctionHandler* functionHandler{};
Vec2 position{};
String label{};
bool initialized{};

Array<GraphEditorNodePin*> inputs{};
Array<GraphEditorNodePin*> outputs{};
HashSet<RID> links{};
};

struct GraphEditorLink
{
u64 linkId{};
u64 inputPin{};
u64 outputPin{};
TypeID linkType{};
RID rid{};
u64 index{};
GraphEditorNodePin* inputPin{};
GraphEditorNodePin* outputPin{};
TypeID linkType{};
};

using GraphNodeMap = HashMap<RID, UniquePtr<GraphEditorNode>>;
using GraphNodePinMap = HashMap<GraphEditorNodePinLookup, UniquePtr<GraphEditorNodePin>>;

class GraphEditor
{
public:
Expand All @@ -82,16 +87,19 @@ namespace Fyrion

FY_NO_COPY_CONSTRUCTOR(GraphEditor)

void OpenGraph(RID rid);
bool IsGraphLoaded() const;
Span<GraphEditorNode*> GetNodes() { return m_nodesArray; }
Span<GraphEditorNodePin*> GetPins() { return m_pinsArray; }
Span<GraphEditorLink> GetLinks() { return m_links; }
void OpenGraph(RID rid);
bool IsGraphLoaded() const;
GraphNodeMap& GetNodes() { return m_nodes; }
GraphNodePinMap& GetPins() { return m_pins; }
Span<GraphEditorLink*> GetLinks() { return m_linksArray; }

void AddOutput(TypeHandler* outputType, const Vec2& position);
void AddNode(FunctionHandler* functionHandler, const Vec2& position);
bool ValidateLink(u64 inputPin, u64 outputPin);
void AddLink(u64 inputPin, u64 outputPin);
bool ValidateLink(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin);
void AddLink(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin);

void DeleteLink(RID link);
void DeleteNode(RID node);

private:
AssetTree& m_assetTree;
Expand All @@ -100,19 +108,18 @@ namespace Fyrion
TypeID m_graphTypeId{};
String m_graphName{};

Array<GraphEditorNode*> m_nodesArray;
HashMap<RID, UniquePtr<GraphEditorNode>> m_nodes;

Array<GraphEditorNodePin*> m_pinsArray;
HashMap<GraphEditorNodePinLookup, UniquePtr<GraphEditorNodePin>> m_pins;
GraphNodeMap m_nodes;
GraphNodePinMap m_pins;

Array<GraphEditorLink> m_links;
HashMap<RID, UniquePtr<GraphEditorLink>> m_links;
Array<GraphEditorLink*> m_linksArray;

void AddNodeCache(RID node);
void AddLinkCache(RID link);

GraphEditorNodePin* GetPin(u64 left, u64 right, GraphEditorPinKind disiredKind);
GraphEditorNodePin* GetPin(GraphEditorNodePin* left, GraphEditorNodePin* right, GraphEditorPinKind disiredKind);

GraphEditorNodePin* FindPin(RID node, const StringView& pin, GraphEditorPinKind graphEditorPinKind);
void DeletePin(GraphEditorNodePin* pin);
};
}
Loading

0 comments on commit 7325e6a

Please sign in to comment.