Blender V5.0
mesh_selection.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "BLI_index_mask.hh"
6
8
9namespace blender::geometry {
10
12 const IndexMask &edge_mask,
13 const int verts_num,
14 IndexMaskMemory &memory)
15{
16 Array<bool> array(verts_num, false);
17 edge_mask.foreach_index_optimized<int>(GrainSize(4096), [&](const int i) {
18 array[edges[i][0]] = true;
19 array[edges[i][1]] = true;
20 });
21 return IndexMask::from_bools(array, memory);
22}
23
25 const IndexMask &face_mask,
26 const Span<int> corner_verts_or_edges,
27 const int verts_or_edges_num,
28 IndexMaskMemory &memory)
29{
30 Array<bool> array(verts_or_edges_num, false);
31 face_mask.foreach_index(GrainSize(512), [&](const int64_t i) {
32 array.as_mutable_span().fill_indices(corner_verts_or_edges.slice(faces[i]), true);
33 });
34 return IndexMask::from_bools(array, memory);
35}
36
38 const IndexMask &face_mask,
39 const Span<int> corner_verts,
40 const int verts_num,
41 IndexMaskMemory &memory)
42{
43 return mapped_corner_selection_from_face(faces, face_mask, corner_verts, verts_num, memory);
44}
45
47 const IndexMask &face_mask,
48 const Span<int> corner_edges,
49 const int edges_num,
50 IndexMaskMemory &memory)
51{
52 return mapped_corner_selection_from_face(faces, face_mask, corner_edges, edges_num, memory);
53}
54
56 const Span<bool> vert_selection,
57 IndexMaskMemory &memory)
58{
60 edges.index_range(), GrainSize(1024), memory, [&](const int64_t i) {
61 const int2 edge = edges[i];
62 return vert_selection[edge[0]] && vert_selection[edge[1]];
63 });
64}
65
67 const Span<int> corner_verts_or_edges,
68 const Span<bool> vert_or_edge_selection,
69 IndexMaskMemory &memory)
70{
72 faces.index_range(), GrainSize(1024), memory, [&](const int64_t i) {
73 const Span<int> indices = corner_verts_or_edges.slice(faces[i]);
74 return std::all_of(indices.begin(), indices.end(), [&](const int i) {
75 return vert_or_edge_selection[i];
76 });
77 });
78}
79
81 const Span<int> corner_verts,
82 const Span<bool> vert_selection,
83 IndexMaskMemory &memory)
84{
85 return face_selection_from_mapped_corner(faces, corner_verts, vert_selection, memory);
86}
87
89 const Span<int> corner_edges,
90 const Span<bool> edge_mask,
91 IndexMaskMemory &memory)
92{
93 return face_selection_from_mapped_corner(faces, corner_edges, edge_mask, memory);
94}
95
96} // namespace blender::geometry
long long int int64_t
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_bools(Span< bool > bools, IndexMaskMemory &memory)
constexpr Span slice(int64_t start, int64_t size) const
Definition BLI_span.hh:137
constexpr IndexRange index_range() const
Definition BLI_span.hh:401
void foreach_index_optimized(Fn &&fn) const
void foreach_index(Fn &&fn) const
static ushort indices[]
static char faces[256]
static IndexMask mapped_corner_selection_from_face(const OffsetIndices< int > faces, const IndexMask &face_mask, const Span< int > corner_verts_or_edges, const int verts_or_edges_num, IndexMaskMemory &memory)
IndexMask edge_selection_from_face(OffsetIndices< int > faces, const IndexMask &face_mask, Span< int > corner_edges, int edges_num, IndexMaskMemory &memory)
IndexMask edge_selection_from_vert(Span< int2 > edges, Span< bool > vert_selection, IndexMaskMemory &memory)
IndexMask face_selection_from_edge(OffsetIndices< int > faces, Span< int > corner_edges, Span< bool > edge_mask, IndexMaskMemory &memory)
static IndexMask face_selection_from_mapped_corner(const OffsetIndices< int > faces, const Span< int > corner_verts_or_edges, const Span< bool > vert_or_edge_selection, IndexMaskMemory &memory)
IndexMask vert_selection_from_face(OffsetIndices< int > faces, const IndexMask &face_mask, Span< int > corner_verts, int verts_num, IndexMaskMemory &memory)
IndexMask face_selection_from_vert(OffsetIndices< int > faces, Span< int > corner_verts, Span< bool > vert_selection, IndexMaskMemory &memory)
IndexMask vert_selection_from_edge(Span< int2 > edges, const IndexMask &edge_mask, int verts_num, IndexMaskMemory &memory)
VecBase< int32_t, 2 > int2
i
Definition text_draw.cc:230