Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/gpu/intern/gpu_buffers.c')
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c49
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) {