@@ -372,6 +372,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
372372 bool m_fog_enabled;
373373 CachedPixelShaderSetting<float , 4 > m_sky_bg_color;
374374 CachedPixelShaderSetting<float > m_fog_distance;
375+ CachedPixelShaderSetting<float > m_fog_shading_parameter;
375376 CachedVertexShaderSetting<float > m_animation_timer_vertex;
376377 CachedPixelShaderSetting<float > m_animation_timer_pixel;
377378 CachedVertexShaderSetting<float > m_animation_timer_delta_vertex;
@@ -431,6 +432,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
431432 m_fog_range (fog_range),
432433 m_sky_bg_color (" skyBgColor" ),
433434 m_fog_distance (" fogDistance" ),
435+ m_fog_shading_parameter (" fogShadingParameter" ),
434436 m_animation_timer_vertex (" animationTimer" ),
435437 m_animation_timer_pixel (" animationTimer" ),
436438 m_animation_timer_delta_vertex (" animationTimerDelta" ),
@@ -496,7 +498,10 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
496498 if (m_fog_enabled && !*m_force_fog_off)
497499 fog_distance = *m_fog_range;
498500
501+ float fog_shading_parameter = 1.0 / ( 1.0 - m_sky->getFogStart ());
502+
499503 m_fog_distance.set (&fog_distance, services);
504+ m_fog_shading_parameter.set (&fog_shading_parameter, services);
500505
501506 u32 daynight_ratio = (float )m_client->getEnv ().getDayNightRatio ();
502507 video::SColorf sunlight;
@@ -961,7 +966,6 @@ class Game {
961966 f32 m_cache_joystick_frustum_sensitivity;
962967 f32 m_repeat_place_time;
963968 f32 m_cache_cam_smoothing;
964- f32 m_cache_fog_start;
965969
966970 bool m_invert_mouse;
967971 bool m_enable_hotbar_mouse_wheel;
@@ -2490,6 +2494,9 @@ void Game::increaseViewRange()
24902494 range_new = 4000 ;
24912495 std::wstring msg = fwgettext (" Viewing range is at maximum: %d" , range_new);
24922496 m_game_ui->showStatusText (msg);
2497+ } else if (sky->getFogDistance () >= 0 && range_new > sky->getFogDistance ()) {
2498+ std::wstring msg = fwgettext (" Viewing range changed to %d, but limited to %d set by server" , range_new, sky->getFogDistance ());
2499+ m_game_ui->showStatusText (msg);
24932500 } else {
24942501 std::wstring msg = fwgettext (" Viewing range changed to %d" , range_new);
24952502 m_game_ui->showStatusText (msg);
@@ -2507,6 +2514,9 @@ void Game::decreaseViewRange()
25072514 range_new = 20 ;
25082515 std::wstring msg = fwgettext (" Viewing range is at minimum: %d" , range_new);
25092516 m_game_ui->showStatusText (msg);
2517+ } else if (sky->getFogDistance () >= 0 && range_new > sky->getFogDistance ()) {
2518+ std::wstring msg = fwgettext (" Viewing range changed to %d, but limited to %d set by server" , range_new, sky->getFogDistance ());
2519+ m_game_ui->showStatusText (msg);
25102520 } else {
25112521 std::wstring msg = fwgettext (" Viewing range changed to %d" , range_new);
25122522 m_game_ui->showStatusText (msg);
@@ -2518,10 +2528,15 @@ void Game::decreaseViewRange()
25182528void Game::toggleFullViewRange ()
25192529{
25202530 draw_control->range_all = !draw_control->range_all ;
2521- if (draw_control->range_all )
2522- m_game_ui->showTranslatedStatusText (" Enabled unlimited viewing range" );
2523- else
2531+ if (draw_control->range_all ) {
2532+ if (sky->getFogDistance () >= 0 ) {
2533+ m_game_ui->showTranslatedStatusText (" The server has disabled unlimited viewing range" );
2534+ } else {
2535+ m_game_ui->showTranslatedStatusText (" Enabled unlimited viewing range" );
2536+ }
2537+ } else {
25242538 m_game_ui->showTranslatedStatusText (" Disabled unlimited viewing range" );
2539+ }
25252540}
25262541
25272542
@@ -2996,6 +3011,20 @@ void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam)
29963011 // Orbit Tilt:
29973012 sky->setBodyOrbitTilt (event->set_sky ->body_orbit_tilt );
29983013
3014+ // fog
3015+ // do not override a potentially smaller client setting.
3016+ sky->setFogDistance (event->set_sky ->fog_distance );
3017+
3018+ // if the fog distance is reset, switch back to the client's viewing_range
3019+ if (event->set_sky ->fog_distance < 0 )
3020+ draw_control->wanted_range = g_settings->getS16 (" viewing_range" );
3021+
3022+ if (event->set_sky ->fog_start >= 0 )
3023+ sky->setFogStart (rangelim (event->set_sky ->fog_start , 0 .0f , 0 .99f ));
3024+ else
3025+ sky->setFogStart (rangelim (g_settings->getFloat (" fog_start" ), 0 .0f , 0 .99f ));
3026+
3027+
29993028 delete event->set_sky ;
30003029}
30013030
@@ -3915,7 +3944,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
39153944 Fog range
39163945 */
39173946
3918- if (draw_control->range_all ) {
3947+ if (sky->getFogDistance () >= 0 ) {
3948+ draw_control->wanted_range = MYMIN (draw_control->wanted_range , sky->getFogDistance ());
3949+ }
3950+ if (draw_control->range_all && sky->getFogDistance () < 0 ) {
39193951 runData.fog_range = 100000 * BS;
39203952 } else {
39213953 runData.fog_range = draw_control->wanted_range * BS;
@@ -4006,12 +4038,11 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
40064038 /*
40074039 Fog
40084040 */
4009-
40104041 if (m_cache_enable_fog) {
40114042 driver->setFog (
40124043 sky->getBgColor (),
40134044 video::EFT_FOG_LINEAR,
4014- runData.fog_range * m_cache_fog_start ,
4045+ runData.fog_range * sky-> getFogStart () ,
40154046 runData.fog_range * 1.0 ,
40164047 0.01 ,
40174048 false , // pixel fog
@@ -4284,15 +4315,12 @@ void Game::readSettings()
42844315 m_cache_enable_noclip = g_settings->getBool (" noclip" );
42854316 m_cache_enable_free_move = g_settings->getBool (" free_move" );
42864317
4287- m_cache_fog_start = g_settings->getFloat (" fog_start" );
4288-
42894318 m_cache_cam_smoothing = 0 ;
42904319 if (g_settings->getBool (" cinematic" ))
42914320 m_cache_cam_smoothing = 1 - g_settings->getFloat (" cinematic_camera_smoothing" );
42924321 else
42934322 m_cache_cam_smoothing = 1 - g_settings->getFloat (" camera_smoothing" );
42944323
4295- m_cache_fog_start = rangelim (m_cache_fog_start, 0 .0f , 0 .99f );
42964324 m_cache_cam_smoothing = rangelim (m_cache_cam_smoothing, 0 .01f , 1 .0f );
42974325 m_cache_mouse_sensitivity = rangelim (m_cache_mouse_sensitivity, 0.001 , 100.0 );
42984326
0 commit comments