From da41f11a290d9641fed4e73e140fda33a803d391 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 8 Nov 2022 13:12:39 -0600 Subject: Fix T102358: Sample curve node all curves factor mode incorrect The "all curve" sampling is implemented as two functions internally. The first finds which curve each "global" sample should be on. Then the second is the regular evaluation and sampling in that curve. The first operations creates lengths, but they were processed as factors when passed to the second function. --- .../nodes/geometry/nodes/node_geo_curve_sample.cc | 28 ++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc index 3170d0aecac..5e551ff66e8 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc @@ -528,29 +528,33 @@ static void node_geo_exec(GeoNodeExecParams params) mode == GEO_NODE_CURVE_SAMPLE_FACTOR ? "Factor" : "Length"); GField src_values_field = get_input_attribute_field(params, data_type); - auto sample_fn = std::make_unique( - std::move(geometry_set), mode, std::move(src_values_field)); - std::shared_ptr sample_op; if (curves.curves_num() == 1) { - sample_op = FieldOperation::Create(std::move(sample_fn), - {fn::make_constant_field(0), std::move(length_field)}); + sample_op = FieldOperation::Create( + std::make_unique( + std::move(geometry_set), mode, std::move(src_values_field)), + {fn::make_constant_field(0), std::move(length_field)}); } else { - Field curve_index; - Field length_in_curve; if (storage.use_all_curves) { auto index_fn = std::make_unique( curve_accumulated_lengths(curves), mode); auto index_op = FieldOperation::Create(std::move(index_fn), {std::move(length_field)}); - curve_index = Field(index_op, 0); - length_in_curve = Field(index_op, 1); + Field curve_index = Field(index_op, 0); + Field length_in_curve = Field(index_op, 1); + sample_op = FieldOperation::Create( + std::make_unique( + std::move(geometry_set), GEO_NODE_CURVE_SAMPLE_LENGTH, std::move(src_values_field)), + {std::move(curve_index), std::move(length_in_curve)}); } else { - curve_index = params.extract_input>("Curve Index"); - length_in_curve = std::move(length_field); + Field curve_index = params.extract_input>("Curve Index"); + Field length_in_curve = std::move(length_field); + sample_op = FieldOperation::Create( + std::make_unique( + std::move(geometry_set), mode, std::move(src_values_field)), + {std::move(curve_index), std::move(length_in_curve)}); } - sample_op = FieldOperation::Create(std::move(sample_fn), {curve_index, length_in_curve}); } params.set_output("Position", Field(sample_op, 0)); -- cgit v1.2.3