Sculpt: fix missing nullptr check in pbvh draw

This time it was face sets.
This commit is contained in:
Joseph Eagar 2022-09-29 01:25:28 -07:00
parent 9be99bcb45
commit 039429faeb
Notes: blender-bot 2023-02-13 14:22:20 +01:00
Referenced by commit 6865aab133, Cleanup: quiet unused parameter warning in lambda function
Referenced by issue #101502, Regression: Artifacts/crash when sculpting with Dyntopo
Referenced by issue #101467, Regression: Sculpt Mode: Hiding Face Sets will cause glitches
Referenced by issue #101456, Crash when using "draw face sets" tool while cavity auto-mask is checked under "brush" and "options"
Referenced by issue #101453, Regression: Immediate crash when switching to sculpt mode
2 changed files with 32 additions and 17 deletions

View File

@ -550,27 +550,40 @@ struct PBVHBatches {
}
case CD_PBVH_FSET_TYPE: {
int *face_sets = static_cast<int *>(
CustomData_get_layer(args->pdata, CD_SCULPT_FACE_SETS));
int last_poly = -1;
uchar fset_color[3] = {255, 255, 255};
CustomData_get_layer_named(args->pdata, CD_PROP_INT32, ".sculpt_face_set"));
foreach_faces([&](int /*buffer_i*/, int /*tri_i*/, int /*vertex_i*/, const MLoopTri *tri) {
if (last_poly != tri->poly && args->face_sets) {
last_poly = tri->poly;
if (face_sets) {
int last_poly = -1;
uchar fset_color[3] = {255, 255, 255};
const int fset = abs(face_sets[tri->poly]);
foreach_faces(
[&](int /*buffer_i*/, int /*tri_i*/, int /*vertex_i*/, const MLoopTri *tri) {
if (last_poly != tri->poly && args->face_sets) {
last_poly = tri->poly;
if (fset != args->face_sets_color_default) {
BKE_paint_face_set_overlay_color_get(fset, args->face_sets_color_seed, fset_color);
}
else {
/* Skip for the default color face set to render it white. */
fset_color[0] = fset_color[1] = fset_color[2] = 255;
}
}
const int fset = abs(face_sets[tri->poly]);
*static_cast<uchar3 *>(GPU_vertbuf_raw_step(&access)) = fset_color;
});
if (fset != args->face_sets_color_default) {
BKE_paint_face_set_overlay_color_get(
fset, args->face_sets_color_seed, fset_color);
}
else {
/* Skip for the default color face set to render it white. */
fset_color[0] = fset_color[1] = fset_color[2] = 255;
}
}
*static_cast<uchar3 *>(GPU_vertbuf_raw_step(&access)) = fset_color;
});
}
else {
uchar fset_color[3] = {255, 255, 255};
foreach_faces(
[&](int /*buffer_i*/, int /*tri_i*/, int /*vertex_i*/, const MLoopTri *tri) {
*static_cast<uchar3 *>(GPU_vertbuf_raw_step(&access)) = fset_color;
});
}
break;
}

View File

@ -134,6 +134,8 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
data->ob, ss, ss->cache->automasking, &automask_data, data->nodes[n]);
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
SCULPT_automasking_node_update(ss, &automask_data, &vd);
if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
MeshElemMap *vert_map = &ss->pmap[vd.index];
for (int j = 0; j < ss->pmap[vd.index].count; j++) {