[Bf-blender-cvs] [336a8f283f4] master: Fix T62917 UV editor: Edge overlay not shown when edge overlay type is Dash

Clément Foucault noreply at git.blender.org
Mon Jun 22 17:32:06 CEST 2020


Commit: 336a8f283f4b612b687dc26ea0c86a2c82bf514d
Author: Clément Foucault
Date:   Mon Jun 22 17:30:45 2020 +0200
Branches: master
https://developer.blender.org/rB336a8f283f4b612b687dc26ea0c86a2c82bf514d

Fix T62917 UV editor: Edge overlay not shown when edge overlay type is Dash

Fix by changing the shader to always compute dash for uv and just change
dash size to something really big for other overlay types.

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

M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_shader.c
A	source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_frag.glsl
M	source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl

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

diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 897e2f13774..df6e4f70e99 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -409,70 +409,49 @@ static void draw_uvs(SpaceImage *sima,
       GPU_blend(true);
     }
 
-    switch (sima->dt_uv) {
-      case SI_UVDT_DASH: {
-        float dash_colors[2][4] = {
-            {0.56f, 0.56f, 0.56f, overlay_alpha},
-            {0.07f, 0.07f, 0.07f, overlay_alpha},
-        };
-        float viewport_size[4];
-        GPU_viewport_size_get_f(viewport_size);
-
-        GPU_line_width(1.0f);
-        GPU_batch_program_set_builtin(batch->edges, GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR);
-        GPU_batch_uniform_4fv_array(batch->edges, "colors", 2, (float *)dash_colors);
-        GPU_batch_uniform_2f(batch->edges,
-                             "viewport_size",
-                             viewport_size[2] / UI_DPI_FAC,
-                             viewport_size[3] / UI_DPI_FAC);
-        GPU_batch_uniform_1i(batch->edges, "colors_len", 2); /* "advanced" mode */
-        GPU_batch_uniform_1f(batch->edges, "dash_width", 4.0f);
-        GPU_batch_uniform_1f(batch->edges, "dash_factor", 0.5f);
-        GPU_batch_draw(batch->edges);
-        break;
-      }
-      case SI_UVDT_BLACK:
-      case SI_UVDT_WHITE:
-      case SI_UVDT_OUTLINE: {
-        /* We could modify the vbo's data filling
-         * instead of modifying the provoking vert. */
-        glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);
-
-        UI_GetThemeColor3fv(TH_EDGE_SELECT, col2);
-        col2[3] = overlay_alpha;
-
-        GPU_batch_program_set_builtin(
-            batch->edges, (interpedges) ? GPU_SHADER_2D_UV_EDGES_SMOOTH : GPU_SHADER_2D_UV_EDGES);
-
-        if (sima->dt_uv == SI_UVDT_OUTLINE) {
-          /* Black Outline. */
-          GPU_line_width(3.0f);
-          GPU_batch_uniform_4f(batch->edges, "edgeColor", 0.0f, 0.0f, 0.0f, overlay_alpha);
-          GPU_batch_uniform_4f(batch->edges, "selectColor", 0.0f, 0.0f, 0.0f, overlay_alpha);
-          GPU_batch_draw(batch->edges);
-
-          UI_GetThemeColor3fv(TH_WIRE_EDIT, col1);
-        }
-        else if (sima->dt_uv == SI_UVDT_WHITE) {
-          copy_v3_fl3(col1, 1.0f, 1.0f, 1.0f);
-        }
-        else {
-          copy_v3_fl3(col1, 0.0f, 0.0f, 0.0f);
-        }
-        col1[3] = overlay_alpha;
+    {
+      /* We could modify the vbo's data filling
+       * instead of modifying the provoking vert. */
+      glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);
+
+      UI_GetThemeColor3fv(TH_EDGE_SELECT, col2);
+      col2[3] = overlay_alpha;
 
-        /* Inner Line. Use depth test to insure selection is drawn on top. */
-        GPU_depth_test(true);
-        GPU_line_width(1.0f);
-        GPU_batch_uniform_4fv(batch->edges, "edgeColor", col1);
-        GPU_batch_uniform_4fv(batch->edges, "selectColor", col2);
+      float dash_width = (sima->dt_uv & SI_UVDT_DASH) ? (4.0f * UI_DPI_FAC) : 9999.0f;
+
+      GPU_batch_program_set_builtin(
+          batch->edges, (interpedges) ? GPU_SHADER_2D_UV_EDGES_SMOOTH : GPU_SHADER_2D_UV_EDGES);
+
+      if (sima->dt_uv == SI_UVDT_OUTLINE) {
+        /* Black Outline. */
+        GPU_line_width(3.0f);
+        GPU_batch_uniform_4f(batch->edges, "edgeColor", 0.0f, 0.0f, 0.0f, overlay_alpha);
+        GPU_batch_uniform_4f(batch->edges, "selectColor", 0.0f, 0.0f, 0.0f, overlay_alpha);
+        GPU_batch_uniform_1f(batch->edges, "dashWidth", dash_width);
         GPU_batch_draw(batch->edges);
-        GPU_depth_test(false);
 
-        glProvokingVertex(GL_LAST_VERTEX_CONVENTION);
-        break;
+        UI_GetThemeColor3fv(TH_WIRE_EDIT, col1);
+      }
+      else if (sima->dt_uv == SI_UVDT_BLACK) {
+        copy_v3_fl3(col1, 0.0f, 0.0f, 0.0f);
       }
+      else {
+        copy_v3_fl3(col1, 1.0f, 1.0f, 1.0f);
+      }
+      col1[3] = overlay_alpha;
+
+      /* Inner Line. Use depth test to insure selection is drawn on top. */
+      GPU_depth_test(true);
+      GPU_line_width(1.0f);
+      GPU_batch_uniform_4fv(batch->edges, "edgeColor", col1);
+      GPU_batch_uniform_4fv(batch->edges, "selectColor", col2);
+      GPU_batch_uniform_1f(batch->edges, "dashWidth", dash_width);
+      GPU_batch_draw(batch->edges);
+      GPU_depth_test(false);
+
+      glProvokingVertex(GL_LAST_VERTEX_CONVENTION);
     }
