[Bf-blender-cvs] [1968c9b7024] temp-geometry-nodes-fields--fields: Add another test, add TODO comments
Hans Goudey
noreply at git.blender.org
Sun Aug 29 04:17:29 CEST 2021
Commit: 1968c9b702477fff56aab160f63b9317a70d4bf5
Author: Hans Goudey
Date: Sat Aug 28 21:17:21 2021 -0500
Branches: temp-geometry-nodes-fields--fields
https://developer.blender.org/rB1968c9b702477fff56aab160f63b9317a70d4bf5
Add another test, add TODO comments
===================================================================
M source/blender/functions/FN_field.hh
M source/blender/functions/intern/field.cc
M source/blender/functions/tests/FN_field_test.cc
===================================================================
diff --git a/source/blender/functions/FN_field.hh b/source/blender/functions/FN_field.hh
index f0e2fdb7a8f..14790d4e9e7 100644
--- a/source/blender/functions/FN_field.hh
+++ b/source/blender/functions/FN_field.hh
@@ -19,7 +19,7 @@
/** \file
* \ingroup fn
*
- * Field serve as an intermediate representation for a calculation of a group of functions. Having
+ * Field serve as an intermediate representation for calculation of a group of functions. Having
* an intermediate representation is helpful mainly to separate the execution system from the
* system that describes the necessary computations. Fields can be executed in different contexts,
* and optimization might mean executing the fields differently based on some factors like the
@@ -33,6 +33,7 @@
#include "BLI_string_ref.hh"
#include "BLI_vector.hh"
+#include "FN_generic_virtual_array.hh"
#include "FN_multi_function_procedure.hh"
#include "FN_multi_function_procedure_builder.hh"
#include "FN_multi_function_procedure_executor.hh"
@@ -145,7 +146,6 @@ class FieldFunction {
};
class FieldInput {
-
protected:
StringRef name_;
diff --git a/source/blender/functions/intern/field.cc b/source/blender/functions/intern/field.cc
index b323ff7e8fa..3e27e537f26 100644
--- a/source/blender/functions/intern/field.cc
+++ b/source/blender/functions/intern/field.cc
@@ -23,10 +23,11 @@
namespace blender::fn {
/**
- * A map to hold the output variables for each function so they can be reused.
+ * A map to hold the output variables for each function or input so they can be reused.
*/
// using VariableMap = Map<const FunctionOrInput *, Vector<MFVariable *>>;
using VariableMap = Map<const void *, Vector<MFVariable *>>;
+/* TODO: Use use counter in the vector to control when to add the desctruct call. */
/**
* A map of the computed inputs for all of a field system's inputs, to avoid creating duplicates.
@@ -79,7 +80,7 @@ static void add_field_variables_recursive(const Field &field,
Vector<MFVariable *> outputs = builder.add_call(function.multi_function(), inputs);
- builder.add_destruct(unique_inputs);
+ builder.add_destruct(unique_inputs); /* TODO: What if the same variable was used later on? */
variable_map.add(&function, std::move(outputs));
}
diff --git a/source/blender/functions/tests/FN_field_test.cc b/source/blender/functions/tests/FN_field_test.cc
index c0d7d4b2a82..c01fa0f87b8 100644
--- a/source/blender/functions/tests/FN_field_test.cc
+++ b/source/blender/functions/tests/FN_field_test.cc
@@ -10,10 +10,10 @@ namespace blender::fn::tests {
TEST(field, ConstantFunction)
{
- Field constant_field = Field(CPPType::get<int>(),
- std::make_shared<FieldFunction>(FieldFunction(
- std::make_unique<CustomMF_Constant<int>>(10), {})),
- 0);
+ Field constant_field{CPPType::get<int>(),
+ std::make_shared<FieldFunction>(
+ FieldFunction(std::make_unique<CustomMF_Constant<int>>(10), {})),
+ 0};
Array<int> result(4);
GMutableSpan result_generic(result.as_mutable_span());
@@ -38,7 +38,7 @@ class IndexFieldInput final : public FieldInput {
TEST(field, VArrayInput)
{
- Field index_field = Field(CPPType::get<int>(), std::make_shared<IndexFieldInput>());
+ Field index_field{CPPType::get<int>(), std::make_shared<IndexFieldInput>()};
Array<int> result_1(4);
GMutableSpan result_generic_1(result_1.as_mutable_span());
@@ -61,8 +61,8 @@ TEST(field, VArrayInput)
TEST(field, VArrayInputMultipleOutputs)
{
std::shared_ptr<FieldInput> index_input = std::make_shared<IndexFieldInput>();
- Field field_1 = Field(CPPType::get<int>(), index_input);
- Field field_2 = Field(CPPType::get<int>(), index_input);
+ Field field_1{CPPType::get<int>(), index_input};
+ Field field_2{CPPType::get<int>(), index_input};
Array<int> result_1(10);
Array<int> result_2(10);
@@ -82,14 +82,14 @@ TEST(field, VArrayInputMultipleOutputs)
TEST(field, InputAndFunction)
{
- Field index_field = Field(CPPType::get<int>(), std::make_shared<IndexFieldInput>());
+ Field index_field{CPPType::get<int>(), std::make_shared<IndexFieldInput>()};
- Field output_field = Field(CPPType::get<int>(),
- std::make_shared<FieldFunction>(
- FieldFunction(std::make_unique<CustomMF_SI_SI_SO<int, int, int>>(
- "add", [](int a, int b) { return a + b; }),
- {index_field, index_field})),
- 0);
+ Field output_field{CPPType::get<int>(),
+ std::make_shared<FieldFunction>(
+ FieldFunction(std::make_unique<CustomMF_SI_SI_SO<int, int, int>>(
+ "add", [](int a, int b) { return a + b; }),
+ {index_field, index_field})),
+ 0};
Array<int> result(10);
GMutableSpan result_generic(result.as_mutable_span());
@@ -100,4 +100,31 @@ TEST(field, InputAndFunction)
EXPECT_EQ(result[8], 16);
}
+TEST(field, TwoFunctions)
+{
+ Field index_field{CPPType::get<int>(), std::make_shared<IndexFieldInput>()};
+
+ Field add_field{CPPType::get<int>(),
+ std::make_shared<FieldFunction>(
+ FieldFunction(std::make_unique<CustomMF_SI_SI_SO<int, int, int>>(
+ "add", [](int a, int b) { return a + b; }),
+ {index_field, index_field})),
+ 0};
+
+ Field result_field{
+ CPPType::get<int>(),
+ std::make_shared<FieldFunction>(FieldFunction(
+ std::make_unique<CustomMF_SI_SO<int, int>>("add_10", [](int a) { return a + 10; }),
+ {add_field})),
+ 0};
+
+ Array<int> result(10);
+ GMutableSpan result_generic(result.as_mutable_span());
+ evaluate_fields({result_field}, {2, 4, 6, 8}, {result_generic});
+ EXPECT_EQ(result[2], 14);
+ EXPECT_EQ(result[4], 18);
+ EXPECT_EQ(result[6], 22);
+ EXPECT_EQ(result[8], 26);
+}
+
} // namespace blender::fn::tests
More information about the Bf-blender-cvs
mailing list