From 4d8b78b0a9b760bba2f715a7421b3fdd5e076ccf Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 15 Jan 2018 11:38:56 +0100 Subject: Sculpting: Sdd an option to hide mask in viewport Brushes themselves are still affected by the mask, but the viewport is not showing the mask. This way it's easier to see details while sculpting. Studio request by Julien Kaspar --- source/blender/gpu/intern/gpu_buffers.c | 49 +++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 12 deletions(-) (limited to 'source/blender/gpu/intern') diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 09d6f80abb8..afe7a4c4d27 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -993,6 +993,8 @@ struct GPU_PBVH_Buffers { bool smooth; bool show_diffuse_color; + bool show_mask; + bool use_matcaps; float diffuse_color[4]; }; @@ -1037,11 +1039,13 @@ void GPU_pbvh_mesh_buffers_update( const int update_flags) { const bool show_diffuse_color = (update_flags & GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR) != 0; + const bool show_mask = (update_flags & GPU_PBVH_BUFFERS_SHOW_MASK) != 0; VertexBufferFormat *vert_data; int i; buffers->vmask = vmask; buffers->show_diffuse_color = show_diffuse_color; + buffers->show_mask = show_mask; buffers->use_matcaps = GPU_material_use_matcaps_get(); { @@ -1086,7 +1090,7 @@ void GPU_pbvh_mesh_buffers_update( for (uint j = 0; j < 3; j++) { VertexBufferFormat *out = vert_data + face_vert_indices[i][j]; - if (vmask) { + if (vmask && show_mask) { uint v_index = buffers->mloop[lt->tri[j]].v; gpu_color_from_mask_copy(vmask[v_index], diffuse_color, out->color); } @@ -1122,7 +1126,7 @@ void GPU_pbvh_mesh_buffers_update( } uchar color_ub[3]; - if (vmask) { + if (vmask && show_mask) { float fmask = (vmask[vtri[0]] + vmask[vtri[1]] + vmask[vtri[2]]) / 3.0f; gpu_color_from_mask_copy(fmask, diffuse_color, color_ub); } @@ -1170,6 +1174,7 @@ GPU_PBVH_Buffers *GPU_pbvh_mesh_buffers_build( buffers->smooth = mpoly[looptri[face_indices[0]].poly].flag & ME_SMOOTH; buffers->show_diffuse_color = false; + buffers->show_mask = true; buffers->use_matcaps = false; /* Count the number of visible triangles */ @@ -1245,10 +1250,12 @@ void GPU_pbvh_grid_buffers_update( const int update_flags) { const bool show_diffuse_color = (update_flags & GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR) != 0; + const bool show_mask = (update_flags & GPU_PBVH_BUFFERS_SHOW_MASK) != 0; VertexBufferFormat *vert_data; int i, j, k, x, y; buffers->show_diffuse_color = show_diffuse_color; + buffers->show_mask = show_mask; buffers->use_matcaps = GPU_material_use_matcaps_get(); buffers->smooth = grid_flag_mats[grid_indices[0]].flag & ME_SMOOTH; @@ -1281,7 +1288,7 @@ void GPU_pbvh_grid_buffers_update( if (buffers->smooth) { normal_float_to_short_v3(vd->no, CCG_elem_no(key, elem)); - if (has_mask) { + if (has_mask && show_mask) { gpu_color_from_mask_copy(*CCG_elem_mask(key, elem), diffuse_color, vd->color); } @@ -1476,6 +1483,7 @@ GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build( buffers->totgrid = totgrid; buffers->show_diffuse_color = false; + buffers->show_mask = true; buffers->use_matcaps = false; /* Count the number of quads */ @@ -1547,7 +1555,8 @@ static void gpu_bmesh_vert_to_buffer_copy(BMVert *v, const float fno[3], const float *fmask, const int cd_vert_mask_offset, - const float diffuse_color[4]) + const float diffuse_color[4], + const bool show_mask) { if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN)) { VertexBufferFormat *vd = &vert_data[*v_index]; @@ -1556,11 +1565,16 @@ static void gpu_bmesh_vert_to_buffer_copy(BMVert *v, copy_v3_v3(vd->co, v->co); normal_float_to_short_v3(vd->no, fno ? fno : v->no); - gpu_color_from_mask_copy( - fmask ? *fmask : - BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset), - diffuse_color, - vd->color); + float effective_mask; + if (show_mask) { + effective_mask = fmask ? *fmask + : BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset); + } + else { + effective_mask = 0.0f; + } + + gpu_color_from_mask_copy(effective_mask, diffuse_color, vd->color); /* Assign index for use in the triangle index buffer */ /* note: caller must set: bm->elem_index_dirty |= BM_VERT; */ @@ -1618,6 +1632,7 @@ void GPU_pbvh_bmesh_buffers_update( const int update_flags) { const bool show_diffuse_color = (update_flags & GPU_PBVH_BUFFERS_SHOW_DIFFUSE_COLOR) != 0; + const bool show_mask = (update_flags & GPU_PBVH_BUFFERS_SHOW_MASK) != 0; VertexBufferFormat *vert_data; void *tri_data; int tottri, totvert, maxvert = 0; @@ -1627,6 +1642,7 @@ void GPU_pbvh_bmesh_buffers_update( const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK); buffers->show_diffuse_color = show_diffuse_color; + buffers->show_mask = show_mask; buffers->use_matcaps = GPU_material_use_matcaps_get(); /* Count visible triangles */ @@ -1677,13 +1693,15 @@ void GPU_pbvh_bmesh_buffers_update( GSET_ITER (gs_iter, bm_unique_verts) { gpu_bmesh_vert_to_buffer_copy(BLI_gsetIterator_getKey(&gs_iter), vert_data, &v_index, NULL, NULL, - cd_vert_mask_offset, diffuse_color); + cd_vert_mask_offset, diffuse_color, + show_mask); } GSET_ITER (gs_iter, bm_other_verts) { gpu_bmesh_vert_to_buffer_copy(BLI_gsetIterator_getKey(&gs_iter), vert_data, &v_index, NULL, NULL, - cd_vert_mask_offset, diffuse_color); + cd_vert_mask_offset, diffuse_color, + show_mask); } maxvert = v_index; @@ -1715,7 +1733,8 @@ void GPU_pbvh_bmesh_buffers_update( for (i = 0; i < 3; i++) { gpu_bmesh_vert_to_buffer_copy(v[i], vert_data, &v_index, f->no, &fmask, - cd_vert_mask_offset, diffuse_color); + cd_vert_mask_offset, diffuse_color, + show_mask); } } } @@ -1810,6 +1829,7 @@ GPU_PBVH_Buffers *GPU_pbvh_bmesh_buffers_build(bool smooth_shading) buffers->use_bmesh = true; buffers->smooth = smooth_shading; buffers->show_diffuse_color = false; + buffers->show_mask = true; buffers->use_matcaps = false; return buffers; @@ -2000,6 +2020,11 @@ bool GPU_pbvh_buffers_diffuse_changed( return !equals_v3v3(diffuse_color, buffers->diffuse_color); } +bool GPU_pbvh_buffers_mask_changed(GPU_PBVH_Buffers *buffers, bool show_mask) +{ + return (buffers->show_mask != show_mask); +} + void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers) { if (buffers) { -- cgit v1.2.3