Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/functions/FN_field.hh12
-rw-r--r--source/blender/functions/intern/field.cc20
-rw-r--r--source/blender/functions/tests/FN_field_test.cc79
3 files changed, 56 insertions, 55 deletions
diff --git a/source/blender/functions/FN_field.hh b/source/blender/functions/FN_field.hh
index 56bd9a43356..5b12e662f55 100644
--- a/source/blender/functions/FN_field.hh
+++ b/source/blender/functions/FN_field.hh
@@ -366,10 +366,9 @@ class FieldEvaluator : NonMovable, NonCopyable {
*/
template<typename T> int add_with_destination(Field<T> field, MutableSpan<T> dst)
{
- const int field_index = fields_to_evaluate_.append_and_get_index(std::move(field));
- dst_hints_.append(&scope_.construct<GVMutableArray_For_MutableSpan<T>>(__func__, dst));
- output_pointer_infos_.append({});
- return field_index;
+ GVMutableArray &generic_dst_hint = scope_.construct<GVMutableArray_For_MutableSpan<T>>(
+ __func__, dst);
+ return this->add_with_destination(std::move(field), generic_dst_hint);
}
int add(GField field, const GVArray **varray_ptr);
@@ -434,11 +433,6 @@ Vector<const GVArray *> evaluate_fields(ResourceScope &scope,
void evaluate_constant_field(const GField &field, void *r_value);
-void evaluate_fields_to_spans(Span<GFieldRef> fields_to_evaluate,
- IndexMask mask,
- const FieldContext &context,
- Span<GMutableSpan> out_spans);
-
template<typename T> T evaluate_constant_field(const Field<T> &field)
{
T value;
diff --git a/source/blender/functions/intern/field.cc b/source/blender/functions/intern/field.cc
index 042a12259c8..a27c5e4e3dc 100644
--- a/source/blender/functions/intern/field.cc
+++ b/source/blender/functions/intern/field.cc
@@ -462,19 +462,6 @@ void evaluate_constant_field(const GField &field, void *r_value)
varrays[0]->get_to_uninitialized(0, r_value);
}
-void evaluate_fields_to_spans(Span<GFieldRef> fields_to_evaluate,
- IndexMask mask,
- const FieldContext &context,
- Span<GMutableSpan> out_spans)
-{
- ResourceScope scope;
- Vector<GVMutableArray *> varrays;
- for (GMutableSpan span : out_spans) {
- varrays.append(&scope.construct<GVMutableArray_For_GMutableSpan>(__func__, span));
- }
- evaluate_fields(scope, fields_to_evaluate, mask, context, varrays);
-}
-
const GVArray *FieldContext::get_varray_for_input(const FieldInput &field_input,
IndexMask mask,
ResourceScope &scope) const
@@ -522,10 +509,9 @@ int FieldEvaluator::add_with_destination(GField field, GVMutableArray &dst)
int FieldEvaluator::add_with_destination(GField field, GMutableSpan dst)
{
- const int field_index = fields_to_evaluate_.append_and_get_index(std::move(field));
- dst_hints_.append(&scope_.construct<GVMutableArray_For_GMutableSpan>(__func__, dst));
- output_pointer_infos_.append({});
- return field_index;
+ GVMutableArray &varray_dst_hint = scope_.construct<GVMutableArray_For_GMutableSpan>(__func__,
+ dst);
+ return this->add_with_destination(std::move(field), varray_dst_hint);
}
int FieldEvaluator::add(GField field, const GVArray **varray_ptr)
diff --git a/source/blender/functions/tests/FN_field_test.cc b/source/blender/functions/tests/FN_field_test.cc
index 81529c988c6..212b79e75d3 100644
--- a/source/blender/functions/tests/FN_field_test.cc
+++ b/source/blender/functions/tests/FN_field_test.cc
@@ -16,11 +16,11 @@ TEST(field, ConstantFunction)
0};
Array<int> result(4);
- GMutableSpan result_generic(result.as_mutable_span());
- FieldContext field_context;
- evaluate_fields_to_spans(
- {constant_field}, IndexMask(IndexRange(4)), field_context, {result_generic});
+ FieldContext context;
+ FieldEvaluator evaluator{context, 4};
+ evaluator.add_with_destination(constant_field, result.as_mutable_span());
+ evaluator.evaluate();
EXPECT_EQ(result[0], 10);
EXPECT_EQ(result[1], 10);
EXPECT_EQ(result[2], 10);
@@ -49,10 +49,11 @@ TEST(field, VArrayInput)
GField index_field{std::make_shared<IndexFieldInput>()};
Array<int> result_1(4);
- GMutableSpan result_generic_1(result_1.as_mutable_span());
- FieldContext field_context;
- evaluate_fields_to_spans(
- {index_field}, IndexMask(IndexRange(4)), field_context, {result_generic_1});
+
+ FieldContext context;
+ FieldEvaluator evaluator{context, 4};
+ evaluator.add_with_destination(index_field, result_1.as_mutable_span());
+ evaluator.evaluate();
EXPECT_EQ(result_1[0], 0);
EXPECT_EQ(result_1[1], 1);
EXPECT_EQ(result_1[2], 2);
@@ -60,8 +61,13 @@ TEST(field, VArrayInput)
/* Evaluate a second time, just to test that the first didn't break anything. */
Array<int> result_2(10);
- GMutableSpan result_generic_2(result_2.as_mutable_span());
- evaluate_fields_to_spans({index_field}, {2, 4, 6, 8}, field_context, {result_generic_2});
+
+ const Array<int64_t> indices = {2, 4, 6, 8};
+ const IndexMask mask{indices};
+
+ FieldEvaluator evaluator_2{context, &mask};
+ evaluator_2.add_with_destination(index_field, result_2.as_mutable_span());
+ evaluator_2.evaluate();
EXPECT_EQ(result_2[2], 2);
EXPECT_EQ(result_2[4], 4);
EXPECT_EQ(result_2[6], 6);
@@ -76,12 +82,15 @@ TEST(field, VArrayInputMultipleOutputs)
Array<int> result_1(10);
Array<int> result_2(10);
- GMutableSpan result_generic_1(result_1.as_mutable_span());
- GMutableSpan result_generic_2(result_2.as_mutable_span());
- FieldContext field_context;
- evaluate_fields_to_spans(
- {field_1, field_2}, {2, 4, 6, 8}, field_context, {result_generic_1, result_generic_2});
+ const Array<int64_t> indices = {2, 4, 6, 8};
+ const IndexMask mask{indices};
+
+ FieldContext context;
+ FieldEvaluator evaluator{context, &mask};
+ evaluator.add_with_destination(field_1, result_1.as_mutable_span());
+ evaluator.add_with_destination(field_2, result_2.as_mutable_span());
+ evaluator.evaluate();
EXPECT_EQ(result_1[2], 2);
EXPECT_EQ(result_1[4], 4);
EXPECT_EQ(result_1[6], 6);
@@ -103,9 +112,14 @@ TEST(field, InputAndFunction)
0};
Array<int> result(10);
- GMutableSpan result_generic(result.as_mutable_span());
- FieldContext field_context;
- evaluate_fields_to_spans({output_field}, {2, 4, 6, 8}, field_context, {result_generic});
+
+ const Array<int64_t> indices = {2, 4, 6, 8};
+ const IndexMask mask{indices};
+
+ FieldContext context;
+ FieldEvaluator evaluator{context, &mask};
+ evaluator.add_with_destination(output_field, result.as_mutable_span());
+ evaluator.evaluate();
EXPECT_EQ(result[2], 4);
EXPECT_EQ(result[4], 8);
EXPECT_EQ(result[6], 12);
@@ -128,9 +142,14 @@ TEST(field, TwoFunctions)
std::make_shared<FieldOperation>(FieldOperation(std::move(add_10_fn), {add_field})), 0};
Array<int> result(10);
- GMutableSpan result_generic(result.as_mutable_span());
- FieldContext field_context;
- evaluate_fields_to_spans({result_field}, {2, 4, 6, 8}, field_context, {result_generic});
+
+ const Array<int64_t> indices = {2, 4, 6, 8};
+ const IndexMask mask{indices};
+
+ FieldContext context;
+ FieldEvaluator evaluator{context, &mask};
+ evaluator.add_with_destination(result_field, result.as_mutable_span());
+ evaluator.evaluate();
EXPECT_EQ(result[2], 14);
EXPECT_EQ(result[4], 18);
EXPECT_EQ(result[6], 22);
@@ -180,13 +199,15 @@ TEST(field, FunctionTwoOutputs)
Array<int> result_1(10);
Array<int> result_2(10);
- GMutableSpan result_generic_1(result_1.as_mutable_span());
- GMutableSpan result_generic_2(result_2.as_mutable_span());
- FieldContext field_context;
- evaluate_fields_to_spans({result_field_1, result_field_2},
- {2, 4, 6, 8},
- field_context,
- {result_generic_1, result_generic_2});
+
+ const Array<int64_t> indices = {2, 4, 6, 8};
+ const IndexMask mask{indices};
+
+ FieldContext context;
+ FieldEvaluator evaluator{context, &mask};
+ evaluator.add_with_destination(result_field_1, result_1.as_mutable_span());
+ evaluator.add_with_destination(result_field_2, result_2.as_mutable_span());
+ evaluator.evaluate();
EXPECT_EQ(result_1[2], 4);
EXPECT_EQ(result_1[4], 8);
EXPECT_EQ(result_1[6], 12);
@@ -204,7 +225,7 @@ TEST(field, TwoFunctionsTwoOutputs)
std::shared_ptr<FieldOperation> fn = std::make_shared<FieldOperation>(FieldOperation(
std::make_unique<TwoOutputFunction>("SI_SI_SO_SO"), {index_field, index_field}));
- Vector<int64_t> mask_indices = {2, 4, 6, 8};
+ Array<int64_t> mask_indices = {2, 4, 6, 8};
IndexMask mask = mask_indices.as_span();
Field<int> result_field_1{fn, 0};