#version 450 core #pragma include ./tail_update_shared.glsl #pragma include ../misc/global.glsl in VertexData vertexData[]; layout (points) in; layout (points, max_vertices = 1) out; out vec2 outTail0; out vec2 outTail1; out vec2 outTail2; out vec2 outTail3; out vec2 outTail4; out vec2 outTail5; vec2 move(vec2 ref, vec2 point) { vec2 dir = ref - point; float len = length(dir); float diff = max(len - TAIL_LEN, 0.0); float force = min(TAIL_FORCE * diff * uGlobal.delta, diff); return point + normalize(dir) * force; } void main() { VertexData d = vertexData[0]; outTail0 = d.pos; outTail1 = move(d.pos, d.tail[1]); outTail2 = move(d.tail[1], d.tail[2]); outTail3 = move(d.tail[2], d.tail[3]); outTail4 = move(d.tail[3], d.tail[4]); outTail5 = move(d.tail[4], d.tail[5]); EmitVertex(); EndPrimitive(); }