61 lines
1.4 KiB
GLSL
61 lines
1.4 KiB
GLSL
#ifdef __cplusplus
|
|
#include <string>
|
|
const std::string shader_2d_line_vert = R"("
|
|
#version 460
|
|
|
|
layout(std430, binding = 0) buffer TVertex
|
|
{
|
|
vec4 vertex[];
|
|
};
|
|
|
|
layout (std140) uniform GlobalMatrices
|
|
{
|
|
mat4 projection;
|
|
mat4 ortho;
|
|
mat4 view;
|
|
mat4 pvm;
|
|
mat4 ovm;
|
|
};
|
|
uniform vec2 u_resolution;
|
|
uniform float u_thickness;
|
|
|
|
void main()
|
|
{
|
|
int line_i = gl_VertexID / 6;
|
|
int tri_i = gl_VertexID % 6;
|
|
|
|
vec4 va[4];
|
|
for (int i=0; i<4; ++i)
|
|
{
|
|
va[i] = ovm * vertex[line_i+i];
|
|
va[i].xyz /= va[i].w;
|
|
va[i].xy = (va[i].xy + 1.0) * 0.5 * u_resolution;
|
|
}
|
|
|
|
vec2 v_line = normalize(va[2].xy - va[1].xy);
|
|
vec2 nv_line = vec2(-v_line.y, v_line.x);
|
|
|
|
vec4 pos;
|
|
if (tri_i == 0 || tri_i == 1 || tri_i == 3)
|
|
{
|
|
vec2 v_pred = normalize(va[1].xy - va[0].xy);
|
|
vec2 v_miter = normalize(nv_line + vec2(-v_pred.y, v_pred.x));
|
|
|
|
pos = va[1];
|
|
pos.xy += v_miter * u_thickness * (tri_i == 1 ? -0.5 : 0.5) / dot(v_miter, nv_line);
|
|
}
|
|
else
|
|
{
|
|
vec2 v_succ = normalize(va[3].xy - va[2].xy);
|
|
vec2 v_miter = normalize(nv_line + vec2(-v_succ.y, v_succ.x));
|
|
|
|
pos = va[2];
|
|
pos.xy += v_miter * u_thickness * (tri_i == 5 ? 0.5 : -0.5) / dot(v_miter, nv_line);
|
|
}
|
|
|
|
pos.xy = pos.xy / u_resolution * 2.0 - 1.0;
|
|
pos.xyz *= pos.w;
|
|
gl_Position = pos;
|
|
}
|
|
")";
|
|
#endif |