diff --git a/Engine/Source/Fyrion/Resource/ResourceGraph.cpp b/Engine/Source/Fyrion/Resource/ResourceGraph.cpp index 2ad0443c..a4bfe54d 100644 --- a/Engine/Source/Fyrion/Resource/ResourceGraph.cpp +++ b/Engine/Source/Fyrion/Resource/ResourceGraph.cpp @@ -26,7 +26,7 @@ namespace Fyrion for (auto& data : m_resourceGraph->m_data) { - if (data.defaultValue == nullptr && data.typeHandler && data.offset != U32_MAX) + if (data.defaultValue == nullptr && data.typeHandler && data.offset != U32_MAX) { data.typeHandler->Construct(&m_instanceData[data.offset]); } @@ -59,8 +59,10 @@ namespace Fyrion } else if (node->m_outputOffset != U32_MAX && node->m_typeHandler != nullptr) { + //type constructor node->m_typeHandler->Construct(&m_instanceData[node->m_outputOffset]); + //publish output. auto it = m_outputs.Find(node->m_typeHandler->GetTypeInfo().typeId); if (it == m_outputs.end()) { @@ -77,9 +79,21 @@ namespace Fyrion for (int n = 0; n < m_resourceGraph->m_nodes.Size(); ++n) { const auto& node = m_resourceGraph->m_nodes[n]; - if (node->m_valid && node->m_functionHandler) + if (node->m_valid) { - node->m_functionHandler->Invoke(nullptr, nullptr, m_nodeParams[n].Data()); + if (node->m_functionHandler) + { + node->m_functionHandler->Invoke(nullptr, nullptr, m_nodeParams[n].Data()); + } + else if (node->m_typeHandler) + { + //copy links to type. + for(auto& itOffset: node->m_offsets) + { + auto& data = m_resourceGraph->m_data[itOffset.second]; + data.typeHandler->Copy(&m_instanceData[data.copyOffset], &m_instanceData[data.offset]); + } + } } } } @@ -236,10 +250,18 @@ namespace Fyrion node->m_offsets.Insert(fieldHandler->GetName(), m_data.Size()); //TODO don't need to c construct. - m_data.EmplaceBack(ResourceGraphNodeParamData{ + auto& data = m_data.EmplaceBack(ResourceGraphNodeParamData{ .offset = node->m_outputOffset + (u32)fieldInfo.offsetOf, - .typeHandler = fieldType + .typeHandler = fieldType, }); + + if (auto it = node->m_inputLinks.Find(fieldHandler->GetName())) + { + if (auto itOffset = m_nodes[it->second.outputNodeId]->m_offsets.Find(it->second.outputPin)) + { + data.copyOffset = m_data[itOffset->second].offset; + } + } } } } diff --git a/Engine/Source/Fyrion/Resource/ResourceGraph.hpp b/Engine/Source/Fyrion/Resource/ResourceGraph.hpp index 9d4cc0c4..4d1d5208 100644 --- a/Engine/Source/Fyrion/Resource/ResourceGraph.hpp +++ b/Engine/Source/Fyrion/Resource/ResourceGraph.hpp @@ -49,6 +49,7 @@ namespace Fyrion u32 offset = U32_MAX; TypeHandler* typeHandler; VoidPtr defaultValue; + u32 copyOffset = U32_MAX; }; class FY_API ResourceGraphNodeData diff --git a/Engine/Test/Fyrion/Resource/ResourceGraphTests.cpp b/Engine/Test/Fyrion/Resource/ResourceGraphTests.cpp index 1537e428..80c57c27 100644 --- a/Engine/Test/Fyrion/Resource/ResourceGraphTests.cpp +++ b/Engine/Test/Fyrion/Resource/ResourceGraphTests.cpp @@ -134,7 +134,7 @@ namespace TEST_CASE("Resource::ResourceGraphBasics") { - String vl = "default"; + String vl = "value"; Engine::Init(); { @@ -194,7 +194,7 @@ namespace CHECK(graphNodes[2]->GetId() == 2); ResourceGraphInstance* instance = resourceGraph.CreateInstance(); - String vl = "value-"; + String vl = "default-"; instance->SetInputValue("inputValue", &vl); instance->Execute(); @@ -204,7 +204,7 @@ namespace REQUIRE(outputs[0]); const TestOutputNode* testOutputNode = static_cast(outputs[0]); - // CHECK(testOutputNode->stringValue == "value-value-"); + CHECK(testOutputNode->stringValue == "default-value"); instance->Destroy(); }