glowygraph 0.8.0

A library for drawing glowy graphs
Documentation
#version 150

in vec2 position0;
in vec2 position1;
in vec2 position2;
in vec4 inner_color0;
in vec4 inner_color1;
in float falloff0;
in float falloff1;
in vec4 falloff_color0;
in vec4 falloff_color1;
in float falloff_radius0;
in float falloff_radius1;
in float inner_radius0;
in float inner_radius1;

out vec2 gposition0;
out vec2 gposition1;
out vec2 gposition2;
out vec4 ginner_color0;
out vec4 ginner_color1;
out float gfalloff0;
out float gfalloff1;
out vec4 gfalloff_color0;
out vec4 gfalloff_color1;
out float gfalloff_radius0;
out float gfalloff_radius1;
out float ginner_radius0;
out float ginner_radius1;

uniform mat3 modelview;

void main() {
    vec2 wigglepos1;
    // Determine if we need to wiggle
    vec2 norm02 = normalize(position2 - position0);
    vec2 norm12 = normalize(position2 - position1);
    float flatness = dot(norm02, norm12);
    // We must wiggle (angle incredibly small or flat)
    if (flatness > 0.995) {
        // If its perfectly flat, we cant know the direction to wiggle, so we must go perpendicular to the norm02
        vec2 wiggle_vector = vec2(-norm02.y, norm02.x);
        float scale = length(position2 - position1);
        // Wiggle by 2 percent of the scale
        wigglepos1 = position1 + 0.005 * scale * wiggle_vector;
    } else {
        wigglepos1 = position1;
    }
    // Find clockwise vs counter-clockwise
    float cc =
        (wigglepos1.x - position0.x) * (wigglepos1.y + position0.y) +
        (position2.x - wigglepos1.x) * (position2.y + wigglepos1.y) +
        (position0.x - position2.x) * (position0.y + position2.y);
    gposition1 = (modelview * vec3(wigglepos1, 1.0)).xy;
    if (cc > 0.0) {
        gposition0 = (modelview * vec3(position0, 1.0)).xy;
        gposition2 = (modelview * vec3(position2, 1.0)).xy;
        ginner_color0 = inner_color0;
        ginner_color1 = inner_color1;
        gfalloff0 = falloff0;
        gfalloff1 = falloff1;
        gfalloff_color0 = falloff_color0;
        gfalloff_color1 = falloff_color1;
        gfalloff_radius0 = falloff_radius0;
        gfalloff_radius1 = falloff_radius1;
        ginner_radius0 = inner_radius0;
        ginner_radius1 = inner_radius1;
    } else {
        gposition0 = (modelview * vec3(position2, 1.0)).xy;
        gposition2 = (modelview * vec3(position0, 1.0)).xy;
        ginner_color0 = inner_color1;
        ginner_color1 = inner_color0;
        gfalloff0 = falloff1;
        gfalloff1 = falloff0;
        gfalloff_color0 = falloff_color1;
        gfalloff_color1 = falloff_color0;
        gfalloff_radius0 = falloff_radius1;
        gfalloff_radius1 = falloff_radius0;
        ginner_radius0 = inner_radius1;
        ginner_radius1 = inner_radius0;
    }
}