spoiler_vertex.glsl 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #version 300 es
  2. precision highp float;
  3. layout(location = 0) in vec2 inPosition;
  4. layout(location = 1) in vec2 inVelocity;
  5. layout(location = 2) in float inTime;
  6. layout(location = 3) in float inDuration;
  7. out vec2 outPosition;
  8. out vec2 outVelocity;
  9. out float outTime;
  10. out float outDuration;
  11. out float alpha;
  12. uniform float reset;
  13. uniform float time;
  14. uniform float deltaTime;
  15. uniform vec2 size;
  16. uniform float r;
  17. uniform float seed;
  18. uniform float noiseScale;
  19. uniform float noiseSpeed;
  20. uniform float noiseMovement;
  21. uniform float dampingMult;
  22. uniform float forceMult;
  23. uniform float velocityMult;
  24. uniform float longevity;
  25. uniform float maxVelocity;
  26. float rand(vec2 n) {
  27. return fract(sin(dot(n,vec2(12.9898,4.1414-seed*.42)))*43758.5453);
  28. }
  29. vec4 loop(vec4 p) {
  30. p.xy = fract(p.xy / noiseScale) * noiseScale;
  31. p.zw = fract(p.zw / noiseScale) * noiseScale;
  32. return p;
  33. }
  34. vec3 loop(vec3 p) {
  35. p.xy = fract(p.xy / noiseScale) * noiseScale;
  36. return p;
  37. }
  38. float mod289(float x){return x-floor(x*(1./(289.+seed)))*(289.+seed);}
  39. vec4 mod289(vec4 x){return x-floor(x*(1./(289.+seed)))*(289.0+seed);}
  40. vec4 perm(vec4 x){return mod289(((x*34.)+1.)*x);}
  41. float noise(vec3 p){
  42. vec3 a = floor(p);
  43. vec3 d = p - a;
  44. d = d * d * (3. - 2. * d);
  45. vec4 b = a.xxyy + vec4(0., 1., 0., 1.);
  46. vec4 k1 = perm(loop(b.xyxy));
  47. vec4 k2 = perm(loop(k1.xyxy + b.zzww));
  48. vec4 c = k2 + a.zzzz;
  49. vec4 k3 = perm(c);
  50. vec4 k4 = perm(c + 1.0);
  51. vec4 o3 = fract(k4 / 41.0) * d.z + fract(k3 / 41.0) * (1.0 - d.z);
  52. vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);
  53. return o4.y * d.y + o4.x * (1.0 - d.y);
  54. }
  55. vec3 grad(vec3 p) {
  56. const vec2 e = vec2(.1, .0);
  57. return vec3(
  58. noise(loop(p + e.xyy)) - noise(loop(p - e.xyy)),
  59. noise(loop(p + e.yxy)) - noise(loop(p - e.yxy)),
  60. noise(loop(p + e.yyx)) - noise(loop(p - e.yyx))
  61. ) / (2.0 * e.x);
  62. }
  63. vec3 curlNoise(vec3 p) {
  64. p.xy /= size;
  65. p.x *= (size.x / size.y);
  66. p.xy = fract(p.xy);
  67. p.xy *= noiseScale;
  68. const vec2 e = vec2(.01, .0);
  69. return grad(loop(p)).yzx - vec3(
  70. grad(loop(p + e.yxy)).z,
  71. grad(loop(p + e.yyx)).x,
  72. grad(loop(p + e.xyy)).y
  73. );
  74. }
  75. void main() {
  76. vec2 position = inPosition;
  77. vec2 velocity = inVelocity;
  78. float particleDuration = inDuration;
  79. float particleTime = inTime + deltaTime * particleDuration / longevity;
  80. if (reset > 0.) {
  81. particleTime = rand(vec2(-94.3, 83.9) * vec2(gl_VertexID, gl_VertexID));
  82. particleDuration = .5 + 2. * rand(vec2(gl_VertexID) + seed * 32.4);
  83. position = size * vec2(
  84. rand(vec2(42., -3.) * vec2(cos(float(gl_VertexID) - seed), gl_VertexID)),
  85. rand(vec2(-3., 42.) * vec2(time * time, sin(float(gl_VertexID) + seed)))
  86. );
  87. velocity = vec2(0.);
  88. } else if (particleTime >= 1.) {
  89. particleTime = 0.0;
  90. particleDuration = .5 + 2. * rand(vec2(gl_VertexID) + position);
  91. velocity = vec2(0.);
  92. }
  93. float msz = min(size.x, size.y);
  94. vec2 force = normalize(curlNoise(
  95. vec3(
  96. position + time * (noiseMovement / 100. * msz),
  97. time * noiseSpeed + rand(position) * 2.5
  98. )
  99. ).xy);
  100. velocity += force * forceMult * deltaTime * msz * .1;
  101. velocity *= dampingMult;
  102. float vlen = length(velocity);
  103. float maxVelocityPx = maxVelocity / 100. * msz;
  104. if (vlen > maxVelocityPx) {
  105. velocity = velocity / vlen * maxVelocityPx;
  106. }
  107. position += velocity * velocityMult * deltaTime;
  108. position = fract(position / size) * size;
  109. outPosition = position;
  110. outVelocity = velocity;
  111. outTime = particleTime;
  112. outDuration = particleDuration;
  113. gl_PointSize = r;
  114. gl_Position = vec4((position / size * 2.0 - vec2(1.0)), 0.0, 1.0);
  115. alpha = sin(particleTime * 3.14) * (.6 + .4 * rand(vec2(gl_VertexID)));
  116. }
  117. // @dkaraush