Cleanup: comments (long lines) in gpu
[blender.git] / source / blender / gpu / shaders / gpu_shader_2D_line_dashed_geom.glsl
1
2 /*
3  * Geometry Shader for dashed lines, with uniform multi-color(s),
4  * or any single-color, and unary thickness.
5  *
6  * Dashed is performed in screen space.
7  */
8
9 /* Make to be used with dynamic batching so no Model Matrix needed */
10 uniform mat4 ModelViewProjectionMatrix;
11 uniform vec2 viewport_size;
12
13 /* Uniforms from fragment shader,
14  * used here to optimize out useless computation in case of solid line. */
15 uniform float dash_factor; /* if > 1.0, solid line. */
16 uniform int colors_len;    /* Enabled if > 0, 1 for solid line. */
17
18 layout(lines) in;
19
20 in vec4 color_vert[];
21
22 layout(line_strip, max_vertices = 2) out;
23 noperspective out float distance_along_line;
24 noperspective out vec4 color_geom;
25
26 void main()
27 {
28   vec4 v1 = gl_in[0].gl_Position;
29   vec4 v2 = gl_in[1].gl_Position;
30
31   gl_Position = v1;
32   color_geom = color_vert[0];
33   distance_along_line = 0.0f;
34
35 #ifdef USE_WORLD_CLIP_PLANES
36   world_clip_planes_set_clip_distance(gl_in[0].gl_ClipDistance);
37 #endif
38   EmitVertex();
39
40   gl_Position = v2;
41   color_geom = color_vert[1];
42   if ((colors_len == 1) || (dash_factor >= 1.0f)) {
43     /* Solid line, optimize out distance computation! */
44     distance_along_line = 0.0f;
45   }
46   else {
47     vec2 p1 = (v1.xy / v1.w) * 0.5 + 0.5;  // <- device coordinates in [0..1] range.
48     p1 = p1 * viewport_size;               // <- 'virtual' screen coordinates.
49
50     vec2 p2 = (v2.xy / v2.w) * 0.5 + 0.5;  // <- device coordinates in [0..1] range.
51     p2 = p2 * viewport_size;               // <- 'virtual' screen coordinates.
52
53     distance_along_line = distance(p1, p2);
54   }
55
56 #ifdef USE_WORLD_CLIP_PLANES
57   world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance);
58 #endif
59   EmitVertex();
60
61   EndPrimitive();
62
63   /* Note: we could also use similar approach as diag_stripes_frag,
64    * but this would give us dashed 'anchored' to the screen, and not to one end of the line... */
65 }