#version 110

varying vec3 eye_normal;

vec3 world_normal()
{
    // the world normal is always parallel to the world XY plane
    // the x component is stored into gl_Vertex.w
    float x = gl_Vertex.w;
    float y = sqrt(1.0 - x * x);
    return vec3(x, y, 0.0);
}

void main()
{
    vec4 world_position = vec4(gl_Vertex.xyz, 1.0);
    gl_Position = gl_ModelViewProjectionMatrix * world_position;
    eye_normal = gl_NormalMatrix * world_normal();    
}