You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.6 KiB

  1. #version 450 core
  2. #pragma include ./shared.glsl
  3. #pragma include ../../misc/camera.glsl
  4. in FragmentData fragmentData;
  5. uniform vec2 uRings;
  6. uniform vec2 uMarker;
  7. uniform float uProgress;
  8. uniform float uSize;
  9. uniform float uValue;
  10. out vec4 outColor;
  11. const float RING_STRENGTH = 0.0000;
  12. const float RING_BLUR = 0.0020;
  13. const float MARKER_STRENGTH = 0.0000;
  14. const float MARKER_BLUR = 0.0020;
  15. const vec2 VEC_HORZ = vec2(1.0, 0.0);
  16. const float PI = 3.1415926535897932384626433832795;
  17. float smoothstep2(float b0, float b1, float b2, float b3, float v) {
  18. return smoothstep(b0, b1, v) * (1.0 - smoothstep(b2, b3, v));
  19. }
  20. float calcLine(float actual, float expected, float strength, float blur)
  21. {
  22. return smoothstep2(
  23. expected - strength - blur,
  24. expected - strength,
  25. expected + strength,
  26. expected + strength + blur,
  27. actual);
  28. }
  29. float calcAngle(vec2 v1, vec2 v2)
  30. {
  31. v1 = -v1;
  32. return -atan(
  33. v1.x * v2.y - v1.y * v2.x,
  34. v1.x * v2.x + v1.y * v2.y);
  35. }
  36. float random(float seed) {
  37. return fract(sin(dot(vec4(seed), vec4(12.9898, 78.233, 45.164, 53.1324))) * 43758.5453);
  38. }
  39. float animate(float v0, float v1, float t) {
  40. float x = t * t * (3.0 - 2.0 * t);
  41. return v0 + x * (v1 - v0);
  42. }
  43. void main() {
  44. float ts = clamp(uProgress, 0.0, 1.0);
  45. float te = clamp(uProgress - 1.0, 0.0, 1.0);
  46. float r = length(fragmentData.texCoords);
  47. float zoom = pow(length(uCamera.view[0].xyz), 0.5);
  48. float angle = calcAngle(fragmentData.texCoords, VEC_HORZ);
  49. /* marker */
  50. float m = calcAngle(uMarker, VEC_HORZ);
  51. m = calcLine(angle, m, MARKER_STRENGTH / r / zoom, MARKER_BLUR / r / zoom);
  52. m *= smoothstep2(
  53. ts * (uRings[0] - 0.25),
  54. ts * uRings[0],
  55. ts * uRings[1],
  56. ts * (uRings[1] + 0.10),
  57. r);
  58. m *= 0.75;
  59. /* rings */
  60. float f = angle / PI + 1.0;
  61. f = f * 2.0;
  62. f = fract(f + 0.5);
  63. f = smoothstep2(
  64. 0.0 - (ts - 0.5),
  65. 0.2 - (ts - 0.5),
  66. 0.8 + (ts - 0.5),
  67. 1.0 + (ts - 0.5),
  68. f);
  69. float r0 = 0.25 * f * calcLine(r, animate(uSize, uRings[0], ts), RING_STRENGTH / zoom, RING_BLUR / zoom);
  70. float r1 = 0.25 * f * calcLine(r, animate(uSize, uRings[1], ts), RING_STRENGTH / zoom, RING_BLUR / zoom);
  71. float v = 0.75 * f * calcLine(r, animate(uSize, uValue, ts), RING_STRENGTH / zoom, RING_BLUR / zoom);
  72. /* alpha */
  73. float as = step(1.0 - ts, random(uProgress));
  74. float ae = (1.0 - te) * step(te, random(uProgress));
  75. float a = as * ae;
  76. /* put together */
  77. vec3 rgb = vec3(1.0);
  78. outColor = vec4(rgb, (v + r0 + r1 + m) * a + uSize * 0.0001);
  79. }