diff --git a/src/AnimGraph/AnimGraph.cc b/src/AnimGraph/AnimGraph.cc index 0fc8ed7..5ad52af 100644 --- a/src/AnimGraph/AnimGraph.cc +++ b/src/AnimGraph/AnimGraph.cc @@ -223,6 +223,8 @@ void AnimGraph::evaluate() { finishNodeEval(node->m_index); } + + evalOutputNode(); } Socket* AnimGraph::getInputSocket(const std::string& name) { diff --git a/tests/AnimGraphResourceTests.cc b/tests/AnimGraphResourceTests.cc index 82a82f8..8d8e19a 100644 --- a/tests/AnimGraphResourceTests.cc +++ b/tests/AnimGraphResourceTests.cc @@ -150,8 +150,8 @@ TEST_CASE("ResourceSaveLoadMathGraphInputs", "[AnimGraphResource]") { graph_resource_origin.clear(); graph_resource_origin.m_name = "TestInputOutputGraph"; - size_t float_to_vec3_node_index = - graph_resource_origin.addNode(AnimNodeResourceFactory("MathFloatToVec3Node")); + size_t float_to_vec3_node_index = graph_resource_origin.addNode( + AnimNodeResourceFactory("MathFloatToVec3Node")); AnimNodeResource& graph_output_node = graph_resource_origin.getGraphOutputNode(); @@ -200,7 +200,6 @@ TEST_CASE("ResourceSaveLoadMathGraphInputs", "[AnimGraphResource]") { graph_output_node, "GraphVec3Output")); - WHEN("Saving and loading graph resource") { const char* filename = "ResourceSaveLoadGraphInputs.json"; graph_resource_origin.saveToFile(filename); @@ -240,25 +239,170 @@ TEST_CASE("ResourceSaveLoadMathGraphInputs", "[AnimGraphResource]") { AnimGraph anim_graph = graph_resource_loaded.createInstance(); REQUIRE(anim_graph.getInputSocket("GraphFloatInput") != nullptr); - REQUIRE(anim_graph.getInputPtr("GraphFloatInput") == anim_graph.m_input_buffer); + REQUIRE( + anim_graph.getInputPtr("GraphFloatInput") + == anim_graph.m_input_buffer); float* graph_float_input = nullptr; - graph_float_input = static_cast(anim_graph.getInputPtr("GraphFloatInput")); + graph_float_input = + static_cast(anim_graph.getInputPtr("GraphFloatInput")); *graph_float_input = 123.456f; + AND_WHEN("Evaluating Graph") { + anim_graph.updateTime(0.f); + anim_graph.evaluate(); + + Socket* float_output_socket = + anim_graph.getOutputSocket("GraphFloatOutput"); + Socket* vec3_output_socket = + anim_graph.getOutputSocket("GraphVec3Output"); + Vec3& vec3_output = + *static_cast(vec3_output_socket->m_value.ptr); + + THEN("output vector components equal the graph input vaulues") { + CHECK(vec3_output[0] == *graph_float_input); + CHECK(vec3_output[1] == *graph_float_input); + CHECK(vec3_output[2] == *graph_float_input); + } + } + } + } + } +} + +TEST_CASE("SimpleMathEvaluations", "[AnimGraphResource]") { + AnimGraphResource graph_resource_origin; + + graph_resource_origin.clear(); + graph_resource_origin.m_name = "TestInputOutputGraph"; + + size_t math_add0_node_index = + graph_resource_origin.addNode(AnimNodeResourceFactory("MathAddNode")); + + size_t math_add1_node_index = + graph_resource_origin.addNode(AnimNodeResourceFactory("MathAddNode")); + + AnimNodeResource& graph_output_node = + graph_resource_origin.getGraphOutputNode(); + + graph_output_node.m_socket_accessor->RegisterInput( + "GraphFloat0Output", + nullptr); + graph_output_node.m_socket_accessor->RegisterInput( + "GraphFloat1Output", + nullptr); + graph_output_node.m_socket_accessor->RegisterInput( + "GraphFloat2Output", + nullptr); + + AnimNodeResource& graph_input_node = + graph_resource_origin.getGraphInputNode(); + graph_input_node.m_socket_accessor->RegisterOutput( + "GraphFloatInput", + nullptr); + + // Prepare graph inputs and outputs + AnimNodeResource& math_add0_node = + graph_resource_origin.m_nodes[math_add0_node_index]; + AnimNodeResource& math_add1_node = + graph_resource_origin.m_nodes[math_add1_node_index]; + + // direct output + REQUIRE(graph_resource_origin.connectSockets( + graph_input_node, + "GraphFloatInput", + graph_output_node, + "GraphFloat0Output")); + + // add0 node + REQUIRE(graph_resource_origin.connectSockets( + graph_input_node, + "GraphFloatInput", + math_add0_node, + "Input0")); + + REQUIRE(graph_resource_origin.connectSockets( + graph_input_node, + "GraphFloatInput", + math_add0_node, + "Input1")); + + REQUIRE(graph_resource_origin.connectSockets( + math_add0_node, + "Output", + graph_output_node, + "GraphFloat1Output")); + + // add1 node + REQUIRE(graph_resource_origin.connectSockets( + math_add0_node, + "Output", + math_add1_node, + "Input0")); + + REQUIRE(graph_resource_origin.connectSockets( + graph_input_node, + "GraphFloatInput", + math_add1_node, + "Input1")); + + REQUIRE(graph_resource_origin.connectSockets( + math_add1_node, + "Output", + graph_output_node, + "GraphFloat2Output")); + + WHEN("Saving and loading graph resource") { + const char* filename = "ResourceSaveLoadGraphInputs.json"; + graph_resource_origin.saveToFile(filename); + + AnimGraphResource graph_resource_loaded; + graph_resource_loaded.loadFromFile(filename); + + const AnimNodeResource& graph_loaded_output_node = + graph_resource_loaded.m_nodes[0]; + const AnimNodeResource& graph_loaded_input_node = + graph_resource_loaded.m_nodes[1]; + + WHEN("Instantiating an AnimGraph") { + AnimGraph anim_graph = graph_resource_loaded.createInstance(); + + REQUIRE(anim_graph.getInputSocket("GraphFloatInput") != nullptr); + REQUIRE( + anim_graph.getInputPtr("GraphFloatInput") + == anim_graph.m_input_buffer); + + float* graph_float_input = nullptr; + graph_float_input = + static_cast(anim_graph.getInputPtr("GraphFloatInput")); + + *graph_float_input = 123.456f; + + AND_WHEN("Evaluating Graph") { anim_graph.updateTime(0.f); anim_graph.evaluate(); - anim_graph.evalOutputNode(); + Socket* float0_output_socket = + anim_graph.getOutputSocket("GraphFloat0Output"); + Socket* float1_output_socket = + anim_graph.getOutputSocket("GraphFloat1Output"); + Socket* float2_output_socket = + anim_graph.getOutputSocket("GraphFloat2Output"); - Socket* float_output_socket = anim_graph.getOutputSocket("GraphFloatOutput"); - Socket* vec3_output_socket = anim_graph.getOutputSocket("GraphVec3Output"); - Vec3& vec3_output = *static_cast(vec3_output_socket->m_value.ptr); + REQUIRE(float0_output_socket != nullptr); + REQUIRE(float1_output_socket != nullptr); + REQUIRE(float2_output_socket != nullptr); - CHECK(vec3_output[0] == *graph_float_input); - CHECK(vec3_output[1] == *graph_float_input); - CHECK(vec3_output[2] == *graph_float_input); + float& float0_output = *static_cast(float0_output_socket->m_value.ptr); + float& float1_output = *static_cast(float1_output_socket->m_value.ptr); + float& float2_output = *static_cast(float2_output_socket->m_value.ptr); + + THEN("output vector components equal the graph input vaulues") { + CHECK(float0_output == Approx(*graph_float_input)); + CHECK(float1_output == Approx(*graph_float_input * 2.)); + CHECK(float2_output == Approx(*graph_float_input * 3.)); + } } } }