|
@@ -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)
|
|
@@ -469,7 +471,8 @@ public:
|
|
|
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);
|
|
@@ -483,6 +486,7 @@ public:
|
|
|
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") && m_bloom_enabled;
|
|
|
}
|
|
|
|
|
|
~GameGlobalShaderConstantSetter()
|
|
@@ -588,49 +592,52 @@ public:
|
|
|
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_client->getEnv().getLocalPlayer()->getLighting().volumetric_light_strength;
|
|
|
+ m_volumetric_light_strength_pixel.set(&volumetric_light_strength, services);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3089,7 +3096,6 @@ void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam)
|
|
|
else
|
|
|
sky->setFogStart(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f));
|
|
|
|
|
|
-
|
|
|
delete event->set_sky;
|
|
|
}
|
|
|
|