[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