Skip to content

Commit

Permalink
GraphEditor work
Browse files Browse the repository at this point in the history
  • Loading branch information
Daethalus committed May 20, 2024
1 parent 2c7c331 commit a1a9018
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 26 deletions.
137 changes: 112 additions & 25 deletions Editor/Source/Fyrion/Editor/Editor/GraphEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,42 @@

namespace Fyrion
{

void GraphEditor::AddOutputPinCache(RID value, GraphEditorNode* node)
{
ResourceObject valueObject = Repository::Read(value);

String name = valueObject[GraphNodeValue::Input].Value<String>();

TypeID typeId = 0;
if (valueObject.Has(GraphNodeValue::Value))
{
RID valueSuboject = valueObject.GetSubObject(GraphNodeValue::Value);
if (TypeHandler* typeHandler = Repository::GetResourceTypeHandler(valueSuboject))
{
typeId = typeHandler->GetTypeInfo().typeId;
}
}

GraphEditorNodePinLookup lookup = GraphEditorNodePinLookup{
.node = node->rid,
.name = name,
};

m_pins.Erase(lookup);

GraphEditorNodePin* pin = m_pins.Emplace(lookup, MakeUnique<GraphEditorNodePin>(GraphEditorNodePin{
.node = node,
.label = FormatName(name),
.name = name,
.typeId = typeId,
.kind = GraphEditorPinKind::Output,
.publicValue = valueObject[GraphNodeValue::PublicValue].Value<bool>()
})).first->second.Get();

node->outputs.EmplaceBack(pin);
}

void GraphEditor::AddNodeCache(RID node)
{
ResourceObject nodeObject = Repository::Read(node);
Expand All @@ -21,23 +57,27 @@ namespace Fyrion
for (RID input : inputValues)
{
ResourceObject valueObject = Repository::Read(input);
inputCache.Insert(valueObject[GraphNodeValue::Input].Value<String>(), MakePair(input, valueObject[GraphNodeValue::Value].Value<RID>()));
if (valueObject)
{
inputCache.Insert(valueObject[GraphNodeValue::Input].Value<String>(), MakePair(input, valueObject[GraphNodeValue::Value].Value<RID>()));
}
}

GraphEditorNode* graphEditorNode = m_nodes.Emplace(node, MakeUnique<GraphEditorNode>(GraphEditorNode{
.rid = node,
.typeHandler = Registry::FindTypeByName(nodeObject[GraphNodeAsset::NodeOutput].Value<String>()),
.functionHandler = Registry::FindFunctionByName(nodeObject[GraphNodeAsset::NodeFunction].Value<String>()),
.position = nodeObject[GraphNodeAsset::Position].Value<Vec2>(),
.label = nodeObject[GraphNodeAsset::Label].Value<String>(),
.label = FormatName(nodeObject[GraphNodeAsset::Label].Value<String>()),
.initialized = false
})).first->second.Get();

if (graphEditorNode->functionHandler)
{
graphEditorNode->name = graphEditorNode->functionHandler->GetSimpleName();
if (graphEditorNode->label.Empty())
{
graphEditorNode->label = graphEditorNode->functionHandler->GetSimpleName();
graphEditorNode->label = FormatName(graphEditorNode->name);
}

Span<ParamHandler> params = graphEditorNode->functionHandler->GetParams();
Expand Down Expand Up @@ -92,9 +132,10 @@ namespace Fyrion
}
else if (graphEditorNode->typeHandler)
{
graphEditorNode->name = graphEditorNode->typeHandler->GetSimpleName();
if (graphEditorNode->label.Empty())
{
graphEditorNode->label = graphEditorNode->typeHandler->GetSimpleName();
graphEditorNode->label = FormatName(graphEditorNode->name);
}

Span<FieldHandler*> fields = graphEditorNode->typeHandler->GetFields();
Expand Down Expand Up @@ -127,28 +168,9 @@ namespace Fyrion

for (RID inputValue : inputValues)
{
ResourceObject valueObject = Repository::Read(inputValue);

String name = valueObject[GraphNodeValue::Input].Value<String>();
RID valueSuboject = valueObject.GetSubObject(GraphNodeValue::Value);

GraphEditorNodePin* pin = m_pins.Emplace(GraphEditorNodePinLookup{
.node = node,
.name = name,
}, MakeUnique<GraphEditorNodePin>(GraphEditorNodePin{
.node = graphEditorNode,
.label = FormatName(name),
.name = name,
// .typeId = Repository::GetResourceTypeHandler(valueSuboject)->GetTypeInfo().typeId,
.value = valueSuboject,
.kind = GraphEditorPinKind::Output,
.publicValue = valueObject[GraphNodeValue::PublicValue].Value<bool>()
})).first->second.Get();

graphEditorNode->outputs.EmplaceBack(pin);
AddOutputPinCache(inputValue, graphEditorNode);
}


if (graphEditorNode->label.Empty())
{
graphEditorNode->label = "Input";
Expand Down Expand Up @@ -290,7 +312,72 @@ namespace Fyrion
{
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;
return input && output && input->typeId == output->typeId;
}

bool GraphEditor::ValidateNewInput(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin)
{
GraphEditorNodePin* input = GetPin(inputPin, outputPin, GraphEditorPinKind::Input);
GraphEditorNodePin* addOutput = GetPin(inputPin, outputPin, GraphEditorPinKind::AddOutputPin);


if (input && addOutput)
{
for(auto node : addOutput->node->outputs)
{
if (node->name == input->name)
{
return false;
}
}
return true;
}

return false;
}

void GraphEditor::AddNewInput(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin)
{
GraphEditorNodePin* input = GetPin(inputPin, outputPin, GraphEditorPinKind::Input);
GraphEditorNodePin* addOutput = GetPin(inputPin, outputPin, GraphEditorPinKind::AddOutputPin);

if (input && addOutput)
{
RID valueAsset = Repository::CreateResource<GraphNodeValue>();
Repository::SetUUID(valueAsset, UUID::RandomUUID());

RID value = Repository::CreateResource(input->typeId);
Repository::SetUUID(value, UUID::RandomUUID());

ResourceObject valueObject = Repository::Write(valueAsset);
valueObject[GraphNodeValue::Input] = input->name;
valueObject.SetSubObject(GraphNodeValue::Value, value);
valueObject.Commit();

ResourceObject nodeObject = Repository::Write(addOutput->node->rid);
nodeObject.AddToSubObjectSet(GraphNodeAsset::InputValues, valueAsset);
nodeObject.Commit();

AddOutputPinCache(valueAsset, addOutput->node);

RID linkAsset = Repository::CreateResource<GraphNodeLinkAsset>();

ResourceObject linkObject = Repository::Write(linkAsset);
linkObject[GraphNodeLinkAsset::InputNode] = input->node->rid;
linkObject[GraphNodeLinkAsset::InputPin] = input->name;
linkObject[GraphNodeLinkAsset::OutputNode] = addOutput->node->rid;
linkObject[GraphNodeLinkAsset::OutputPin] = input->name;
linkObject.Commit();

ResourceObject graphAsset = Repository::Write(m_graph);
graphAsset.AddToSubObjectSet(ResourceGraphAsset::Links, linkAsset);
graphAsset.Commit();

Repository::SetUUID(linkAsset, UUID::RandomUUID());

AddLinkCache(linkAsset);
m_assetTree.MarkDirty();
}
}

void GraphEditor::AddLink(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin)
Expand Down
5 changes: 5 additions & 0 deletions Editor/Source/Fyrion/Editor/Editor/GraphEditor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ namespace Fyrion
FunctionHandler* functionHandler{};
Vec2 position{};
String label{};
String name{};
bool initialized{};
UniquePtr<GraphEditorNodePin> addInputPin{};
UniquePtr<GraphEditorNodePin> addOutputPin{};
Expand Down Expand Up @@ -105,6 +106,8 @@ namespace Fyrion
void AddOutput(TypeHandler* outputType, const Vec2& position);
void AddNode(FunctionHandler* functionHandler, const Vec2& position);
bool ValidateLink(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin);
bool ValidateNewInput(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin);
void AddNewInput(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin);
void AddLink(GraphEditorNodePin* inputPin, GraphEditorNodePin* outputPin);
void SetPinValue(GraphEditorNodePin* input, ConstPtr value);

Expand Down Expand Up @@ -132,5 +135,7 @@ namespace Fyrion

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

void AddOutputPinCache(RID value, GraphEditorNode* node);
};
}
9 changes: 8 additions & 1 deletion Editor/Source/Fyrion/Editor/Window/GraphEditorWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ namespace Fyrion
}

builder.Begin(node->rid.id);
builder.Header(GetNodeColor(node->label));
builder.Header(GetNodeColor(node->name));

ImGui::Spring(0);

Expand Down Expand Up @@ -249,6 +249,13 @@ namespace Fyrion
m_graphEditor.AddLink(inputPinId.AsPointer<GraphEditorNodePin>(), outputPinId.AsPointer<GraphEditorNodePin>());
}
}
else if (m_graphEditor.ValidateNewInput(inputPinId.AsPointer<GraphEditorNodePin>(), outputPinId.AsPointer<GraphEditorNodePin>()))
{
if (ed::AcceptNewItem())
{
m_graphEditor.AddNewInput(inputPinId.AsPointer<GraphEditorNodePin>(), outputPinId.AsPointer<GraphEditorNodePin>());
}
}
else
{
ed::RejectNewItem();
Expand Down
12 changes: 12 additions & 0 deletions Engine/Source/Fyrion/Graphics/DefaultRenderPipeline/GraphNodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@

namespace Fyrion
{

void DCCMeshLoader(RID mesh, Array<u8>& vertexData, Array<u8>& indexData)
{

}

void CreateBuffer(const Array<u8>& data, const BufferUsage& usage, Buffer& buffer)
{
buffer = Graphics::CreateBuffer(BufferCreation{
Expand Down Expand Up @@ -36,5 +42,11 @@ namespace Fyrion
uploadGPUBuffer.Param<1>("usage").Attribute<GraphInput>();
uploadGPUBuffer.Param<2>("buffer").Attribute<GraphOutput>();
uploadGPUBuffer.Attribute<ResourceGraphNode>("Render/Create Buffer");

auto dccMeshLoader = Registry::Function<DCCMeshLoader>("Fyrion::DCCMeshLoader");
dccMeshLoader.Param<0>("mesh").Attribute<GraphInput>();
dccMeshLoader.Param<1>("vertexData").Attribute<GraphOutput>();
dccMeshLoader.Param<2>("indexData").Attribute<GraphOutput>();
dccMeshLoader.Attribute<ResourceGraphNode>("Render/DCC Mesh Loader");
}
}
3 changes: 3 additions & 0 deletions Engine/Source/Fyrion/Resource/ResourceSerialization.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,9 @@ namespace Fyrion::ResourceSerialization

void WriteResource(WriterContext& context, RID rid)
{
if(!Repository::GetUUID(rid)) return;


ResourceType* resourceType = Repository::GetResourceType(rid);
if (resourceType)
{
Expand Down

0 comments on commit a1a9018

Please sign in to comment.