diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh index 8f21ca01f31..53485ecbd6b 100644 --- a/source/blender/blenkernel/BKE_spline.hh +++ b/source/blender/blenkernel/BKE_spline.hh @@ -543,6 +543,7 @@ struct CurveEval { blender::Span splines() const; blender::MutableSpan splines(); + bool has_spline_with_type(const Spline::Type type) const; void resize(const int size); void add_spline(SplinePtr spline); diff --git a/source/blender/blenkernel/intern/curve_eval.cc b/source/blender/blenkernel/intern/curve_eval.cc index 8e1577ab072..5c18f6f3807 100644 --- a/source/blender/blenkernel/intern/curve_eval.cc +++ b/source/blender/blenkernel/intern/curve_eval.cc @@ -48,6 +48,22 @@ blender::MutableSpan CurveEval::splines() return splines_; } +/** + * \return True if the curve contains a spline with the given type. + * + * \note If you are looping over all of the splines in the same scope anyway, + * it's better to avoid calling this function, in case there are many splines. + */ +bool CurveEval::has_spline_with_type(const Spline::Type type) const +{ + for (const SplinePtr &spline : this->splines()) { + if (spline->type() == type) { + return true; + } + } + return false; +} + void CurveEval::resize(const int size) { splines_.resize(size); diff --git a/source/blender/blenkernel/intern/geometry_component_curve.cc b/source/blender/blenkernel/intern/geometry_component_curve.cc index b5c49dbb8b2..0b6ba966974 100644 --- a/source/blender/blenkernel/intern/geometry_component_curve.cc +++ b/source/blender/blenkernel/intern/geometry_component_curve.cc @@ -854,17 +854,9 @@ class PositionAttributeProvider final : public BuiltinPointAttributeProvidersplines()) { - if (spline->type() == Spline::Type::Bezier) { - curve_has_bezier_spline = true; - break; - } - } - /* Use the regular position virtual array when there aren't any Bezier splines * to avoid the overhead of checking the spline type for every point. */ - if (!curve_has_bezier_spline) { + if (!curve->has_spline_with_type(Spline::Type::Bezier)) { return BuiltinPointAttributeProvider::try_get_for_write(component); }