amethyst_renderer 0.10.4

High-level rendering engine with multiple backends
// TODO: Needs documentation.

#version 150 core

layout (std140) uniform VertexArgs {
    uniform mat4 proj;
    uniform mat4 view;
    uniform mat4 model; /* Not actually used, all our lines are in world coordinates */
};

in VertexData {
    vec3 position;
    vec4 color;
    vec3 normal;
} vertex_in[1];

out VertexData {
    vec3 position;
    vec4 color;
    vec3 normal;
} vertex;

layout (points) in;
layout (triangle_strip, max_vertices = 4) out;

uniform vec3 camera_position;
uniform float line_width;

void EmitLine (int id) {
    vec3 cam_dir = normalize(vertex_in[id].position - camera_position);
    vec3 right = normalize(cross(cam_dir, vertex_in[id].normal));

    vec3 width_vector = right * line_width * 0.5;

    vertex.color = vertex_in[id].color;
    vec3 pos = vertex_in[id].position - width_vector;
    gl_Position = proj * view * vec4(pos, 1.0);
    EmitVertex();

    vertex.color = vertex_in[id].color;
    pos = vertex_in[id].position + width_vector;
    gl_Position = proj * view * vec4(pos, 1.0);
    EmitVertex();

    vertex.color = vertex_in[id].color;
    pos = vertex_in[id].position + vertex_in[id].normal - width_vector;
    gl_Position = proj * view * vec4(pos, 1.0);
    EmitVertex();

    vertex.color = vertex_in[id].color;
    pos = vertex_in[id].position + vertex_in[id].normal + width_vector;
    gl_Position = proj * view * vec4(pos, 1.0);
    EmitVertex();
    EndPrimitive();
}

void main() {
    EmitLine(0);
}