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;
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;
134 for (const int i : range) {
135 process_vert_fn(loose_verts_start + i, loose_verts[i]);
164 else if (visible_verts.
size() ==
bm.totvert) {
169 data[vert] = ibo_index;
178 const int index = map[vert];
181 data[index] = ibo_index;
206 visible,
GrainSize(4096), memory, [&](
const int i) {
return !hide_vert[map[
i]]; });
224 const int loose_edge_verts_num = verts_per_edge * loose_edges.
size();
232 return corner_orig_verts[
i] != -1;
235 mr, visible_corners, corner_orig_verts, memory);
240 const int max_index = subdiv_cache.
num_subdiv_loops + loose_edge_verts_num + loose_verts.
size();
244 visible_corners.
size() + loose_edges.
size() * 2 + visible_loose.
size(),
250 const auto show_vert = [&](
const int vert) {
251 if (!hide_vert.
is_empty() && hide_vert[vert]) {
263 const int2 edge = coarse_edges[loose_edges[
i]];
264 const IndexRange edge_range(loose_geom_start +
i * verts_per_edge, verts_per_edge);
270 const int loose_verts_start = loose_geom_start + loose_edge_verts_num;
283 const int loose_edge_verts_num = verts_per_edge * loose_edges.
size();
287 const auto show_vert_bm = [&](
const int vert_index) {
296 return corner_orig_verts[
i] != -1 && show_vert_bm(corner_orig_verts[
i]);
301 return show_vert_bm(vert);
304 const int max_index = subdiv_cache.
num_subdiv_loops + loose_edge_verts_num + loose_verts.
size();
308 visible_corners.
size() + loose_edges.
size() * 2 + visible_loose.size(),
317 const int2 edge = coarse_edges[loose_edges[
i]];
318 const IndexRange edge_range(loose_geom_start +
i * verts_per_edge, verts_per_edge);
324 const int loose_verts_start = loose_geom_start + loose_edge_verts_num;
325 visible_loose.shift(loose_verts_start, memory).to_indices<
int32_t>(loose_vert_data);
blender::MutableSpan< uint32_t > GPU_indexbuf_get_data(GPUIndexBufBuilder *)
void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint vertex_len)
blender::gpu::IndexBuf * GPU_indexbuf_build_ex(GPUIndexBufBuilder *builder, uint index_min, uint index_max, bool uses_restart_indices)
#define BM_elem_index_get(ele)
#define BM_elem_flag_test_bool(ele, hflag)
BMesh const char void * data
BLI_INLINE BMVert * BM_vert_at_index(BMesh *bm, const int index)
BMLoop * BM_vert_find_first_loop(BMVert *v)
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
constexpr int64_t size_in_bytes() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
MutableSpan< T > as_mutable_span()
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
static IndexMask from_bools_inverse(const VArray< bool > &bools, IndexMaskMemory &memory)
constexpr int64_t first() const
constexpr int64_t last(const int64_t n=0) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
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 float2 mask(const MaskType mask, const float2 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)
gpu::IndexBufPtr extract_points_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache)
static void process_ibo_verts_mesh(const MeshRenderData &mr, const Fn &process_vert_fn)
static gpu::IndexBufPtr extract_points_subdiv_bm(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache)
static gpu::IndexBufPtr extract_points_bm(const MeshRenderData &mr)
static gpu::IndexBufPtr extract_points_mesh(const MeshRenderData &mr)
static void process_ibo_verts_bm(const MeshRenderData &mr, const Fn &process_vert_fn)
static IndexMask calc_vert_visibility_mesh(const MeshRenderData &mr, const IndexMask &mask, IndexMaskMemory &memory)
static gpu::IndexBufPtr extract_points_subdiv_mesh(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache)
gpu::IndexBufPtr extract_points(const MeshRenderData &mr)
std::unique_ptr< IndexBuf, IndexBufDeleter > IndexBufPtr
constexpr uint32_t RESTART_INDEX
void build_reverse_map(const IndexMask &mask, MutableSpan< T > r_map)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
void memory_bandwidth_bound_task(const int64_t approximate_bytes_touched, const Function &function)
VecBase< int32_t, 2 > int2
gpu::VertBuf * verts_orig_index
VArraySpan< bool > hide_vert
const int * orig_index_vert
MeshExtractType extract_type