Skip to content

Commit

Permalink
Make volumetric light effect strength server controllable
Browse files Browse the repository at this point in the history
  • Loading branch information
lhofhansl committed Oct 26, 2023
1 parent 2e614ad commit 79c875c
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 43 deletions.
5 changes: 0 additions & 5 deletions builtin/settingtypes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -623,11 +623,6 @@ bloom_radius (Bloom Radius) float 1 0.1 8
# Requires: shaders_support
enable_volumetric_lighting (Volumetric lighting) bool false

# Sets the strength of the volumetric lighting effect.
#
# Requires: shaders_support, enable_volumetric_lighting
volumetric_lighting_strength (Volumetric strength) float 0.2 0.01 1

[*Audio]

# Volume of all sounds.
Expand Down
5 changes: 5 additions & 0 deletions doc/lua_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -7868,6 +7868,11 @@ child will follow movement and rotation of that bone.
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)
* `volumetric_light_strength`: float, set the strength of the client's volumetric light (a.k.a. "godrays") effect.
Any value between [0.0, 1.0] sets the strength of the effect.
A value of 0 disables the effect.
This value has no effect on clients who have the "Volumetric Lighting" shader disabled.
(default: 0)
* `set_sky(base_color, type, {texture names}, clouds)`
* Deprecated. Use `set_sky(sky_parameters)`
* `base_color`: ColorSpec, defaults to white
Expand Down
81 changes: 45 additions & 36 deletions src/client/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -404,10 +404,12 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
CachedPixelShaderSetting<float> m_bloom_radius_pixel;
float m_bloom_radius;
CachedPixelShaderSetting<float> m_saturation_pixel;
bool m_volumetric_light_enabled;
CachedPixelShaderSetting<float, 3> m_sun_position_pixel;
CachedPixelShaderSetting<float> m_sun_brightness_pixel;
CachedPixelShaderSetting<float, 3> m_moon_position_pixel;
CachedPixelShaderSetting<float> m_moon_brightness_pixel;
CachedPixelShaderSetting<float> m_volumetric_light_strength_pixel;

public:
void onSettingsChange(const std::string &name)
Expand Down Expand Up @@ -469,7 +471,8 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
m_sun_position_pixel("sunPositionScreen"),
m_sun_brightness_pixel("sunBrightness"),
m_moon_position_pixel("moonPositionScreen"),
m_moon_brightness_pixel("moonBrightness")
m_moon_brightness_pixel("moonBrightness"),
m_volumetric_light_strength_pixel("volumetricLightStrength")
{
g_settings->registerChangedCallback("enable_fog", settingsCallback, this);
g_settings->registerChangedCallback("exposure_compensation", settingsCallback, this);
Expand All @@ -483,6 +486,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
m_bloom_intensity = g_settings->getFloat("bloom_intensity", 0.01f, 1.0f);
m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f);
m_bloom_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f);
m_volumetric_light_enabled = g_settings->getBool("enable_volumetric_lighting");
}

~GameGlobalShaderConstantSetter()
Expand Down Expand Up @@ -588,49 +592,53 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
float saturation = m_client->getEnv().getLocalPlayer()->getLighting().saturation;
m_saturation_pixel.set(&saturation, services);

// Map directional light to screen space
auto camera_node = m_client->getCamera()->getCameraNode();
core::matrix4 transform = camera_node->getProjectionMatrix();
transform *= camera_node->getViewMatrix();
if (m_volumetric_light_enabled) {
// Map directional light to screen space
auto camera_node = m_client->getCamera()->getCameraNode();
core::matrix4 transform = camera_node->getProjectionMatrix();
transform *= camera_node->getViewMatrix();

if (m_sky->getSunVisible()) {
v3f sun_position = camera_node->getAbsolutePosition() +
10000. * m_sky->getSunDirection();
transform.transformVect(sun_position);
sun_position.normalize();
if (m_sky->getSunVisible()) {
v3f sun_position = camera_node->getAbsolutePosition() +
10000. * m_sky->getSunDirection();
transform.transformVect(sun_position);
sun_position.normalize();

float sun_position_array[3] = { sun_position.X, sun_position.Y, sun_position.Z};
m_sun_position_pixel.set(sun_position_array, services);
float sun_position_array[3] = { sun_position.X, sun_position.Y, sun_position.Z};
m_sun_position_pixel.set(sun_position_array, services);

float sun_brightness = rangelim(107.143f * m_sky->getSunDirection().dotProduct(v3f(0.f, 1.f, 0.f)), 0.f, 1.f);
m_sun_brightness_pixel.set(&sun_brightness, services);
}
else {
float sun_position_array[3] = { 0.f, 0.f, -1.f };
m_sun_position_pixel.set(sun_position_array, services);
float sun_brightness = rangelim(107.143f * m_sky->getSunDirection().dotProduct(v3f(0.f, 1.f, 0.f)), 0.f, 1.f);
m_sun_brightness_pixel.set(&sun_brightness, services);
}
else {
float sun_position_array[3] = { 0.f, 0.f, -1.f };
m_sun_position_pixel.set(sun_position_array, services);

float sun_brightness = 0.f;
m_sun_brightness_pixel.set(&sun_brightness, services);
}
float sun_brightness = 0.f;
m_sun_brightness_pixel.set(&sun_brightness, services);
}

if (m_sky->getMoonVisible()) {
v3f moon_position = camera_node->getAbsolutePosition() +
10000. * m_sky->getMoonDirection();
transform.transformVect(moon_position);
moon_position.normalize();
if (m_sky->getMoonVisible()) {
v3f moon_position = camera_node->getAbsolutePosition() +
10000. * m_sky->getMoonDirection();
transform.transformVect(moon_position);
moon_position.normalize();

float moon_position_array[3] = { moon_position.X, moon_position.Y, moon_position.Z};
m_moon_position_pixel.set(moon_position_array, services);
float moon_position_array[3] = { moon_position.X, moon_position.Y, moon_position.Z};
m_moon_position_pixel.set(moon_position_array, services);

float moon_brightness = rangelim(107.143f * m_sky->getMoonDirection().dotProduct(v3f(0.f, 1.f, 0.f)), 0.f, 1.f);
m_moon_brightness_pixel.set(&moon_brightness, services);
}
else {
float moon_position_array[3] = { 0.f, 0.f, -1.f };
m_moon_position_pixel.set(moon_position_array, services);
float moon_brightness = rangelim(107.143f * m_sky->getMoonDirection().dotProduct(v3f(0.f, 1.f, 0.f)), 0.f, 1.f);
m_moon_brightness_pixel.set(&moon_brightness, services);
}
else {
float moon_position_array[3] = { 0.f, 0.f, -1.f };
m_moon_position_pixel.set(moon_position_array, services);

float moon_brightness = 0.f;
m_moon_brightness_pixel.set(&moon_brightness, services);
float moon_brightness = 0.f;
m_moon_brightness_pixel.set(&moon_brightness, services);
}
float volumetric_light_strength = m_sky->getVolumetricLightStrength();
m_volumetric_light_strength_pixel.set(&volumetric_light_strength, services);
}
}

