53e32a9848
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14971 178a84e3-b1eb-0310-8ba1-8eac791a3b58
91 lines
2.3 KiB
GLSL
91 lines
2.3 KiB
GLSL
#version 140
|
|
uniform mat4 ProjectionMatrix;
|
|
uniform mat4 ViewMatrix;
|
|
uniform float track_x;
|
|
uniform float track_z;
|
|
uniform float track_x_len;
|
|
uniform float track_z_len;
|
|
uniform samplerBuffer heightmap;
|
|
uniform bool hasHeightMap;
|
|
uniform bool flips;
|
|
|
|
in vec2 quadcorner;
|
|
in vec2 texcoord;
|
|
in vec3 position;
|
|
in float lifetime;
|
|
in float size;
|
|
|
|
in vec3 rotationvec;
|
|
in float anglespeed;
|
|
|
|
out float lf;
|
|
out vec2 tc;
|
|
|
|
void main(void)
|
|
{
|
|
tc = texcoord;
|
|
lf = lifetime;
|
|
vec3 newposition = position;
|
|
|
|
float i_as_float = clamp(256. * (position.x - track_x) / track_x_len, 0., 255.);
|
|
float j_as_float = clamp(256. * (position.z - track_z) / track_z_len, 0., 255.);
|
|
int i = int(i_as_float);
|
|
int j = int(j_as_float);
|
|
|
|
if (hasHeightMap) {
|
|
float h = position.y - texelFetch(heightmap, i * 256 + j).r;
|
|
newposition.y = (h > 0.)? position.y : position.y - h;
|
|
}
|
|
|
|
if (flips)
|
|
{
|
|
// from http://jeux.developpez.com/faq/math
|
|
float angle = lf * anglespeed;
|
|
float sin_a = sin(angle / 2.);
|
|
float cos_a = cos(angle / 2.);
|
|
|
|
vec4 quaternion = normalize(vec4(rotationvec * sin_a, cos_a));
|
|
|
|
float xx = quaternion.x * quaternion.x;
|
|
float xy = quaternion.x * quaternion.y;
|
|
float xz = quaternion.x * quaternion.z;
|
|
float xw = quaternion.x * quaternion.w;
|
|
|
|
float yy = quaternion.y * quaternion.y;
|
|
float yz = quaternion.y * quaternion.z;
|
|
float yw = quaternion.y * quaternion.w;
|
|
|
|
float zz = quaternion.z * quaternion.z;
|
|
float zw = quaternion.z * quaternion.w;
|
|
|
|
vec4 col1 = vec4(
|
|
1. - 2. * ( yy + zz ),
|
|
2. * ( xy + zw ),
|
|
2. * ( xz - yw ),
|
|
0.);
|
|
vec4 col2 = vec4(
|
|
2. * ( xy - zw ),
|
|
1. - 2. * ( xx + zz ),
|
|
2. * ( yz + xw ),
|
|
0.);
|
|
vec4 col3 = vec4(
|
|
2. * ( xz + yw ),
|
|
2. * ( yz - xw ),
|
|
1. - 2. * ( xx + yy ),
|
|
0.);
|
|
vec4 col4 = vec4(0., 0., 0., 1.);
|
|
mat4 rotationMatrix = mat4(col1, col2, col3, col4);
|
|
vec3 newquadcorner = size * vec3(quadcorner, 0.);
|
|
newquadcorner = (rotationMatrix * vec4(newquadcorner, 0.)).xyz;
|
|
|
|
vec4 viewpos = ViewMatrix * vec4(newposition + newquadcorner, 1.0);
|
|
gl_Position = ProjectionMatrix * viewpos;
|
|
} else {
|
|
vec4 viewpos = ViewMatrix * vec4(newposition, 1.0);
|
|
viewpos += size * vec4(quadcorner, 0., 0.);
|
|
gl_Position = ProjectionMatrix * viewpos;
|
|
}
|
|
|
|
|
|
}
|