45 for (const int corner : range) {
46 process_vert_fn(corner, corner_verts[corner]);
50 const int loose_edges_start = mr.corners_num;
52 const Span<int> loose_edges = mr.loose_edges;
54 for (const int i : range) {
55 const int2 edge = edges[loose_edges[i]];
56 process_vert_fn(loose_edges_start + i * 2 + 0, edge[0]);
57 process_vert_fn(loose_edges_start + i * 2 + 1, edge[1]);
61 const int loose_verts_start = mr.corners_num + loose_edges.
size() * 2;
62 const Span<int> loose_verts = mr.loose_verts;
63 threading::parallel_for(loose_verts.index_range(), 2048, [&](
const IndexRange range) {
64 for (const int i : range) {
65 process_vert_fn(loose_verts_start + i, loose_verts[i]);
81 if (visible_verts.size() == mr.verts_num) {
82 Array<bool> used(mr.verts_num, false);
83 process_ibo_verts_mesh(mr, [&](const int ibo_index, const int vert) {
86 data[vert] = ibo_index;
92 Array<int> map(mr.verts_num, -1);
93 index_mask::build_reverse_map(visible_verts, map.as_mutable_span());
94 process_ibo_verts_mesh(mr, [&](const int ibo_index, const int vert) {
95 const int index = map[vert];
98 data[index] = ibo_index;
113 for (const int i : range) {
114 BMVert &vert = *BM_vert_at_index(&bm, i);
115 if (const BMLoop *loop = BM_vert_find_first_loop(&vert)) {
116 process_vert_fn(BM_elem_index_get(loop), i);
121 const int loose_edges_start = mr.corners_num;
122 const Span<int> loose_edges = mr.loose_edges;
124 for (const int i : range) {
125 const BMEdge &edge = *BM_edge_at_index(&bm, loose_edges[i]);
126 process_vert_fn(loose_edges_start + i * 2 + 0, BM_elem_index_get(edge.v1));
127 process_vert_fn(loose_edges_start + i * 2 + 1, BM_elem_index_get(edge.v2));
131 const int loose_verts_start = mr.corners_num + loose_edges.
size() * 2;
132 const Span<int> loose_verts = mr.loose_verts;
133 threading::parallel_for(loose_verts.index_range(), 4096, [&](
const IndexRange range) {
134 for (const int i : range) {
135 process_vert_fn(loose_verts_start + i, loose_verts[i]);
145 const IndexMask visible_verts = IndexMask::from_predicate(
168 data[vert] = ibo_index;
176 index_mask::build_reverse_map(visible_verts, map.as_mutable_span());
178 if (map[vert] != -1) {
179 data[map[vert]] = ibo_index;
206 visible = IndexMask::from_predicate(
207 visible,
GrainSize(4096), memory, [&](
const int i) {
return !hide_vert[map[i]]; });
211 visible = IndexMask::from_predicate(visible,
GrainSize(4096), memory, [&](
const int i) {
226 const int loose_edge_verts_num = verts_per_edge * loose_edges.
size();
232 IndexMask visible_corners = IndexMask::from_predicate(
234 return corner_orig_verts[i] != -1;
237 mr, visible_corners, corner_orig_verts, memory);
242 const int max_index = subdiv_cache.
num_subdiv_loops + loose_edge_verts_num + loose_verts.
size();
246 visible_corners.
size() + loose_edges.
size() * 2 + visible_loose.
size(),
252 const auto show_vert = [&](
const int vert) {
253 if (!hide_vert.
is_empty() && hide_vert[vert]) {
265 const int2 edge = coarse_edges[loose_edges[i]];
266 const IndexRange edge_range(loose_geom_start + i * verts_per_edge, verts_per_edge);
267 loose_edge_data[i * 2 + 0] = show_vert(edge[0]) ? edge_range.
first() : gpu::RESTART_INDEX;
268 loose_edge_data[i * 2 + 1] = show_vert(edge[1]) ? edge_range.
last() : gpu::RESTART_INDEX;
272 const int loose_verts_start = loose_geom_start + loose_edge_verts_num;
286 const int loose_edge_verts_num = verts_per_edge * loose_edges.
size();
290 const auto show_vert_bm = [&](
const int vert_index) {
297 const IndexMask visible_corners = IndexMask::from_predicate(
299 return corner_orig_verts[i] != -1 && show_vert_bm(corner_orig_verts[i]);
302 const IndexMask visible_loose = IndexMask::from_predicate(
304 return show_vert_bm(vert);
307 const int max_index = subdiv_cache.
num_subdiv_loops + loose_edge_verts_num + loose_verts.
size();
311 visible_corners.
size() + loose_edges.
size() * 2 + visible_loose.size(),
320 const int2 edge = coarse_edges[loose_edges[i]];
321 const IndexRange edge_range(loose_geom_start + i * verts_per_edge, verts_per_edge);
322 loose_edge_data[i * 2 + 0] = show_vert_bm(edge[0]) ? edge_range.
first() : gpu::RESTART_INDEX;
323 loose_edge_data[i * 2 + 1] = show_vert_bm(edge[1]) ? edge_range.
last() : gpu::RESTART_INDEX;
327 const int loose_verts_start = loose_geom_start + loose_edge_verts_num;
328 visible_loose.shift(loose_verts_start, memory).to_indices<
int32_t>(loose_vert_data);
void GPU_indexbuf_build_in_place_ex(GPUIndexBufBuilder *builder, uint index_min, uint index_max, bool uses_restart_indices, blender::gpu::IndexBuf *elem)
blender::MutableSpan< uint32_t > GPU_indexbuf_get_data(GPUIndexBufBuilder *)
void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint vertex_len)
#define BM_elem_index_get(ele)
#define BM_elem_flag_test_bool(ele, hflag)
ATTR_WARN_UNUSED_RESULT BMesh * bm
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
BMLoop * BM_vert_find_first_loop(BMVert *v)
constexpr int64_t first() const
constexpr int64_t last(const int64_t n=0) const
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
constexpr MutableSpan< NewT > cast() const
constexpr MutableSpan take_back(const int64_t n) const
constexpr int64_t size_in_bytes() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_bools_inverse(const IndexMask &universe, Span< bool > bools, IndexMaskMemory &memory)
void to_indices(MutableSpan< T > r_indices) const
IndexMask shift(const int64_t offset, IndexMaskMemory &memory) const
void foreach_index(Fn &&fn) const
ccl_device_inline float4 mask(const int4 mask, const float4 a)
BLI_INLINE BMVert * bm_original_vert_get(const MeshRenderData &mr, int idx)
static IndexMask calc_vert_visibility_mapped_mesh(const MeshRenderData &mr, const IndexMask &mask, const Span< int > map, IndexMaskMemory &memory)
int subdiv_verts_per_coarse_edge(const DRWSubdivCache &cache)
static void process_ibo_verts_mesh(const MeshRenderData &mr, const Fn &process_vert_fn)
void extract_points_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &points)
static void process_ibo_verts_bm(const MeshRenderData &mr, const Fn &process_vert_fn)
static void extract_points_subdiv_mesh(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &points)
static IndexMask calc_vert_visibility_mesh(const MeshRenderData &mr, const IndexMask &mask, IndexMaskMemory &memory)
void extract_points(const MeshRenderData &mr, gpu::IndexBuf &points)
static void extract_points_bm(const MeshRenderData &mr, gpu::IndexBuf &points)
static void extract_points_mesh(const MeshRenderData &mr, gpu::IndexBuf &points)
static void extract_points_subdiv_bm(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &points)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
gpu::VertBuf * verts_orig_index
VArraySpan< bool > hide_vert
const int * orig_index_vert
eMRExtractType extract_type