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 + /rendering/scene/saturation + + /environment/config/enabled + + + /rendering/scene/overcast + /environment/clouds/layer[0]/coverage-type @@ -49,6 +64,16 @@ /environment/clouds/layer[4]/coverage-type + + + /environment/config/boundary/entry[0]/wind-from-east-fps + + + /environment/config/boundary/entry[0]/wind-from-north-fps + + @@ -175,6 +200,24 @@ texture[4]/internal-format + + 5 + + texture[5]/image + + + texture[5]/filter + + + texture[5]/wrap-s + + + texture[5]/wrap-t + + + texture[5]/internal-format + + Shaders/water.vert Shaders/water.frag @@ -199,11 +242,16 @@ sampler-2d 4 + + sea_foam + sampler-2d + 5 + saturation float - 0.4 - + + saturation CloudCover0 @@ -240,6 +288,35 @@ cloud-cover4 + + Status + int + + status + + + + + Overcast + float + + overcast + + + + WindE + float + + windE + + + + WindN + float + + windN + + 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