Blender V5.0
blender::index_mask::IndexMask Class Reference

#include <BLI_index_mask.hh>

Inherits blender::index_mask::IndexMaskData.

Public Types

using Initializer = std::variant<IndexRange, Span<int64_t>, Span<int>, int64_t>

Public Member Functions

std::optional< RawMaskIteratorfind (int64_t query_index) const
std::optional< RawMaskIteratorfind_larger_equal (int64_t query_index) const
std::optional< RawMaskIteratorfind_smaller_equal (int64_t query_index) const
bool contains (int64_t query_index) const
IndexMask slice (int64_t start, int64_t size) const
IndexMask slice (RawMaskIterator first_it, RawMaskIterator last_it, int64_t size) const
IndexMask slice_content (IndexRange range) const
IndexMask slice_content (int64_t start, int64_t size) const
IndexMask slice_and_shift (IndexRange range, int64_t offset, IndexMaskMemory &memory) const
IndexMask slice_and_shift (int64_t start, int64_t size, int64_t offset, IndexMaskMemory &memory) const
IndexMask shift (const int64_t offset, IndexMaskMemory &memory) const
IndexMask complement (const IndexMask &universe, IndexMaskMemory &memory) const
template<typename T>
void to_indices (MutableSpan< T > r_indices) const
void set_bits (MutableBitSpan r_bits, int64_t offset=0) const
void to_bits (MutableBitSpan r_bits, int64_t offset=0) const
void to_bools (MutableSpan< bool > r_bools) const
Vector< IndexRangeto_ranges () const
Vector< IndexRangeto_ranges_invert (IndexRange universe) const

Static Public Member Functions

