diff options
Diffstat (limited to 'source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl')
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl b/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl index 85aab7e06ef..1bca505390b 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_line_dashed_frag.glsl @@ -1,6 +1,5 @@ // Draw dashed lines, perforated in screen space. -// Based on a (3D) version by Mike Erwin. #if __VERSION__ == 120 noperspective varying float distance_along_line; @@ -11,15 +10,38 @@ #endif uniform float dash_width; -uniform float dash_width_on; -uniform vec4 color1; -uniform vec4 color2; + +/* Simple mode, discarding non-dash parts (so no need for blending at all). */ +uniform float dash_factor; /* if > 1.0, solid line. */ +uniform vec4 color; + +/* More advanced mode, allowing for complex, multi-colored patterns. Enabled when num_colors > 0. */ +/* Note: max number of steps/colors in pattern is 32! */ +uniform int num_colors; /* Enabled if > 0, 1 for solid line. */ +uniform vec4 colors[32]; void main() { - if (mod(distance_along_line, dash_width) <= dash_width_on) { - fragColor = color1; - } else { - fragColor = color2; + /* Solid line cases, simple. */ + if (num_colors == 1) { + fragColor = colors[0]; + } + else if (dash_factor >= 1.0f) { + fragColor = color; + } + else { + /* Actually dashed line... */ + float normalized_distance = fract(distance_along_line / dash_width); + if (num_colors > 0) { + fragColor = colors[int(normalized_distance * num_colors)]; + } + else { + if (normalized_distance <= dash_factor) { + fragColor = color; + } + else { + discard; + } + } } } |