/* SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "BKE_curves.hh" /** \file * \ingroup bke * \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 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 void copy_point_data(const CurvesGeometry &src_curves, const CurvesGeometry &dst_curves, const IndexMask src_curve_selection, const Span src, MutableSpan 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 void fill_points(const CurvesGeometry &curves, const IndexMask curve_selection, const T &value, MutableSpan 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, Span curve_ranges, MutableSpan counts); /** * Turn an array of sizes into the offset at each index including all previous sizes. */ void accumulate_counts_to_offsets(MutableSpan counts_to_offsets, int start_offset = 0); IndexMask indices_for_type(const VArray &types, const std::array &type_counts, const CurveType type, const IndexMask selection, Vector &r_indices); void foreach_curve_by_type(const VArray &types, const std::array &type_counts, IndexMask selection, FunctionRef catmull_rom_fn, FunctionRef poly_fn, FunctionRef bezier_fn, FunctionRef nurbs_fn); } // namespace blender::bke::curves