Blender V4.3
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
7#include "BKE_mesh.hh"
8
10
11namespace blender::geometry {
12
14 const IndexMask &edge_mask,
15 const int verts_num,
16 IndexMaskMemory &memory)
17{
18 Array<bool> array(verts_num, false);
19 edge_mask.foreach_index_optimized<int>(GrainSize(4096), [&](const int i) {
20 array[edges[i][0]] = true;
21 array[edges[i][1]] = true;
22 });
23 return IndexMask::from_bools(array, memory);
24}
25
27 const IndexMask &face_mask,
28 const Span<int> corner_verts_or_edges,
29 const int verts_or_edges_num,
30 IndexMaskMemory &memory)
31{
32 Array<bool> array(verts_or_edges_num, false);
33 face_mask.foreach_index(GrainSize(512), [&](const int64_t i) {
34 array.as_mutable_span().fill_indices(corner_verts_or_edges.slice(faces[i]), true);
35 });
36 return IndexMask::from_bools(array, memory);
37}
38
40 const IndexMask &face_mask,
41 const Span<int> corner_verts,
42 const int verts_num,
43 IndexMaskMemory &memory)
44{
45 return mapped_corner_selection_from_face(faces, face_mask, corner_verts, verts_num, memory);
46}
47
49 const IndexMask &face_mask,
50 const Span<int> corner_edges,
51 const int edges_num,
52 IndexMaskMemory &memory)
53{
54 return mapped_corner_selection_from_face(faces, face_mask, corner_edges, edges_num, memory);
55}
56
58 const Span<bool> vert_selection,
59 IndexMaskMemory &memory)
60{
62 edges.index_range(), GrainSize(1024), memory, [&](const int64_t i) {
63 const int2 edge = edges[i];
64 return vert_selection[edge[0]] && vert_selection[edge[1]];
65 });
66}
67
69 const Span<int> corner_verts_or_edges,
70 const Span<bool> vert_or_edge_selection,
71 IndexMaskMemory &memory)
72{
74 faces.index_range(), GrainSize(1024), memory, [&](const int64_t i) {
75 const Span<int> indices = corner_verts_or_edges.slice(faces[i]);
76 return std::all_of(indices.begin(), indices.end(), [&](const int i) {
77 return vert_or_edge_selection[i];
78 });
79 });
80}
81
83 const Span<int> corner_verts,
84 const Span<bool> vert_selection,
85 IndexMaskMemory &memory)
86{
87 return face_selection_from_mapped_corner(faces, corner_verts, vert_selection, memory);
88}
89
91 const Span<int> corner_edges,
92 const Span<bool> edge_mask,
93 IndexMaskMemory &memory)
94{
95 return face_selection_from_mapped_corner(faces, corner_edges, edge_mask, memory);
96}
97
98} // namespace blender::geometry
constexpr Span slice(int64_t start, int64_t size) const
Definition BLI_span.hh:138
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
void foreach_index_optimized(Fn &&fn) const
static IndexMask from_bools(Span< bool > bools, IndexMaskMemory &memory)
void foreach_index(Fn &&fn) const
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)
__int64 int64_t
Definition stdint.h:89