[Bf-blender-cvs] [7bc300a74ba] master: Fix T67587: Fix Drawing in Wireframe Non X-Ray Mode

Jeroen Bakker noreply at git.blender.org
Thu Aug 8 08:04:50 CEST 2019


Commit: 7bc300a74baa382e6243322898675c3f24121606
Author: Jeroen Bakker
Date:   Thu Jul 25 08:51:59 2019 +0200
Branches: master
https://developer.blender.org/rB7bc300a74baa382e6243322898675c3f24121606

Fix T67587: Fix Drawing in Wireframe Non X-Ray Mode

When using Vertex or Weight paint mode on a wireframe the overlay was
blended with the background. In this case we now use alpha blending.

Reviewed By: fclem

Differential Revision: https://developer.blender.org/D5340

===================================================================

M	source/blender/draw/modes/paint_vertex_mode.c
M	source/blender/draw/modes/shaders/paint_vertex_frag.glsl
M	source/blender/draw/modes/shaders/paint_weight_frag.glsl
M	source/blender/makesdna/DNA_view3d_types.h

===================================================================

diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c
index bfd189189b4..5d14b3ba414 100644
--- a/source/blender/draw/modes/paint_vertex_mode.c
+++ b/source/blender/draw/modes/paint_vertex_mode.c
@@ -78,7 +78,8 @@ typedef struct PAINT_VERTEX_Data {
 
 typedef struct PAINT_VERTEX_Shaders {
   struct {
-    struct GPUShader *color_face;
+    struct GPUShader *color_face_mul_blending;
+    struct GPUShader *color_face_alpha_blending;
     struct GPUShader *wire_overlay;
     struct GPUShader *wire_select_overlay;
   } by_mode[MODE_LEN];
@@ -114,7 +115,7 @@ static void PAINT_VERTEX_engine_init(void *vedata)
   const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
 
   if (!sh_data->face_select_overlay) {
-    sh_data->by_mode[VERTEX_MODE].color_face = GPU_shader_create_from_arrays({
+    sh_data->by_mode[VERTEX_MODE].color_face_mul_blending = GPU_shader_create_from_arrays({
         .vert = (const char *[]){sh_cfg_data->lib,
                                  datatoc_common_view_lib_glsl,
                                  datatoc_paint_vertex_vert_glsl,
@@ -122,7 +123,15 @@ static void PAINT_VERTEX_engine_init(void *vedata)
         .frag = (const char *[]){datatoc_paint_vertex_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg_data->def, NULL},
     });
-    sh_data->by_mode[WEIGHT_MODE].color_face = GPU_shader_create_from_arrays({
+    sh_data->by_mode[VERTEX_MODE].color_face_alpha_blending = GPU_shader_create_from_arrays({
+        .vert = (const char *[]){sh_cfg_data->lib,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_paint_vertex_vert_glsl,
+                                 NULL},
+        .frag = (const char *[]){datatoc_paint_vertex_frag_glsl, NULL},
+        .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_ALPHA\n", NULL},
+    });
+    sh_data->by_mode[WEIGHT_MODE].color_face_mul_blending = GPU_shader_create_from_arrays({
         .vert = (const char *[]){sh_cfg_data->lib,
                                  datatoc_common_view_lib_glsl,
                                  datatoc_common_globals_lib_glsl,
@@ -131,7 +140,18 @@ static void PAINT_VERTEX_engine_init(void *vedata)
         .frag = (const char *[]){datatoc_common_globals_lib_glsl,
                                  datatoc_paint_weight_frag_glsl,
                                  NULL},
-        .defs = (const char *[]){sh_cfg_data->def, NULL},
+        .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_MUL\n", NULL},
+    });
+    sh_data->by_mode[WEIGHT_MODE].color_face_alpha_blending = GPU_shader_create_from_arrays({
+        .vert = (const char *[]){sh_cfg_data->lib,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_common_globals_lib_glsl,
+                                 datatoc_paint_weight_vert_glsl,
+                                 NULL},
+        .frag = (const char *[]){datatoc_common_globals_lib_glsl,
+                                 datatoc_paint_weight_frag_glsl,
+                                 NULL},
+        .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_ALPHA\n", NULL},
     });
 
     sh_data->face_select_overlay = GPU_shader_create_from_arrays({
@@ -140,7 +160,7 @@ static void PAINT_VERTEX_engine_init(void *vedata)
                                  datatoc_paint_face_selection_vert_glsl,
                                  NULL},
         .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
-        .defs = (const char *[]){sh_cfg_data->def, NULL},
+        .defs = (const char *[]){sh_cfg_data->def, "#define DRW_STATE_BLEND_MUL\n", NULL},
     });
     sh_data->vert_select_overlay = GPU_shader_create_from_arrays({
         .vert = (const char *[]){sh_cfg_data->lib,
@@ -195,13 +215,17 @@ static void PAINT_VERTEX_cache_init(void *vedata)
   const RegionView3D *rv3d = draw_ctx->rv3d;
   PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
 
+  const bool use_alpha_blending = draw_ctx->v3d->shading.type == OB_WIRE;
+  DRWState draw_state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL |
+                        (use_alpha_blending ? DRW_STATE_BLEND_ALPHA : DRW_STATE_BLEND_MUL);
   /* Vertex color pass */
   {
-    DRWPass *pass = DRW_pass_create(
-        "Vert Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_MUL);
-    DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->by_mode[VERTEX_MODE].color_face, pass);
-    DRW_shgroup_uniform_float_copy(
-        shgrp, "white_factor", 1.0f - v3d->overlay.vertex_paint_mode_opacity);
+    DRWPass *pass = DRW_pass_create("Vert Color Pass", draw_state);
+    GPUShader *shader = use_alpha_blending ?
+                            sh_data->by_mode[VERTEX_MODE].color_face_alpha_blending :
+                            sh_data->by_mode[VERTEX_MODE].color_face_mul_blending;
+    DRWShadingGroup *shgrp = DRW_shgroup_create(shader, pass);
+    DRW_shgroup_uniform_float(shgrp, "opacity", &v3d->overlay.vertex_paint_mode_opacity, 1);
     if (rv3d->rflag & RV3D_CLIPPING) {
       DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES);
     }
@@ -211,9 +235,11 @@ static void PAINT_VERTEX_cache_init(void *vedata)
 
   /* Weight color pass */
   {
-    DRWPass *pass = DRW_pass_create(
-        "Weight Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_MUL);
-    DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->by_mode[WEIGHT_MODE].color_face, pass);
+    DRWPass *pass = DRW_pass_create("Weight Pass", draw_state);
+    GPUShader *shader = use_alpha_blending ?
+                            sh_data->by_mode[WEIGHT_MODE].color_face_alpha_blending :
+                            sh_data->by_mode[WEIGHT_MODE].color_face_mul_blending;
+    DRWShadingGroup *shgrp = DRW_shgroup_create(shader, pass);
     DRW_shgroup_uniform_bool_copy(
         shgrp, "drawContours", (v3d->overlay.wpaint_flag & V3D_OVERLAY_WPAINT_CONTOURS) != 0);
     DRW_shgroup_uniform_float(shgrp, "opacity", &v3d->overlay.weight_paint_mode_opacity, 1);
diff --git a/source/blender/draw/modes/shaders/paint_vertex_frag.glsl b/source/blender/draw/modes/shaders/paint_vertex_frag.glsl
index 426dbada812..f03e3410ec3 100644
--- a/source/blender/draw/modes/shaders/paint_vertex_frag.glsl
+++ b/source/blender/draw/modes/shaders/paint_vertex_frag.glsl
@@ -2,7 +2,7 @@
 in vec3 finalColor;
 
 out vec4 fragColor;
-uniform float white_factor = 1.0;
+uniform float opacity = 1.0;
 
 vec3 linear_to_srgb_attr(vec3 c)
 {
@@ -14,6 +14,11 @@ vec3 linear_to_srgb_attr(vec3 c)
 
 void main()
 {
-  fragColor.rgb = mix(linear_to_srgb_attr(finalColor), vec3(1.0), white_factor);
+  vec3 color = linear_to_srgb_attr(finalColor);
+#ifdef DRW_STATE_BLEND_ALPHA
+  fragColor = vec4(color, opacity);
+#else
+  fragColor.rgb = mix(vec3(1.0), color, opacity);
   fragColor.a = 1.0;
+#endif
 }
diff --git a/source/blender/draw/modes/shaders/paint_weight_frag.glsl b/source/blender/draw/modes/shaders/paint_weight_frag.glsl
index 8b0e03ac31c..76b7719be64 100644
--- a/source/blender/draw/modes/shaders/paint_weight_frag.glsl
+++ b/source/blender/draw/modes/shaders/paint_weight_frag.glsl
@@ -95,6 +95,11 @@ void main()
     color = mix(weight_color, colorVertexUnreferenced, alert * alert);
   }
 
+#ifdef DRW_STATE_BLEND_ALPHA
+  /* alpha blending mix */
+  fragColor = vec4(color.rgb, opacity);
+#else
   /* mix with 1.0 -> is like opacity when using multiply blend mode */
   fragColor = vec4(mix(vec3(1.0), color.rgb, opacity), 1.0);
+#endif
 }
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index e7a4f9cbd4e..3ba33cfe3d4 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -144,7 +144,7 @@ typedef struct View3DCursor {
 
 /** 3D Viewport Shading settings. */
 typedef struct View3DShading {
-  /** Shading type (VIEW3D_SHADE_SOLID, ..). */
+  /** Shading type (OB_SOLID, ..). */
   char type;
   /** Runtime, for toggle between rendered viewport. */
   char prev_type;



More information about the Bf-blender-cvs mailing list