44 lines
1.2 KiB
Plaintext
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;
|
|
}
|