stk-code_catmod/data/shaders/alphatest_particle.vert

66 lines
1.6 KiB
GLSL
Raw Normal View History

2017-10-13 12:19:59 -04:00
uniform int flips;
#ifdef Explicit_Attrib_Location_Usable
layout(location = 0) in vec3 Position;
layout(location = 1) in vec4 color_lifetime;
layout(location = 2) in vec2 size;
2017-10-13 12:19:59 -04:00
layout(location = 3) in vec2 Texcoord;
layout(location = 4) in vec2 quadcorner;
layout(location = 6) in float anglespeed;
#else
in vec3 Position;
in vec4 color_lifetime;
in vec2 size;
2017-10-13 12:19:59 -04:00
in vec2 Texcoord;
in vec2 quadcorner;
in float anglespeed;
2017-10-13 12:19:59 -04:00
#endif
out vec2 tc;
out vec4 pc;
void main(void)
{
if (size.x == 0.0 && size.y == 0.0)
2017-10-13 12:19:59 -04:00
{
2017-10-13 21:47:13 -04:00
gl_Position = vec4(0.);
pc = vec4(0.0);
tc = vec2(0.0);
2017-10-13 12:19:59 -04:00
return;
}
float lifetime = color_lifetime.w;
2017-10-19 21:25:43 -04:00
vec4 particle_color = vec4(color_lifetime.zyx, 1.0);
2017-10-13 12:19:59 -04:00
tc = Texcoord;
#if !defined(Advanced_Lighting_Enabled)
2017-10-19 21:25:43 -04:00
particle_color.rgb = pow(particle_color.rgb, vec3(1.0 / 2.2));
2017-10-13 12:19:59 -04:00
#endif
2017-10-19 21:25:43 -04:00
pc = particle_color;
2017-10-13 12:19:59 -04:00
vec4 viewpos = vec4(0.);
if (flips == 1)
{
float angle = lifetime * anglespeed;
2017-10-13 21:47:13 -04:00
float sin_a = sin(mod(angle / 2.0, 6.283185307179586));
float cos_a = cos(mod(angle / 2.0, 6.283185307179586));
vec4 quat = normalize(vec4(vec3(0.0, 1.0, 0.0) * sin_a, cos_a));
vec3 newquadcorner = vec3(size * quadcorner, 0.0);
2017-10-13 21:47:13 -04:00
newquadcorner = newquadcorner + 2.0 * cross(cross(newquadcorner,
quat.xyz) + quat.w * newquadcorner, quat.xyz);
viewpos = u_view_matrix * vec4(Position + newquadcorner, 1.0);
2017-10-13 12:19:59 -04:00
}
else
{
viewpos = u_view_matrix * vec4(Position, 1.0);
viewpos += vec4(size * quadcorner, 0.0, 0.0);
2017-10-13 12:19:59 -04:00
}
gl_Position = u_projection_matrix * viewpos;
2017-10-13 12:19:59 -04:00
}