#version 450 core #pragma include ./tail_render_shared.glsl #pragma include ../misc/camera.glsl /* Vertex Layout: .-- 0 --- 3 --- 6 --- 9 --- 12 --- 15 / | \ | \ | \ | \ | \ | SHIP ----- 1 --- 4 --- 7 --- 10 --- 13 --- 16 \ | / | / | / | / | / | `-- 2 --- 5 --- 8 --- 11 --- 14 --- 17 */ in VertexData vertexData[]; layout (points) in; layout (triangle_strip, max_vertices = 24) out; out FragmentData fragmentData; struct Vertex { vec2 pos; vec4 clr; }; vec2 ortho2(vec2 pos, vec2 ref) { vec2 dir = normalize(pos - ref); return vec2(dir.y, -dir.x); } vec2 ortho3(vec2 ref0, vec2 pos, vec2 ref1) { vec2 dir0 = ortho2(ref0, pos); vec2 dir1 = ortho2(pos, ref1); return normalize(dir0 + dir1); } void emit(Vertex v) { gl_Position = uCamera.projection * uCamera.view * vec4(v.pos, 0.0, 1.0); fragmentData.color = v.clr; EmitVertex(); } void main() { VertexData d = vertexData[0]; vec2 ortho; Vertex vertices[18]; /* tail[0] */ ortho = ortho2(d.tail[0], d.tail[1]); vertices[0].pos = d.tail[0] + TAIL_WIDTH * ortho; vertices[0].clr = vec4(d.color, 0.8 * TAIL_ALPHA); vertices[1].pos = d.tail[0]; vertices[1].clr = vec4(d.color, 1.0 * TAIL_ALPHA); vertices[2].pos = d.tail[0] - TAIL_WIDTH * ortho; vertices[2].clr = vec4(d.color, 0.8 * TAIL_ALPHA); /* tail[1] */ ortho = ortho3(d.tail[0], d.tail[1], d.tail[2]); vertices[3].pos = d.tail[1] + TAIL_WIDTH * ortho; vertices[3].clr = vec4(d.color, 0.6 * TAIL_ALPHA); vertices[4].pos = d.tail[1]; vertices[4].clr = vec4(d.color, 0.8 * TAIL_ALPHA); vertices[5].pos = d.tail[1] - TAIL_WIDTH * ortho; vertices[5].clr = vec4(d.color, 0.6 * TAIL_ALPHA); /* tail[2] */ ortho = ortho3(d.tail[1], d.tail[2], d.tail[3]); vertices[6].pos = d.tail[2] + TAIL_WIDTH * ortho; vertices[6].clr = vec4(d.color, 0.4 * TAIL_ALPHA); vertices[7].pos = d.tail[2]; vertices[7].clr = vec4(d.color, 0.6 * TAIL_ALPHA); vertices[8].pos = d.tail[2] - TAIL_WIDTH * ortho; vertices[8].clr = vec4(d.color, 0.4 * TAIL_ALPHA); /* tail[3] */ ortho = ortho3(d.tail[2], d.tail[3], d.tail[4]); vertices[9].pos = d.tail[3] + TAIL_WIDTH * ortho; vertices[9].clr = vec4(d.color, 0.2 * TAIL_ALPHA); vertices[10].pos = d.tail[3]; vertices[10].clr = vec4(d.color, 0.4 * TAIL_ALPHA); vertices[11].pos = d.tail[3] - TAIL_WIDTH * ortho; vertices[11].clr = vec4(d.color, 0.2 * TAIL_ALPHA); /* tail[4] */ ortho = ortho3(d.tail[3], d.tail[4], d.tail[5]); vertices[12].pos = d.tail[4] + TAIL_WIDTH * ortho; vertices[12].clr = vec4(d.color, 0.0 * TAIL_ALPHA); vertices[13].pos = d.tail[4]; vertices[13].clr = vec4(d.color, 0.2 * TAIL_ALPHA); vertices[14].pos = d.tail[4] - TAIL_WIDTH * ortho; vertices[14].clr = vec4(d.color, 0.0 * TAIL_ALPHA); /* tail[5] */ ortho = ortho2(d.tail[4], d.tail[5]); vertices[15].pos = d.tail[5] + TAIL_WIDTH * ortho; vertices[15].clr = vec4(d.color, 0.0 * TAIL_ALPHA); vertices[16].pos = d.tail[5]; vertices[16].clr = vec4(d.color, 0.0 * TAIL_ALPHA); vertices[17].pos = d.tail[5] - TAIL_WIDTH * ortho; vertices[17].clr = vec4(d.color, 0.0 * TAIL_ALPHA); /* emit */ emit(vertices[1]); emit(vertices[0]); emit(vertices[4]); emit(vertices[3]); emit(vertices[7]); emit(vertices[6]); emit(vertices[10]); emit(vertices[9]); emit(vertices[13]); emit(vertices[12]); emit(vertices[16]); emit(vertices[15]); EndPrimitive(); emit(vertices[1]); emit(vertices[2]); emit(vertices[4]); emit(vertices[5]); emit(vertices[7]); emit(vertices[8]); emit(vertices[10]); emit(vertices[11]); emit(vertices[13]); emit(vertices[14]); emit(vertices[16]); emit(vertices[17]); EndPrimitive(); }