Index: ps/trunk/binaries/data/mods/public/shaders/glsl/common/fog.h =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/common/fog.h +++ ps/trunk/binaries/data/mods/public/shaders/glsl/common/fog.h @@ -0,0 +1,29 @@ +#ifndef INCLUDED_FOG +#define INCLUDED_FOG + +#if USE_FOG +uniform vec3 fogColor; +uniform vec2 fogParams; +#endif + +vec3 applyFog(vec3 color) +{ +#if USE_FOG + float density = fogParams.x; + float maxFog = fogParams.y; + + const float LOG2 = 1.442695; + float z = gl_FragCoord.z / gl_FragCoord.w; + float fogFactor = exp2(-density * density * z * z * LOG2); + + fogFactor = fogFactor * (1.0 - maxFog) + maxFog; + + fogFactor = clamp(fogFactor, 0.0, 1.0); + + return mix(fogColor, color, fogFactor); +#else + return color; +#endif +} + +#endif // INCLUDED_FOG Index: ps/trunk/binaries/data/mods/public/shaders/glsl/common/shadows_fragment.h =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/common/shadows_fragment.h +++ ps/trunk/binaries/data/mods/public/shaders/glsl/common/shadows_fragment.h @@ -0,0 +1,44 @@ +#ifndef INCLUDED_SHADOWS_FRAGMENT +#define INCLUDED_SHADOWS_FRAGMENT + +#if USE_SHADOW + varying vec4 v_shadow; + #if USE_SHADOW_SAMPLER + uniform sampler2DShadow shadowTex; + #if USE_SHADOW_PCF + uniform vec4 shadowScale; + #endif + #else + uniform sampler2D shadowTex; + #endif +#endif + +float get_shadow() +{ + float shadowBias = 0.003; + #if USE_SHADOW && !DISABLE_RECEIVE_SHADOWS + float biasedShdwZ = v_shadow.z - shadowBias; + #if USE_SHADOW_SAMPLER + #if USE_SHADOW_PCF + vec2 offset = fract(v_shadow.xy - 0.5); + vec4 size = vec4(offset + 1.0, 2.0 - offset); + vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (v_shadow.xy - 0.5*offset).xyxy) * shadowScale.zwzw; + return (1.0/9.0)*dot(size.zxzx*size.wwyy, + vec4(shadow2D(shadowTex, vec3(weight.zw, biasedShdwZ)).r, + shadow2D(shadowTex, vec3(weight.xw, biasedShdwZ)).r, + shadow2D(shadowTex, vec3(weight.zy, biasedShdwZ)).r, + shadow2D(shadowTex, vec3(weight.xy, biasedShdwZ)).r)); + #else + return shadow2D(shadowTex, vec3(v_shadow.xy, biasedShdwZ)).r; + #endif + #else + if (biasedShdwZ >= 1.0) + return 1.0; + return (biasedShdwZ < texture2D(shadowTex, v_shadow.xy).x ? 1.0 : 0.0); + #endif + #else + return 1.0; + #endif +} + +#endif // INCLUDED_SHADOWS_FRAGMENT Index: ps/trunk/binaries/data/mods/public/shaders/glsl/common/shadows_vertex.h =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/common/shadows_vertex.h +++ ps/trunk/binaries/data/mods/public/shaders/glsl/common/shadows_vertex.h @@ -0,0 +1,22 @@ +#ifndef INCLUDED_SHADOWS_VERTEX +#define INCLUDED_SHADOWS_VERTEX + +#if USE_SHADOW +uniform mat4 shadowTransform; +varying vec4 v_shadow; +#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF + uniform vec4 shadowScale; +#endif +#endif + +void calculatePositionInShadowSpace(vec4 position) +{ +#if USE_SHADOW + v_shadow = shadowTransform * position; +#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF + v_shadow.xy *= shadowScale.xy; +#endif +#endif +} + +#endif // INCLUDED_SHADOWS_VERTEX Index: ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.fs @@ -1,23 +1,14 @@ #version 120 +#include "common/fog.h" +#include "common/shadows_fragment.h" + uniform sampler2D baseTex; uniform sampler2D losTex; uniform sampler2D aoTex; uniform sampler2D normTex; uniform sampler2D specTex; -#if USE_SHADOW - varying vec4 v_shadow; - #if USE_SHADOW_SAMPLER - uniform sampler2DShadow shadowTex; - #if USE_SHADOW_PCF - uniform vec4 shadowScale; - #endif - #else - uniform sampler2D shadowTex; - #endif -#endif - #if USE_OBJECTCOLOR uniform vec3 objectColor; #else @@ -31,9 +22,6 @@ uniform vec3 sunColor; uniform vec3 sunDir; -uniform vec3 fogColor; -uniform vec2 fogParams; - varying vec4 v_lighting; varying vec2 v_tex; varying vec2 v_los; @@ -65,50 +53,6 @@ #endif #endif -float get_shadow() -{ - float shadowBias = 0.003; - #if USE_SHADOW && !DISABLE_RECEIVE_SHADOWS - float biasedShdwZ = v_shadow.z - shadowBias; - #if USE_SHADOW_SAMPLER - #if USE_SHADOW_PCF - vec2 offset = fract(v_shadow.xy - 0.5); - vec4 size = vec4(offset + 1.0, 2.0 - offset); - vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (v_shadow.xy - 0.5*offset).xyxy) * shadowScale.zwzw; - return (1.0/9.0)*dot(size.zxzx*size.wwyy, - vec4(shadow2D(shadowTex, vec3(weight.zw, biasedShdwZ)).r, - shadow2D(shadowTex, vec3(weight.xw, biasedShdwZ)).r, - shadow2D(shadowTex, vec3(weight.zy, biasedShdwZ)).r, - shadow2D(shadowTex, vec3(weight.xy, biasedShdwZ)).r)); - #else - return shadow2D(shadowTex, vec3(v_shadow.xy, biasedShdwZ)).r; - #endif - #else - if (biasedShdwZ >= 1.0) - return 1.0; - return (biasedShdwZ < texture2D(shadowTex, v_shadow.xy).x ? 1.0 : 0.0); - #endif - #else - return 1.0; - #endif -} - -vec3 get_fog(vec3 color) -{ - float density = fogParams.x; - float maxFog = fogParams.y; - - const float LOG2 = 1.442695; - float z = gl_FragCoord.z / gl_FragCoord.w; - float fogFactor = exp2(-density * density * z * z * LOG2); - - fogFactor = fogFactor * (1.0 - maxFog) + maxFog; - - fogFactor = clamp(fogFactor, 0.0, 1.0); - - return mix(fogColor, color, fogFactor); -} - void main() { vec2 coord = v_tex; @@ -225,9 +169,7 @@ color = mix(texdiffuse, color, specular.a); #endif - #if USE_FOG - color = get_fog(color); - #endif + color = applyFog(color); #if !IGNORE_LOS float los = texture2D(losTex, v_los).a; Index: ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.vs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.vs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/model_common.vs @@ -1,5 +1,7 @@ #version 120 +#include "common/shadows_vertex.h" + uniform mat4 transform; uniform vec3 cameraPos; #ifdef GL_ES @@ -10,13 +12,8 @@ uniform vec3 sunColor; #endif uniform vec2 losTransform; -uniform mat4 shadowTransform; uniform mat4 instancingTransform; -#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - uniform vec4 shadowScale; -#endif - #if USE_WIND uniform vec4 sim_time; uniform vec4 windData; @@ -26,10 +23,6 @@ varying vec2 v_tex; varying vec2 v_los; -#if USE_SHADOW - varying vec4 v_shadow; -#endif - #if (USE_INSTANCING || USE_GPU_SKINNING) && USE_AO varying vec2 v_tex2; #endif @@ -173,12 +166,7 @@ v_tex2 = a_uv1; #endif - #if USE_SHADOW - v_shadow = shadowTransform * position; - #if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - v_shadow.xy *= shadowScale.xy; - #endif - #endif + calculatePositionInShadowSpace(position); v_los = position.xz * losTransform.x + losTransform.y; } Index: ps/trunk/binaries/data/mods/public/shaders/glsl/model_water.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/model_water.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/model_water.fs @@ -1,5 +1,7 @@ #version 120 +#include "common/shadows_fragment.h" + uniform sampler2D baseTex; uniform sampler2D losTex; uniform sampler2D aoTex; @@ -9,17 +11,6 @@ uniform sampler2D waterTex; uniform samplerCube skyCube; -#if USE_SHADOW - #if USE_SHADOW_SAMPLER - uniform sampler2DShadow shadowTex; - #if USE_SHADOW_PCF - uniform vec4 shadowScale; - #endif - #else - uniform sampler2D shadowTex; - #endif -#endif - #if USE_OBJECTCOLOR uniform vec3 objectColor; #else @@ -41,44 +32,14 @@ uniform vec3 reflectionTint; uniform float reflectionTintStrength; - float waterDepth = 4.0; float fullDepth = 5.0; // Depth at which to use full murkiness (shallower water will be clearer) - varying vec4 worldPos; varying vec4 v_tex; varying vec4 v_shadow; varying vec2 v_los; - -float get_shadow(vec4 coords) -{ - #if USE_SHADOW && !DISABLE_RECEIVE_SHADOWS - #if USE_SHADOW_SAMPLER - #if USE_SHADOW_PCF - vec2 offset = fract(coords.xy - 0.5); - vec4 size = vec4(offset + 1.0, 2.0 - offset); - vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (coords.xy - 0.5*offset).xyxy) * shadowScale.zwzw; - return (1.0/9.0)*dot(size.zxzx*size.wwyy, - vec4(shadow2D(shadowTex, vec3(weight.zw, coords.z)).r, - shadow2D(shadowTex, vec3(weight.xw, coords.z)).r, - shadow2D(shadowTex, vec3(weight.zy, coords.z)).r, - shadow2D(shadowTex, vec3(weight.xy, coords.z)).r)); - #else - return shadow2D(shadowTex, coords.xyz).r; - #endif - #else - if (coords.z >= 1.0) - return 1.0; - return (coords.z <= texture2D(shadowTex, coords.xy).x ? 1.0 : 0.0); - #endif - #else - return 1.0; - #endif -} - - void main() { vec3 n, l, h, v; // Normal, light vector, half-vector and view vector (vector to eye) Index: ps/trunk/binaries/data/mods/public/shaders/glsl/model_water.vs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/model_water.vs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/model_water.vs @@ -5,22 +5,18 @@ #version 120 #endif +#include "common/shadows_vertex.h" + uniform mat4 transform; uniform vec3 cameraPos; uniform vec3 sunDir; uniform vec3 sunColor; uniform vec2 losTransform; -uniform mat4 shadowTransform; uniform mat4 instancingTransform; uniform float sim_time; uniform vec2 translation; -#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - uniform vec4 shadowScale; -#endif - - attribute vec3 a_vertex; attribute vec3 a_normal; #if USE_INSTANCING @@ -37,21 +33,16 @@ attribute vec4 a_skinWeights; #endif - varying vec4 worldPos; varying vec4 v_tex; -varying vec4 v_shadow; varying vec2 v_los; - vec4 fakeCos(vec4 x) { vec4 tri = abs(fract(x + 0.5) * 2.0 - 1.0); return tri * tri *(3.0 - 2.0 * tri); } - - void main() { worldPos = instancingTransform * vec4(a_vertex, 1.0); @@ -60,15 +51,9 @@ v_tex.zw = a_uv0; - #if USE_SHADOW - v_shadow = shadowTransform * worldPos; - #if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - v_shadow.xy *= shadowScale.xy; - #endif - #endif + calculatePositionInShadowSpace(worldPos); v_los = worldPos.xz * losTransform.x + losTransform.y; gl_Position = transform * worldPos; } - Index: ps/trunk/binaries/data/mods/public/shaders/glsl/model_waterfall.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/model_waterfall.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/model_waterfall.fs @@ -1,31 +1,19 @@ #version 120 +#include "common/shadows_fragment.h" + uniform sampler2D baseTex; uniform sampler2D losTex; - -#if USE_SHADOW - #if USE_SHADOW_SAMPLER - uniform sampler2DShadow shadowTex; - #if USE_SHADOW_PCF - uniform vec4 shadowScale; - #endif - #else - uniform sampler2D shadowTex; - #endif -#endif - uniform vec3 shadingColor; uniform vec3 ambient; uniform vec3 sunColor; uniform vec3 sunDir; uniform vec3 cameraPos; - uniform float specularPower; uniform vec3 specularColor; - varying vec4 v_tex; varying vec4 v_shadow; varying vec2 v_los; @@ -34,33 +22,6 @@ varying float v_transp; varying vec3 v_lighting; -float get_shadow() -{ - #if USE_SHADOW && !DISABLE_RECEIVE_SHADOWS - #if USE_SHADOW_SAMPLER - #if USE_SHADOW_PCF - vec2 offset = fract(v_shadow.xy - 0.5); - vec4 size = vec4(offset + 1.0, 2.0 - offset); - vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (v_shadow.xy - 0.5*offset).xyxy) * shadowScale.zwzw; - return (1.0/9.0)*dot(size.zxzx*size.wwyy, - vec4(shadow2D(shadowTex, vec3(weight.zw, v_shadow.z)).r, - shadow2D(shadowTex, vec3(weight.xw, v_shadow.z)).r, - shadow2D(shadowTex, vec3(weight.zy, v_shadow.z)).r, - shadow2D(shadowTex, vec3(weight.xy, v_shadow.z)).r)); - #else - return shadow2D(shadowTex, v_shadow.xyz).r; - #endif - #else - if (v_shadow.z >= 1.0) - return 1.0; - return (v_shadow.z <= texture2D(shadowTex, v_shadow.xy).x ? 1.0 : 0.0); - #endif - #else - return 1.0; - #endif -} - - void main() { //vec4 texdiffuse = textureGrad(baseTex, vec3(fract(v_tex.xy), v_tex.z), dFdx(v_tex.xy), dFdy(v_tex.xy)); Index: ps/trunk/binaries/data/mods/public/shaders/glsl/model_waterfall.vs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/model_waterfall.vs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/model_waterfall.vs @@ -5,22 +5,18 @@ #version 120 #endif +#include "common/shadows_vertex.h" + uniform mat4 transform; uniform vec3 cameraPos; uniform vec3 sunDir; uniform vec3 sunColor; uniform vec2 losTransform; -uniform mat4 shadowTransform; uniform mat4 instancingTransform; uniform float sim_time; uniform vec2 translation; -#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - uniform vec4 shadowScale; -#endif - - attribute vec3 a_vertex; attribute vec3 a_normal; attribute vec2 a_uv0; @@ -28,14 +24,12 @@ varying vec4 worldPos; varying vec4 v_tex; -varying vec4 v_shadow; varying vec2 v_los; varying vec3 v_half; varying vec3 v_normal; varying float v_transp; varying vec3 v_lighting; - void main() { worldPos = instancingTransform * vec4(a_vertex, 1.0); @@ -43,12 +37,7 @@ v_tex.xy = a_uv0 + sim_time * translation; v_transp = a_uv1.x; - #if USE_SHADOW - v_shadow = shadowTransform * worldPos; - #if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - v_shadow.xy *= shadowScale.xy; - #endif - #endif + calculatePositionInShadowSpace(worldPos); v_los = worldPos.xz * losTransform.x + losTransform.y; Index: ps/trunk/binaries/data/mods/public/shaders/glsl/particle.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/particle.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/particle.fs @@ -1,5 +1,7 @@ #version 110 +#include "common/fog.h" + uniform sampler2D baseTex; uniform sampler2D losTex; @@ -8,24 +10,6 @@ varying vec4 v_color; uniform vec3 sunColor; -uniform vec3 fogColor; -uniform vec2 fogParams; - -vec4 get_fog(vec4 color) -{ - float density = fogParams.x; - float maxFog = fogParams.y; - - const float LOG2 = 1.442695; - float z = gl_FragCoord.z / gl_FragCoord.w; - float fogFactor = exp2(-density * density * z * z * LOG2); - - fogFactor = fogFactor * (1.0 - maxFog) + maxFog; - - fogFactor = clamp(fogFactor, 0.0, 1.0); - - return vec4(mix(fogColor, color.rgb, fogFactor),color.a); -} void main() { @@ -35,9 +19,7 @@ los = los < 0.03 ? 0.0 : los; color.rgb *= los; -#if USE_FOG - color = get_fog(color); -#endif + color.rgb = applyFog(color.rgb); gl_FragColor = color; } Index: ps/trunk/binaries/data/mods/public/shaders/glsl/solid_player.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/solid_player.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/solid_player.fs @@ -1,30 +1,10 @@ #version 110 -uniform vec4 playerColor; -uniform vec3 fogColor; -uniform vec2 fogParams; - -vec3 get_fog(vec3 color) -{ - float density = fogParams.x; - float maxFog = fogParams.y; - - const float LOG2 = 1.442695; - float z = gl_FragCoord.z / gl_FragCoord.w; - float fogFactor = exp2(-density * density * z * z * LOG2); +#include "common/fog.h" - fogFactor = fogFactor * (1.0 - maxFog) + maxFog; - - fogFactor = clamp(fogFactor, 0.0, 1.0); - - return mix(fogColor, color, fogFactor); -} +uniform vec4 playerColor; void main() { -#if USE_FOG - gl_FragColor = vec4(get_fog(playerColor.rgb), playerColor.a); -#else - gl_FragColor = vec4(playerColor.rgb, playerColor.a); -#endif + gl_FragColor = vec4(applyFog(playerColor.rgb), playerColor.a); } Index: ps/trunk/binaries/data/mods/public/shaders/glsl/terrain_common.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/terrain_common.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/terrain_common.fs @@ -1,39 +1,23 @@ #version 120 +#include "common/fog.h" +#include "common/shadows_fragment.h" + uniform sampler2D baseTex; uniform sampler2D blendTex; uniform sampler2D losTex; uniform sampler2D normTex; uniform sampler2D specTex; -#if USE_SHADOW - uniform float shadowAngle; - #if USE_SHADOW_SAMPLER - uniform sampler2DShadow shadowTex; - #if USE_SHADOW_PCF - uniform vec4 shadowScale; - #endif - #else - uniform sampler2D shadowTex; - #endif -#endif - uniform vec3 shadingColor; uniform vec3 ambient; uniform vec3 sunColor; uniform vec3 sunDir; -uniform vec3 fogColor; -uniform vec2 fogParams; - uniform vec2 textureTransform; varying vec3 v_lighting; -#if USE_SHADOW - varying vec4 v_shadow; -#endif - varying vec2 v_los; varying vec2 v_blend; @@ -64,34 +48,6 @@ #endif #endif -float get_shadow() -{ - float shadowBias = 0.0005; - #if USE_SHADOW && !DISABLE_RECEIVE_SHADOWS - float biasedShdwZ = v_shadow.z - shadowBias; - #if USE_SHADOW_SAMPLER - #if USE_SHADOW_PCF - vec2 offset = fract(v_shadow.xy - 0.5); - vec4 size = vec4(offset + 1.0, 2.0 - offset); - vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (v_shadow.xy - 0.5*offset).xyxy) * shadowScale.zwzw; - return (1.0/9.0)*dot(size.zxzx*size.wwyy, - vec4(shadow2D(shadowTex, vec3(weight.zw, biasedShdwZ)).r, - shadow2D(shadowTex, vec3(weight.xw, biasedShdwZ)).r, - shadow2D(shadowTex, vec3(weight.zy, biasedShdwZ)).r, - shadow2D(shadowTex, vec3(weight.xy, biasedShdwZ)).r)); - #else - return shadow2D(shadowTex, vec3(v_shadow.xy, biasedShdwZ)).r; - #endif - #else - if (biasedShdwZ >= 1.0) - return 1.0; - return (biasedShdwZ < texture2D(shadowTex, v_shadow.xy).x ? 1.0 : 0.0); - #endif - #else - return 1.0; - #endif -} - #if USE_TRIPLANAR vec4 triplanar(sampler2D sampler, vec3 wpos) { @@ -143,22 +99,6 @@ } #endif -vec3 get_fog(vec3 color) -{ - float density = fogParams.x; - float maxFog = fogParams.y; - - const float LOG2 = 1.442695; - float z = gl_FragCoord.z / gl_FragCoord.w; - float fogFactor = exp2(-density * density * z * z * LOG2); - - fogFactor = fogFactor * (1.0 - maxFog) + maxFog; - - fogFactor = clamp(fogFactor, 0.0, 1.0); - - return mix(fogColor, color, fogFactor); -} - void main() { #if BLEND @@ -236,9 +176,7 @@ color = mix(texdiffuse, color, specular.a); #endif - #if USE_FOG - color = get_fog(color); - #endif + color = applyFog(color); float los = texture2D(losTex, v_los).a; los = los < 0.03 ? 0.0 : los; Index: ps/trunk/binaries/data/mods/public/shaders/glsl/terrain_common.vs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/terrain_common.vs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/terrain_common.vs @@ -1,5 +1,7 @@ #version 120 +#include "common/shadows_vertex.h" + uniform mat4 transform; uniform vec3 cameraPos; #ifdef GL_ES @@ -11,18 +13,9 @@ #endif uniform vec2 textureTransform; uniform vec2 losTransform; -uniform mat4 shadowTransform; - -#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - uniform vec4 shadowScale; -#endif varying vec3 v_lighting; -#if USE_SHADOW - varying vec4 v_shadow; -#endif - varying vec2 v_los; varying vec2 v_blend; @@ -44,7 +37,6 @@ #endif #endif - attribute vec3 a_vertex; attribute vec3 a_normal; attribute vec2 a_uv0; @@ -89,12 +81,7 @@ v_blend = a_uv1; #endif - #if USE_SHADOW - v_shadow = shadowTransform * vec4(a_vertex, 1.0); - #if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - v_shadow.xy *= shadowScale.xy; - #endif - #endif + calculatePositionInShadowSpace(vec4(a_vertex, 1.0)); v_normal = a_normal; Index: ps/trunk/binaries/data/mods/public/shaders/glsl/water_high.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/water_high.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/water_high.fs @@ -1,5 +1,11 @@ #version 110 +#include "common/fog.h" + +#if USE_SHADOWS_ON_WATER +#include "common/shadows_fragment.h" +#endif + // Environment settings uniform vec3 ambient; uniform vec3 sunDir; @@ -18,9 +24,6 @@ uniform float windAngle; varying vec2 WindCosSin; -uniform vec3 fogColor; -uniform vec2 fogParams; - uniform vec2 screenSize; varying float moddedTime; @@ -66,43 +69,6 @@ #endif #endif -#if USE_SHADOWS_ON_WATER && USE_SHADOW - varying vec4 v_shadow; - #if USE_SHADOW_SAMPLER - uniform sampler2DShadow shadowTex; - #if USE_SHADOW_PCF - uniform vec4 shadowScale; - #endif - #else - uniform sampler2D shadowTex; - #endif - float get_shadow(vec4 coords) - { - #if USE_SHADOWS_ON_WATER && !DISABLE_RECEIVE_SHADOWS - #if USE_SHADOW_SAMPLER - #if USE_SHADOW_PCF - vec2 offset = fract(coords.xy - 0.5); - vec4 size = vec4(offset + 1.0, 2.0 - offset); - vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (coords.xy - 0.5 * offset).xyxy) * shadowScale.zwzw; - return (1.0 / 9.0) * dot(size.zxzx * size.wwyy, - vec4(shadow2D(shadowTex, vec3(weight.zw, coords.z)).r, - shadow2D(shadowTex, vec3(weight.xw, coords.z)).r, - shadow2D(shadowTex, vec3(weight.zy, coords.z)).r, - shadow2D(shadowTex, vec3(weight.xy, coords.z)).r)); - #else - return shadow2D(shadowTex, coords.xyz).r; - #endif - #else - if (coords.z >= 1.0) - return 1.0; - return (coords.z <= texture2D(shadowTex, coords.xy).x ? 1.0 : 0.0); - #endif - #else - return 1.0; - #endif - } -#endif - // TODO: convert this to something not only for AABBs struct Ray { vec3 Origin; @@ -117,22 +83,6 @@ return min ( MAX.x, min ( MAX.y, MAX.z ) ); } -vec3 get_fog(vec3 color) -{ - float density = fogParams.x; - float maxFog = fogParams.y; - - const float LOG2 = 1.442695; - float z = gl_FragCoord.z / gl_FragCoord.w; - float fogFactor = exp2(-density * density * z * z * LOG2); - - fogFactor = fogFactor * (1.0 - maxFog) + maxFog; - - fogFactor = clamp(fogFactor, 0.0, 1.0); - - return mix(fogColor, color, fogFactor); -} - vec3 getNormal(vec4 fancyeffects) { float wavyEffect = waveParams1.r; @@ -365,7 +315,7 @@ vec3 specular = getSpecular(normal, eyeVec); #if USE_SHADOWS_ON_WATER && USE_SHADOW - float shadow = get_shadow(vec4(v_shadow.xy, v_shadow.zw)); + float shadow = get_shadow(); float fresShadow = mix(fresnel, fresnel * shadow, 0.05 + murkiness * 0.2); vec3 color = mix(refrColor.rgb, reflColor.rgb, fresShadow * reflColor.a); color += shadow * specular; @@ -378,9 +328,7 @@ color = clamp(mix(color, foam.rgb, foam.a), 0.0, 1.0); -#if USE_FOG - color = get_fog(color); -#endif + color = applyFog(color); float alpha = refrColor.a; float losMod = texture2D(losTex, losCoords.st).a; Index: ps/trunk/binaries/data/mods/public/shaders/glsl/water_high.vs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/water_high.vs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/water_high.vs @@ -1,19 +1,18 @@ #version 110 +#if USE_SHADOWS_ON_WATER +#include "common/shadows_vertex.h" +#endif + uniform mat4 reflectionMatrix; uniform mat4 refractionMatrix; uniform mat4 losMatrix; -uniform mat4 shadowTransform; uniform float repeatScale; uniform float windAngle; // "Wildness" of the reflections and refractions; choose based on texture uniform float waviness; uniform vec3 sunDir; -#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - uniform vec4 shadowScale; -#endif - uniform float time; uniform mat4 transform; @@ -39,10 +38,6 @@ varying float fwaviness; varying vec2 WindCosSin; -#if USE_SHADOW && USE_SHADOWS_ON_WATER - varying vec4 v_shadow; -#endif - attribute vec3 a_vertex; attribute vec2 a_waterInfo; attribute vec3 a_otherPosition; @@ -69,11 +64,8 @@ #endif losCoords = (losMatrix * vec4(a_vertex, 1.0)).rg; -#if USE_SHADOW && USE_SHADOWS_ON_WATER - v_shadow = shadowTransform * vec4(a_vertex, 1.0); -#if USE_SHADOW_SAMPLER && USE_SHADOW_PCF - v_shadow.xy *= shadowScale.xy; -#endif +#if USE_SHADOWS_ON_WATER + calculatePositionInShadowSpace(vec4(a_vertex, 1.0)); #endif v_eyeVec = normalize(cameraPos - worldPos); Index: ps/trunk/source/graphics/ShaderProgram.cpp =================================================================== --- ps/trunk/source/graphics/ShaderProgram.cpp +++ ps/trunk/source/graphics/ShaderProgram.cpp @@ -101,9 +101,6 @@ CStr vertexCode = preprocessor.Preprocess(vertexFile.GetAsString()); CStr fragmentCode = preprocessor.Preprocess(fragmentFile.GetAsString()); -// printf(">>>\n%s<<<\n", vertexCode.c_str()); -// printf(">>>\n%s<<<\n", fragmentCode.c_str()); - if (!Compile(GL_VERTEX_PROGRAM_ARB, "vertex", m_VertexProgram, m_VertexFile, vertexCode)) return;