// oceanGLSL.frag
// fragment program for Ocean water simulation
// 05 Aug 2005
// adapted for Ogre by nfz
// converted from HLSL to GLSL
// original shader source from Render Monkey 1.6 Reflections Refractions.rfx

// 06 Aug 2005: moved uvw calculation from fragment program into vertex program 

uniform float fadeBias;
uniform float fadeExp;
uniform vec4 waterColor;
uniform sampler3D Noise;
uniform samplerCube skyBox;

varying vec3 uvw;
varying vec3 oNormal;
varying vec3 vVec;

void main(void)
{
   vec3 noisy = texture3D(Noise, uvw).xyz;
   
   // convert to signed noise
   vec3 bump = 2.0 * noisy - 1.0;
   bump.xz *= 0.15;
   // Make sure the normal always points upwards
   // note that Ogres y axis is vertical (RM Z axis is vertical)
   bump.y = 0.8 * abs(bump.y) + 0.2;
   // Offset the surface normal with the bump
   bump = normalize(oNormal + bump);

   // Find the reflection vector
   vec3 normView = normalize(vVec);
   vec3 reflVec = reflect(normView, bump);
   // Ogre has z flipped for cubemaps
   reflVec.z = -reflVec.z;
   vec4 refl = textureCube(skyBox, reflVec);

   // set up for fresnel calc
   float lrp = 1.0 - dot(-normView, bump);
   
   // Interpolate between the water color and reflection for fresnel effect
   gl_FragColor = mix(waterColor, refl, clamp(fadeBias + pow(lrp, fadeExp), 0.0, 1.0) );
}
