38 struct gpuSculptData {
54 for (const int face_index : range) {
55 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
56 const IndexRange face_range(BM_elem_index_get(BM_FACE_FIRST_LOOP(&face)), face.len);
58 uchar4 face_set_color(UCHAR_MAX);
59 if (face_set_offset != -1) {
60 const int face_set_id = BM_ELEM_CD_GET_INT(&face, face_set_offset);
61 if (face_set_id != default_face_set) {
62 BKE_paint_face_set_overlay_color_get(face_set_id, face_set_seed, face_set_color);
65 vbo_data.slice(face_range).fill(gpuSculptData{face_set_color, 0.0f});
67 if (mask_offset != -1) {
68 const BMLoop *loop = BM_FACE_FIRST_LOOP(&face);
69 for ([[maybe_unused]] const int i : IndexRange(face.len)) {
70 const int index = BM_elem_index_get(loop);
71 vbo_data[index].mask = BM_ELEM_CD_GET_FLOAT(loop->v, mask_offset);
80 const Span<int> corner_verts = mr.corner_verts;
85 for (const int face_index : range) {
86 const IndexRange face = faces[face_index];
87 uchar4 face_set_color(UCHAR_MAX);
88 if (!face_set.is_empty()) {
89 const int face_set_id = face_set[face_index];
90 if (face_set_id != default_face_set) {
91 BKE_paint_face_set_overlay_color_get(face_set_id, face_set_seed, face_set_color);
94 vbo_data.slice(face).fill(gpuSculptData{face_set_color, 0.0f});
96 if (!mask.is_empty()) {
97 for (const int corner : face) {
98 vbo_data[corner].mask = mask[corner_verts[corner]];
119 if (
const VArray mask = *attributes.lookup<
float>(
".sculpt_mask", bke::AttrDomain::Point)) {
122 const Span<int> corner_verts = coarse_mesh.corner_verts();
128 array_utils::gather(mask, corner_verts, mask_vbo_data);
149 const VArraySpan face_sets = *attributes.lookup<
int>(
".sculpt_face_set", bke::AttrDomain::Face);
150 if (face_sets.is_empty()) {
159 for (
const int i :
range) {
160 const int face_index = subdiv_loop_face_index[i];
162 uchar4 face_set_color(UCHAR_MAX);
163 const int face_set_id = face_sets[face_index];
165 if (face_set_id != default_face_set) {