diff --git a/Effects/water.eff b/Effects/water.eff
index 4edf05af9..a9220a564 100644
--- a/Effects/water.eff
+++ b/Effects/water.eff
@@ -11,14 +11,16 @@
normalized
- Textures/Water/water-normalmap.png
+
+ Textures/Water/normalmap2.png
linear-mipmap-linear
repeat
repeat
normalized
- Textures/Water/water-dudv.png
+
+ Textures/Water/dudvmap2.png
linear-mipmap-linear
repeat
repeat
@@ -31,9 +33,22 @@
repeat
normalized
+
+ Textures/Water/sea_foam.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+
+
+
+
+
@@ -49,6 +64,16 @@
+
+
+
+
+
+
+
+
@@ -175,6 +200,24 @@
+
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Shaders/water.vert
Shaders/water.frag
@@ -199,11 +242,16 @@
sampler-2d
4
+
+ sea_foam
+ sampler-2d
+ 5
+
saturation
float
- 0.4
-
+
+
CloudCover0
@@ -240,6 +288,35 @@
+
+ Status
+ int
+
+
+
+
+
+
+ Overcast
+ float
+
+
+
+
+
+ WindE
+ float
+
+
+
+
+
+ WindN
+ float
+
+
+
+
diff --git a/Shaders/water.frag b/Shaders/water.frag
index dcaaf198c..2d61ca69c 100644
--- a/Shaders/water.frag
+++ b/Shaders/water.frag
@@ -3,13 +3,18 @@
// available at http://forum.bonzaisoftware.com/viewthread.php?tid=10
// © Michael Horsch - 2005
+#version 120
+#pragma debug(on)
+
uniform sampler2D water_normalmap;
uniform sampler2D water_reflection;
uniform sampler2D water_dudvmap;
uniform sampler2D water_reflection_grey;
+uniform sampler2D sea_foam;
-uniform float saturation;
+uniform float saturation, Overcast, WindE, WindN;
uniform float CloudCover0, CloudCover1, CloudCover2, CloudCover3, CloudCover4;
+uniform int Status;
varying vec4 waterTex1; //moving texcoords
varying vec4 waterTex2; //moving texcoords
@@ -36,20 +41,37 @@ void main(void)
const float water_shininess = 240.0;
+ // calculate wind effects
+ float windEffect = sqrt(pow(abs(WindE),2)+pow(abs(WindN),2)) * 0.6;
+ float windScale = 10.0/(6.0 + 8.0 * smoothstep(0.0,0.8,windEffect * 0.05));
+
// approximate cloud cover
- float cover = 0;
- cover = min(min(min(min(CloudCover0, CloudCover1),CloudCover2),CloudCover3),CloudCover4);
+ float cover = 0.0;
+ //bool Status = true;
+
+ if (Status == 1){
+ cover = min(min(min(min(CloudCover0, CloudCover1),CloudCover2),CloudCover3),CloudCover4);
+ } else {
+ // hack to allow for Overcast not to be set by Local Weather
+
+ if (Overcast == 0){
+ cover = 5;
+ } else {
+ cover = Overcast * 5;
+ }
+
+ }
vec4 viewt = normalize(waterTex4);
- vec4 disdis = texture2D(water_dudvmap, vec2(waterTex2 * tscale)) * 2.0 - 1.0;
- vec4 dist = texture2D(water_dudvmap, vec2(waterTex1 + disdis*sca2)) * 2.0 - 1.0;
+ vec4 disdis = texture2D(water_dudvmap, vec2(waterTex2 * tscale)* windScale) * 2.0 - 1.0;
+ vec4 dist = texture2D(water_dudvmap, vec2(waterTex1 + disdis*sca2)* windScale) * 2.0 - 1.0;
vec4 fdist = normalize(dist);
fdist *= sca;
//normalmap
- vec4 nmap0 = texture2D(water_normalmap, vec2(waterTex1+ disdis*sca2)) * 2.0 - 1.0;
- vec4 nmap2 = texture2D(water_normalmap, vec2(waterTex2 * tscale)) * 2.0 - 1.0;
+ vec4 nmap0 = texture2D(water_normalmap, vec2(waterTex1+ disdis*sca2) * windScale) * 2.0 - 1.0;
+ vec4 nmap2 = texture2D(water_normalmap, vec2(waterTex2 * tscale) * windScale) * 2.0 - 1.0;
vec4 vNorm = normalize(nmap0 + nmap2);
//load reflection
@@ -70,20 +92,20 @@ void main(void)
refl.a *= 1.0;
}
-
- vec3 N0 = vec3(texture2D(water_normalmap, vec2(waterTex1+ disdis*sca2)) * 2.0 - 1.0);
- vec3 N1 = vec3(texture2D(water_normalmap, vec2(waterTex2 * tscale)) * 2.0 - 1.0);
+ vec3 N0 = vec3(texture2D(water_normalmap, vec2(waterTex1+ disdis*sca2) * windScale) * 2.0 - 1.0);
+ vec3 N1 = vec3(texture2D(water_normalmap, vec2(waterTex2 * tscale) * windScale) * 2.0 - 1.0);
vec3 N = normalize(normal+N0+N1);
// specular
vec3 specular_color = vec3(gl_LightSource[0].diffuse)
* pow(max(0.0, dot(N, H)), water_shininess) * 6.0;
vec4 specular = vec4(specular_color, 0.5);
- specular = specular * saturation;
+
+ specular = specular * saturation * 0.4;
//calculate fresnel
vec4 invfres = vec4( dot(vNorm, viewt) );
- vec4 fres = vec4(1.0) + invfres;
+ vec4 fres = vec4(1.0) + invfres;
refl *= fres;
//calculate the fog factor
@@ -95,7 +117,7 @@ void main(void)
if(gl_Fog.density == 1.0)
fogFactor=1.0;
- //calculate final colour
+ //calculate final colour
vec4 ambient_light = gl_LightSource[0].diffuse;
vec4 finalColor;
@@ -107,7 +129,17 @@ void main(void)
finalColor = refl;
}
+ if (windEffect >= 10.0){
+ float windScale3 = pow(windScale, 3);
+
+ if (N.g >= 0.0005 + 0.085 * windScale3){
+ vec4 foam_texel = texture2D(sea_foam, vec2(waterTex1+ disdis*sca2) * windScale3 * 50.0);
+ finalColor = mix(finalColor, max(finalColor, foam_texel), smoothstep(0.0005 + 0.085 * windScale3, 0.1, N.g));
+ }
+
+ }
finalColor *= ambient_light;
+
gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}
diff --git a/Shaders/water.vert b/Shaders/water.vert
index f549071b1..5e3b35496 100644
--- a/Shaders/water.vert
+++ b/Shaders/water.vert
@@ -3,11 +3,14 @@
// available at http://forum.bonzaisoftware.com/viewthread.php?tid=10
// © Michael Horsch - 2005
+#version 120
+
varying vec4 waterTex1;
varying vec4 waterTex2;
varying vec4 waterTex4;
varying vec4 ecPosition;
uniform float osg_SimulationTime;
+uniform float WindE, WindN;
varying vec3 viewerdir;
varying vec3 lightdir;
varying vec3 normal;
@@ -24,11 +27,18 @@ lightdir = normalize(vec3(gl_ModelViewMatrixInverse * gl_LightSource[0].position
waterTex4 = vec4( ecPosition.xzy, 0.0 );
-vec4 t1 = vec4(0.0, osg_SimulationTime*0.005217, 0.0,0.0);
-vec4 t2 = vec4(0.0, osg_SimulationTime*-0.0012, 0.0,0.0);
+vec4 t1 = vec4(0.0, osg_SimulationTime * 0.005217, 0.0, 0.0);
+vec4 t2 = vec4(0.0, osg_SimulationTime * -0.0012, 0.0, 0.0);
+
+//float windFactor = sqrt(pow(abs(WindE),2)+pow(abs(WindN),2)) * 0.3;
+float windFactor = 0.001;
waterTex1 = gl_MultiTexCoord0 + t1;
+waterTex1.x += WindE * windFactor;
+waterTex1.y += WindN * windFactor;
waterTex2 = gl_MultiTexCoord0 + t2;
+waterTex2.x += WindE * windFactor;
+waterTex2.y += WindN * windFactor;
gl_Position = ftransform();
}
\ No newline at end of file
diff --git a/Textures/Water/dudvmap2.png b/Textures/Water/dudvmap2.png
new file mode 100644
index 000000000..43b769386
Binary files /dev/null and b/Textures/Water/dudvmap2.png differ
diff --git a/Textures/Water/normalmap2.png b/Textures/Water/normalmap2.png
new file mode 100644
index 000000000..e36e97178
Binary files /dev/null and b/Textures/Water/normalmap2.png differ
diff --git a/Textures/Water/sea_foam.png b/Textures/Water/sea_foam.png
new file mode 100644
index 000000000..a25edae0f
Binary files /dev/null and b/Textures/Water/sea_foam.png differ