|
- #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();
- }
|