Files
starruler-linux/data/shaders/source/prominence_vs.txt
T
2018-07-17 14:15:37 +02:00

44 lines
1.2 KiB
Plaintext

uniform vec4 curve[8];
varying vec2 uv;
varying vec3 pos, normal;
vec4 bezier(float x) {
vec4 lerp_a[7], lerp_b[6];
for(int i = 0; i < 7; ++i)
lerp_a[i] = mix(curve[i], curve[i+1], x);
for(int i = 0; i < 6; ++i)
lerp_b[i] = mix(lerp_a[i], lerp_a[i+1], x);
for(int i = 0; i < 5; ++i)
lerp_a[i] = mix(lerp_b[i], lerp_b[i+1], x);
for(int i = 0; i < 4; ++i)
lerp_b[i] = mix(lerp_a[i], lerp_a[i+1], x);
for(int i = 0; i < 3; ++i)
lerp_a[i] = mix(lerp_b[i], lerp_b[i+1], x);
for(int i = 0; i < 2; ++i)
lerp_b[i] = mix(lerp_a[i], lerp_a[i+1], x);
return mix(lerp_b[0], lerp_b[1], x);
}
//Rotate about z (x is known to be 0)
vec3 rotate(vec3 pt, float rad) {
return vec3(pt.y * -sin(rad), pt.y * cos(rad), pt.z);
}
void main() {
uv = gl_MultiTexCoord0.xy;
vec4 offset = bezier(uv.x);
vec3 n = gl_Vertex.xyz; n.x = 0.0;
n = rotate(vec3(0.0, n.yz), offset.w);
normal = normalize(gl_NormalMatrix * n);
vec3 vert = offset.xyz + rotate(vec3(0, gl_Vertex.yz), offset.w - 0.135);
vec4 postMV = gl_ModelViewMatrix * vec4(vert, gl_Vertex.w);
pos = (gl_ModelViewMatrix * offset).xyz;
gl_Position = gl_ProjectionMatrix * postMV;
}