diff options
Diffstat (limited to 'source/blender/gpu/intern')
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 49 |
1 files changed, 37 insertions, 12 deletions
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) { |