uniform vec3 u_Camera;
uniform float u_WaterLevel;
uniform vec3 u_LightPosition;
in vec3 in_Vertex;
in vec3 in_Normal;
out vec3 vectorLightSource;
out vec3 transformedNormal;
void main (void) {
vec3 out_Vertex = in_Vertex;
if ( (in_Vertex.y - u_WaterLevel)*(u_Camera.y - u_WaterLevel) < 0 ) {
float dist = distance(in_Vertex, u_Camera);
float lnt = distance( vec2(in_Vertex.x,in_Vertex.y), vec2(u_Camera.x,u_Camera.y));
float hgt = abs(u_Camera.y - in_Vertex.y);
float sinAngleA = hgt/dist;
float angleA = asin (sinAngleA);
float waterHgt = abs(u_Camera.y - u_WaterLevel);
float waterLnt = waterHgt/tan(angleA);
float angleB = asin ( sinAngleA/1.3330);
float dLnt = u_WaterLevel*tan(angleB);
float imagineLnt = abs(waterLnt+dLnt);
float dX = in_Vertex.x - u_Camera.x;
float dZ = in_Vertex.z - u_Camera.z;
dX = imagineLnt*dX/lnt;
dZ = imagineLnt*dZ/lnt;
out_Vertex = vec3 (u_Camera.x+dX,in_Vertex.y,u_Camera.z+dZ);
}
vec3 vertexPos = (gl_ModelViewMatrix * vec4(out_Vertex,1)).xyz;
vectorLightSource = normalize ( u_LightPosition - out_Vertex );
transformedNormal = normalize ( gl_NormalMatrix * in_Normal );
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(out_Vertex,1);
}