Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/sculpt_paint/curves_sculpt_selection.cc
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||||
| #include "BLI_index_mask_ops.hh" | #include "BLI_index_mask_ops.hh" | ||||
| #include "BKE_curves.hh" | #include "BKE_curves.hh" | ||||
| #include "curves_sculpt_intern.hh" | #include "curves_sculpt_intern.hh" | ||||
| #include "ED_curves_sculpt.h" | |||||
| namespace blender::ed::sculpt_paint { | namespace blender::ed::sculpt_paint { | ||||
| static VArray<float> get_curves_selection(const CurvesGeometry &curves, const eAttrDomain domain) | static VArray<float> get_curves_selection(const CurvesGeometry &curves, const eAttrDomain domain) | ||||
| { | { | ||||
| switch (domain) { | switch (domain) { | ||||
| case ATTR_DOMAIN_CURVE: | case ATTR_DOMAIN_CURVE: | ||||
| return curves.selection_curve_float(); | return curves.selection_curve_float(); | ||||
| case ATTR_DOMAIN_POINT: | case ATTR_DOMAIN_POINT: | ||||
| Show All 40 Lines | |||||
| static IndexMask retrieve_selected_curves(const CurvesGeometry &curves, | static IndexMask retrieve_selected_curves(const CurvesGeometry &curves, | ||||
| const eAttrDomain domain, | const eAttrDomain domain, | ||||
| Vector<int64_t> &r_indices) | Vector<int64_t> &r_indices) | ||||
| { | { | ||||
| switch (domain) { | switch (domain) { | ||||
| case ATTR_DOMAIN_POINT: { | case ATTR_DOMAIN_POINT: { | ||||
| const VArray<float> selection = curves.selection_point_float(); | const VArray<float> selection = curves.selection_point_float(); | ||||
| if (selection.is_single()) { | if (selection.is_single()) { | ||||
| return selection.get_internal_single() == 0.0f ? IndexMask(0) : | return selection.get_internal_single() <= 0.0f ? IndexMask(0) : | ||||
| IndexMask(curves.curves_num()); | IndexMask(curves.curves_num()); | ||||
JacquesLucke: Why does this change and the one below make sense? | |||||
| } | } | ||||
| return index_mask_ops::find_indices_based_on_predicate( | return index_mask_ops::find_indices_based_on_predicate( | ||||
| curves.curves_range(), 512, r_indices, [&](const int curve_i) { | curves.curves_range(), 512, r_indices, [&](const int curve_i) { | ||||
| for (const int i : curves.points_for_curve(curve_i)) { | for (const int i : curves.points_for_curve(curve_i)) { | ||||
| if (selection[i] > 0.0f) { | if (selection[i] > 0.0f) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| } | } | ||||
| return false; | return false; | ||||
| }); | }); | ||||
| } | } | ||||
| case ATTR_DOMAIN_CURVE: { | case ATTR_DOMAIN_CURVE: { | ||||
| const VArray<float> selection = curves.selection_curve_float(); | const VArray<float> selection = curves.selection_curve_float(); | ||||
| if (selection.is_single()) { | if (selection.is_single()) { | ||||
| return selection.get_internal_single() == 0.0f ? IndexMask(0) : | return selection.get_internal_single() <= 0.0f ? IndexMask(0) : | ||||
| IndexMask(curves.curves_num()); | IndexMask(curves.curves_num()); | ||||
| } | } | ||||
| return index_mask_ops::find_indices_based_on_predicate( | return index_mask_ops::find_indices_based_on_predicate( | ||||
| curves.curves_range(), 2048, r_indices, [&](const int i) { | curves.curves_range(), 2048, r_indices, [&](const int i) { | ||||
| return selection[i] > 0.0f; | return selection[i] > 0.0f; | ||||
| }); | }); | ||||
| } | } | ||||
| default: | default: | ||||
| BLI_assert_unreachable(); | BLI_assert_unreachable(); | ||||
| return {}; | return {}; | ||||
| } | } | ||||
| } | } | ||||
| IndexMask retrieve_selected_curves(const Curves &curves_id, Vector<int64_t> &r_indices) | IndexMask retrieve_selected_curves(const Curves &curves_id, Vector<int64_t> &r_indices) | ||||
| { | { | ||||
| if (!(curves_id.flag & CV_SCULPT_SELECTION_ENABLED)) { | if (!(curves_id.flag & CV_SCULPT_SELECTION_ENABLED)) { | ||||
| return CurvesGeometry::wrap(curves_id.geometry).curves_range(); | return CurvesGeometry::wrap(curves_id.geometry).curves_range(); | ||||
| } | } | ||||
| return retrieve_selected_curves(CurvesGeometry::wrap(curves_id.geometry), | return retrieve_selected_curves(CurvesGeometry::wrap(curves_id.geometry), | ||||
| eAttrDomain(curves_id.selection_domain), | eAttrDomain(curves_id.selection_domain), | ||||
| r_indices); | r_indices); | ||||
| } | } | ||||
| static IndexMask retrieve_selected_points(const CurvesGeometry &curves, | |||||
| const eAttrDomain domain, | |||||
| Vector<int64_t> &r_indices) | |||||
| { | |||||
| switch (domain) { | |||||
| case ATTR_DOMAIN_POINT: { | |||||
| const VArray<float> selection = curves.selection_point_float(); | |||||
| if (selection.is_single()) { | |||||
| return selection.get_internal_single() <= 0.0f ? IndexMask(0) : | |||||
Done Inline ActionsSame as above. JacquesLucke: Same as above. | |||||
| IndexMask(curves.points_num()); | |||||
| } | |||||
| return index_mask_ops::find_indices_based_on_predicate( | |||||
| curves.points_range(), 2048, r_indices, [&](const int i) { | |||||
| return selection[i] > 0.0f; | |||||
| }); | |||||
| } | |||||
| case ATTR_DOMAIN_CURVE: { | |||||
| const VArray<float> selection = curves.selection_curve_float(); | |||||
| if (selection.is_single()) { | |||||
| return selection.get_internal_single() <= 0.0f ? IndexMask(0) : | |||||
| IndexMask(curves.points_num()); | |||||
| } | |||||
| const VArray<float> point_selection = curves.adapt_domain( | |||||
| selection, ATTR_DOMAIN_CURVE, ATTR_DOMAIN_POINT); | |||||
| return index_mask_ops::find_indices_based_on_predicate( | |||||
| curves.points_range(), 2048, r_indices, [&](const int i) { | |||||
| return point_selection[i] > 0.0f; | |||||
| }); | |||||
| } | |||||
| default: | |||||
| BLI_assert_unreachable(); | |||||
| return {}; | |||||
| } | |||||
| } | |||||
| IndexMask retrieve_selected_points(const Curves &curves_id, Vector<int64_t> &r_indices) | |||||
| { | |||||
| if (!(curves_id.flag & CV_SCULPT_SELECTION_ENABLED)) { | |||||
| return CurvesGeometry::wrap(curves_id.geometry).points_range(); | |||||
| } | |||||
| return retrieve_selected_points(CurvesGeometry::wrap(curves_id.geometry), | |||||
| eAttrDomain(curves_id.selection_domain), | |||||
| r_indices); | |||||
| } | |||||
| } // namespace blender::ed::sculpt_paint | } // namespace blender::ed::sculpt_paint | ||||
Why does this change and the one below make sense?