[Bf-blender-cvs] [75c39c8d23d] tmp-overlay-engine: Cleanup: Remove stipple start position duplication

Clément Foucault noreply at git.blender.org
Tue Nov 19 00:45:35 CET 2019


Commit: 75c39c8d23df0760ab0c7e28b0c949b3aaf3fdc5
Author: Clément Foucault
Date:   Tue Nov 19 00:41:04 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB75c39c8d23df0760ab0c7e28b0c949b3aaf3fdc5

Cleanup: Remove stipple start position duplication

Removes 3 floats per stipple vert. Using the same technique we could
remove the need for geom shader for GPU internal shader shader.

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

M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl
M	source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl

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

diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index cb0b06c3acb..bdf56f44933 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -194,7 +194,7 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
       grp = DRW_shgroup_create(sh, extra_ps);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
 
-      cb->extra_dashed_lines = BUF_LINE(grp, formats->wire_dashed_extra);
+      cb->extra_dashed_lines = BUF_LINE(grp, formats->pos_color);
       cb->extra_lines = BUF_LINE(grp, formats->wire_extra);
     }
     {
@@ -244,8 +244,8 @@ void OVERLAY_extra_line_dashed(OVERLAY_ExtraCallBuffers *cb,
                                const float end[3],
                                const float color[4])
 {
-  DRW_buffer_add_entry(cb->extra_dashed_lines, start, start, color);
-  DRW_buffer_add_entry(cb->extra_dashed_lines, end, start, color);
+  DRW_buffer_add_entry(cb->extra_dashed_lines, end, color);
+  DRW_buffer_add_entry(cb->extra_dashed_lines, start, color);
 }
 
 void OVERLAY_extra_line(OVERLAY_ExtraCallBuffers *cb,
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index d7650612468..c64f4352c05 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -344,7 +344,6 @@ typedef struct OVERLAY_InstanceFormats {
   struct GPUVertFormat *pos;
   struct GPUVertFormat *pos_color;
   struct GPUVertFormat *wire_extra;
-  struct GPUVertFormat *wire_dashed_extra;
 } OVERLAY_InstanceFormats;
 
 void OVERLAY_armature_cache_init(OVERLAY_Data *vedata);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index d916467073a..e3bdf43620d 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -1310,12 +1310,6 @@ OVERLAY_InstanceFormats *OVERLAY_shader_instance_formats_get(void)
                                   {"color", DRW_ATTR_FLOAT, 4},
                                   {"inst_obmat", DRW_ATTR_FLOAT, 16},
                               });
-  DRW_shgroup_instance_format(g_formats.wire_dashed_extra,
-                              {
-                                  {"pos", DRW_ATTR_FLOAT, 3},
-                                  {"dash_pos", DRW_ATTR_FLOAT, 3},
-                                  {"color", DRW_ATTR_FLOAT, 4},
-                              });
   DRW_shgroup_instance_format(g_formats.wire_extra,
                               {
                                   {"pos", DRW_ATTR_FLOAT, 3},
diff --git a/source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl b/source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl
index da0399ad348..3281d0f8f9a 100644
--- a/source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl
@@ -1,7 +1,9 @@
 
 uniform vec4 color;
 
-noperspective in vec4 finalColor;
+noperspective in vec2 stipple_coord;
+flat in vec2 stipple_start;
+flat in vec4 finalColor;
 
 out vec4 fragColor;
 
@@ -9,16 +11,14 @@ void main()
 {
   fragColor = finalColor;
 
-  if (fragColor.a < 0.0) {
-    /* Stipple */
-    const float dash_width = 6.0;
-    const float dash_factor = 0.5;
+  /* Stipple */
+  const float dash_width = 6.0;
+  const float dash_factor = 0.5;
 
-    float dist = abs(fragColor.a);
-    fragColor.a = 1.0;
+  float dist = distance(stipple_start, stipple_coord);
+  fragColor.a = 1.0;
 
-    if (fract(dist / dash_width) > dash_factor) {
-      discard;
-    }
+  if (fract(dist / dash_width) > dash_factor) {
+    discard;
   }
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl b/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
index 892ff02680a..bd807bd2683 100644
--- a/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
@@ -1,10 +1,11 @@
 
 in vec3 pos;
-in vec3 dash_pos; /* Start point of the stippling pattern. */
 in vec4 color;
 in int colorid; /* if equal 0 (i.e: Not specified) use color attrib and stippling. */
 
-noperspective out vec4 finalColor;
+noperspective out vec2 stipple_coord;
+flat out vec2 stipple_start;
+flat out vec4 finalColor;
 
 vec2 screen_position(vec4 p)
 {
@@ -14,36 +15,25 @@ vec2 screen_position(vec4 p)
 
 void main()
 {
+  vec3 world_pos = point_object_to_world(pos);
+  gl_Position = point_world_to_ndc(world_pos);
+
+  stipple_coord = stipple_start = vec2(0.0);
+
 #ifdef OBJECT_WIRE
   /* Extract data packed inside the unused mat4 members. */
-  mat4 obmat = ModelMatrix;
-  finalColor = vec4(obmat[0][3], obmat[1][3], obmat[2][3], obmat[3][3]);
-  obmat[0][3] = obmat[1][3] = obmat[2][3] = 0.0;
-  obmat[3][3] = 1.0;
-
-  vec3 world_pos = (ModelMatrix * vec4(pos, 1.0)).xyz;
+  finalColor = vec4(ModelMatrix[0][3], ModelMatrix[1][3], ModelMatrix[2][3], ModelMatrix[3][3]);
 #else
-  vec3 world_pos = point_object_to_world(pos);
 
   if (colorid == TH_CAMERA_PATH) {
     finalColor = colorCameraPath;
   }
   else {
     finalColor = color;
-
-    world_pos = point_object_to_world(dash_pos);
-
-    vec2 s0 = screen_position(gl_Position);
-
-    vec4 p = point_world_to_ndc(world_pos);
-    vec2 s1 = screen_position(p);
-    /* Put Stipple distance in alpha. */
-    finalColor.a = -distance(s0, s1);
+    stipple_coord = stipple_start = screen_position(gl_Position);
   }
 #endif
 
-  gl_Position = point_world_to_ndc(world_pos);
-
 #ifdef USE_WORLD_CLIP_PLANES
   world_clip_planes_calc_clip_distance(world_pos);
 #endif



More information about the Bf-blender-cvs mailing list