+
     if (sima->flag & SI_SMOOTH_UV) {
       GPU_line_smooth(false);
       GPU_blend(false);
@@ -481,6 +460,7 @@ static void draw_uvs(SpaceImage *sima,
       GPU_blend(false);
     }
   }
+
   if (batch->verts || batch->facedots) {
     UI_GetThemeColor4fv(TH_VERTEX_SELECT, col2);
     if (batch->verts) {
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 1d6a5031d7e..0f7e804de9e 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -210,6 +210,7 @@ data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_varying_color_outline_
 data_to_c_simple(shaders/gpu_shader_2D_edituvs_points_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_edituvs_facedots_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_edituvs_edges_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_edituvs_edges_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_edituvs_faces_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_edituvs_stretch_vert.glsl SRC)
 
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 8c03567b95f..711147a61e9 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -117,6 +117,7 @@ extern char datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_aa_ve
 extern char datatoc_gpu_shader_2D_edituvs_points_vert_glsl[];
 extern char datatoc_gpu_shader_2D_edituvs_facedots_vert_glsl[];
 extern char datatoc_gpu_shader_2D_edituvs_edges_vert_glsl[];
+extern char datatoc_gpu_shader_2D_edituvs_edges_frag_glsl[];
 extern char datatoc_gpu_shader_2D_edituvs_faces_vert_glsl[];
 extern char datatoc_gpu_shader_2D_edituvs_stretch_vert_glsl[];
 
@@ -1171,12 +1172,12 @@ static const GPUShaderStages builtin_shader_stages[GPU_SHADER_BUILTIN_LEN] = {
     [GPU_SHADER_2D_UV_EDGES] =
         {
             .vert = datatoc_gpu_shader_2D_edituvs_edges_vert_glsl,
-            .frag = datatoc_gpu_shader_flat_color_frag_glsl,
+            .frag = datatoc_gpu_shader_2D_edituvs_edges_frag_glsl,
         },
     [GPU_SHADER_2D_UV_EDGES_SMOOTH] =
         {
             .vert = datatoc_gpu_shader_2D_edituvs_edges_vert_glsl,
-            .frag = datatoc_gpu_shader_2D_smooth_color_frag_glsl,
+            .frag = datatoc_gpu_shader_2D_edituvs_edges_frag_glsl,
             .defs = "#define SMOOTH_COLOR\n",
         },
     [GPU_SHADER_2D_UV_FACES] =
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_frag.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_frag.glsl
new file mode 100644
index 00000000000..108fc85c4a5
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_frag.glsl
@@ -0,0 +1,30 @@
+
+
+uniform float dashWidth;
+
+#ifdef SMOOTH_COLOR
+noperspective in vec4 finalColor;
+#else
+flat in vec4 finalColor;
+#endif
+
+noperspective in vec2 stipple_pos;
+flat in vec2 stipple_start;
+
+out vec4 fragColor;
+
+void main()
+{
+  fragColor = finalColor;
+
+  /* Avoid passing viewport size */
+  vec2 dd = fwidth(stipple_pos);
+
+  float dist = distance(stipple_start, stipple_pos) / max(dd.x, dd.y);
+
+  if (fract(dist / dashWidth) > 0.5) {
+    fragColor.rgb = vec3(0.0);
+  }
+
+  fragColor = blender_srgb_to_framebuffer_space(fragColor);
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl
index 02bbe545436..69fe5c93a61 100644
--- a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl
@@ -12,6 +12,9 @@ noperspective out vec4 finalColor;
 flat out vec4 finalColor;
 #endif
 
+noperspective out vec2 stipple_pos;
+flat out vec2 stipple_start;
+
 /* TODO: Port drawing to draw manager and
  * remove constants duplications. */
 #define VERT_UV_SELECT (1 << 3)
@@ -28,5 +31,8 @@ void main()
   gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
   gl_Position.z = float(!is_select);
 
+  /* Avoid precision loss. */
+  stipple_start = stipple_pos = 500.0 + 500.0 * (gl_Position.xy / gl_Position.w);
+
   finalColor = (is_select) ? selectColor : edgeColor;
 }



More information about the Bf-blender-cvs mailing list