21 const BitSpan facedot_tags = mesh.runtime->subsurf_face_dot_tags;
26 for (const int face_index : range) {
27 const IndexRange face = faces[face_index];
28 const auto corner = std::find_if(face.begin(), face.end(), [&](const int corner) {
29 return facedot_tags[corner_verts[corner]].test();
31 if (corner == face.end()) {
32 vbo_data[face_index] = float2(0);
35 vbo_data[face_index] = uv_map[*corner];
53 for (const int face_index : range) {
54 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
55 const BMLoop *loop = BM_FACE_FIRST_LOOP(&face);
56 vbo_data[face_index] = float2(0);
57 for ([[maybe_unused]] const int i : IndexRange(face.len)) {
58 vbo_data[face_index] += *BM_ELEM_CD_GET_FLOAT2_P(loop, offset);
61 vbo_data[face_index] /= face.len;
69 if (
format.attr_len == 0) {
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
#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
void materialize(MutableSpan< T > r_span) const
void extract_face_dots_uv(const MeshRenderData &mr, gpu::VertBuf &vbo)
static void extract_face_dots_uv_mesh(const MeshRenderData &mr, MutableSpan< float2 > vbo_data)
static void extract_face_dots_uv_bm(const MeshRenderData &mr, MutableSpan< float2 > vbo_data)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
eMRExtractType extract_type
OffsetIndices< int > faces