26 if (
format.attr_len == 0) {
39 for (const int face_index : range) {
40 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
41 const BMLoop *loop = BM_FACE_FIRST_LOOP(&face);
42 for ([[maybe_unused]] const int i : IndexRange(face.len)) {
43 const int index = BM_elem_index_get(loop);
44 EditLoopData &value = vbo_data[index];
46 mesh_render_data_loop_flag(mr, loop, offsets, value);
47 mesh_render_data_face_flag(mr, &face, offsets, value);
48 mesh_render_data_loop_edge_flag(mr, loop, offsets, value);
62 threading::parallel_for(faces.index_range(), 2048, [&](
const IndexRange range) {
63 for (const int face_index : range) {
64 const IndexRange face = faces[face_index];
65 BMFace *face_orig = bm_original_face_get(mr, face_index);
67 vbo_data.slice(face).fill({});
70 for (const int corner : face) {
71 EditLoopData &value = vbo_data[corner];
73 BMVert *vert = bm_original_vert_get(mr, corner_verts[corner]);
74 BMEdge *edge = bm_original_edge_get(mr, corner_edges[corner]);
77 BMLoop *l = BM_face_edge_share_loop(face_orig, edge);
78 mesh_render_data_loop_flag(mr, l, offsets, value);
79 mesh_render_data_loop_edge_flag(mr, l, offsets, value);
82 if (edge == nullptr) {
85 const int corner_prev = bke::mesh::face_corner_prev(face, corner);
86 edge = bm_original_edge_get(mr, corner_edges[corner_prev]);
90 BMLoop *l = BM_face_edge_share_loop(face_orig, edge);
91 mesh_render_data_loop_edge_flag(mr, l, offsets, value);
117 const int subdiv_quad_index,
118 const BMFace *coarse_quad,
122 uint start_loop_idx = subdiv_quad_index * 4;
123 uint end_loop_idx = (subdiv_quad_index + 1) * 4;
124 for (
uint i = start_loop_idx; i < end_loop_idx; i++) {
125 const int vert_origindex = subdiv_loop_vert_index[i];
126 int edge_origindex = subdiv_loop_edge_index[i];
131 if (vert_origindex != -1 && edge_origindex != -1) {
139 if (edge_origindex == -1) {
142 const uint loop_index_last = (i == start_loop_idx) ? end_loop_idx - 1 : i - 1;
143 edge_origindex = subdiv_loop_edge_index[loop_index_last];
145 if (edge_origindex != -1) {
169 for (const int subdiv_quad : range) {
170 const int coarse_face = subdiv_loop_face_index[subdiv_quad * 4];
171 extract_edituv_data_iter_subdiv_bm(mr,
173 subdiv_loop_vert_index,
174 subdiv_loop_edge_index,
176 BM_face_at_index(mr.bm, coarse_face),
194 for (const int subdiv_quad : range) {
195 const int coarse_face = subdiv_loop_face_index[subdiv_quad * 4];
196 extract_edituv_data_iter_subdiv_bm(mr,
198 subdiv_loop_vert_index,
199 subdiv_loop_edge_index,
201 bm_original_face_get(mr, coarse_face),
#define GPU_vertbuf_init_with_format(verts, format)
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
ATTR_WARN_UNUSED_RESULT BMesh * bm
BLI_INLINE BMEdge * BM_edge_at_index(BMesh *bm, const int index)
BMLoop * BM_face_edge_share_loop(BMFace *f, BMEdge *e)
Return the Loop Shared by Face and Edge.
ATTR_WARN_UNUSED_RESULT const BMLoop * l
BMUVOffsets BM_uv_map_get_offsets(const BMesh *bm)
void extract_edituv_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
static void extract_edituv_data_bm(const MeshRenderData &mr, MutableSpan< EditLoopData > vbo_data)
static const GPUVertFormat & edituv_data_format()
void extract_edituv_data_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &vbo)
static void extract_edituv_data_mesh(const MeshRenderData &mr, MutableSpan< EditLoopData > vbo_data)
static void extract_edituv_subdiv_data_mesh(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, MutableSpan< EditLoopData > vbo_data)
static void extract_edituv_data_iter_subdiv_bm(const MeshRenderData &mr, const BMUVOffsets offsets, const Span< int > subdiv_loop_vert_index, const Span< int > subdiv_loop_edge_index, const int subdiv_quad_index, const BMFace *coarse_quad, MutableSpan< EditLoopData > vbo_data)
static void extract_edituv_subdiv_data_bm(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, MutableSpan< EditLoopData > vbo_data)
void mesh_render_data_face_flag(const MeshRenderData &mr, const BMFace *efa, const BMUVOffsets offsets, EditLoopData &eattr)
void mesh_render_data_loop_flag(const MeshRenderData &mr, const BMLoop *l, const BMUVOffsets offsets, EditLoopData &eattr)
void mesh_render_data_loop_edge_flag(const MeshRenderData &mr, const BMLoop *l, const BMUVOffsets offsets, EditLoopData &eattr)
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
gpu::VertBuf * edges_orig_index
int * subdiv_loop_face_index
eMRExtractType extract_type
OffsetIndices< int > faces