[Bf-blender-cvs] [78e3b7c28d8] blender-v2.83-release: Sculpt: Render Face Sets always as flat shading
Pablo Dobarro
noreply at git.blender.org
Thu May 14 16:48:55 CEST 2020
Commit: 78e3b7c28d858ca256c99338cf195b9d60f2c3d6
Author: Pablo Dobarro
Date: Thu May 14 15:27:11 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB78e3b7c28d858ca256c99338cf195b9d60f2c3d6
Sculpt: Render Face Sets always as flat shading
This removes the smooth shading rendering from the face set overlay when
smooth shading is enabled.
Reviewed By: jbakker
Maniphest Tasks: T74906, T74622, T75331, T76530
Differential Revision: https://developer.blender.org/D7105
===================================================================
M source/blender/blenkernel/intern/pbvh.c
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_shader.c
A source/blender/draw/engines/overlay/shaders/sculpt_mask_frag.glsl
M source/blender/draw/engines/overlay/shaders/sculpt_mask_vert.glsl
M source/blender/gpu/GPU_buffers.h
M source/blender/gpu/intern/gpu_buffers.c
===================================================================
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 7d5a0e7fd91..d925a2b4db9 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -1274,7 +1274,6 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
break;
case PBVH_FACES:
node->draw_buffers = GPU_pbvh_mesh_buffers_build(
- node->face_vert_indices,
bvh->mpoly,
bvh->mloop,
bvh->looptri,
@@ -1310,14 +1309,11 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
case PBVH_FACES:
GPU_pbvh_mesh_buffers_update(node->draw_buffers,
bvh->verts,
- node->vert_indices,
- node->uniq_verts + node->face_verts,
CustomData_get_layer(bvh->vdata, CD_PAINT_MASK),
CustomData_get_layer(bvh->ldata, CD_MLOOPCOL),
CustomData_get_layer(bvh->pdata, CD_SCULPT_FACE_SETS),
bvh->face_sets_color_seed,
bvh->face_sets_color_default,
- node->face_vert_indices,
update_flags);
break;
case PBVH_BMESH:
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 46263f694cb..6f932bf8797 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -384,6 +384,7 @@ data_to_c_simple(engines/overlay/shaders/particle_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/pointcloud_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/pointcloud_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/sculpt_mask_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/sculpt_mask_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/volume_velocity_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 264791a6661..59f388df4e3 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -105,6 +105,7 @@ extern char datatoc_particle_frag_glsl[];
extern char datatoc_pointcloud_vert_glsl[];
extern char datatoc_pointcloud_frag_glsl[];
extern char datatoc_sculpt_mask_vert_glsl[];
+extern char datatoc_sculpt_mask_frag_glsl[];
extern char datatoc_volume_velocity_vert_glsl[];
extern char datatoc_wireframe_vert_glsl[];
extern char datatoc_wireframe_frag_glsl[];
@@ -1307,7 +1308,7 @@ GPUShader *OVERLAY_shader_sculpt_mask(void)
datatoc_common_view_lib_glsl,
datatoc_sculpt_mask_vert_glsl,
NULL},
- .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
+ .frag = (const char *[]){datatoc_sculpt_mask_frag_glsl, NULL},
.defs = (const char *[]){sh_cfg->def, NULL},
});
}
diff --git a/source/blender/draw/engines/overlay/shaders/sculpt_mask_frag.glsl b/source/blender/draw/engines/overlay/shaders/sculpt_mask_frag.glsl
new file mode 100644
index 00000000000..a778e518392
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/sculpt_mask_frag.glsl
@@ -0,0 +1,10 @@
+
+flat in vec3 faceset_color;
+in float mask_color;
+
+out vec4 fragColor;
+
+void main()
+{
+ fragColor = vec4(faceset_color * vec3(mask_color), 1.0);
+}
diff --git a/source/blender/draw/engines/overlay/shaders/sculpt_mask_vert.glsl b/source/blender/draw/engines/overlay/shaders/sculpt_mask_vert.glsl
index 5d79195a40b..f2b827738ac 100644
--- a/source/blender/draw/engines/overlay/shaders/sculpt_mask_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/sculpt_mask_vert.glsl
@@ -8,13 +8,16 @@ in float msk;
out vec4 finalColor;
+flat out vec3 faceset_color;
+out float mask_color;
+
void main()
{
vec3 world_pos = point_object_to_world(pos);
gl_Position = point_world_to_ndc(world_pos);
- finalColor = vec4(mix(vec3(1.0), fset, faceSetsOpacity), 1.0);
- finalColor.rgb *= (1.0 - (msk * maskOpacity));
+ faceset_color = mix(vec3(1.0), fset, faceSetsOpacity);
+ mask_color = 1.0 - (msk * maskOpacity);
#ifdef USE_WORLD_CLIP_PLANES
world_clip_planes_calc_clip_distance(world_pos);
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 22086b8a9d6..ab16bfc43c4 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -49,8 +49,7 @@ typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
/* Build must be called once before using the other functions, used every time
* mesh topology changes. Threaded. */
-GPU_PBVH_Buffers *GPU_pbvh_mesh_buffers_build(const int (*face_vert_indices)[3],
- const struct MPoly *mpoly,
+GPU_PBVH_Buffers *GPU_pbvh_mesh_buffers_build(const struct MPoly *mpoly,
const struct MLoop *mloop,
const struct MLoopTri *looptri,
const struct MVert *verts,
@@ -78,14 +77,11 @@ enum {
void GPU_pbvh_mesh_buffers_update(GPU_PBVH_Buffers *buffers,
const struct MVert *mvert,
- const int *vert_indices,
- int totvert,
const float *vmask,
const struct MLoopCol *vcol,
const int *sculpt_face_sets,
const int face_sets_color_seed,
const int face_sets_color_default,
- const int (*face_vert_indices)[3],
const int update_flags);
void GPU_pbvh_bmesh_buffers_update(GPU_PBVH_Buffers *buffers,
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 03e0d1829c5..e9061f1a029 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -219,14 +219,11 @@ static bool gpu_pbvh_is_looptri_visible(const MLoopTri *lt,
/* Threaded - do not call any functions that use OpenGL calls! */
void GPU_pbvh_mesh_buffers_update(GPU_PBVH_Buffers *buffers,
const MVert *mvert,
- const int *vert_indices,
- int totvert,
const float *vmask,
const MLoopCol *vcol,
const int *sculpt_face_sets,
const int face_sets_color_seed,
const int face_sets_color_default,
- const int (*face_vert_indices)[3],
const int update_flags)
{
const bool show_mask = vmask && (update_flags & GPU_PBVH_BUFFERS_SHOW_MASK) != 0;
@@ -237,7 +234,7 @@ void GPU_pbvh_mesh_buffers_update(GPU_PBVH_Buffers *buffers,
bool default_face_set = true;
{
- int totelem = (buffers->smooth ? totvert : (buffers->tot_tri * 3));
+ const int totelem = buffers->tot_tri * 3;
/* Build VBO */
if (gpu_pbvh_vert_buf_data_set(buffers, totelem)) {
@@ -255,127 +252,77 @@ void GPU_pbvh_mesh_buffers_update(GPU_PBVH_Buffers *buffers,
GPU_vertbuf_attr_get_raw_data(buffers->vert_buf, g_vbo_id.col, &col_step);
}
- /* Vertex data is shared if smooth-shaded, but separate
- * copies are made for flat shading because normals
- * shouldn't be shared. */
- if (buffers->smooth) {
- for (uint i = 0; i < totvert; i++) {
- const int vidx = vert_indices[i];
- const MVert *v = &mvert[vidx];
- copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), v->co);
- copy_v3_v3_short(GPU_vertbuf_raw_step(&nor_step), v->no);
+ /* calculate normal for each polygon only once */
+ uint mpoly_prev = UINT_MAX;
+ short no[3] = {0, 0, 0};
- uchar mask;
- if (show_mask) {
- mask = (uchar)(vmask[vidx] * 255);
- }
- else {
- mask = 0.0f;
- }
- *(uchar *)GPU_vertbuf_raw_step(&msk_step) = mask;
- empty_mask = empty_mask && (mask == 0);
+ for (uint i = 0; i < buffers->face_indices_len; i++) {
+ const MLoopTri *lt = &buffers->looptri[buffers->face_indices[i]];
+ const uint vtri[3] = {
+ buffers->mloop[lt->tri[0]].v,
+ buffers->mloop[lt->tri[1]].v,
+ buffers->mloop[lt->tri[2]].v,
+ };
+
+ if (!gpu_pbvh_is_looptri_visible(lt, mvert, buffers->mloop, sculpt_face_sets)) {
+ continue;
}
- /* Face Sets. */
- for (uint i = 0; i < buffers->face_indices_len; i++) {
- uchar face_set_color[4] = {UCHAR_MAX, UCHAR_MAX, UCHAR_MAX, UCHAR_MAX};
- if (show_face_sets) {
- const MLoopTri *lt = &buffers->looptri[buffers->face_indices[i]];
- const int fset = abs(sculpt_face_sets[lt->poly]);
-
- /* Skip for the default color Face Set to render it white. */
- if (fset != face_sets_color_default) {
- face_set_overlay_color_get(fset, face_sets_color_seed, face_set_color);
- default_face_set = false;
- }
- }
- for (int j = 0; j < 3; j++) {
- const int vidx = face_vert_indices[i][j];
- GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.fset, vidx, &face_set_color);
- }
+ /* Face normal and mask */
+ if (lt->poly != mpoly_prev && !buffers->smooth) {
+ const MPoly *mp = &buffers->mpoly[lt->poly];
+ float fno[3];
+ BKE_mesh_calc_poly_normal(mp, &
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list