Chillzy

Untitled

Nov 6th, 2024
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.10 KB | Source Code | 0 0
  1. // Based on: https://github.com/frozein/VkGalaxy/blob/main/assets/shaders/particle.vert
  2. #version 450
  3.  
  4. #define RANDOM_IA 16807
  5. #define RANDOM_IM 2147483647
  6. #define RANDOM_AM 1.0 / float(RANDOM_IM)
  7. #define RANDOM_IQ 127773
  8. #define RANDOM_IR 2836
  9. #define RANDOM_MASK 123459876
  10.  
  11. int _SEED = 0;
  12.  
  13. void srand_cycle()
  14. {
  15.     _SEED ^= RANDOM_MASK;
  16.     int k = _SEED / RANDOM_IQ;
  17.     _SEED = RANDOM_IA * (_SEED - k * RANDOM_IQ) - RANDOM_IR * k;
  18.  
  19.     if (_SEED < 0)
  20.         _SEED += RANDOM_IM;
  21.  
  22.     _SEED ^= RANDOM_MASK;
  23. }
  24.  
  25. void srand_set(int seed)
  26. {
  27.     _SEED = seed;
  28.     srand_cycle();
  29. }
  30.  
  31. float rand()
  32. {
  33.     srand_cycle();
  34.     return RANDOM_AM * _SEED;
  35. }
  36.  
  37. #define NUM_VERTICES 6
  38. const vec3 VERTICES[NUM_VERTICES] =
  39. {
  40.     vec3(-0.5, 0.0, -0.5),
  41.     vec3( 0.5, 0.0, -0.5),
  42.     vec3(-0.5, 0.0,  0.5),
  43.     vec3( 0.5, 0.0, -0.5),
  44.     vec3(-0.5, 0.0,  0.5),
  45.     vec3( 0.5, 0.0,  0.5)
  46. };
  47.  
  48. layout (location = 0) out vec2 out_tex;
  49. layout (location = 1) out float temperature;
  50. layout (location = 2) out flat uint out_type;
  51.  
  52. struct particle
  53. {
  54.     vec2 pos;
  55.     float height;
  56.     float angle;
  57.     float tilt;
  58.     float vel;
  59.     float opacity;
  60.     float temp;
  61. };
  62.  
  63. layout (push_constant) uniform particle_info
  64. {
  65.     uint star_count;
  66.     float time;
  67.     float min_temp, max_temp;
  68.     float star_size, dust_size, h2size;
  69.     float h2dist;
  70. }   info;
  71.  
  72. layout (binding = 0) uniform camera_info
  73. {
  74.     mat4 proj_view;
  75. }   camera;
  76.  
  77. layout (std140, binding = 1) readonly buffer stars
  78. {
  79.     particle particles[];
  80. } particles;
  81.  
  82. float ease_in_circ(float x)
  83. {
  84.     return x >= 1.0 ? 1.0 : 1.0 - sqrt(1.0 - x * x);
  85. }
  86.  
  87. vec2 calc_pos(particle p)
  88. {
  89.     float angle = p.angle + p.vel * info.time;
  90.  
  91.     float ca = cos(angle);
  92.     float sa = sin(angle);
  93.     float ct = cos(p.tilt);
  94.     float st = sin(p.tilt);
  95.  
  96.     vec2 pos = p.pos;
  97.  
  98.     return vec2(pos.x * ca * ct - pos.y * sa * st,
  99.                 pos.x * ca * st + pos.y * sa * ct);
  100. }
  101.  
  102. void main(void)
  103. {
  104.     srand_set(gl_VertexIndex);
  105.     vec3 pos = VERTICES[gl_VertexIndex % NUM_VERTICES];
  106.     vec2 tex_pos = VERTICES[gl_VertexIndex & NUM_VERTICES].xz + vec2(0.5);
  107.  
  108.     particle p = particles.particles[gl_VertexIndex / NUM_VERTICES];
  109.     uint type = (gl_VertexIndex / NUM_VERTICES) < info.star_count ? 1 : 0;
  110.     float scale = 0.0;
  111.  
  112.     if(type == 0 && gl_VertexIndex / NUM_VERTICES % 150 == 0)
  113.         type = 2;
  114.  
  115.     if(type == 0)  // Star
  116.         scale = info.star_size;
  117.     else if(type == 1)     // Dust
  118.         scale = info.dust_size;
  119.     else    // H-2 region
  120.     {
  121.         particle h2particle = p;
  122.         h2particle.pos.x += info.h2dist;
  123.  
  124.         vec2 pos1 = calc_pos(h2particle);
  125.         vec2 pos2 = calc_pos(p);
  126.         float dist = distance(pos1, pos2);
  127.         dist = ease_in_circ(dist / info.h2dist);
  128.  
  129.         scale = info.h2size * (1.0 - dist);
  130.     }
  131.  
  132.     vec2 new_pos = calc_pos(p);
  133.     vec3 world_space = vec3(new_pos.x, p.height, new_pos.y) * scale;
  134.  
  135.     out_type = type;
  136.     temperature = info.min_temp + rand() * (info.max_temp - info.min_temp);
  137.  
  138.     gl_Position = camera.proj_view * vec4(world_space, 1.0);
  139. }
  140.  
Advertisement
Add Comment
Please, Sign In to add comment