37 struct gpuSculptData {
53 for (const int face_index : range) {
54 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
55 const IndexRange face_range(BM_elem_index_get(BM_FACE_FIRST_LOOP(&face)), face.len);
57 uchar4 face_set_color(UCHAR_MAX);
58 if (face_set_offset != -1) {
59 const int face_set_id = BM_ELEM_CD_GET_INT(&face, face_set_offset);
60 if (face_set_id != default_face_set) {
61 BKE_paint_face_set_overlay_color_get(face_set_id, face_set_seed, face_set_color);
64 vbo_data.slice(face_range).fill(gpuSculptData{face_set_color, 0.0f});
66 if (mask_offset != -1) {
67 const BMLoop *loop = BM_FACE_FIRST_LOOP(&face);
68 for ([[maybe_unused]] const int i : IndexRange(face.len)) {
69 const int index = BM_elem_index_get(loop);
70 vbo_data[index].mask = BM_ELEM_CD_GET_FLOAT(loop->v, mask_offset);
79 const Span<int> corner_verts = mr.corner_verts;
84 for (const int face_index : range) {
85 const IndexRange face = faces[face_index];
86 uchar4 face_set_color(UCHAR_MAX);
87 if (!face_set.is_empty()) {
88 const int face_set_id = face_set[face_index];
89 if (face_set_id != default_face_set) {
90 BKE_paint_face_set_overlay_color_get(face_set_id, face_set_seed, face_set_color);
93 vbo_data.slice(face).fill(gpuSculptData{face_set_color, 0.0f});
95 if (!mask.is_empty()) {
96 for (const int corner : face) {
97 vbo_data[corner].mask = mask[corner_verts[corner]];
118 if (
const VArray mask = *attributes.
lookup<
float>(
".sculpt_mask", bke::AttrDomain::Point)) {
121 const Span<int> corner_verts = coarse_mesh.corner_verts();
127 array_utils::gather(
mask, corner_verts, mask_vbo_data);
148 const VArraySpan face_sets = *attributes.
lookup<
int>(
".sculpt_face_set", bke::AttrDomain::Face);
149 if (face_sets.is_empty()) {
158 for (
const int i :
range) {
159 const int face_index = subdiv_loop_face_index[i];
161 uchar4 face_set_color(UCHAR_MAX);
162 const int face_set_id = face_sets[face_index];
164 if (face_set_id != default_face_set) {