diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg index 0ac064bb82..ed0b073a68 100644 --- a/binaries/data/config/default.cfg +++ b/binaries/data/config/default.cfg @@ -74,6 +74,7 @@ shadowquality = 0 ; Shadow map resolution. (-2 - Very Low, -1 - Low, 0 - Me shadowpcf = true vsync = false particles = true +fog = true silhouettes = true showsky = true diff --git a/binaries/data/mods/public/gui/options/options.json b/binaries/data/mods/public/gui/options/options.json index f8c9acb7a2..1ef40f3f00 100644 --- a/binaries/data/mods/public/gui/options/options.json +++ b/binaries/data/mods/public/gui/options/options.json @@ -128,6 +128,14 @@ "config": "preferglsl", "function": "Renderer_SetPreferGLSLEnabled" }, + { + "type": "boolean", + "label": "Fog", + "tooltip": "Enable Fog", + "dependencies": ["preferglsl"], + "config": "fog", + "function": "Renderer_SetFogEnabled" + }, { "type": "boolean", "label": "Post Processing", diff --git a/binaries/data/mods/public/shaders/glsl/model_common.fs b/binaries/data/mods/public/shaders/glsl/model_common.fs index 3b5e775ade..b5d5300cce 100644 --- a/binaries/data/mods/public/shaders/glsl/model_common.fs +++ b/binaries/data/mods/public/shaders/glsl/model_common.fs @@ -225,7 +225,9 @@ void main() color = mix(texdiffuse, color, specular.a); #endif - color = get_fog(color); + #if USE_FOG + color = get_fog(color); + #endif #if !IGNORE_LOS float los = texture2D(losTex, v_los).a; diff --git a/binaries/data/mods/public/shaders/glsl/particle.fs b/binaries/data/mods/public/shaders/glsl/particle.fs index 772546219b..9a2bcb6bdd 100644 --- a/binaries/data/mods/public/shaders/glsl/particle.fs +++ b/binaries/data/mods/public/shaders/glsl/particle.fs @@ -35,5 +35,9 @@ void main() los = los < 0.03 ? 0.0 : los; color.rgb *= los; - gl_FragColor = get_fog(color); + #if USE_FOG + gl_FragColor = get_fog(color); + #else + gl_FragColor = color; + #endif } diff --git a/binaries/data/mods/public/shaders/glsl/solid_player.fs b/binaries/data/mods/public/shaders/glsl/solid_player.fs index 9498174cf0..16cdb77907 100644 --- a/binaries/data/mods/public/shaders/glsl/solid_player.fs +++ b/binaries/data/mods/public/shaders/glsl/solid_player.fs @@ -22,5 +22,9 @@ vec3 get_fog(vec3 color) void main() { - gl_FragColor = vec4(get_fog(playerColor.rgb),playerColor.a); + #if USE_FOG + gl_FragColor = vec4(get_fog(playerColor.rgb), playerColor.a); + #else + gl_FragColor = vec4(playerColor.rgb, playerColor.a); + #endif } diff --git a/binaries/data/mods/public/shaders/glsl/terrain_common.fs b/binaries/data/mods/public/shaders/glsl/terrain_common.fs index d5059a9074..e50fb05212 100644 --- a/binaries/data/mods/public/shaders/glsl/terrain_common.fs +++ b/binaries/data/mods/public/shaders/glsl/terrain_common.fs @@ -236,7 +236,9 @@ void main() color = mix(texdiffuse, color, specular.a); #endif - color = get_fog(color); + #if USE_FOG + color = get_fog(color); + #endif float los = texture2D(losTex, v_los).a; los = los < 0.03 ? 0.0 : los; diff --git a/binaries/data/mods/public/shaders/glsl/water_high.fs b/binaries/data/mods/public/shaders/glsl/water_high.fs index 2fb28509ef..bf438026e6 100644 --- a/binaries/data/mods/public/shaders/glsl/water_high.fs +++ b/binaries/data/mods/public/shaders/glsl/water_high.fs @@ -325,7 +325,13 @@ void main() #else color += specular; #endif - + +#if USE_FOG + color = get_fog(color); +#endif + +gl_FragColor.rgb = color; + #if USE_FANCY_EFFECTS vec4 FoamEffects = texture2D(waterEffectsTexOther, gl_FragCoord.xy/screenSize); @@ -338,13 +344,10 @@ void main() foam1.x = foaminterp.x * WindCosSin.x - foaminterp.z * WindCosSin.y; - float foam = FoamEffects.r * FoamEffects.a*0.4 + pow(foam1.x*(5.0+waviness),(2.6 - waviness/5.5)); - - gl_FragColor.rgb = get_fog(color) * losMod + foam * losMod; -#else - gl_FragColor.rgb = get_fog(color) * losMod; + gl_FragColor.rgb += FoamEffects.r * FoamEffects.a * 0.4 + pow(foam1.x * (5.0 + waviness), 2.6 - waviness / 5.5); #endif - + +gl_FragColor.rgb *= losMod; gl_FragColor.a = 1.0; #if !USE_REFRACTION diff --git a/source/ps/CStrInternStatic.h b/source/ps/CStrInternStatic.h index f5fafaab07..911a89e730 100644 --- a/source/ps/CStrInternStatic.h +++ b/source/ps/CStrInternStatic.h @@ -62,6 +62,7 @@ X(USE_SHADOW) X(USE_SHADOW_PCF) X(USE_SHADOW_SAMPLER) X(USE_SHADOWS_ON_WATER) +X(USE_FOG) X(WATERTYPE_CLAP) X(WATERTYPE_LAKE) X2(_emptystring, "") diff --git a/source/ps/GameSetup/Config.cpp b/source/ps/GameSetup/Config.cpp index 93f7a1f105..1a092cd548 100644 --- a/source/ps/GameSetup/Config.cpp +++ b/source/ps/GameSetup/Config.cpp @@ -50,6 +50,7 @@ bool g_WaterReflection = false; bool g_WaterShadows = false; bool g_Particles = false; +bool g_Fog = true; bool g_Silhouettes = false; bool g_ShowSky = false; @@ -105,6 +106,7 @@ static void LoadGlobals() CFG_GET_VAL("renderpath", g_RenderPath); CFG_GET_VAL("particles", g_Particles); + CFG_GET_VAL("fog", g_Fog); CFG_GET_VAL("silhouettes", g_Silhouettes); CFG_GET_VAL("showsky", g_ShowSky); CFG_GET_VAL("preferglsl", g_PreferGLSL); diff --git a/source/ps/GameSetup/Config.h b/source/ps/GameSetup/Config.h index 563d6c007e..d38abb4ca3 100644 --- a/source/ps/GameSetup/Config.h +++ b/source/ps/GameSetup/Config.h @@ -67,6 +67,8 @@ extern bool g_WaterShadows; extern bool g_ShadowPCF; // flag to switch on particles rendering extern bool g_Particles; +// flag to switch on fog +extern bool g_Fog; // flag to switch on unit silhouettes extern bool g_Silhouettes; // flag to switch on sky rendering diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index f239d054f1..9a0f52ebb0 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -632,6 +632,8 @@ static void InitRenderer() g_ConfigDB.SetValueBool(CFG_SYSTEM, "shadowpcf", g_ShadowPCF); g_Renderer.SetOptionBool(CRenderer::OPT_PARTICLES, g_Particles); g_ConfigDB.SetValueBool(CFG_SYSTEM, "particles", g_Particles); + g_Renderer.SetOptionBool(CRenderer::OPT_FOG, g_Fog); + g_ConfigDB.SetValueBool(CFG_SYSTEM, "fog", g_Fog); g_Renderer.SetOptionBool(CRenderer::OPT_SILHOUETTES, g_Silhouettes); g_ConfigDB.SetValueBool(CFG_SYSTEM, "silhouettes", g_Silhouettes); g_Renderer.SetOptionBool(CRenderer::OPT_SHOWSKY, g_ShowSky); diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 8a4ac1edb2..ec4a775519 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -443,6 +443,7 @@ CRenderer::CRenderer() m_Options.m_Particles = false; m_Options.m_Silhouettes = false; m_Options.m_PreferGLSL = false; + m_Options.m_Fog = false; m_Options.m_ForceAlphaTest = false; m_Options.m_GPUSkinning = false; m_Options.m_SmoothLOS = false; @@ -582,6 +583,9 @@ void CRenderer::ReloadShaders() if (m_LightEnv) m->globalContext.Add(CStrIntern("LIGHTING_MODEL_" + m_LightEnv->GetLightingModel()), str_1); + if (m_Options.m_PreferGLSL && m_Options.m_Fog) + m->globalContext.Add(str_USE_FOG, str_1); + m->Model.ModShader = LitRenderModifierPtr(new ShaderRenderModifier()); bool cpuLighting = (GetRenderPath() == RP_FIXED); @@ -722,6 +726,10 @@ void CRenderer::SetOptionBool(enum Option opt,bool value) MakeShadersDirty(); RecomputeSystemShaderDefines(); break; + case OPT_FOG: + m_Options.m_Fog = value; + MakeShadersDirty(); + break; case OPT_SILHOUETTES: m_Options.m_Silhouettes = value; break; @@ -770,6 +778,8 @@ bool CRenderer::GetOptionBool(enum Option opt) const return m_Options.m_Particles; case OPT_PREFERGLSL: return m_Options.m_PreferGLSL; + case OPT_FOG: + return m_Options.m_Fog; case OPT_SILHOUETTES: return m_Options.m_Silhouettes; case OPT_SHOWSKY: diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h index a72a41a721..1d37390fd2 100644 --- a/source/renderer/Renderer.h +++ b/source/renderer/Renderer.h @@ -85,6 +85,7 @@ public: OPT_SHADOWPCF, OPT_PARTICLES, OPT_PREFERGLSL, + OPT_FOG, OPT_SILHOUETTES, OPT_SHOWSKY, OPT_SMOOTHLOS, @@ -154,6 +155,7 @@ public: bool m_PreferGLSL; bool m_ForceAlphaTest; bool m_GPUSkinning; + bool m_Fog; bool m_Silhouettes; bool m_SmoothLOS; bool m_ShowSky; diff --git a/source/renderer/scripting/JSInterface_Renderer.cpp b/source/renderer/scripting/JSInterface_Renderer.cpp index ff23de4539..31a611b017 100644 --- a/source/renderer/scripting/JSInterface_Renderer.cpp +++ b/source/renderer/scripting/JSInterface_Renderer.cpp @@ -43,6 +43,7 @@ IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERREALDEPTH, WaterRealDepth); IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERREFLECTION, WaterReflection); IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERREFRACTION, WaterRefraction); IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SHADOWSONWATER, WaterShadows); +IMPLEMENT_BOOLEAN_SCRIPT_SETTING(FOG, Fog); IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SILHOUETTES, Silhouettes); IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SHOWSKY, ShowSky); IMPLEMENT_BOOLEAN_SCRIPT_SETTING(SMOOTHLOS, SmoothLOS); @@ -86,6 +87,7 @@ void JSI_Renderer::RegisterScriptFunctions(const ScriptInterface& scriptInterfac REGISTER_BOOLEAN_SCRIPT_SETTING(WaterReflection); REGISTER_BOOLEAN_SCRIPT_SETTING(WaterRefraction); REGISTER_BOOLEAN_SCRIPT_SETTING(WaterShadows); + REGISTER_BOOLEAN_SCRIPT_SETTING(Fog); REGISTER_BOOLEAN_SCRIPT_SETTING(Silhouettes); REGISTER_BOOLEAN_SCRIPT_SETTING(ShowSky); REGISTER_BOOLEAN_SCRIPT_SETTING(SmoothLOS); diff --git a/source/renderer/scripting/JSInterface_Renderer.h b/source/renderer/scripting/JSInterface_Renderer.h index aac4d79773..f2d99bef62 100644 --- a/source/renderer/scripting/JSInterface_Renderer.h +++ b/source/renderer/scripting/JSInterface_Renderer.h @@ -41,6 +41,7 @@ namespace JSI_Renderer DECLARE_BOOLEAN_SCRIPT_SETTING(WaterReflection); DECLARE_BOOLEAN_SCRIPT_SETTING(WaterRefraction); DECLARE_BOOLEAN_SCRIPT_SETTING(WaterShadows); + DECLARE_BOOLEAN_SCRIPT_SETTING(Fog); DECLARE_BOOLEAN_SCRIPT_SETTING(Silhouettes); DECLARE_BOOLEAN_SCRIPT_SETTING(ShowSky); DECLARE_BOOLEAN_SCRIPT_SETTING(SmoothLOS);