Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow the server to control fog_distance and fog_start via the sky-api #13448

Merged
merged 7 commits into from Jul 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 1 addition & 3 deletions client/shaders/nodes_shader/opengl_fragment.glsl
Expand Up @@ -3,6 +3,7 @@ uniform sampler2D baseTexture;
uniform vec3 dayLight;
uniform vec4 skyBgColor;
uniform float fogDistance;
uniform float fogShadingParameter;
uniform vec3 eyePosition;

// The cameraOffset is the current center of the visible world.
Expand Down Expand Up @@ -49,9 +50,6 @@ varying vec3 tsEyeVec;
varying vec3 lightVec;
varying vec3 tsLightVec;

const float fogStart = FOG_START;
const float fogShadingParameter = 1.0 / ( 1.0 - fogStart);

#ifdef ENABLE_DYNAMIC_SHADOWS

// assuming near is always 1.0
Expand Down
4 changes: 1 addition & 3 deletions client/shaders/object_shader/opengl_fragment.glsl
Expand Up @@ -3,6 +3,7 @@ uniform sampler2D baseTexture;
uniform vec3 dayLight;
uniform vec4 skyBgColor;
uniform float fogDistance;
uniform float fogShadingParameter;
uniform vec3 eyePosition;

// The cameraOffset is the current center of the visible world.
Expand Down Expand Up @@ -48,9 +49,6 @@ varying float nightRatio;

varying float vIDiff;

const float fogStart = FOG_START;
const float fogShadingParameter = 1.0 / (1.0 - fogStart);

#ifdef ENABLE_DYNAMIC_SHADOWS

// assuming near is always 1.0
Expand Down
12 changes: 12 additions & 0 deletions doc/lua_api.md
Expand Up @@ -7740,6 +7740,18 @@ child will follow movement and rotation of that bone.
abides by, `"custom"` uses `sun_tint` and `moon_tint`, while
`"default"` uses the classic Minetest sun and moon tinting.
Will use tonemaps, if set to `"default"`. (default: `"default"`)
* `fog`: A table with following optional fields:
* `fog_distance`: integer, set an upper bound the client's viewing_range (inluding range_all).
By default, fog_distance is controlled by the client's viewing_range, and this field is not set.
Any value >= 0 sets the desired upper bound for the client's viewing_range and disables range_all.
Any value < 0, resets the behavior to being client-controlled.
(default: -1)
* `fog_start`: float, override the client's fog_start.
lhofhansl marked this conversation as resolved.
Show resolved Hide resolved
Fraction of the visible distance at which fog starts to be rendered.
Desour marked this conversation as resolved.
Show resolved Hide resolved
By default, fog_start is controlled by the client's `fog_start` setting, and this field is not set.
Any value between [0.0, 0.99] set the fog_start as a fraction of the viewing_range.
Any value < 0, resets the behavior to being client-controlled.
(default: -1)
* `set_sky(base_color, type, {texture names}, clouds)`
* Deprecated. Use `set_sky(sky_parameters)`
* `base_color`: ColorSpec, defaults to white
Expand Down
48 changes: 38 additions & 10 deletions src/client/game.cpp
Expand Up @@ -372,6 +372,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
bool m_fog_enabled;
CachedPixelShaderSetting<float, 4> m_sky_bg_color;
CachedPixelShaderSetting<float> m_fog_distance;
CachedPixelShaderSetting<float> m_fog_shading_parameter;
CachedVertexShaderSetting<float> m_animation_timer_vertex;
CachedPixelShaderSetting<float> m_animation_timer_pixel;
CachedVertexShaderSetting<float> m_animation_timer_delta_vertex;
Expand Down Expand Up @@ -431,6 +432,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
m_fog_range(fog_range),
m_sky_bg_color("skyBgColor"),
m_fog_distance("fogDistance"),
m_fog_shading_parameter("fogShadingParameter"),
m_animation_timer_vertex("animationTimer"),
m_animation_timer_pixel("animationTimer"),
m_animation_timer_delta_vertex("animationTimerDelta"),
Expand Down Expand Up @@ -496,7 +498,10 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
if (m_fog_enabled && !*m_force_fog_off)
fog_distance = *m_fog_range;
Desour marked this conversation as resolved.
Show resolved Hide resolved

float fog_shading_parameter = 1.0 / ( 1.0 - m_sky->getFogStart());

m_fog_distance.set(&fog_distance, services);
m_fog_shading_parameter.set(&fog_shading_parameter, services);

