diff options
Diffstat (limited to 'source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc')
-rw-r--r-- | source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc index 4e4cabd3c33..55610ec86ab 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc @@ -259,8 +259,8 @@ static SplinePtr poly_to_bezier(const Spline &input) output->positions().copy_from(input.positions()); output->radii().copy_from(input.radii()); output->tilts().copy_from(input.tilts()); - output->handle_types_left().fill(BezierSpline::HandleType::Vector); - output->handle_types_right().fill(BezierSpline::HandleType::Vector); + output->handle_types_left().fill(BEZIER_HANDLE_VECTOR); + output->handle_types_right().fill(BEZIER_HANDLE_VECTOR); output->set_resolution(12); Spline::copy_base_settings(input, *output); output->attributes = input.attributes; @@ -298,8 +298,8 @@ static SplinePtr nurbs_to_bezier(const Spline &input) nurbs_to_bezier_assign(nurbs_spline.tilts(), output->tilts(), knots_mode); scale_input_assign(handle_positions.as_span(), 2, 0, output->handle_positions_left()); scale_input_assign(handle_positions.as_span(), 2, 1, output->handle_positions_right()); - output->handle_types_left().fill(BezierSpline::HandleType::Align); - output->handle_types_right().fill(BezierSpline::HandleType::Align); + output->handle_types_left().fill(BEZIER_HANDLE_ALIGN); + output->handle_types_right().fill(BEZIER_HANDLE_ALIGN); output->set_resolution(nurbs_spline.resolution()); Spline::copy_base_settings(nurbs_spline, *output); output->attributes.reallocate(output->size()); @@ -315,11 +315,11 @@ static SplinePtr nurbs_to_bezier(const Spline &input) static SplinePtr convert_to_bezier(const Spline &input, GeoNodeExecParams params) { switch (input.type()) { - case Spline::Type::Bezier: + case CURVE_TYPE_BEZIER: return input.copy(); - case Spline::Type::Poly: + case CURVE_TYPE_POLY: return poly_to_bezier(input); - case Spline::Type::NURBS: + case CURVE_TYPE_NURBS: if (input.size() < 4) { params.error_message_add( NodeWarningType::Info, @@ -327,6 +327,10 @@ static SplinePtr convert_to_bezier(const Spline &input, GeoNodeExecParams params return input.copy(); } return nurbs_to_bezier(input); + case CURVE_TYPE_CATMULL_ROM: { + BLI_assert_unreachable(); + return {}; + } } BLI_assert_unreachable(); return {}; @@ -335,12 +339,15 @@ static SplinePtr convert_to_bezier(const Spline &input, GeoNodeExecParams params static SplinePtr convert_to_nurbs(const Spline &input) { switch (input.type()) { - case Spline::Type::NURBS: + case CURVE_TYPE_NURBS: return input.copy(); - case Spline::Type::Bezier: + case CURVE_TYPE_BEZIER: return bezier_to_nurbs(input); - case Spline::Type::Poly: + case CURVE_TYPE_POLY: return poly_to_nurbs(input); + case CURVE_TYPE_CATMULL_ROM: + BLI_assert_unreachable(); + return {}; } BLI_assert_unreachable(); return {}; @@ -355,45 +362,48 @@ static void node_geo_exec(GeoNodeExecParams params) Field<bool> selection_field = params.extract_input<Field<bool>>("Selection"); geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { - if (!geometry_set.has_curve()) { + if (!geometry_set.has_curves()) { return; } const CurveComponent *curve_component = geometry_set.get_component_for_read<CurveComponent>(); - const CurveEval &curve = *curve_component->get_for_read(); + const std::unique_ptr<CurveEval> curve = curves_to_curve_eval( + *curve_component->get_for_read()); GeometryComponentFieldContext field_context{*curve_component, ATTR_DOMAIN_CURVE}; const int domain_size = curve_component->attribute_domain_size(ATTR_DOMAIN_CURVE); + Span<SplinePtr> src_splines = curve->splines(); + fn::FieldEvaluator selection_evaluator{field_context, domain_size}; selection_evaluator.add(selection_field); selection_evaluator.evaluate(); const VArray<bool> &selection = selection_evaluator.get_evaluated<bool>(0); std::unique_ptr<CurveEval> new_curve = std::make_unique<CurveEval>(); - new_curve->resize(curve.splines().size()); + new_curve->resize(src_splines.size()); - threading::parallel_for(curve.splines().index_range(), 512, [&](IndexRange range) { + threading::parallel_for(src_splines.index_range(), 512, [&](IndexRange range) { for (const int i : range) { if (selection[i]) { switch (output_type) { case GEO_NODE_SPLINE_TYPE_POLY: - new_curve->splines()[i] = convert_to_poly_spline(*curve.splines()[i]); + new_curve->splines()[i] = convert_to_poly_spline(*src_splines[i]); break; case GEO_NODE_SPLINE_TYPE_BEZIER: - new_curve->splines()[i] = convert_to_bezier(*curve.splines()[i], params); + new_curve->splines()[i] = convert_to_bezier(*src_splines[i], params); break; case GEO_NODE_SPLINE_TYPE_NURBS: - new_curve->splines()[i] = convert_to_nurbs(*curve.splines()[i]); + new_curve->splines()[i] = convert_to_nurbs(*src_splines[i]); break; } } else { - new_curve->splines()[i] = curve.splines()[i]->copy(); + new_curve->splines()[i] = src_splines[i]->copy(); } } }); - new_curve->attributes = curve.attributes; - geometry_set.replace_curve(new_curve.release()); + new_curve->attributes = curve->attributes; + geometry_set.replace_curve(curve_eval_to_curves(*new_curve)); }); params.set_output("Curve", std::move(geometry_set)); |