diff --git a/source/blender/editors/curves/CMakeLists.txt b/source/blender/editors/curves/CMakeLists.txt index 873df89b40c..36eb0e04647 100644 --- a/source/blender/editors/curves/CMakeLists.txt +++ b/source/blender/editors/curves/CMakeLists.txt @@ -23,6 +23,7 @@ set(INC set(SRC intern/curves_add.cc intern/curves_data.cc + intern/curves_edit.cc intern/curves_ops.cc intern/curves_selection.cc intern/curves_undo.cc diff --git a/source/blender/editors/curves/intern/curves_edit.cc b/source/blender/editors/curves/intern/curves_edit.cc new file mode 100644 index 00000000000..9d5e7730ba0 --- /dev/null +++ b/source/blender/editors/curves/intern/curves_edit.cc @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup edcurves + */ + +#include "BLI_index_mask_ops.hh" + +#include "BKE_curves.hh" + +#include "ED_curves.h" + +namespace blender::ed::curves { + +bool remove_selection(bke::CurvesGeometry &curves, const eAttrDomain selection_domain) +{ + const bke::AttributeAccessor attributes = curves.attributes(); + const VArray selection = attributes.lookup_or_default( + ".selection", selection_domain, true); + const int domain_size_orig = attributes.domain_size(selection_domain); + Vector indices; + const IndexMask mask = index_mask_ops::find_indices_from_virtual_array( + selection.index_range(), selection, 4096, indices); + switch (selection_domain) { + case ATTR_DOMAIN_POINT: + curves.remove_points(mask); + break; + case ATTR_DOMAIN_CURVE: + curves.remove_curves(mask); + break; + default: + BLI_assert_unreachable(); + } + + return attributes.domain_size(selection_domain) != domain_size_orig; +} + +} // namespace blender::ed::curves diff --git a/source/blender/editors/curves/intern/curves_ops.cc b/source/blender/editors/curves/intern/curves_ops.cc index d9496cf6e25..080307ef2bd 100644 --- a/source/blender/editors/curves/intern/curves_ops.cc +++ b/source/blender/editors/curves/intern/curves_ops.cc @@ -1097,24 +1097,7 @@ static int delete_exec(bContext *C, wmOperator * /*op*/) { for (Curves *curves_id : get_unique_editable_curves(*C)) { bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - const eAttrDomain domain = eAttrDomain(curves_id->selection_domain); - const bke::AttributeAccessor attributes = curves.attributes(); - const VArray selection = attributes.lookup_or_default(".selection", domain, false); - const int domain_size_orig = attributes.domain_size(domain); - Vector indices; - const IndexMask mask = index_mask_ops::find_indices_from_virtual_array( - selection.index_range(), selection, 4096, indices); - switch (domain) { - case ATTR_DOMAIN_POINT: - curves.remove_points(mask); - break; - case ATTR_DOMAIN_CURVE: - curves.remove_curves(mask); - break; - default: - BLI_assert_unreachable(); - } - if (attributes.domain_size(domain) != domain_size_orig) { + if (remove_selection(curves, eAttrDomain(curves_id->selection_domain))) { DEG_id_tag_update(&curves_id->id, ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GEOM | ND_DATA, curves_id); } diff --git a/source/blender/editors/include/ED_curves.h b/source/blender/editors/include/ED_curves.h index 2bfe99ea2bd..d9d6c0c2863 100644 --- a/source/blender/editors/include/ED_curves.h +++ b/source/blender/editors/include/ED_curves.h @@ -185,5 +185,17 @@ bool select_circle(const ViewContext &vc, eSelectOp sel_op); /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Editing + * \{ */ + +/** + * Remove (dissolve) selected curves or points based on the ".selection" attribute. + * \returns true if any point or curve was removed. + */ +bool remove_selection(bke::CurvesGeometry &curves, eAttrDomain selection_domain); + +/** \} */ + } // namespace blender::ed::curves #endif