69 lines
1.4 KiB
GLSL
69 lines
1.4 KiB
GLSL
|
|
|
||
|
|
layout(lines) in;
|
||
|
|
layout(triangle_strip, max_vertices = 4) out;
|
||
|
|
|
||
|
|
uniform vec4 color;
|
||
|
|
uniform vec2 viewportSize;
|
||
|
|
uniform float lineWidth;
|
||
|
|
|
||
|
|
#if !defined(UNIFORM)
|
||
|
|
in vec4 finalColor_g[];
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifdef CLIP
|
||
|
|
in float clip_g[];
|
||
|
|
out float clip;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
out vec4 finalColor;
|
||
|
|
noperspective out float smoothline;
|
||
|
|
|
||
|
|
#define SMOOTH_WIDTH 1.0
|
||
|
|
|
||
|
|
void do_vertex(const int i, vec2 ofs)
|
||
|
|
{
|
||
|
|
#if defined(UNIFORM)
|
||
|
|
finalColor = color;
|
||
|
|
|
||
|
|
#elif defined(FLAT)
|
||
|
|
finalColor = finalColor_g[0];
|
||
|
|
|
||
|
|
#elif defined(SMOOTH)
|
||
|
|
finalColor = finalColor_g[i];
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifdef CLIP
|
||
|
|
clip = clip_g[i];
|
||
|
|
#endif
|
||
|
|
|
||
|
|
smoothline = (lineWidth + SMOOTH_WIDTH) * 0.5;
|
||
|
|
gl_Position = gl_in[i].gl_Position;
|
||
|
|
gl_Position.xy += ofs * gl_Position.w;
|
||
|
|
EmitVertex();
|
||
|
|
|
||
|
|
smoothline = -(lineWidth + SMOOTH_WIDTH) * 0.5;
|
||
|
|
gl_Position = gl_in[i].gl_Position;
|
||
|
|
gl_Position.xy -= ofs * gl_Position.w;
|
||
|
|
EmitVertex();
|
||
|
|
}
|
||
|
|
|
||
|
|
void main(void)
|
||
|
|
{
|
||
|
|
vec2 p0 = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w;
|
||
|
|
vec2 p1 = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w;
|
||
|
|
vec2 e = normalize((p1 - p0) * viewportSize.xy);
|
||
|
|
#if 0 /* Hard turn when line direction changes quadrant. */
|
||
|
|
e = abs(e);
|
||
|
|
vec2 ofs = (e.x > e.y) ? vec2(0.0, 1.0 / e.x) : vec2(1.0 / e.y, 0.0);
|
||
|
|
#else /* Use perpendicular direction. */
|
||
|
|
vec2 ofs = vec2(-e.y, e.x);
|
||
|
|
#endif
|
||
|
|
ofs /= viewportSize.xy;
|
||
|
|
ofs *= lineWidth + SMOOTH_WIDTH;
|
||
|
|
|
||
|
|
do_vertex(0, ofs);
|
||
|
|
do_vertex(1, ofs);
|
||
|
|
|
||
|
|
EndPrimitive();
|
||
|
|
}
|