Proper fog disabling with and without shaders (#227)
This commit is contained in:
parent
e239d8a6d3
commit
9627563107
@ -3,6 +3,7 @@ uniform sampler2D normalTexture;
|
|||||||
uniform sampler2D textureFlags;
|
uniform sampler2D textureFlags;
|
||||||
|
|
||||||
uniform vec4 skyBgColor;
|
uniform vec4 skyBgColor;
|
||||||
|
uniform mediump float fogDistance;
|
||||||
uniform vec3 eyePosition;
|
uniform vec3 eyePosition;
|
||||||
|
|
||||||
varying mediump vec4 varColor;
|
varying mediump vec4 varColor;
|
||||||
@ -73,9 +74,11 @@ void main(void)
|
|||||||
// As additions usually come for free following a multiplication, the new formula
|
// As additions usually come for free following a multiplication, the new formula
|
||||||
// should be more efficient as well.
|
// should be more efficient as well.
|
||||||
// Note: clarity = (1 - fogginess)
|
// Note: clarity = (1 - fogginess)
|
||||||
|
if (fogDistance > 0.0) { // -1.0 means disabled
|
||||||
float clarity = clamp(fogShadingParameter
|
float clarity = clamp(fogShadingParameter
|
||||||
- fogShadingParameter * length(eyeVec), 0.0, 1.0);
|
- fogShadingParameter * length(eyeVec), 0.0, 1.0);
|
||||||
col = mix(skyBgColor, col, clarity);
|
col = mix(skyBgColor, col, clarity);
|
||||||
|
}
|
||||||
col = vec4(col.rgb, base.a);
|
col = vec4(col.rgb, base.a);
|
||||||
|
|
||||||
gl_FragColor = col;
|
gl_FragColor = col;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Color of the light emitted by the sun.
|
// Color of the light emitted by the sun.
|
||||||
uniform highp mat4 mWorld;
|
uniform highp mat4 mWorld;
|
||||||
uniform vec3 dayLight;
|
uniform vec3 dayLight;
|
||||||
uniform float fogDistance;
|
uniform mediump float fogDistance;
|
||||||
uniform float animationTimer;
|
uniform float animationTimer;
|
||||||
|
|
||||||
varying mediump vec4 varColor;
|
varying mediump vec4 varColor;
|
||||||
|
@ -40,9 +40,11 @@ void main(void)
|
|||||||
// As additions usually come for free following a multiplication, the new formula
|
// As additions usually come for free following a multiplication, the new formula
|
||||||
// should be more efficient as well.
|
// should be more efficient as well.
|
||||||
// Note: clarity = (1 - fogginess)
|
// Note: clarity = (1 - fogginess)
|
||||||
|
if (fogDistance > 0.0) { // -1.0 means disabled
|
||||||
float clarity = clamp(fogShadingParameter
|
float clarity = clamp(fogShadingParameter
|
||||||
- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
|
- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
|
||||||
col = mix(skyBgColor, col, clarity);
|
col = mix(skyBgColor, col, clarity);
|
||||||
|
}
|
||||||
|
|
||||||
gl_FragColor = vec4(col.rgb, base.a);
|
gl_FragColor = vec4(col.rgb, base.a);
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ void draw_anaglyph_3d_mode(Camera& camera, bool show_hud, Hud& hud,
|
|||||||
//clear the depth buffer, and color
|
//clear the depth buffer, and color
|
||||||
driver->beginScene( true, true, irr::video::SColor(0, 200, 200, 255));
|
driver->beginScene( true, true, irr::video::SColor(0, 200, 200, 255));
|
||||||
driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_RED;
|
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
|
driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX
|
||||||
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
|
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
|
||||||
+ irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW;
|
+ 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->clearZBuffer();
|
||||||
driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_GREEN
|
driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_GREEN
|
||||||
+ irr::video::ECP_BLUE;
|
+ 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
|
driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX
|
||||||
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
|
+ irr::scene::ESNRP_SOLID + irr::scene::ESNRP_TRANSPARENT
|
||||||
+ irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW;
|
+ irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW;
|
||||||
|
37
src/game.cpp
37
src/game.cpp
@ -698,7 +698,7 @@ public:
|
|||||||
m_sky_bg_color.set(bgcolorfa, services);
|
m_sky_bg_color.set(bgcolorfa, services);
|
||||||
|
|
||||||
// Fog distance
|
// Fog distance
|
||||||
float fog_distance = 10000 * BS;
|
float fog_distance = -1.0f; // sentinel for disabled fog
|
||||||
|
|
||||||
if (m_fog_enabled && !*m_force_fog_off)
|
if (m_fog_enabled && !*m_force_fog_off)
|
||||||
fog_distance = *m_fog_range;
|
fog_distance = *m_fog_range;
|
||||||
@ -1164,6 +1164,7 @@ struct GameRunData {
|
|||||||
bool left_punch;
|
bool left_punch;
|
||||||
bool update_wielded_item_trigger;
|
bool update_wielded_item_trigger;
|
||||||
bool reset_jump_timer;
|
bool reset_jump_timer;
|
||||||
|
bool disable_fog;
|
||||||
float nodig_delay_timer;
|
float nodig_delay_timer;
|
||||||
float noplace_delay_timer;
|
float noplace_delay_timer;
|
||||||
float dig_time;
|
float dig_time;
|
||||||
@ -1961,7 +1962,7 @@ bool Game::createClient(const std::string &playername,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory(
|
GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory(
|
||||||
&flags.force_fog_off, &runData.fog_range, client);
|
&runData.disable_fog, &runData.fog_range, client);
|
||||||
shader_src->addShaderConstantSetterFactory(scsf);
|
shader_src->addShaderConstantSetterFactory(scsf);
|
||||||
|
|
||||||
// Update cached textures, meshes and materials
|
// Update cached textures, meshes and materials
|
||||||
@ -4188,15 +4189,8 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
|
|||||||
Fog range
|
Fog range
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (draw_control->range_all) {
|
runData.disable_fog = !m_cache_enable_fog || flags.force_fog_off || 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.fog_range = draw_control->wanted_range * BS;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Calculate general brightness
|
Calculate general brightness
|
||||||
@ -4267,7 +4261,6 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
|
|||||||
Fog
|
Fog
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (m_cache_enable_fog && !flags.force_fog_off) {
|
|
||||||
driver->setFog(
|
driver->setFog(
|
||||||
sky->getBgColor(),
|
sky->getBgColor(),
|
||||||
video::EFT_FOG_LINEAR,
|
video::EFT_FOG_LINEAR,
|
||||||
@ -4277,17 +4270,6 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
|
|||||||
false, // pixel fog
|
false, // pixel fog
|
||||||
true // range 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
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get chat messages from client
|
Get chat messages from client
|
||||||
@ -4378,10 +4360,21 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
|
|||||||
TimeTaker tt_draw("mainloop: draw");
|
TimeTaker tt_draw("mainloop: draw");
|
||||||
driver->beginScene(true, true, skycolor);
|
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,
|
draw_scene(driver, smgr, *camera, *client, player, *hud, mapper,
|
||||||
guienv, screensize, skycolor, flags.show_hud,
|
guienv, screensize, skycolor, flags.show_hud,
|
||||||
flags.show_minimap);
|
flags.show_minimap);
|
||||||
|
|
||||||
|
driver->getOverrideMaterial().EnableFlags = 0;
|
||||||
|
driver->getOverrideMaterial().EnablePasses = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Profiler graph
|
Profiler graph
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user