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; }