/* SPDX-FileCopyrightText: 2023 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later */ /** \file * \ingroup bke */ #include "BKE_curves_utils.hh" namespace blender::bke::curves { void fill_points(const OffsetIndices points_by_curve, const IndexMask &curve_selection, const GPointer value, GMutableSpan dst) { BLI_assert(*value.type() == dst.type()); const CPPType &type = dst.type(); curve_selection.foreach_index(GrainSize(512), [&](const int i) { const IndexRange points = points_by_curve[i]; type.fill_assign_n(value.get(), dst.slice(points).data(), points.size()); }); } bke::CurvesGeometry copy_only_curve_domain(const bke::CurvesGeometry &src_curves) { bke::CurvesGeometry dst_curves(0, src_curves.curves_num()); CustomData_copy( &src_curves.curve_data, &dst_curves.curve_data, CD_MASK_ALL, src_curves.curves_num()); dst_curves.runtime->type_counts = src_curves.runtime->type_counts; return dst_curves; } IndexMask indices_for_type(const VArray &types, const std::array &type_counts, const CurveType type, const IndexMask &selection, IndexMaskMemory &memory) { if (type_counts[type] == types.size()) { return selection; } if (types.is_single()) { return types.get_internal_single() == type ? IndexMask(types.size()) : IndexMask(0); } Span types_span = types.get_internal_span(); return IndexMask::from_predicate(selection, GrainSize(4096), memory, [&](const int index) { return types_span[index] == type; }); } void foreach_curve_by_type(const VArray &types, const std::array &counts, const IndexMask &selection, FunctionRef catmull_rom_fn, FunctionRef poly_fn, FunctionRef bezier_fn, FunctionRef nurbs_fn) { auto call_if_not_empty = [&](const CurveType type, FunctionRef fn) { IndexMaskMemory memory; const IndexMask mask = indices_for_type(types, counts, type, selection, memory); if (!mask.is_empty()) { fn(mask); } }; call_if_not_empty(CURVE_TYPE_CATMULL_ROM, catmull_rom_fn); call_if_not_empty(CURVE_TYPE_POLY, poly_fn); call_if_not_empty(CURVE_TYPE_BEZIER, bezier_fn); call_if_not_empty(CURVE_TYPE_NURBS, nurbs_fn); } } // namespace blender::bke::curves