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 @@ <internal-format>normalized</internal-format> </texture> <texture n="2"> - <image>Textures/Water/water-normalmap.png</image> + <!--<image>Textures/Water/water-normalmap.png</image>--> + <image>Textures/Water/normalmap2.png</image> <filter>linear-mipmap-linear</filter> <wrap-s>repeat</wrap-s> <wrap-t>repeat</wrap-t> <internal-format>normalized</internal-format> </texture> <texture n="3"> - <image>Textures/Water/water-dudv.png</image> + <!--<image>Textures/Water/water-dudv.png</image>--> + <image>Textures/Water/dudvmap2.png</image> <filter>linear-mipmap-linear</filter> <wrap-s>repeat</wrap-s> <wrap-t>repeat</wrap-t> @@ -31,9 +33,22 @@ <wrap-t>repeat</wrap-t> <internal-format>normalized</internal-format> </texture> + <texture n="5"> + <image>Textures/Water/sea_foam.png</image> + <filter>linear-mipmap-linear</filter> + <wrap-s>repeat</wrap-s> + <wrap-t>repeat</wrap-t> + <internal-format>normalized</internal-format> + </texture> <saturation> <use>/rendering/scene/saturation</use> </saturation> + <status> + <use>/environment/config/enabled</use> + </status> + <overcast> + <use>/rendering/scene/overcast</use> + </overcast> <cloud-cover0> <use>/environment/clouds/layer[0]/coverage-type</use> </cloud-cover0> @@ -49,6 +64,16 @@ <cloud-cover4> <use>/environment/clouds/layer[4]/coverage-type</use> </cloud-cover4> + <!--<wind> + <use>/environment/wind-speed-kt</use> + </wind>--> + <windE> + <use>/environment/config/boundary/entry[0]/wind-from-east-fps</use> + </windE> + <windN> + <use>/environment/config/boundary/entry[0]/wind-from-north-fps</use> + </windN> + </parameters> <technique n="8"> <predicate> @@ -175,6 +200,24 @@ <use>texture[4]/internal-format</use> </internal-format> </texture-unit> + <texture-unit> + <unit>5</unit> + <image> + <use>texture[5]/image</use> + </image> + <filter> + <use>texture[5]/filter</use> + </filter> + <wrap-s> + <use>texture[5]/wrap-s</use> + </wrap-s> + <wrap-t> + <use>texture[5]/wrap-t</use> + </wrap-t> + <internal-format> + <use>texture[5]/internal-format</use> + </internal-format> + </texture-unit> <program> <vertex-shader>Shaders/water.vert</vertex-shader> <fragment-shader>Shaders/water.frag</fragment-shader> @@ -199,11 +242,16 @@ <type>sampler-2d</type> <value type="int">4</value> </uniform> + <uniform> + <name>sea_foam</name> + <type>sampler-2d</type> + <value type="int">5</value> + </uniform> <uniform> <name>saturation</name> <type>float</type> - <value>0.4</value> - <!--<value><use>saturation</use></value>--> + <!--<value>0.4</value>--> + <value><use>saturation</use></value> </uniform> <uniform> <name>CloudCover0</name> @@ -240,6 +288,35 @@ <use>cloud-cover4</use> </value> </uniform> + <uniform> + <name>Status</name> + <type>int</type> + <value> + <use>status</use> + </value> + <!--<value type="int">0</value> --> + </uniform> + <uniform> + <name>Overcast</name> + <type>float</type> + <value> + <use>overcast</use> + </value> + </uniform> + <uniform> + <name>WindE</name> + <type>float</type> + <value> + <use>windE</use> + </value> + </uniform> + <uniform> + <name>WindN</name> + <type>float</type> + <value> + <use>windN</use> + </value> + </uniform> </pass> </technique> <technique n="9"> 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