Fix T74761: Reimplement vertex to face sets visibility sync
This fixes multiple issues: - Adds tag to update shading when changing vertex visibiliyt. This makes the mesh visibility update when the operator ends. - Sync vertex to face sets no longer requires the pmap, so it does not crash. (Maybe we can initialize the pmap on undo to avoid these problems in the future). - Sync vertex to face sets now works in a coherent way with the rest of visibility operations. Hide Box and Hide mask now sync the visibility changes to the face sets, so the all the operations are now getting a correct visibility state. Reviewed By: brecht Maniphest Tasks: T74761 Differential Revision: https://developer.blender.org/D7187
This commit is contained in:
@@ -403,6 +403,9 @@ static int hide_show_exec(bContext *C, wmOperator *op)
|
||||
BKE_mesh_flush_hidden_from_verts(me);
|
||||
}
|
||||
|
||||
SCULPT_visibility_sync_all_vertex_to_face_sets(ob->sculpt);
|
||||
|
||||
DEG_id_tag_update(&ob->id, ID_RECALC_SHADING);
|
||||
ED_region_tag_redraw(region);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
|
||||
@@ -435,8 +435,23 @@ static void sculpt_visibility_sync_vertex_to_face_sets(SculptSession *ss, int in
|
||||
|
||||
void SCULPT_visibility_sync_all_vertex_to_face_sets(SculptSession *ss)
|
||||
{
|
||||
for (int i = 0; i < ss->totvert; i++) {
|
||||
sculpt_visibility_sync_vertex_to_face_sets(ss, i);
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
|
||||
for (int i = 0; i < ss->totpoly; i++) {
|
||||
MPoly *poly = &ss->mpoly[i];
|
||||
bool poly_visible = true;
|
||||
for (int l = 0; l < poly->totloop; l++) {
|
||||
MLoop *loop = &ss->mloop[poly->loopstart + l];
|
||||
if (!SCULPT_vertex_visible_get(ss, (int)loop->v)) {
|
||||
poly_visible = false;
|
||||
}
|
||||
}
|
||||
if (poly_visible) {
|
||||
ss->face_sets[i] = abs(ss->face_sets[i]);
|
||||
}
|
||||
else {
|
||||
ss->face_sets[i] = -abs(ss->face_sets[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user