No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

161 líneas
3.9 KiB

  1. #version 450 core
  2. #pragma include ./tail_render_shared.glsl
  3. #pragma include ../misc/camera.glsl
  4. /*
  5. Vertex Layout:
  6. .-- 0 --- 3 --- 6 --- 9 --- 12 --- 15
  7. / | \ | \ | \ | \ | \ |
  8. SHIP ----- 1 --- 4 --- 7 --- 10 --- 13 --- 16
  9. \ | / | / | / | / | / |
  10. `-- 2 --- 5 --- 8 --- 11 --- 14 --- 17
  11. */
  12. in VertexData vertexData[];
  13. layout (points) in;
  14. layout (triangle_strip, max_vertices = 24) out;
  15. out FragmentData fragmentData;
  16. struct Vertex {
  17. vec2 pos;
  18. vec4 clr;
  19. };
  20. vec2 ortho2(vec2 pos, vec2 ref) {
  21. vec2 dir = normalize(pos - ref);
  22. return vec2(dir.y, -dir.x);
  23. }
  24. vec2 ortho3(vec2 ref0, vec2 pos, vec2 ref1) {
  25. vec2 dir0 = ortho2(ref0, pos);
  26. vec2 dir1 = ortho2(pos, ref1);
  27. return normalize(dir0 + dir1);
  28. }
  29. void emit(Vertex v) {
  30. gl_Position = uCamera.projection * uCamera.view * vec4(v.pos, 0.0, 1.0);
  31. fragmentData.color = v.clr;
  32. EmitVertex();
  33. }
  34. void main() {
  35. VertexData d = vertexData[0];
  36. vec2 ortho;
  37. Vertex vertices[18];
  38. /* tail[0] */
  39. ortho = ortho2(d.tail[0], d.tail[1]);
  40. vertices[0].pos = d.tail[0] + TAIL_WIDTH * ortho;
  41. vertices[0].clr = vec4(d.color, 0.8 * TAIL_ALPHA);
  42. vertices[1].pos = d.tail[0];
  43. vertices[1].clr = vec4(d.color, 1.0 * TAIL_ALPHA);
  44. vertices[2].pos = d.tail[0] - TAIL_WIDTH * ortho;
  45. vertices[2].clr = vec4(d.color, 0.8 * TAIL_ALPHA);
  46. /* tail[1] */
  47. ortho = ortho3(d.tail[0], d.tail[1], d.tail[2]);
  48. vertices[3].pos = d.tail[1] + TAIL_WIDTH * ortho;
  49. vertices[3].clr = vec4(d.color, 0.6 * TAIL_ALPHA);
  50. vertices[4].pos = d.tail[1];
  51. vertices[4].clr = vec4(d.color, 0.8 * TAIL_ALPHA);
  52. vertices[5].pos = d.tail[1] - TAIL_WIDTH * ortho;
  53. vertices[5].clr = vec4(d.color, 0.6 * TAIL_ALPHA);
  54. /* tail[2] */
  55. ortho = ortho3(d.tail[1], d.tail[2], d.tail[3]);
  56. vertices[6].pos = d.tail[2] + TAIL_WIDTH * ortho;
  57. vertices[6].clr = vec4(d.color, 0.4 * TAIL_ALPHA);
  58. vertices[7].pos = d.tail[2];
  59. vertices[7].clr = vec4(d.color, 0.6 * TAIL_ALPHA);
  60. vertices[8].pos = d.tail[2] - TAIL_WIDTH * ortho;
  61. vertices[8].clr = vec4(d.color, 0.4 * TAIL_ALPHA);
  62. /* tail[3] */
  63. ortho = ortho3(d.tail[2], d.tail[3], d.tail[4]);
  64. vertices[9].pos = d.tail[3] + TAIL_WIDTH * ortho;
  65. vertices[9].clr = vec4(d.color, 0.2 * TAIL_ALPHA);
  66. vertices[10].pos = d.tail[3];
  67. vertices[10].clr = vec4(d.color, 0.4 * TAIL_ALPHA);
  68. vertices[11].pos = d.tail[3] - TAIL_WIDTH * ortho;
  69. vertices[11].clr = vec4(d.color, 0.2 * TAIL_ALPHA);
  70. /* tail[4] */
  71. ortho = ortho3(d.tail[3], d.tail[4], d.tail[5]);
  72. vertices[12].pos = d.tail[4] + TAIL_WIDTH * ortho;
  73. vertices[12].clr = vec4(d.color, 0.0 * TAIL_ALPHA);
  74. vertices[13].pos = d.tail[4];
  75. vertices[13].clr = vec4(d.color, 0.2 * TAIL_ALPHA);
  76. vertices[14].pos = d.tail[4] - TAIL_WIDTH * ortho;
  77. vertices[14].clr = vec4(d.color, 0.0 * TAIL_ALPHA);
  78. /* tail[5] */
  79. ortho = ortho2(d.tail[4], d.tail[5]);
  80. vertices[15].pos = d.tail[5] + TAIL_WIDTH * ortho;
  81. vertices[15].clr = vec4(d.color, 0.0 * TAIL_ALPHA);
  82. vertices[16].pos = d.tail[5];
  83. vertices[16].clr = vec4(d.color, 0.0 * TAIL_ALPHA);
  84. vertices[17].pos = d.tail[5] - TAIL_WIDTH * ortho;
  85. vertices[17].clr = vec4(d.color, 0.0 * TAIL_ALPHA);
  86. /* emit */
  87. emit(vertices[1]);
  88. emit(vertices[0]);
  89. emit(vertices[4]);
  90. emit(vertices[3]);
  91. emit(vertices[7]);
  92. emit(vertices[6]);
  93. emit(vertices[10]);
  94. emit(vertices[9]);
  95. emit(vertices[13]);
  96. emit(vertices[12]);
  97. emit(vertices[16]);
  98. emit(vertices[15]);
  99. EndPrimitive();
  100. emit(vertices[1]);
  101. emit(vertices[2]);
  102. emit(vertices[4]);
  103. emit(vertices[5]);
  104. emit(vertices[7]);
  105. emit(vertices[8]);
  106. emit(vertices[10]);
  107. emit(vertices[11]);
  108. emit(vertices[13]);
  109. emit(vertices[14]);
  110. emit(vertices[16]);
  111. emit(vertices[17]);
  112. EndPrimitive();
  113. }