diff options
Diffstat (limited to 'source/blender/blenkernel/BKE_curves_utils.hh')
-rw-r--r-- | source/blender/blenkernel/BKE_curves_utils.hh | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_curves_utils.hh b/source/blender/blenkernel/BKE_curves_utils.hh index 62b060093e9..0fbd33002e1 100644 --- a/source/blender/blenkernel/BKE_curves_utils.hh +++ b/source/blender/blenkernel/BKE_curves_utils.hh @@ -9,9 +9,60 @@ * \brief Low-level operations for curves. */ +#include "BLI_function_ref.hh" +#include "BLI_generic_pointer.hh" + namespace blender::bke::curves { /** + * Copy the provided point attribute values between all curves in the #curve_ranges index + * ranges, assuming that all curves have the same number of control points in #src_curves + * and #dst_curves. + */ +void copy_point_data(const CurvesGeometry &src_curves, + const CurvesGeometry &dst_curves, + Span<IndexRange> curve_ranges, + GSpan src, + GMutableSpan dst); + +void copy_point_data(const CurvesGeometry &src_curves, + const CurvesGeometry &dst_curves, + IndexMask src_curve_selection, + GSpan src, + GMutableSpan dst); + +template<typename T> +void copy_point_data(const CurvesGeometry &src_curves, + const CurvesGeometry &dst_curves, + const IndexMask src_curve_selection, + const Span<T> src, + MutableSpan<T> dst) +{ + copy_point_data(src_curves, dst_curves, src_curve_selection, GSpan(src), GMutableSpan(dst)); +} + +void fill_points(const CurvesGeometry &curves, + IndexMask curve_selection, + GPointer value, + GMutableSpan dst); + +template<typename T> +void fill_points(const CurvesGeometry &curves, + const IndexMask curve_selection, + const T &value, + MutableSpan<T> dst) +{ + fill_points(curves, curve_selection, &value, dst); +} + +/** + * Copy only the information on the point domain, but not the offsets or any point attributes, + * meant for operations that change the number of points but not the number of curves. + * \warning The returned curves have invalid offsets! + */ +bke::CurvesGeometry copy_only_curve_domain(const bke::CurvesGeometry &src_curves); + +/** * Copy the size of every curve in #curve_ranges to the corresponding index in #counts. */ void fill_curve_counts(const bke::CurvesGeometry &curves, @@ -23,4 +74,18 @@ void fill_curve_counts(const bke::CurvesGeometry &curves, */ void accumulate_counts_to_offsets(MutableSpan<int> counts_to_offsets, int start_offset = 0); +IndexMask indices_for_type(const VArray<int8_t> &types, + const std::array<int, CURVE_TYPES_NUM> &type_counts, + const CurveType type, + const IndexMask selection, + Vector<int64_t> &r_indices); + +void foreach_curve_by_type(const VArray<int8_t> &types, + const std::array<int, CURVE_TYPES_NUM> &type_counts, + IndexMask selection, + FunctionRef<void(IndexMask)> catmull_rom_fn, + FunctionRef<void(IndexMask)> poly_fn, + FunctionRef<void(IndexMask)> bezier_fn, + FunctionRef<void(IndexMask)> nurbs_fn); + } // namespace blender::bke::curves |