Expand Down Expand Up @@ -3079,6 +3087,7 @@ void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam)
else
sky->setFogStart(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f));

sky->setVolumetricLightStrength(rangelim(event->set_sky->volumetric_light_strength, 0.0f, 1.0f));

delete event->set_sky;
}
Expand Down
2 changes: 1 addition & 1 deletion src/client/shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,7 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,
}

if (g_settings->getBool("enable_volumetric_lighting")) {
shaders_header << "#define VOLUMETRIC_LIGHT " << g_settings->getFloat("volumetric_lighting_strength") << "\n";
shaders_header << "#define VOLUMETRIC_LIGHT 1\n";
}

shaders_header << "#line 0\n"; // reset the line counter for meaningful diagnostics
Expand Down
3 changes: 3 additions & 0 deletions src/client/sky.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ class Sky : public scene::ISceneNode
void setFogStart(float fog_start) { m_sky_params.fog_start = fog_start; }
float getFogStart() const { return m_sky_params.fog_start; }

void setVolumetricLightStrength(float volumetric_light_strength) { m_sky_params.volumetric_light_strength = volumetric_light_strength; }
float getVolumetricLightStrength() const { return m_sky_params.volumetric_light_strength; }

private:
aabb3f m_box;
video::SMaterial m_materials[SKY_MATERIAL_COUNT];
Expand Down
1 change: 0 additions & 1 deletion src/defaultsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,6 @@ void set_default_settings()
settings->setDefault("bloom_intensity", "0.05");
settings->setDefault("bloom_radius", "1");
settings->setDefault("enable_volumetric_lighting", "false");
settings->setDefault("volumetric_lighting_strength", "0.2");

// Effects Shadows
settings->setDefault("enable_dynamic_shadows", "false");
Expand Down
4 changes: 4 additions & 0 deletions src/network/clientpackethandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1404,6 +1404,10 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt)
*pkt >> skybox.fog_distance >> skybox.fog_start;
}

if (pkt->getRemainingBytes() >= 4) {
*pkt >> skybox.volumetric_light_strength;
}

ClientEvent *event = new ClientEvent();
event->type = CE_SET_SKY;
event->set_sky = new SkyboxParams(skybox);
Expand Down
5 changes: 5 additions & 0 deletions src/script/lua_api/l_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1835,6 +1835,8 @@ int ObjectRef::l_set_sky(lua_State *L)
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);
}

sky_params.volumetric_light_strength = getfloatfield_default(L, 2, "volumetric_light_strength", sky_params.volumetric_light_strength);
} 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 @@ -1975,6 +1977,9 @@ int ObjectRef::l_get_sky(lua_State *L)
lua_setfield(L, -2, "fog_start");
lua_setfield(L, -2, "fog");

lua_pushnumber(L, skybox_params.volumetric_light_strength);
lua_setfield(L, -2, "volumetric_light_strength");

return 1;
}

Expand Down
1 change: 1 addition & 0 deletions src/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1851,6 +1851,7 @@ void Server::SendSetSky(session_t peer_id, const SkyboxParams &params)

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

Send(&pkt);
Expand Down
1 change: 1 addition & 0 deletions src/skyparams.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ struct SkyboxParams
float body_orbit_tilt { INVALID_SKYBOX_TILT };
s16 fog_distance { -1 };
float fog_start { -1.0f };
float volumetric_light_strength { 0.0f };
};

struct SunParams
Expand Down

0 comments on commit 79c875c

Please sign in to comment.