diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index ef75d55b..1a3b1484 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -3,6 +3,7 @@ uniform sampler2D normalTexture; uniform sampler2D textureFlags; uniform vec4 skyBgColor; +uniform mediump float fogDistance; uniform vec3 eyePosition; varying mediump vec4 varColor; @@ -73,9 +74,11 @@ void main(void) // As additions usually come for free following a multiplication, the new formula // should be more efficient as well. // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec), 0.0, 1.0); - col = mix(skyBgColor, col, clarity); + if (fogDistance > 0.0) { // -1.0 means disabled + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec), 0.0, 1.0); + col = mix(skyBgColor, col, clarity); + } col = vec4(col.rgb, base.a); gl_FragColor = col; diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index aba93942..f6647380 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -1,7 +1,7 @@ // Color of the light emitted by the sun. uniform highp mat4 mWorld; uniform vec3 dayLight; -uniform float fogDistance; +uniform mediump float fogDistance; uniform float animationTimer; varying mediump vec4 varColor; diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl index f926dcff..2300f90c 100644 --- a/client/shaders/wielded_shader/opengl_fragment.glsl +++ b/client/shaders/wielded_shader/opengl_fragment.glsl @@ -40,9 +40,11 @@ void main(void) // As additions usually come for free following a multiplication, the new formula // should be more efficient as well. // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - col = mix(skyBgColor, col, clarity); + if (fogDistance > 0.0) { // -1.0 means disabled + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); + } gl_FragColor = vec4(col.rgb, base.a); } diff --git a/src/drawscene.cpp b/src/drawscene.cpp index 2564e2b8..375e38eb 100644 --- a/src/drawscene.cpp +++ b/src/drawscene.cpp @@ -60,7 +60,7 @@ void draw_anaglyph_3d_mode(Camera& camera, bool show_hud, Hud& hud, //clear the depth buffer, and color driver->beginScene( true, true, irr::video::SColor(0, 200, 200, 255)); driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_RED; - driver->getOverrideMaterial().EnableFlags = irr::video::EMF_COLOR_MASK; + driver->getOverrideMaterial().EnableFlags |= irr::video::EMF_COLOR_MASK; driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX + irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT + irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW; @@ -88,7 +88,7 @@ void draw_anaglyph_3d_mode(Camera& camera, bool show_hud, Hud& hud, driver->clearZBuffer(); driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_GREEN + irr::video::ECP_BLUE; - driver->getOverrideMaterial().EnableFlags = irr::video::EMF_COLOR_MASK; + driver->getOverrideMaterial().EnableFlags |= irr::video::EMF_COLOR_MASK; driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX + irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT + irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW; diff --git a/src/game.cpp b/src/game.cpp index 131cae5e..44cb8fce 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -698,7 +698,7 @@ public: m_sky_bg_color.set(bgcolorfa, services); // Fog distance - float fog_distance = 10000 * BS; + float fog_distance = -1.0f; // sentinel for disabled fog if (m_fog_enabled && !*m_force_fog_off) fog_distance = *m_fog_range; @@ -1164,6 +1164,7 @@ struct GameRunData { bool left_punch; bool update_wielded_item_trigger; bool reset_jump_timer; + bool disable_fog; float nodig_delay_timer; float noplace_delay_timer; float dig_time; @@ -1961,7 +1962,7 @@ bool Game::createClient(const std::string &playername, #endif GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory( - &flags.force_fog_off, &runData.fog_range, client); + &runData.disable_fog, &runData.fog_range, client); shader_src->addShaderConstantSetterFactory(scsf); // Update cached textures, meshes and materials @@ -4188,15 +4189,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, Fog range */ - if (draw_control->range_all) { - #if defined(__ANDROID__) || defined(__IOS__) - runData.fog_range = draw_control->wanted_range * 4 * BS; - #else - runData.fog_range = 100000 * BS; - #endif - } else { - runData.fog_range = draw_control->wanted_range * BS; - } + runData.disable_fog = !m_cache_enable_fog || flags.force_fog_off || draw_control->range_all; + runData.fog_range = draw_control->wanted_range * BS; /* Calculate general brightness @@ -4267,27 +4261,15 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, Fog */ - if (m_cache_enable_fog && !flags.force_fog_off) { - driver->setFog( - sky->getBgColor(), - video::EFT_FOG_LINEAR, - runData.fog_range * m_cache_fog_start, - runData.fog_range * 1.0, - 0.01, - false, // pixel fog - true // range fog - ); - } else { - driver->setFog( - sky->getBgColor(), - video::EFT_FOG_LINEAR, - 100000 * BS, - 110000 * BS, - 0.01, - false, // pixel fog - false // range fog - ); - } + driver->setFog( + sky->getBgColor(), + video::EFT_FOG_LINEAR, + runData.fog_range * m_cache_fog_start, + runData.fog_range * 1.0, + 0.01, + false, // pixel fog + true // range fog + ); /* Get chat messages from client @@ -4378,10 +4360,21 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, TimeTaker tt_draw("mainloop: draw"); driver->beginScene(true, true, skycolor); + if (runData.disable_fog) { + driver->getOverrideMaterial().reset(); + driver->getOverrideMaterial().EnableFlags = video::EMF_FOG_ENABLE; + driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX + | irr::scene::ESNRP_SOLID | irr::scene::ESNRP_TRANSPARENT + | irr::scene::ESNRP_TRANSPARENT_EFFECT | irr::scene::ESNRP_SHADOW; + } + draw_scene(driver, smgr, *camera, *client, player, *hud, mapper, guienv, screensize, skycolor, flags.show_hud, flags.show_minimap); + driver->getOverrideMaterial().EnableFlags = 0; + driver->getOverrideMaterial().EnablePasses = 0; + /* Profiler graph */