u32 daynight_ratio = (float)m_client->getEnv().getDayNightRatio();
video::SColorf sunlight;
Expand Down Expand Up @@ -961,7 +966,6 @@ class Game {
f32 m_cache_joystick_frustum_sensitivity;
f32 m_repeat_place_time;
f32 m_cache_cam_smoothing;
f32 m_cache_fog_start;

bool m_invert_mouse;
bool m_enable_hotbar_mouse_wheel;
Expand Down Expand Up @@ -2490,6 +2494,9 @@ void Game::increaseViewRange()
range_new = 4000;
std::wstring msg = fwgettext("Viewing range is at maximum: %d", range_new);
m_game_ui->showStatusText(msg);
} else if (sky->getFogDistance() >= 0 && range_new > sky->getFogDistance()) {
std::wstring msg = fwgettext("Viewing range changed to %d, but limited to %d set by server", range_new, sky->getFogDistance());
m_game_ui->showStatusText(msg);
} else {
std::wstring msg = fwgettext("Viewing range changed to %d", range_new);
m_game_ui->showStatusText(msg);
Expand All @@ -2507,6 +2514,9 @@ void Game::decreaseViewRange()
range_new = 20;
std::wstring msg = fwgettext("Viewing range is at minimum: %d", range_new);
m_game_ui->showStatusText(msg);
} else if (sky->getFogDistance() >= 0 && range_new > sky->getFogDistance()) {
std::wstring msg = fwgettext("Viewing range changed to %d, but limited to %d set by server", range_new, sky->getFogDistance());
m_game_ui->showStatusText(msg);
} else {
std::wstring msg = fwgettext("Viewing range changed to %d", range_new);
m_game_ui->showStatusText(msg);
Expand All @@ -2518,10 +2528,15 @@ void Game::decreaseViewRange()
void Game::toggleFullViewRange()
{
draw_control->range_all = !draw_control->range_all;
if (draw_control->range_all)
m_game_ui->showTranslatedStatusText("Enabled unlimited viewing range");
else
if (draw_control->range_all) {
if (sky->getFogDistance() >= 0) {
m_game_ui->showTranslatedStatusText("The server has disabled unlimited viewing range");
} else {
m_game_ui->showTranslatedStatusText("Enabled unlimited viewing range");
}
} else {
m_game_ui->showTranslatedStatusText("Disabled unlimited viewing range");
}
}


Expand Down Expand Up @@ -2996,6 +3011,20 @@ void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam)
// Orbit Tilt:
sky->setBodyOrbitTilt(event->set_sky->body_orbit_tilt);

// fog
// do not override a potentially smaller client setting.
sky->setFogDistance(event->set_sky->fog_distance);

// if the fog distance is reset, switch back to the client's viewing_range
if (event->set_sky->fog_distance < 0)
draw_control->wanted_range = g_settings->getS16("viewing_range");

if (event->set_sky->fog_start >= 0)
sky->setFogStart(rangelim(event->set_sky->fog_start, 0.0f, 0.99f));
Desour marked this conversation as resolved.
Show resolved Hide resolved
else
sky->setFogStart(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f));


delete event->set_sky;
}

Expand Down Expand Up @@ -3915,7 +3944,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
Fog range
*/

if (draw_control->range_all) {
if (sky->getFogDistance() >= 0) {
draw_control->wanted_range = MYMIN(draw_control->wanted_range, sky->getFogDistance());
}
if (draw_control->range_all && sky->getFogDistance() < 0) {
runData.fog_range = 100000 * BS;
} else {
runData.fog_range = draw_control->wanted_range * BS;
Expand Down Expand Up @@ -4006,12 +4038,11 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
/*
Fog
*/

if (m_cache_enable_fog) {
driver->setFog(
sky->getBgColor(),
video::EFT_FOG_LINEAR,
runData.fog_range * m_cache_fog_start,
runData.fog_range * sky->getFogStart(),
runData.fog_range * 1.0,
0.01,
false, // pixel fog
Expand Down Expand Up @@ -4284,15 +4315,12 @@ void Game::readSettings()
m_cache_enable_noclip = g_settings->getBool("noclip");
m_cache_enable_free_move = g_settings->getBool("free_move");

m_cache_fog_start = g_settings->getFloat("fog_start");

m_cache_cam_smoothing = 0;
if (g_settings->getBool("cinematic"))
m_cache_cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing");
else
m_cache_cam_smoothing = 1 - g_settings->getFloat("camera_smoothing");

m_cache_fog_start = rangelim(m_cache_fog_start, 0.0f, 0.99f);
m_cache_cam_smoothing = rangelim(m_cache_cam_smoothing, 0.01f, 1.0f);
m_cache_mouse_sensitivity = rangelim(m_cache_mouse_sensitivity, 0.001, 100.0);

Expand Down
2 changes: 0 additions & 2 deletions src/client/shader.cpp
Expand Up @@ -752,8 +752,6 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,
shaders_header << "#define ENABLE_WAVING_PLANTS " << g_settings->getBool("enable_waving_plants") << "\n";
shaders_header << "#define ENABLE_TONE_MAPPING " << g_settings->getBool("tone_mapping") << "\n";

shaders_header << "#define FOG_START " << core::clamp(g_settings->getFloat("fog_start"), 0.0f, 0.99f) << "\n";

if (g_settings->getBool("enable_dynamic_shadows")) {
shaders_header << "#define ENABLE_DYNAMIC_SHADOWS 1\n";
if (g_settings->getBool("shadow_map_color"))
Expand Down
1 change: 1 addition & 0 deletions src/client/sky.cpp
Expand Up @@ -98,6 +98,7 @@ Sky::Sky(s32 id, RenderingEngine *rendering_engine, ITextureSource *tsrc, IShade

m_directional_colored_fog = g_settings->getBool("directional_colored_fog");
m_sky_params.body_orbit_tilt = g_settings->getFloat("shadow_sky_body_orbit_tilt", -60., 60.);
m_sky_params.fog_start = rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f);

setStarCount(1000);
}
Expand Down
5 changes: 5 additions & 0 deletions src/client/sky.h
Expand Up @@ -114,6 +114,11 @@ class Sky : public scene::ISceneNode
void addTextureToSkybox(const std::string &texture, int material_id,
ITextureSource *tsrc);
const video::SColorf &getCurrentStarColor() const { return m_star_color; }
void setFogDistance(s16 fog_distance) { m_sky_params.fog_distance = fog_distance; }
s16 getFogDistance() const { return m_sky_params.fog_distance; }

void setFogStart(float fog_start) { m_sky_params.fog_start = fog_start; }
float getFogStart() const { return m_sky_params.fog_start; }

private:
aabb3f m_box;
Expand Down
8 changes: 6 additions & 2 deletions src/network/clientpackethandler.cpp
Expand Up @@ -1395,9 +1395,13 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt)
>> skybox.sky_color.indoors;
}

try {
if (pkt->getRemainingBytes() >= 4) {
*pkt >> skybox.body_orbit_tilt;
} catch (PacketError &e) {}
}

if (pkt->getRemainingBytes() >= 6) {
sfan5 marked this conversation as resolved.
Show resolved Hide resolved
*pkt >> skybox.fog_distance >> skybox.fog_start;
}

ClientEvent *event = new ClientEvent();
event->type = CE_SET_SKY;
Expand Down
14 changes: 13 additions & 1 deletion src/script/lua_api/l_object.cpp
Expand Up @@ -1803,6 +1803,11 @@ int ObjectRef::l_set_sky(lua_State *L)
// pop "sky_color" table
lua_pop(L, 1);
}
lua_getfield(L, 2, "fog");
if (lua_istable(L, -1)) {
sky_params.fog_distance = getintfield_default(L, -1, "fog_distance", sky_params.fog_distance);
sky_params.fog_start = getfloatfield_default(L, -1, "fog_start", sky_params.fog_start);
}
} else {
// Handle old set_sky calls, and log deprecated:
log_deprecated(L, "Deprecated call to set_sky, please check lua_api.md");
Expand Down Expand Up @@ -1923,7 +1928,6 @@ int ObjectRef::l_get_sky(lua_State *L)
lua_pushnumber(L, skybox_params.body_orbit_tilt);
lua_setfield(L, -2, "body_orbit_tilt");
}

lua_newtable(L);
s16 i = 1;
for (const std::string &texture : skybox_params.textures) {
Expand All @@ -1936,6 +1940,14 @@ int ObjectRef::l_get_sky(lua_State *L)

push_sky_color(L, skybox_params);
lua_setfield(L, -2, "sky_color");

lua_newtable(L); // fog
lua_pushinteger(L, skybox_params.fog_distance >= 0 ? skybox_params.fog_distance : -1);
lua_setfield(L, -2, "fog_distance");
lua_pushnumber(L, skybox_params.fog_start >= 0 ? skybox_params.fog_start : -1.0f);
lua_setfield(L, -2, "fog_start");
lua_setfield(L, -2, "fog");

return 1;
}

Expand Down
1 change: 1 addition & 0 deletions src/server.cpp
Expand Up @@ -1846,6 +1846,7 @@ void Server::SendSetSky(session_t peer_id, const SkyboxParams &params)
}

pkt << params.body_orbit_tilt;
pkt << params.fog_distance << params.fog_start;
}

Send(&pkt);
Expand Down
2 changes: 2 additions & 0 deletions src/skyparams.h
Expand Up @@ -44,6 +44,8 @@ struct SkyboxParams
video::SColor fog_moon_tint;
std::string fog_tint_type;
float body_orbit_tilt { INVALID_SKYBOX_TILT };
s16 fog_distance { -1 };
float fog_start { -1.0f };
};

struct SunParams
Expand Down