template<typename T>
static IndexMask from_indices (Span< T > indices, IndexMaskMemory &memory)
static IndexMask from_bits (BitSpan bits, IndexMaskMemory &memory)
static IndexMask from_bits (const IndexMask &universe, BitSpan bits, IndexMaskMemory &memory)
static IndexMask from_bools (Span< bool > bools, IndexMaskMemory &memory)
static IndexMask from_bools (const VArray< bool > &bools, IndexMaskMemory &memory)
static IndexMask from_bools_inverse (const VArray< bool > &bools, IndexMaskMemory &memory)
static IndexMask from_bools (const IndexMask &universe, Span< bool > bools, IndexMaskMemory &memory)
static IndexMask from_bools_inverse (const IndexMask &universe, Span< bool > bools, IndexMaskMemory &memory)
static IndexMask from_bools (const IndexMask &universe, const VArray< bool > &bools, IndexMaskMemory &memory)
static IndexMask from_bools_inverse (const IndexMask &universe, const VArray< bool > &bools, IndexMaskMemory &memory)
template<typename T>
static IndexMask from_ranges (OffsetIndices< T > offsets, const IndexMask &mask, IndexMaskMemory &memory)
static IndexMask from_repeating (const IndexMask &mask_to_repeat, int64_t repetitions, int64_t stride, int64_t initial_offset, IndexMaskMemory &memory)
static IndexMask from_every_nth (int64_t n, int64_t indices_num, const int64_t initial_offset, IndexMaskMemory &memory)
static IndexMask from_segments (Span< IndexMaskSegment > segments, IndexMaskMemory &memory)
static IndexMask from_initializers (const Span< Initializer > initializers, IndexMaskMemory &memory)
static IndexMask from_union (const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
static IndexMask from_union (Span< IndexMask > masks, IndexMaskMemory &memory)
static IndexMask from_difference (const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
static IndexMask from_intersection (const IndexMask &mask_a, const IndexMask &mask_b, IndexMaskMemory &memory)
static IndexMask from_batch_predicate (const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, FunctionRef< int64_t(const IndexMaskSegment &universe_segment, IndexRangesBuilder< int16_t > &builder)> batch_predicate)
static Vector< IndexMask, 4 > from_group_ids (const VArray< int > &group_ids, IndexMaskMemory &memory, VectorSet< int > &r_index_by_group_id)
static Vector< IndexMask, 4 > from_group_ids (const IndexMask &universe, const VArray< int > &group_ids, IndexMaskMemory &memory, VectorSet< int > &r_index_by_group_id)
static void foreach_segment_zipped (Span< IndexMask > masks, FunctionRef< bool(Span< IndexMaskSegment > segments)> fn)

Friends

bool operator== (const IndexMask &a, const IndexMask &b)
bool operator!= (const IndexMask &a, const IndexMask &b)

#IndexMask Inline Methods

 IndexMask ()
 IndexMask (int64_t size)
 IndexMask (IndexRange range)
int64_t size () const
bool is_empty () const
IndexRange index_range () const
int64_t first () const
int64_t last () const
IndexRange bounds () const
int64_t min_array_size () const
RawMaskIterator index_to_iterator (int64_t index) const
int64_t iterator_to_index (const RawMaskIterator &it) const
int64_t operator[] (int64_t i) const
int64_t operator[] (const RawMaskIterator &it) const
IndexMask slice (IndexRange range) const
int64_t segments_num () const
IndexMaskSegment segment (int64_t segment_i) const
template<typename Fn>
void foreach_index (Fn &&fn) const
template<typename Fn>
void foreach_index (GrainSize grain_size, Fn &&fn) const
template<typename IndexT, typename Fn>
void foreach_index_optimized (Fn &&fn) const
template<typename IndexT, typename Fn>
void foreach_index_optimized (GrainSize grain_size, Fn &&fn) const
template<typename Fn>
void foreach_segment (Fn &&fn) const
template<typename Fn>
void foreach_segment (GrainSize grain_size, Fn &&fn) const
template<typename Fn>
void foreach_segment_optimized (Fn &&fn) const
template<typename Fn>
void foreach_segment_optimized (GrainSize grain_size, Fn &&fn) const
template<typename Fn>
void foreach_range (Fn &&fn) const
std::optional< IndexRangeto_range () const
template<int64_t N = 4>
Vector< std::variant< IndexRange, IndexMaskSegment >, Nto_spans_and_ranges () const
IndexMaskDatadata_for_inplace_construction ()
template<typename Fn>
static IndexMask from_predicate (const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
template<typename T, typename Fn>
static void from_groups (const IndexMask &universe, IndexMaskMemory &memory, Fn &&get_group_index, MutableSpan< IndexMask > r_masks)

Detailed Description

An IndexMask is a sequence of unique and sorted indices (BLI_unique_sorted_indices.hh). It's commonly used when a subset of elements in an array has to be processed.

IndexMask is a non-owning container. That data it references is usually either statically allocated or is owned by an IndexMaskMemory.

Internally, an index mask is split into an arbitrary number of ordered segments. Each segment contains up to max_segment_size (2^14 = 16384) indices. The indices in a segment are stored as int16_t, but each segment also has a int64_t offset.

The data structure is designed to satisfy the following key requirements:

  • Construct index mask for an IndexRange in O(1) time (after initial setup).
  • Support efficient slicing (O(log n) with a low constant factor).
  • Support multi-threaded construction without severe serial bottlenecks.
  • Support efficient iteration over indices that uses IndexRange when possible.

Construction: A new index mask is usually created by calling one of its constructors which are O(1), or for more complex masks, by calling various IndexMask::from_* functions that create masks from various sources. Those generally need additional memory which is provided with by an IndexMaskMemory.

Some of the IndexMask::from_* functions have an IndexMask universe input. When provided, the function will only consider the indices in the "universe". The term comes from mathematics: https://en.wikipedia.org/wiki/Universe_(mathematics).

Iteration: To iterate over the indices, one usually has to use one of the foreach_* functions which require a callback function. Due to the internal segmentation of the index mask, this is more efficient than using a normal C++ iterator and range-based for loops.

There are multiple variants of the foreach_* functions which are useful in different scenarios. The callback can generally take one or two arguments. The first is the index stored in the mask and the second is the index that would have to be passed into operator[] to get the first index.

The foreach_* methods also accept an optional GrainSize argument. When that is provided, multi-threading is used when appropriate. Integrating multi-threading at this level works well because mask iteration and parallelism are often used at the same time.

Extraction: An IndexMask can be converted into various other forms using the to_* methods.

Definition at line 188 of file BLI_index_mask.hh.

Member Typedef Documentation

◆ Initializer

Construct a mask from some parts. This is mainly meant for more concise testing code. The individual items are unioned together.

Definition at line 251 of file BLI_index_mask.hh.

Constructor & Destructor Documentation

◆ IndexMask() [1/3]

◆ IndexMask() [2/3]

◆ IndexMask() [3/3]

Member Function Documentation

◆ bounds()

Returns the smallest range that contains all indices stored in this mask.

Definition at line 714 of file BLI_index_mask.hh.

References first(), blender::IndexRange::from_begin_end_inclusive(), is_empty(), and last().

Referenced by from_repeating().

◆ complement()

IndexMask blender::index_mask::IndexMask::complement ( const IndexMask & universe,
IndexMaskMemory & memory ) const
Returns
A new index mask that contains all the indices from the universe that are not in the current mask.

Definition at line 404 of file index_mask.cc.

References blender::index_mask::evaluate_expression(), IndexMask(), and blender::index_mask::ExprBuilder::subtract().

Referenced by blender::build_sequential(), blender::geometry::convert_curves_to_bezier(), blender::geometry::convert_curves_to_catmull_rom_or_poly(), blender::geometry::convert_curves_to_nurbs(), blender::nodes::node_geo_curves_to_grease_pencil_cc::curves_to_grease_pencil_with_one_layer(), blender::io::grease_pencil::SVGExporter::export_grease_pencil_objects(), blender::draw::extract_lines_bm(), blender::draw::extract_lines_mesh(), blender::ed::curves::pen_tool::extrude_curves(), blender::ed::greasepencil::extrude_grease_pencil_curves(), blender::geometry::fillet_curves(), blender::geometry::fit_poly_to_bezier_curves(), blender::generate_curves(), blender::ed::greasepencil::get_reordered_indices(), blender::ed::greasepencil::grease_pencil_copy_strokes_exec(), blender::ed::curves::pen_tool::insert_point_to_curve(), blender::modify_drawing(), blender::geometry::propagate_instances_to_keep(), blender::bke::CurvesGeometry::remove_curves(), blender::bke::CurvesGeometry::remove_points(), blender::geometry::resample_to_count(), blender::geometry::resample_to_evaluated(), blender::geometry::resample_to_length(), blender::geometry::resample_to_uniform(), blender::geometry::resample_to_uniform(), blender::ed::curves::resize_curves(), blender::ed::sculpt_paint::select_grow::select_grow_invoke_per_curve(), blender::ed::curves::select_random_exec(), blender::ed::pointcloud::select_random_exec(), blender::ed::greasepencil::selection_update(), blender::ed::greasepencil::simplify_fixed(), blender::geometry::split_edges(), blender::geometry::subdivide_curves(), blender::bke::greasepencil::Drawing::tag_topology_changed(), blender::index_mask::tests::TEST(), to_ranges_invert(), and blender::geometry::trim_curves().

◆ contains()

bool blender::index_mask::IndexMask::contains ( int64_t query_index) const

◆ data_for_inplace_construction()

Is used by some functions to get low level access to the mask in order to construct it.

Definition at line 806 of file BLI_index_mask.hh.

◆ find()

std::optional< RawMaskIterator > blender::index_mask::IndexMask::find ( int64_t query_index) const
Returns
Position where the #query_index is stored, or none if the index is not in the mask.

Definition at line 873 of file index_mask.cc.

References find_larger_equal().

Referenced by contains().

◆ find_larger_equal()

◆ find_smaller_equal()

◆ first()

◆ foreach_index() [1/2]

template<typename Fn>
void blender::index_mask::IndexMask::foreach_index ( Fn && fn) const
inline

Calls the function once for every index.

Supported function signatures:

i is the index that should be processed and pos is the position of that index in the mask: i == mask[pos]

Definition at line 816 of file BLI_index_mask.hh.

References foreach_segment(), i, and indices.

Referenced by blender::nodes::node_geo_instance_on_points_cc::add_instances_from_component(), blender::ed::greasepencil::apply_color_operation_for_mode(), blender::ed::greasepencil::apply_eval_grease_pencil_data(), blender::ed::greasepencil::apply_mask_as_selection(), blender::ed::sculpt_paint::mask::apply_mask_from_settings(), blender::ed::sculpt_paint::mask::apply_new_mask_bmesh(), blender::ed::sculpt_paint::mask::apply_new_mask_grids(), blender::ed::sculpt_paint::mask::apply_new_mask_mesh(), blender::ed::sculpt_paint::smooth::blur_geometry_data_array(), blender::bke::pbvh::bmesh_normals_update(), blender::ed::greasepencil::build_curves_2d_bvh_from_visible(), blender::build_sequential(), blender::draw::build_tris_from_subdiv_quad_selection(), blender::geometry::calc_all_corner_groups(), blender::ed::sculpt_paint::auto_mask::Cache::calc_cavity_factor(), blender::ed::sculpt_paint::cloth::calc_constraint_factors(), blender::draw::calc_edit_handles_ibo(), blender::ed::sculpt_paint::filter::calc_enhance_details_filter(), blender::ed::sculpt_paint::filter::calc_erase_displacement_filter(), blender::ed::sculpt_paint::filter::calc_inflate_filter(), blender::geometry::calc_new_edges(), blender::bke::pbvh::calc_node_face_normals(), blender::bke::pbvh::calc_node_vert_normals(), blender::ed::sculpt_paint::filter::calc_random_filter(), blender::ed::sculpt_paint::filter::calc_relax_face_sets_filter(), blender::ed::sculpt_paint::filter::calc_relax_filter(), blender::ed::sculpt_paint::filter::calc_scale_filter(), blender::ed::sculpt_paint::filter::calc_sharpen_filter(), blender::ed::sculpt_paint::filter::calc_smooth_filter(), blender::ed::sculpt_paint::calc_smooth_translations(), blender::ed::sculpt_paint::filter::calc_sphere_filter(), blender::ed::sculpt_paint::filter::calc_surface_smooth_filter(), blender::ed::sculpt_paint::expand::calc_topology_falloff_from_verts(), blender::ed::sculpt_paint::islands::calc_topology_islands_bmesh(), blender::ed::sculpt_paint::islands::calc_topology_islands_mesh(), blender::geometry::ngon::calc_tris_by_ngon(), calculate_average_color(), blender::ed::curves::pen_tool::calculate_center_of_mass(), blender::geometry::calculate_result_offsets(), blender::geometry::calculate_result_offsets(), blender::ed::sculpt_paint::greasepencil::calculate_view_positions(), blender::ed::sculpt_paint::greasepencil::calculate_view_radii(), blender::ed::sculpt_paint::face_set::clear_face_sets(), blender::ed::sculpt_paint::cloth::cloth_brush_apply_brush_forces(), blender::ed::sculpt_paint::cloth::cloth_sim_initialize_default_node_state(), blender::ed::sculpt_paint::paint::image::collect_dirty_tiles(), blender::geometry::compute_curve_trim_parameters(), blender::nodes::node_geo_uv_pack_islands_cc::construct_uv_gvarray(), blender::nodes::node_geo_uv_unwrap_cc::construct_uv_gvarray(), blender::geometry::convert_curves_to_bezier(), blender::geometry::convert_curves_to_catmull_rom_or_poly(), blender::geometry::convert_curves_to_nurbs(), blender::array_utils::copy_group_to_group(), blender::bke::copy_point_selection_custom_knots(), blender::nodes::node_geo_duplicate_elements_cc::copy_stable_id_curves(), blender::nodes::node_geo_duplicate_elements_cc::copy_stable_id_edges(), blender::io::hydra::copy_submesh(), blender::create_dashes(), blender::draw::create_edit_points_data(), blender::create_envelope_strokes(), blender::ed::sculpt_paint::create_node_vert_offsets(), blender::ed::sculpt_paint::create_node_vert_offsets(), blender::ed::sculpt_paint::create_node_vert_offsets_bmesh(), blender::draw::create_segments_with_cyclic(), blender::bke::create_tree_from_edges(), blender::bke::create_tree_from_tris(), blender::bke::create_tree_from_verts(), blender::nodes::node_geo_curves_to_grease_pencil_cc::curve_instances_to_grease_pencil_layers(), blender::ed::greasepencil::curve_merge_by_distance(), blender::ed::transform::curves::curve_populate_trans_data_structs(), blender::bke::curves::curve_to_point_selection(), blender::bke::curves_copy_point_selection(), blender::deform_drawing(), blender::deform_drawing(), blender::deform_drawing_as_envelope(), blender::ed::sculpt_paint::boundary::do_bend_brush(), blender::ed::sculpt_paint::brushes::do_bmesh_topology_rake_brush(), blender::ed::sculpt_paint::brushes::do_clay_brush(), blender::ed::sculpt_paint::brushes::do_clay_strips_brush(), blender::ed::sculpt_paint::brushes::do_clay_thumb_brush(), blender::ed::sculpt_paint::brushes::do_displacement_eraser_brush(), blender::ed::sculpt_paint::brushes::do_displacement_smear_brush(), blender::ed::sculpt_paint::brushes::do_draw_vector_displacement_brush(), blender::ed::sculpt_paint::brushes::do_elastic_deform_brush(), blender::ed::sculpt_paint::brushes::do_enhance_details_brush(), blender::ed::sculpt_paint::boundary::do_grab_brush(), blender::ed::sculpt_paint::brushes::do_grab_brush(), blender::ed::sculpt_paint::boundary::do_inflate_brush(), blender::ed::sculpt_paint::brushes::do_inflate_brush(), blender::ed::sculpt_paint::brushes::do_layer_brush(), blender::ed::sculpt_paint::brushes::do_mask_brush(), blender::ed::sculpt_paint::brushes::do_multiplane_scrape_brush(), blender::ed::sculpt_paint::color::do_paint_brush(), blender::ed::sculpt_paint::brushes::do_pinch_brush(), blender::ed::sculpt_paint::brushes::do_plane_brush(), blender::ed::sculpt_paint::pose::do_pose_brush(), blender::ed::sculpt_paint::brushes::do_rotate_brush(), blender::ed::sculpt_paint::boundary::do_slide_brush(), blender::ed::sculpt_paint::boundary::do_smooth_brush(), blender::ed::sculpt_paint::brushes::do_smooth_brush(), blender::ed::sculpt_paint::brushes::do_smooth_mask_brush(), blender::ed::sculpt_paint::brushes::do_snake_hook_brush(), blender::ed::sculpt_paint::brushes::do_thumb_brush(), blender::ed::sculpt_paint::brushes::do_topology_slide_brush(), blender::ed::sculpt_paint::boundary::do_twist_brush(), do_vpaint_brush_blur_loops(), do_vpaint_brush_blur_verts(), do_vpaint_brush_smear(), do_wpaint_brush_blur(), do_wpaint_brush_draw(), do_wpaint_brush_smear(), blender::draw::overlay::GreasePencil::draw_grease_pencil(), blender::ed::greasepencil::image_render::draw_grease_pencil_strokes(), blender::geometry::duplicate_fillet_point_data(), blender::nodes::node_geo_duplicate_elements_cc::duplicate_instances(), blender::nodes::node_geo_duplicate_elements_cc::duplicate_layers(), blender::ed::sculpt_paint::dynamic_topology_update(), blender::nodes::node_geo_edge_paths_to_curves_cc::edge_paths_to_curves_convert(), blender::nodes::node_geo_edge_paths_to_selection_cc::edge_paths_to_selection(), blender::nodes::node_geo_scale_elements_cc::edge_to_vert_islands(), blender::ed::sculpt_paint::face_set::edit_fairing(), blender::ed::curves::end_points(), blender::draw::pbvh::DrawCacheImpl::ensure_lines_batches(), blender::draw::pbvh::DrawCacheImpl::ensure_tris_batches(), blender::draw::pbvh::ensure_vbos_allocated_bmesh(), blender::draw::pbvh::ensure_vbos_allocated_grids(), blender::draw::pbvh::ensure_vbos_allocated_mesh(), blender::bke::CurvesGeometry::evaluated_tangents(), blender::ed::curves::cyclic_toggle::exec(), blender::ed::sculpt_paint::DeleteOperationExecutor::execute(), blender::ed::sculpt_paint::ScaleCurvesEffect::execute(), blender::io::grease_pencil::SVGExporter::export_scene(), blender::geometry::extend_curves(), blender::draw::extract_edit_data(), blender::draw::extract_edituv_lines_mesh(), blender::draw::extract_edituv_tris_mesh(), blender::draw::extract_lines_bm(), blender::draw::extract_points_bm(), blender::ed::curves::pen_tool::extrude_curves(), blender::ed::greasepencil::extrude_grease_pencil_curves(), blender::nodes::node_geo_extrude_mesh_cc::extrude_individual_mesh_faces(), blender::ed::curves::extrude_knots(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_edges(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_face_regions(), blender::ed::sculpt_paint::face_set::face_hide_update(), blender::ed::sculpt_paint::face_set::face_sets_update(), blender::nodes::node_geo_scale_elements_cc::face_to_vert_islands(), blender::ed::sculpt_paint::fake_neighbor_search(), blender::geometry::fill_bezier_data(), blender::draw::pbvh::fill_face_sets_grids(), blender::ed::sculpt_paint::mask::fill_mask_bmesh(), blender::ed::sculpt_paint::mask::fill_mask_grids(), blender::ed::sculpt_paint::mask::fill_mask_mesh(), blender::draw::pbvh::fill_masks_grids(), blender::draw::pbvh::fill_normals_grids(), blender::bke::curves::fill_points(), blender::draw::pbvh::fill_positions_grids(), blender::ed::greasepencil::find_curve_intersections(), blender::ed::greasepencil::find_curve_segments(), blender::geometry::fit_poly_to_bezier_curves(), blender::bke::flip_corner_data(), blender::bke::pbvh::Tree::flush_bounds_to_parents(), blender::ed::sculpt_paint::hide::flush_face_changes_node(), blender::draw::pbvh::flush_vbo_data(), blender::ed::curves::foreach_selectable_point_range(), from_group_ids(), from_groups(), blender::geometry::gather_attribute_propagation_components_with_custom_depths(), blender::array_utils::gather_group_to_group(), blender::array_utils::gather_group_to_group(), blender::array_utils::gather_to_groups(), blender::ed::sculpt_paint::expand::geodesic_falloff_create(), blender::ed::sculpt_paint::face_set::gesture_apply_bmesh(), blender::ed::sculpt_paint::mask::gesture_apply_for_symmetry_pass(), blender::ed::sculpt_paint::project::gesture_apply_for_symmetry_pass(), blender::ed::sculpt_paint::face_set::gesture_apply_mesh(), blender::ed::greasepencil::get_boundary_bounds(), blender::modifier::greasepencil::get_drawing_infos_by_frame(), blender::modifier::greasepencil::get_drawing_infos_by_layer(), blender::modifier::greasepencil::get_drawings_for_write(), blender::nodes::node_geo_edges_to_face_groups_cc::FaceSetFromBoundariesInput::get_varray_for_context(), blender::nodes::node_geo_input_instance_bounds_cc::InstanceBoundsField::get_varray_for_context(), blender::ed::transform::gizmo_3d_foreach_selected(), blender::draw::grease_pencil_edit_batch_ensure(), blender::draw::grease_pencil_geom_batch_ensure(), blender::ed::sculpt_paint::greasepencil::grease_pencil_interpolate_sequence_exec(), blender::ed::greasepencil::grease_pencil_material_lock_unselected_exec(), blender::ed::greasepencil::grease_pencil_material_select_exec(), blender::ed::greasepencil::grease_pencil_reproject_exec(), blender::ed::greasepencil::grease_pencil_set_handle_type_exec(), blender::ed::greasepencil::grease_pencil_set_uniform_opacity_exec(), blender::ed::greasepencil::grease_pencil_snap_compute_centroid(), blender::ed::greasepencil::grease_pencil_snap_to_cursor_exec(), blender::ed::greasepencil::grease_pencil_snap_to_grid_exec(), blender::ed::greasepencil::grease_pencil_texture_gradient_exec(), blender::draw::grease_pencil_weight_batch_ensure(), blender::draw::grease_pencil_wire_batch_ensure(), blender::ed::sculpt_paint::hide::grid_hide_update(), blender::ed::sculpt_paint::hide::grow_shrink_visibility_grid(), blender::draw::index_buf_add_bezier_handle_lines(), blender::draw::index_buf_add_line_points(), blender::draw::index_buf_add_nurbs_lines(), blender::draw::index_buf_add_points(), blender::fn::multi_function::VariableState::indices_split(), blender::ed::sculpt_paint::greasepencil::GreasePencilStrokeOperationCommon::init_auto_masking(), init_curves_selection_status(), blender::ed::sculpt_paint::mask::init_mask_grids(), blender::ed::greasepencil::insert_selected_values(), blender::geometry::interpolate_curves(), blender::geometry::interpolate_curves_with_samples(), blender::ed::sculpt_paint::mask::invert_mask_bmesh(), blender::ed::sculpt_paint::mask::invert_mask_grids(), blender::ed::sculpt_paint::hide::invert_visibility_bmesh(), blender::ed::sculpt_paint::hide::invert_visibility_grids(), blender::ed::sculpt_paint::hide::invert_visibility_mesh(), blender::geometry::mapped_corner_selection_from_face(), blender::bke::mesh_calc_edges(), blender::ed::sculpt_paint::filter::mesh_filter_sharpen_init(), blender::bke::mesh_flip_faces(), blender::geometry::mesh_merge_by_distance_all(), blender::geometry::mix_arrays(), blender::geometry::mix_curve_type(), blender::geometry::mix_handle_type_arrays(), blender::modify_curves(), blender::modify_curves(), blender::modify_drawing(), blender::modify_fill_color(), blender::modify_fill_color(), blender::modify_fill_color(), blender::modify_geometry_set(), blender::modify_opacity(), blender::modify_softness(), blender::modify_stroke_by_index(), blender::modify_stroke_by_layer(), blender::modify_stroke_by_material(), blender::modify_stroke_color(), blender::modify_stroke_color(), blender::modify_stroke_color(), blender::modify_stroke_random(), blender::ed::curves::pen_tool::move_handles_in_curve(), blender::ed::sculpt_paint::nearest_vert_calc_bmesh(), blender::ed::sculpt_paint::nearest_vert_calc_grids(), blender::ed::sculpt_paint::nearest_vert_calc_mesh(), blender::nodes::node_geo_grease_pencil_to_curves_cc::node_geo_exec(), blender::bke::pbvh::nodes_to_face_selection_grids(), blender::ed::sculpt_paint::brushes::offset_positions(), blender::ed::sculpt_paint::greasepencil::PinchOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::PushOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::RandomizeOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::StrengthOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::ThicknessOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::TwistOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexAverageOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexBlurOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexPaintOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexReplaceOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexSmearOperation::on_stroke_extended(), blender::ed::sculpt_paint::hide::partialvis_update_bmesh_nodes(), blender::ed::curves::pen_tool::pen_find_closest_edge_point(), blender::ed::curves::pen_tool::pen_find_closest_handle(), blender::ed::curves::pen_tool::pen_find_closest_point(), blender::geometry::point_merge_by_distance(), blender::ed::sculpt_paint::undo::push_nodes(), blender::geometry::reassign_loose_edge_verts(), blender::geometry::remap_edges(), blender::reorder_cyclic_curve_points(), blender::ed::sculpt_paint::expand::reposition_pivot(), blender::geometry::resample_to_length(), blender::ed::curves::resize_curves(), blender::ed::sculpt_paint::expand::restore_color_data(), blender::ed::sculpt_paint::undo::restore_color_from_undo_step(), blender::ed::sculpt_paint::undo::restore_face_set_from_undo_step(), blender::ed::sculpt_paint::undo::restore_mask_from_undo_step(), blender::ed::sculpt_paint::undo::restore_position_from_undo_step(), blender::bke::curves::bezier::retrieve_all_positions(), blender::bke::reverse_curve_point_data(), blender::bke::CurvesGeometry::reverse_curves(), blender::bke::reverse_swap_curve_point_data(), blender::nodes::node_geo_rotate_instances_cc::rotate_instances(), blender::geometry::sample_curve_attribute(), blender::geometry::sample_curve_positions_and_handles(), blender::nodes::node_geo_scale_instances_cc::scale_instances(), blender::draw::sculpt_batches_get_ex(), blender::ed::sculpt_paint::cloth::sculpt_cloth_filter_modal(), blender::ed::sculpt_paint::color::sculpt_color_filter_apply(), blender::ed::sculpt_paint::dyntopo::sculpt_detail_flood_fill_exec(), SCULPT_do_paint_brush_image(), blender::ed::sculpt_paint::mask::sculpt_mask_filter_exec(), blender::ed::sculpt_paint::mask::sculpt_mask_init_exec(), blender::ed::sculpt_paint::sculpt_transform_all_vertices(), blender::ed::curves::select_adjacent(), blender::ed::curves::select_adjacent_mask(), blender::ed::curves::select_alternate(), blender::ed::sculpt_paint::select_grow::select_grow_invoke_per_curve(), blender::ed::curves::select_linked(), blender::geometry::separate_grease_pencil_layer_selection(), blender::ed::curves::set_attribute_invoke(), blender::ed::pointcloud::set_attribute_invoke(), blender::nodes::node_geo_set_position_cc::set_instances_position(), blender::bke::greasepencil::Drawing::set_texture_matrices(), blender::nodes::node_geo_input_shortest_edge_paths_cc::shortest_paths(), blender::ed::sculpt_paint::cloth::sim_activate_nodes(), blender::geometry::simplify_curve_attribute(), blender::geometry::smooth_curve_attribute(), blender::geometry::smooth_curve_positions(), blender::geometry::subdivide_attribute_catmull_rom(), blender::geometry::subdivide_attribute_linear(), blender::geometry::subdivide_curves(), blender::ed::greasepencil::subdivide_last_segement(), blender::index_mask::tests::TEST(), blender::ed::greasepencil::toggle_caps(), blender::ed::sculpt_paint::transform_radius_elastic(), blender::nodes::node_geo_translate_instances_cc::translate_instances(), blender::geometry::trim_bezier_curves(), blender::geometry::trim_catmull_rom_curves(), blender::ed::greasepencil::trim::trim_curve_segments(), blender::geometry::trim_evaluated_curves(), blender::geometry::trim_polygonal_curves(), blender::ed::curves::convert_to_particle_system::try_convert_single_object(), blender::ed::sculpt_paint::mask::try_remove_mask_mesh(), blender::bke::pbvh::Tree::update_bounds_bmesh(), blender::bke::pbvh::Tree::update_bounds_grids(), blender::bke::pbvh::Tree::update_bounds_mesh(), blender::bke::greasepencil::update_curve_plane_normal_cache(), blender::draw::pbvh::update_face_sets_bmesh(), blender::draw::pbvh::update_face_sets_mesh(), blender::ed::sculpt_paint::expand::update_for_vert(), blender::draw::pbvh::update_generic_attribute_bmesh(), blender::draw::pbvh::update_generic_attribute_mesh(), blender::bke::pbvh::update_mask_bmesh(), blender::bke::pbvh::update_mask_grids(), blender::bke::pbvh::update_mask_mesh(), blender::ed::sculpt_paint::mask::update_mask_mesh(), blender::draw::pbvh::update_masks_bmesh(), blender::draw::pbvh::update_masks_mesh(), blender::ed::sculpt_paint::hide::update_node_visibility_from_face_changes(), blender::draw::pbvh::update_normals_bmesh(), blender::bke::pbvh::update_normals_mesh(), blender::draw::pbvh::update_normals_mesh(), blender::draw::pbvh::update_positions_bmesh(), blender::draw::pbvh::update_positions_mesh(), blender::ed::sculpt_paint::hide::update_undo_state(), blender::geometry::update_unselected_edges(), blender::bke::pbvh::update_visibility_bmesh(), blender::bke::pbvh::update_visibility_faces(), blender::bke::pbvh::update_visibility_grids(), blender::ed::sculpt_paint::hide::vert_hide_update(), vpaint_do_draw(), blender::bke::curves::bezier::write_all_positions(), blender::io::grease_pencil::SVGExporter::write_animation_node(), blender::write_fill_transforms(), blender::ed::sculpt_paint::mask::write_mask_mesh(), blender::write_stroke_transforms(), and blender::write_weights_for_drawing().

◆ foreach_index() [2/2]

template<typename Fn>
void blender::index_mask::IndexMask::foreach_index ( GrainSize grain_size,
Fn && fn ) const
inline

◆ foreach_index_optimized() [1/2]

template<typename IndexT, typename Fn>
void blender::index_mask::IndexMask::foreach_index_optimized ( Fn && fn) const
inline

Same as foreach_index, but generates more code, increasing compile time and binary size. This is because separate loops are generated for segments that are ranges and those that are not. Only use this when very little processing is done for each index.

Definition at line 898 of file BLI_index_mask.hh.

References foreach_segment(), blender::index_mask::optimized_foreach_index(), blender::index_mask::optimized_foreach_index_with_pos(), and segment().

Referenced by blender::geometry::calc_new_edges(), blender::bke::curves::bezier::calculate_aligned_handles(), blender::array_utils::copy(), blender::bke::create_tree_from_tris(), blender::ed::greasepencil::curve_merge_by_distance(), blender::nodes::node_geo_duplicate_elements_cc::duplicate_faces(), blender::nodes::node_geo_scale_elements_cc::edge_to_vert_islands(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_edges(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_vertices(), blender::nodes::node_geo_scale_elements_cc::face_to_vert_islands(), blender::io::hydra::gather_corner_data(), blender::io::hydra::gather_face_data(), blender::offset_indices::gather_selected_offsets(), blender::ed::greasepencil::get_reordered_indices(), blender::bke::calc_edges::mask_first_distinct_edges(), blender::geometry::ngon_indices_of_tris(), blender::geometry::point_merge_by_distance(), blender::geometry::quad_indices_of_tris(), blender::nodes::node_geo_material_selection_cc::select_by_material(), blender::nodes::node_geo_sort_elements_cc::sorted_indices(), to_bools(), to_indices(), and blender::geometry::vert_selection_from_edge().

◆ foreach_index_optimized() [2/2]

template<typename IndexT, typename Fn>
void blender::index_mask::IndexMask::foreach_index_optimized ( GrainSize grain_size,
Fn && fn ) const
inline

◆ foreach_range()

template<typename Fn>
void blender::index_mask::IndexMask::foreach_range ( Fn && fn) const
inline

◆ foreach_segment() [1/2]

template<typename Fn>
void blender::index_mask::IndexMask::foreach_segment ( Fn && fn) const
inline

Calls the function once for every segment. This should be used instead of foreach_index if the algorithm can be implemented more efficiently by processing multiple indices at once.

Supported function signatures:

The segment_pos is the position in the mask where the segment starts: segment[0] == mask[segment_pos]

Definition at line 970 of file BLI_index_mask.hh.

References blender::index_mask::has_segment_and_start_parameter, segment(), and blender::index_mask::IndexMaskData::segments_num_.

Referenced by blender::index_mask::build_result_mask_segments(), blender::geometry::ngon::calc_corner_tris(), blender::geometry::quad::calc_corner_tris(), blender::geometry::curve_constraints::compute_segment_lengths(), blender::geometry::convert_curves_to_nurbs(), blender::nodes::node_geo_extrude_mesh_cc::copy_with_mixing(), blender::ed::transform::curves::curve_populate_trans_data_structs(), blender::ed::sculpt_paint::ShrinkCurvesEffect::execute(), blender::geometry::fillet_curves(), foreach_index(), foreach_index_optimized(), foreach_range(), foreach_segment_optimized(), from_batch_predicate(), blender::index_mask::detail::from_predicate_impl(), blender::ed::sculpt_paint::PuffOperationExecutor::puff(), blender::geometry::resample_to_evaluated(), blender::geometry::resample_to_uniform(), blender::geometry::curve_constraints::solve_length_and_collision_constraints(), blender::geometry::curve_constraints::solve_length_constraints(), transform_active_color_data(), and blender::bke::greasepencil::update_triangle_cache().

◆ foreach_segment() [2/2]

template<typename Fn>
void blender::index_mask::IndexMask::foreach_segment ( GrainSize grain_size,
Fn && fn ) const
inline

◆ foreach_segment_optimized() [1/2]

template<typename Fn>
void blender::index_mask::IndexMask::foreach_segment_optimized ( Fn && fn) const
inline

This is similar to foreach_segment but supports slightly different function signatures:

The segment input is either of type IndexMaskSegment or IndexRange, so the function has to support both cases. This also means that more code is generated by the compiler because the function is instantiated twice. Only use this when very little processing happens per index.

Definition at line 928 of file BLI_index_mask.hh.

References foreach_segment(), blender::index_mask::has_segment_and_start_parameter, blender::unique_sorted_indices::non_empty_is_range(), and segment().

Referenced by blender::length_parameterize::interpolate_to_masked(), set_bits(), and to_spans_and_ranges().

◆ foreach_segment_optimized() [2/2]

template<typename Fn>
void blender::index_mask::IndexMask::foreach_segment_optimized ( GrainSize grain_size,
Fn && fn ) const
inline

◆ foreach_segment_zipped()

void blender::index_mask::IndexMask::foreach_segment_zipped ( Span< IndexMask > masks,
FunctionRef< bool(Span< IndexMaskSegment > segments)> fn )
static

Iterate over the indices in multiple masks which have the same size. The given function is called for groups of segments where each segment has the same size and comes from a different input mask. For example, if the input masks are (both have size 18): A: [0, 15), {20, 24, 25} B: [0, 5), [10, 15], {20, 30, 40, 50, 60, 70, 80, 90} Then the function will be called multiple times, each time with two segments:

  1. [0, 5), [0, 5)
  2. [5, 10), [10, 15)
  3. [10, 15), {20, 30, 40, 50, 60}
  4. {20, 24, 25}, {70, 80, 90}

Definition at line 1078 of file index_mask.cc.

References blender::Span< T >::begin(), BLI_assert, blender::Span< T >::end(), blender::Span< T >::index_range(), IndexMask(), blender::Span< T >::is_empty(), blender::math::min(), segments_num(), size(), blender::Span< T >::size(), and blender::Span< T >::slice().

Referenced by operator==, blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), and blender::index_mask::tests::TEST().

◆ from_batch_predicate()

IndexMask blender::index_mask::IndexMask::from_batch_predicate ( const IndexMask & universe,
GrainSize grain_size,
IndexMaskMemory & memory,
FunctionRef< int64_t(const IndexMaskSegment &universe_segment, IndexRangesBuilder< int16_t > &builder)> batch_predicate )
static

This is a variant of from_predicate that is more efficient if the predicate for many indices can be evaluated at once.

Parameters
batch_predicateA function that finds indices in a certain segment that should become part of the mask. To efficiently handle ranges, this function uses IndexRangesBuilder. It returns an index offset that should be applied to each index in the builder.

Definition at line 553 of file index_mask.cc.

References data, blender::index_mask::ParallelSegmentsCollector::data_by_thread, foreach_segment(), from_segments(), IndexMask(), is_empty(), blender::threading::EnumerableThreadSpecific< T >::local(), blender::index_mask::ParallelSegmentsCollector::reduce(), segment(), blender::index_mask::segments_from_batch_predicate(), segments_num(), size(), and blender::GrainSize::value.

Referenced by from_bits(), and from_bools().

◆ from_bits() [1/2]

◆ from_bits() [2/2]

IndexMask blender::index_mask::IndexMask::from_bits ( const IndexMask & universe,
BitSpan bits,
IndexMaskMemory & memory )
static

◆ from_bools() [1/4]

◆ from_bools() [2/4]

◆ from_bools() [3/4]

IndexMask blender::index_mask::IndexMask::from_bools ( const VArray< bool > & bools,
IndexMaskMemory & memory )
static

◆ from_bools() [4/4]

IndexMask blender::index_mask::IndexMask::from_bools ( Span< bool > bools,
IndexMaskMemory & memory )
static

Construct a mask from the true indices.

Definition at line 584 of file index_mask.cc.

References from_bools(), blender::Span< T >::index_range(), and IndexMask().

Referenced by from_bools(), from_bools(), from_bools(), blender::index_mask::random_mask(), and blender::index_mask::tests::TEST().

◆ from_bools_inverse() [1/3]

◆ from_bools_inverse() [2/3]

IndexMask blender::index_mask::IndexMask::from_bools_inverse ( const IndexMask & universe,
Span< bool > bools,
IndexMaskMemory & memory )
static

Definition at line 628 of file index_mask.cc.

References from_bits(), IndexMask(), and blender::bits::invert().

◆ from_bools_inverse() [3/3]

IndexMask blender::index_mask::IndexMask::from_bools_inverse ( const VArray< bool > & bools,
IndexMaskMemory & memory )
static

◆ from_difference()

IndexMask blender::index_mask::IndexMask::from_difference ( const IndexMask & mask_a,
const IndexMask & mask_b,
IndexMaskMemory & memory )
static

Construct a mask from the difference of #mask_a and #mask_b.

Definition at line 700 of file index_mask.cc.

References blender::index_mask::evaluate_expression(), IndexMask(), and blender::index_mask::ExprBuilder::subtract().

Referenced by blender::index_mask::tests::TEST().

◆ from_every_nth()

IndexMask blender::index_mask::IndexMask::from_every_nth ( int64_t n,
int64_t indices_num,
const int64_t initial_offset,
IndexMaskMemory & memory )
static

Constructs a mask that contains every nth index the given number of times.

Definition at line 1069 of file index_mask.cc.

References BLI_assert, from_repeating(), and IndexMask().

Referenced by blender::index_mask::tests::TEST(), and blender::index_mask::tests::TEST().

◆ from_group_ids() [1/2]

◆ from_group_ids() [2/2]

Vector< IndexMask, 4 > blender::index_mask::IndexMask::from_group_ids ( const VArray< int > & group_ids,
IndexMaskMemory & memory,
VectorSet< int > & r_index_by_group_id )
static

Creates an index mask for every unique group id.

Definition at line 1216 of file index_mask.cc.

References from_group_ids(), IndexMask(), and blender::VArrayCommon< T >::size().

Referenced by from_group_ids().

◆ from_groups()

template<typename T, typename Fn>
void blender::index_mask::IndexMask::from_groups ( const IndexMask & universe,
IndexMaskMemory & memory,
Fn && get_group_index,
MutableSpan< IndexMask > r_masks )
static

◆ from_indices()

◆ from_initializers()

IndexMask blender::index_mask::IndexMask::from_initializers ( const Span< Initializer > initializers,
IndexMaskMemory & memory )
static

◆ from_intersection()

IndexMask blender::index_mask::IndexMask::from_intersection ( const IndexMask & mask_a,
const IndexMask & mask_b,
IndexMaskMemory & memory )
static

Construct a mask from the intersection of #mask_a and #mask_b.

Definition at line 709 of file index_mask.cc.

References blender::index_mask::evaluate_expression(), IndexMask(), and blender::index_mask::ExprBuilder::intersect().

Referenced by blender::index_mask::tests::TEST().

◆ from_predicate()

template<typename Fn>
IndexMask blender::index_mask::IndexMask::from_predicate ( const IndexMask & universe,
GrainSize grain_size,
IndexMaskMemory & memory,
Fn && predicate )
inlinestatic

◆ from_ranges()

template<typename T>
template IndexMask blender::index_mask::IndexMask::from_ranges ( OffsetIndices< T > offsets,
const IndexMask & mask,
IndexMaskMemory & memory )
static

Construct a mask from the ranges referenced by the offset indices.

Definition at line 670 of file index_mask.cc.

References from_segments(), blender::index_mask::index_range_to_mask_segments(), IndexMask(), and mask().

Referenced by blender::index_mask::tests::TEST().

◆ from_repeating()

◆ from_segments()

◆ from_union() [1/2]

IndexMask blender::index_mask::IndexMask::from_union ( const IndexMask & mask_a,
const IndexMask & mask_b,
IndexMaskMemory & memory )
static

◆ from_union() [2/2]

IndexMask blender::index_mask::IndexMask::from_union ( Span< IndexMask > masks,
IndexMaskMemory & memory )
static

◆ index_range()

Definition at line 709 of file BLI_index_mask.hh.

References blender::index_mask::IndexMaskData::indices_num_.

Referenced by blender::nodes::node_geo_instance_on_points_cc::add_instances_from_component(), blender::ed::sculpt_paint::average_mask_border_position(), blender::ed::sculpt_paint::average_unmasked_position(), blender::ed::sculpt_paint::calc_area_center(), blender::ed::sculpt_paint::calc_area_normal(), blender::ed::sculpt_paint::calc_area_normal_and_center(), blender::geometry::ngon::calc_corner_tris(), blender::geometry::calc_vert_ranges_per_old_vert(), calculate_average_weight(), blender::array_utils::contains(), blender::array_utils::copy(), blender::nodes::node_geo_duplicate_elements_cc::copy_stable_id_faces(), blender::ed::sculpt_paint::color::do_paint_brush(), blender::ed::sculpt_paint::fake_neighbor_search(), blender::ed::curves::find_closest_curve_to_screen_co(), blender::ed::curves::find_closest_point_to_screen_co(), blender::ed::pointcloud::find_closest_point_to_screen_co(), foreach_index(), foreach_index_optimized(), foreach_segment(), foreach_segment_optimized(), blender::ed::sculpt_paint::pose::grow_pose_factor(), blender::ed::sculpt_paint::nearest_vert_calc_bmesh(), blender::ed::sculpt_paint::nearest_vert_calc_grids(), blender::ed::sculpt_paint::nearest_vert_calc_mesh(), parallel_nodes_loop_with_mirror_check(), blender::ed::sculpt_paint::brushes::sample_surface(), blender::ed::sculpt_paint::select_grow::select_grow_invoke_per_curve(), blender::nodes::node_geo_set_curve_handles_cc::set_position_in_component(), and blender::ed::sculpt_paint::mask::try_remove_mask_mesh().

◆ index_to_iterator()

◆ is_empty()

Definition at line 704 of file BLI_index_mask.hh.

References blender::index_mask::IndexMaskData::indices_num_.

Referenced by blender::nodes::node_geo_instance_on_points_cc::add_instances_from_component(), blender::ed::greasepencil::apply_color_operation_for_mode(), blender::ed::greasepencil::apply_mask_as_segment_selection(), blender::ed::greasepencil::apply_mask_as_selection(), blender::ed::spreadsheet::GeometryDataSource::apply_selection_filter(), bounds(), blender::ed::sculpt_paint::greasepencil::brush_point_influence_mask(), blender::ed::spreadsheet::calc_mesh_selection_mask(), blender::nodes::node_geo_menu_switch_cc::MenuSwitchFn::call(), blender::nodes::node_geo_uv_pack_islands_cc::construct_uv_gvarray(), blender::nodes::node_geo_uv_unwrap_cc::construct_uv_gvarray(), blender::nodes::node_geo_instances_to_points_cc::convert_instances_to_points(), blender::ed::greasepencil::convert_to_bezier(), blender::ed::greasepencil::convert_to_catmull_rom(), blender::ed::greasepencil::convert_to_nurbs(), blender::ed::greasepencil::convert_to_poly(), blender::bke::copy_attributes_group_to_group(), blender::draw::create_edit_points_data(), blender::draw::create_edit_points_position(), blender::draw::create_edit_points_selection(), blender::ed::transform::curves::createTransCurvesVerts(), blender::ed::transform::greasepencil::createTransGreasePencilVerts(), blender::ed::sculpt_paint::cursor_geometry_info_update(), blender::ed::transform::curves::curve_populate_trans_data_structs(), blender::ed::curves::curves_extrude_exec(), blender::deform_drawing(), blender::deform_drawing(), blender::deform_drawing(), blender::geometry::delete_selected_instances(), blender::ed::sculpt_paint::do_brush_action(), blender::nodes::node_geo_split_to_instances_cc::do_common_split(), blender::ed::pointcloud::duplicate_exec(), blender::ed::sculpt_paint::dynamic_topology_update(), blender::modifier::greasepencil::ensure_no_bezier_curves(), blender::bke::CurvesGeometry::evaluated_tangents(), blender::ed::curves::clear_tilt::exec(), blender::ed::curves::curve_type_set::exec(), blender::ed::curves::cyclic_toggle::exec(), blender::ed::curves::subdivide::exec(), blender::ed::curves::switch_direction::exec(), blender::io::grease_pencil::SVGExporter::export_scene(), blender::geometry::extend_curves(), blender::draw::extract_lines_bm(), blender::draw::extract_lines_mesh(), blender::nodes::node_geo_extrude_mesh_cc::extrude_individual_mesh_faces(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_edges(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_face_regions(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_vertices(), blender::ed::sculpt_paint::face_set::face_hide_update(), blender::ed::sculpt_paint::fake_neighbor_search(), blender::geometry::fit_poly_to_bezier_curves(), blender::ed::sculpt_paint::hide::flush_face_changes_node(), from_batch_predicate(), blender::index_mask::detail::from_predicate_impl(), from_repeating(), blender::offset_indices::gather_selected_offsets(), blender::generate_curves(), blender::ed::sculpt_paint::face_set::gesture_apply_bmesh(), blender::nodes::node_geo_input_shortest_edge_paths_cc::ShortestEdgePathsCostFieldInput::get_varray_for_context(), blender::nodes::node_geo_input_shortest_edge_paths_cc::ShortestEdgePathsNextVertFieldInput::get_varray_for_context(), blender::ed::greasepencil::gpencil_stroke_subdivide_exec(), blender::draw::grease_pencil_cache_add_nurbs(), blender::ed::greasepencil::grease_pencil_caps_set_exec(), blender::ed::greasepencil::grease_pencil_convert_curve_type_exec(), blender::ed::greasepencil::grease_pencil_cyclical_set_exec(), blender::ed::greasepencil::grease_pencil_delete_exec(), blender::ed::greasepencil::grease_pencil_dissolve_exec(), blender::ed::greasepencil::grease_pencil_duplicate_exec(), blender::draw::grease_pencil_edit_batch_ensure(), blender::ed::greasepencil::grease_pencil_extrude_exec(), blender::ed::greasepencil::grease_pencil_material_lock_unselected_exec(), blender::ed::greasepencil::grease_pencil_material_select_exec(), blender::ed::greasepencil::grease_pencil_move_to_layer_exec(), blender::ed::greasepencil::grease_pencil_outline_exec(), blender::ed::greasepencil::grease_pencil_reproject_exec(), blender::ed::greasepencil::grease_pencil_reset_uvs_exec(), blender::ed::greasepencil::grease_pencil_separate_layer(), blender::ed::greasepencil::grease_pencil_separate_material(), blender::ed::greasepencil::grease_pencil_separate_selected(), blender::ed::greasepencil::grease_pencil_set_active_material_exec(), blender::ed::greasepencil::grease_pencil_set_corner_type_exec(), blender::ed::greasepencil::grease_pencil_set_curve_resolution_exec(), blender::ed::greasepencil::grease_pencil_set_curve_type_exec(), blender::ed::greasepencil::grease_pencil_set_start_point_exec(), blender::ed::greasepencil::grease_pencil_set_uniform_opacity_exec(), blender::ed::greasepencil::grease_pencil_set_uniform_thickness_exec(), blender::ed::greasepencil::grease_pencil_stroke_material_set_exec(), blender::ed::greasepencil::grease_pencil_stroke_merge_by_distance_exec(), blender::ed::greasepencil::grease_pencil_stroke_reorder_exec(), blender::ed::greasepencil::grease_pencil_stroke_simplify_exec(), blender::ed::greasepencil::grease_pencil_stroke_smooth_exec(), blender::ed::greasepencil::grease_pencil_stroke_split_exec(), blender::ed::greasepencil::grease_pencil_stroke_switch_direction_exec(), blender::ed::greasepencil::grease_pencil_texture_gradient_exec(), blender::ed::sculpt_paint::hide::grid_hide_update(), blender::ed::sculpt_paint::hide::grids_show_all(), blender::draw::index_buf_add_bezier_handle_lines(), blender::draw::index_buf_add_bezier_line_points(), blender::draw::index_buf_add_nurbs_lines(), blender::ed::sculpt_paint::greasepencil::GreasePencilStrokeOperationCommon::init_auto_masking(), blender::nodes::node_geo_proximity_cc::ProximityFunction::init_for_mesh(), blender::nodes::node_geo_proximity_cc::ProximityFunction::init_for_pointcloud(), blender::ed::sculpt_paint::face_set::init_op_exec(), blender::bke::calc_edges::mask_first_distinct_edges(), blender::geometry::mesh_copy_selection(), blender::bke::mesh_flip_faces(), blender::nodes::node_geo_merge_by_distance_cc::mesh_merge_by_distance_all(), blender::geometry::mesh_triangulate(), blender::ed::curves::pen_tool::move_handles_in_curve(), blender::ed::sculpt_paint::nearest_vert_calc_bmesh(), blender::ed::sculpt_paint::nearest_vert_calc_grids(), blender::ed::sculpt_paint::nearest_vert_calc_mesh(), blender::nodes::node_geo_curve_spline_type_cc::node_geo_exec(), blender::nodes::node_geo_flip_faces_cc::node_geo_exec(), blender::nodes::node_geo_mesh_to_curve_cc::node_geo_exec(), blender::nodes::node_geo_set_mesh_normal_cc::node_geo_exec(), blender::nodes::node_geo_triangulate_cc::node_geo_exec(), blender::ed::sculpt_paint::greasepencil::VertexAverageOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexBlurOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexPaintOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexReplaceOperation::on_stroke_extended(), blender::ed::sculpt_paint::greasepencil::VertexSmearOperation::on_stroke_extended(), blender::nodes::node_geo_merge_by_distance_cc::pointcloud_merge_by_distance(), blender::ed::greasepencil::polyline_fit_curve(), blender::geometry::propagate_instances_to_keep(), blender::bke::CurvesGeometry::remove_curves(), blender::bke::CurvesGeometry::remove_points(), blender::ed::sculpt_paint::remove_points_and_split_from_drawings(), blender::ed::curves::resize_curves(), blender::ed::greasepencil::retrieve_editable_fill_strokes(), blender::nodes::node_geo_curve_reverse_cc::reverse_curve(), blender::ed::sculpt_paint::mask::sculpt_mask_init_exec(), blender::ed::greasepencil::select_all_exec(), blender::ed::greasepencil::select_linked_exec(), blender::ed::greasepencil::select_random_exec(), blender::ed::greasepencil::select_similar_by_layer(), blender::ed::greasepencil::selection_update(), blender::geometry::separate_curves_selection(), blender::geometry::separate_grease_pencil_layer_selection(), blender::geometry::separate_pointcloud_selection(), blender::ed::curves::set_attribute_exec(), blender::ed::pointcloud::set_attribute_exec(), blender::simplify_drawing(), blender::ed::sculpt_paint::greasepencil::simplify_stroke(), blender::geometry::smooth_curve_attribute(), blender::geometry::smooth_curve_positions(), blender::ed::sculpt_paint::smooth_fill_strokes(), blender::ed::curves::split::split_exec(), blender::bke::greasepencil::Drawing::tag_positions_changed(), blender::bke::greasepencil::Drawing::tag_topology_changed(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::geometry::trim_curves(), blender::nodes::node_geo_curve_trim_cc::trim_curves(), blender::bke::pbvh::Tree::update_bounds_bmesh(), blender::bke::pbvh::Tree::update_bounds_grids(), blender::bke::pbvh::Tree::update_bounds_mesh(), blender::ed::transform::curves::update_handle_types_for_transform(), blender::ed::transform::curves::update_vector_handle_types(), blender::bke::pbvh::Tree::update_visibility(), blender::ed::greasepencil::weight_sample_invoke(), blender::bke::curves::bezier::write_all_positions(), and blender::write_weights_for_drawing().

◆ iterator_to_index()

◆ last()

◆ min_array_size()

Returns
Minimum number of elements an array has to have so that it can be indexed by every index stored in the mask.

Definition at line 738 of file BLI_index_mask.hh.

References blender::index_mask::IndexMaskData::indices_num_, and last().

Referenced by blender::ed::sculpt_paint::mask::apply_new_mask_bmesh(), blender::ed::sculpt_paint::mask::apply_new_mask_grids(), blender::ed::sculpt_paint::mask::apply_new_mask_mesh(), blender::ed::sculpt_paint::greasepencil::brush_point_influence_mask(), blender::array_utils::copy(), blender::nodes::node_geo_scale_elements_cc::edge_to_vert_islands(), blender::fn::multi_function::VariableState::ensure_is_mutable(), blender::ed::sculpt_paint::face_set::face_hide_update(), blender::nodes::node_geo_scale_elements_cc::face_to_vert_islands(), blender::ed::sculpt_paint::mask::fill_mask_bmesh(), blender::ed::sculpt_paint::mask::fill_mask_grids(), blender::ed::sculpt_paint::mask::fill_mask_mesh(), blender::ed::sculpt_paint::hide::flush_face_changes_node(), from_bits(), from_bools(), from_group_ids(), blender::ed::sculpt_paint::face_set::gesture_apply_bmesh(), blender::ed::sculpt_paint::mask::gesture_apply_for_symmetry_pass(), blender::ed::sculpt_paint::hide::grid_hide_update(), blender::ed::sculpt_paint::undo::restore_face_set_from_undo_step(), blender::ed::sculpt_paint::undo::restore_mask_from_undo_step(), blender::ed::sculpt_paint::mask::sculpt_mask_filter_exec(), blender::nodes::node_geo_material_selection_cc::select_by_material(), blender::bke::pbvh::Tree::tag_positions_changed(), blender::bke::pbvh::Tree::tag_visibility_changed(), blender::draw::pbvh::DrawCacheImpl::tag_visibility_changed(), blender::ed::sculpt_paint::expand::update_for_vert(), blender::ed::sculpt_paint::mask::update_mask_mesh(), and blender::ed::sculpt_paint::hide::update_node_visibility_from_face_changes().

◆ operator[]() [1/2]

int64_t blender::index_mask::IndexMask::operator[] ( const RawMaskIterator & it) const
inline

◆ operator[]() [2/2]

int64_t blender::index_mask::IndexMask::operator[] ( int64_t i) const
inline

Get the index at the given position. Prefer foreach_* methods for better performance. This takes O(log n) time.

Definition at line 771 of file BLI_index_mask.hh.

References i, and index_to_iterator().

◆ segment()

◆ segments_num()

◆ set_bits()

◆ shift()

◆ size()

Definition at line 699 of file BLI_index_mask.hh.

References blender::index_mask::IndexMaskData::indices_num_.

Referenced by blender::nodes::node_geo_duplicate_elements_cc::accumulate_counts_to_offsets(), blender::fn::multi_function::VariableState::add_as_output(), blender::ed::transform::curves::append_positions_to_custom_data(), blender::nodes::node_geo_set_material_cc::assign_material_to_id_geometry(), blender::ed::sculpt_paint::greasepencil::brush_point_influence_mask(), blender::draw::build_tris_from_subdiv_quad_selection(), blender::nodes::node_geo_extrude_mesh_cc::build_vert_to_edge_map(), blender::bke::bvhtree_from_mesh_edges_init(), blender::bke::bvhtree_from_mesh_tris_init(), blender::bke::bvhtree_from_mesh_verts_init(), blender::bke::bvhtree_from_pointcloud_get(), blender::geometry::calc_all_corner_groups(), blender::geometry::ngon::calc_corner_tris(), blender::geometry::quad::calc_corner_tris(), blender::ed::spreadsheet::calc_mesh_selection_mask(), blender::geometry::calc_vert_ranges_per_old_vert(), blender::nodes::node_geo_menu_switch_cc::MenuSwitchFn::call(), blender::nodes::node_geo_instances_to_points_cc::convert_instances_to_points(), blender::bke::copy_attributes_group_to_group(), blender::bke::copy_curve_selection_custom_knots(), blender::io::hydra::copy_submesh(), blender::nodes::node_geo_extrude_mesh_cc::copy_with_mixing(), blender::geometry::create_curves_for_faces(), blender::nodes::node_geo_duplicate_elements_cc::create_duplicate_index_attribute(), blender::ed::sculpt_paint::create_node_vert_offsets(), blender::ed::sculpt_paint::create_node_vert_offsets(), blender::ed::sculpt_paint::create_node_vert_offsets_bmesh(), blender::geometry::create_point_to_vert_map(), blender::bke::create_tree_from_edges(), blender::bke::create_tree_from_tris(), blender::bke::create_tree_from_verts(), blender::ed::transform::curves::createTransCurvesVerts(), blender::ed::transform::greasepencil::createTransGreasePencilVerts(), blender::ed::transform::pointcloud::createTransPointCloudVerts(), blender::nodes::node_geo_curves_to_grease_pencil_cc::curve_instances_to_grease_pencil_layers(), blender::ed::greasepencil::curve_merge_by_distance(), blender::ed::transform::curves::curve_populate_trans_data_structs(), blender::bke::curves::curve_to_point_selection(), blender::bke::curves_copy_curve_selection(), blender::bke::curves_copy_point_selection(), blender::fn::multi_function::VariableState::destruct(), blender::draw::DRW_curves_batch_cache_create_requested(), blender::ed::pointcloud::duplicate_exec(), blender::nodes::node_geo_duplicate_elements_cc::duplicate_faces(), blender::nodes::node_geo_scale_elements_cc::edge_to_vert_islands(), blender::fn::multi_function::evaluate_as_one(), blender::ed::curves::clear_tilt::exec(), blender::ed::sculpt_paint::DensitySubtractOperationExecutor::execute(), blender::io::grease_pencil::SVGExporter::export_scene(), blender::draw::extract_edituv_face_dots_bm(), blender::draw::extract_edituv_face_dots_mesh(), blender::draw::extract_edituv_tris_bm(), blender::draw::extract_edituv_tris_mesh(), blender::draw::extract_lines_bm(), blender::draw::extract_lines_mesh(), blender::draw::extract_points_bm(), blender::draw::extract_points_mesh(), blender::draw::extract_points_subdiv_bm(), blender::draw::extract_points_subdiv_mesh(), blender::ed::curves::extrude_curves(), blender::nodes::node_geo_extrude_mesh_cc::extrude_individual_mesh_faces(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_edges(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_vertices(), blender::nodes::node_geo_scale_elements_cc::face_to_vert_islands(), blender::bke::CurvesGeometry::fill_curve_types(), blender::ed::sculpt_paint::greasepencil::find_curve_mapping_from_index(), blender::ed::greasepencil::find_curve_segments(), blender::geometry::fit_poly_to_bezier_curves(), blender::bke::pbvh::Tree::flush_bounds_to_parents(), foreach_segment_zipped(), from_batch_predicate(), blender::index_mask::detail::from_predicate_impl(), from_repeating(), blender::bke::gather_attributes(), blender::bke::gather_attributes_group_to_group(), blender::geometry::gather_attributes_to_propagate(), blender::bke::curves::nurbs::gather_custom_knots(), blender::nodes::node_geo_scale_elements_cc::gather_edge_islands(), blender::nodes::node_geo_scale_elements_cc::gather_face_islands(), blender::nodes::node_geo_mesh_to_points_cc::geometry_set_mesh_to_points(), blender::nodes::node_geo_points_to_vertices_cc::geometry_set_points_to_vertices(), blender::ed::greasepencil::get_reordered_indices(), blender::ed::transform::gizmo_3d_foreach_selected(), blender::draw::grease_pencil_cache_add_nurbs(), blender::draw::grease_pencil_edit_batch_ensure(), blender::draw::grease_pencil_geom_batch_ensure(), blender::ed::greasepencil::grease_pencil_reset_uvs_exec(), blender::ed::greasepencil::grease_pencil_snap_compute_centroid(), blender::ed::greasepencil::grease_pencil_stroke_reorder_exec(), blender::ed::greasepencil::grease_pencil_stroke_simplify_exec(), blender::ed::greasepencil::grease_pencil_texture_gradient_exec(), blender::draw::grease_pencil_weight_batch_ensure(), blender::draw::index_buf_add_bezier_handle_lines(), blender::draw::index_buf_add_bezier_line_points(), IndexMask(), blender::geometry::interpolate_curves_with_samples(), blender::length_parameterize::interpolate_to_masked(), blender::fn::multi_function::VariableState::is_fully_initialized(), blender::bke::mesh_calc_edges(), blender::geometry::mesh_copy_selection(), blender::geometry::mesh_copy_selection_keep_edges(), blender::geometry::mesh_copy_selection_keep_verts(), blender::geometry::mesh_edges_to_curves_convert(), blender::geometry::mesh_merge_by_distance_all(), blender::geometry::mesh_triangulate(), blender::modify_drawing(), blender::modify_drawing(), blender::geometry::ngon_indices_of_tris(), blender::nodes::node_geo_grease_pencil_to_curves_cc::node_geo_exec(), operator==, blender::geometry::point_merge_by_distance(), blender::ed::greasepencil::polyline_fit_curve(), blender::geometry::quad_indices_of_tris(), blender::geometry::remap_verts(), blender::bke::Instances::remove(), blender::bke::CurvesGeometry::remove_curves(), blender::bke::CurvesGeometry::remove_points(), blender::ed::curves::resize_curves(), blender::draw::sculpt_batches_get_ex(), blender::ed::sculpt_paint::select_grow::select_grow_invoke_per_curve(), blender::geometry::separate_curves_selection(), blender::geometry::separate_grease_pencil_layer_selection(), blender::geometry::separate_pointcloud_selection(), blender::simplify_drawing(), slice(), slice(), slice_and_shift(), slice_content(), blender::geometry::split_edges(), blender::ed::spreadsheet::spreadsheet_main_region_draw(), blender::ed::spreadsheet::SpreadsheetLayoutDrawer::SpreadsheetLayoutDrawer(), blender::bke::greasepencil::Drawing::tag_positions_changed(), blender::bke::greasepencil::Drawing::tag_topology_changed(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), blender::index_mask::tests::TEST(), to_indices(), blender::geometry::trim_curves(), and blender::ed::curves::convert_to_particle_system::try_convert_single_object().

◆ slice() [1/3]

◆ slice() [2/3]

IndexMask blender::index_mask::IndexMask::slice ( int64_t start,
int64_t size ) const

◆ slice() [3/3]

◆ slice_and_shift() [1/2]

IndexMask blender::index_mask::IndexMask::slice_and_shift ( IndexRange range,
int64_t offset,
IndexMaskMemory & memory ) const

Same slice but can also add an offset to every index in the mask. Takes O(log n + range.size()) time but with a very small constant factor.

Definition at line 182 of file index_mask.cc.

References IndexMask(), blender::IndexRange::size(), slice_and_shift(), and blender::IndexRange::start().

Referenced by slice_and_shift().

◆ slice_and_shift() [2/2]

IndexMask blender::index_mask::IndexMask::slice_and_shift ( int64_t start,
int64_t size,
int64_t offset,
IndexMaskMemory & memory ) const

Definition at line 189 of file index_mask.cc.

References IndexMask(), shift(), size(), slice(), and to_range().

◆ slice_content() [1/2]

◆ slice_content() [2/2]

IndexMask blender::index_mask::IndexMask::slice_content ( int64_t start,
int64_t size ) const

◆ to_bits()

void blender::index_mask::IndexMask::to_bits ( MutableBitSpan r_bits,
int64_t offset = 0 ) const

Set the bits at indices in the mask to 1 and all other bits to 0.

Definition at line 776 of file index_mask.cc.

References BLI_assert, blender::bits::MutableBitSpan::reset_all(), set_bits(), and blender::bits::MutableBitSpan::size().

Referenced by blender::geometry::split_edges().

◆ to_bools()

◆ to_indices()

◆ to_range()

std::optional< IndexRange > blender::index_mask::IndexMask::to_range ( ) const
inline

Try to convert the entire index mask into a range. This only works if there are no gaps between any indices.

Definition at line 1077 of file BLI_index_mask.hh.

References first(), blender::index_mask::IndexMaskData::indices_num_, and last().

Referenced by from_repeating(), operator==, blender::ed::curves::resize_curves(), shift(), slice_and_shift(), and blender::geometry::smooth_curve_attribute().

◆ to_ranges()

Vector< IndexRange > blender::index_mask::IndexMask::to_ranges ( ) const
Returns
All index ranges in the mask. In the worst case this is a separate range for every index.

Definition at line 791 of file index_mask.cc.

References blender::Vector< T, InlineBufferCapacity, Allocator >::append(), and foreach_range().

Referenced by to_ranges_invert().

◆ to_ranges_invert()

Vector< IndexRange > blender::index_mask::IndexMask::to_ranges_invert ( IndexRange universe) const
Returns
All index ranges in the universe that are not in the mask. In the worst case this is a separate range for every index.

Definition at line 798 of file index_mask.cc.

References complement(), and to_ranges().

◆ to_spans_and_ranges()

Returns
All segments in sorted vector. Segments that encode a range are already converted to an IndexRange.

Definition at line 1091 of file BLI_index_mask.hh.

References blender::Vector< T, InlineBufferCapacity, Allocator >::append(), foreach_segment_optimized(), N, and segment().

◆ operator!=

bool operator!= ( const IndexMask & a,
const IndexMask & b )
friend

Definition at line 1098 of file BLI_index_mask.hh.

References b, and IndexMask().

◆ operator==

bool operator== ( const IndexMask & a,
const IndexMask & b )
friend

The documentation for this class was generated from the following files: