Created
July 30, 2020 21:12
-
-
Save zesterer/041f3f36f4e28c0275564411479cda7d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #version 330 core | |
| #include <globals.glsl> | |
| #include <srgb.glsl> | |
| #include <random.glsl> | |
| in vec3 v_pos; | |
| in uint v_col; | |
| in uint v_norm_ao; | |
| in vec3 inst_pos; | |
| in float inst_time; | |
| in float inst_entropy; | |
| in int inst_mode; | |
| out vec3 f_pos; | |
| flat out vec3 f_norm; | |
| out vec3 f_col; | |
| out float f_ao; | |
| out float f_light; | |
| const float SCALE = 1.0 / 11.0; | |
| // Φ = Golden Ratio | |
| float PHI = 1.61803398874989484820459; | |
| float gold_noise(in vec2 xy, in float seed){ | |
| return fract(tan(distance(xy * PHI, xy) * seed) * xy.x); | |
| } | |
| // Modes | |
| const int SMOKE = 0; | |
| const int FIRE = 1; | |
| const int GUN_POWDER_SPARK = 2; | |
| // meters per second | |
| const float earth_gravity = 9.807; | |
| mat4 translate(vec3 vec){ | |
| return mat4( | |
| vec4(1.0, 0.0, 0.0, 0.0), | |
| vec4(0.0, 1.0, 0.0, 0.0), | |
| vec4(0.0, 0.0, 1.0, 0.0), | |
| vec4(vec.x, vec.y, vec.z, 1.0) | |
| ); | |
| } | |
| struct Attr { | |
| vec3 offs; | |
| float scale; | |
| vec3 col; | |
| }; | |
| float lifetime = tick.x - inst_time; | |
| vec3 linear_motion(vec3 init_offs, vec3 vel) { | |
| return init_offs + vel * lifetime; | |
| } | |
| vec3 grav_vel(float grav) { | |
| return vec3(0, 0, -grav * lifetime); | |
| } | |
| float exp_scale(float factor) { | |
| return 1 / (1 - lifetime * factor); | |
| } | |
| void main() { | |
| mat4 inst_mat = translate(inst_pos); | |
| float rand0 = hash(vec4(inst_entropy + 0)); | |
| float rand1 = hash(vec4(inst_entropy + 1)); | |
| float rand2 = hash(vec4(inst_entropy + 2)); | |
| float rand3 = hash(vec4(inst_entropy + 3)); | |
| float rand4 = hash(vec4(inst_entropy + 4)); | |
| float rand5 = hash(vec4(inst_entropy + 5)); | |
| float rand6 = hash(vec4(inst_entropy + 6)); | |
| float rand7 = hash(vec4(inst_entropy + 7)); | |
| Attr attr; | |
| if (inst_mode == SMOKE) { | |
| attr = Attr( | |
| linear_motion( | |
| vec3(rand0 * 0.25, rand1 * 0.25, 1.7 + rand5), | |
| vec3(rand2 * 0.2, rand3 * 0.2, 1.0 + rand4 * 0.5)// + vec3(sin(lifetime), sin(lifetime + 1.5), sin(lifetime * 4) * 0.25) | |
| ), | |
| exp_scale(-0.2), | |
| vec3(1) | |
| ); | |
| } else if (inst_mode == FIRE) { | |
| attr = Attr( | |
| linear_motion( | |
| vec3(rand0 * 0.25, rand1 * 0.25, 0.3), | |
| vec3(rand2 * 0.1, rand3 * 0.1, 2.0 + rand4 * 1.0) | |
| ), | |
| 1.0, | |
| vec3(2, rand5 + 2, 0) | |
| ); | |
| } else if (inst_mode == GUN_POWDER_SPARK) { | |
| attr = Attr( | |
| linear_motion( | |
| vec3(rand0, rand1, rand3) * 0.3, | |
| vec3(rand4, rand5, rand6) * 2.0 + grav_vel(earth_gravity) | |
| ), | |
| 1.0, | |
| vec3(3.5, 3 + rand7, 0) | |
| ); | |
| } else { | |
| attr = Attr( | |
| linear_motion( | |
| vec3(rand0 * 0.25, rand1 * 0.25, 1.7 + rand5), | |
| vec3(rand2 * 0.1, rand3 * 0.1, 1.0 + rand4 * 0.5) | |
| ), | |
| exp_scale(-0.2), | |
| vec3(1) | |
| ); | |
| } | |
| f_pos = (inst_mat * vec4(v_pos * attr.scale * SCALE + attr.offs, 1)).xyz; | |
| // First 3 normals are negative, next 3 are positive | |
| vec3 normals[6] = vec3[](vec3(-1,0,0), vec3(1,0,0), vec3(0,-1,0), vec3(0,1,0), vec3(0,0,-1), vec3(0,0,1)); | |
| f_norm = (inst_mat * vec4(normals[(v_norm_ao >> 0) & 0x7u], 0)).xyz; | |
| vec3 col = vec3((uvec3(v_col) >> uvec3(0, 8, 16)) & uvec3(0xFFu)) / 255.0; | |
| f_col = srgb_to_linear(col) * srgb_to_linear(attr.col); | |
| f_ao = float((v_norm_ao >> 3) & 0x3u) / 4.0; | |
| f_light = 1.0; | |
| gl_Position = | |
| all_mat * | |
| vec4(f_pos, 1); | |
| gl_Position.z = -1000.0 / (gl_Position.z + 10000.0); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment