From 385bb3c8016761a6fd68994df6d79d91e343f6fe Mon Sep 17 00:00:00 2001 From: Andrey2470T Date: Fri, 24 May 2024 23:33:46 +0300 Subject: [PATCH] Fixed the ambient light for particles, some code improvements --- src/client/clientenvironment.cpp | 5 ++--- src/client/game.cpp | 2 +- src/client/light_colors.cpp | 13 +++++++------ src/client/light_colors.h | 4 ++-- src/client/particles.cpp | 6 ++++-- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index 35bb19a69..925cb187c 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -264,10 +264,9 @@ void ClientEnvironment::step(float dtime) u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef()); lplayer->light_color = encode_light(light, 0); // this transfers light.alpha - video::SColor ambient_light(255, 0, 0, 0); + video::SColor ambient_light = g_settings->getBool("enable_shaders") ? + lplayer->getLighting().ambient_light : video::SColor(255, 0, 0, 0); - if (g_settings->getBool("enable_shaders")) - ambient_light = lplayer->getLighting().ambient_light; final_color_blend(&lplayer->light_color, light, day_night_ratio, ambient_light); } diff --git a/src/client/game.cpp b/src/client/game.cpp index 4f648b56f..97254add5 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -475,7 +475,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter get_sunlight_color(&sunlight, daynight_ratio); m_day_light.set(sunlight, services); - auto lighting = m_client->getEnv().getLocalPlayer()->getLighting(); + Lighting &lighting = m_client->getEnv().getLocalPlayer()->getLighting(); video::SColorf ambient_light_f(lighting.ambient_light); m_ambient_light.set(ambient_light_f, services); diff --git a/src/client/light_colors.cpp b/src/client/light_colors.cpp index 1b507ea09..d47ed9e66 100644 --- a/src/client/light_colors.cpp +++ b/src/client/light_colors.cpp @@ -47,7 +47,8 @@ video::SColor encode_light(u16 light, u8 emissive_light) return video::SColor(r, b, b, b); } -void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio){ +void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio) +{ f32 rg = daynight_ratio / 1000.0f - 0.04f; f32 b = (0.98f * daynight_ratio) / 1000.0f + 0.078f; sunlight->r = rg; @@ -56,7 +57,7 @@ void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio){ } void final_color_blend(video::SColor *result, - u16 light, u32 daynight_ratio, video::SColor ambientLight) + u16 light, u32 daynight_ratio, const video::SColorf &ambientLight) { video::SColorf dayLight; get_sunlight_color(&dayLight, daynight_ratio); @@ -66,7 +67,7 @@ void final_color_blend(video::SColor *result, void final_color_blend(video::SColor *result, const video::SColor &data, const video::SColorf &dayLight, - video::SColor ambientLight) + const video::SColorf &ambientLight) { static const video::SColorf artificialColor(1.04f, 1.04f, 1.04f); @@ -88,9 +89,9 @@ void final_color_blend(video::SColor *result, 0, 255) / 8] / 255.0f; // Add ambient light - r += ambientLight.getRed() / 255.f; - g += ambientLight.getGreen() / 255.f; - b += ambientLight.getBlue() / 255.f; + r += ambientLight.r; + g += ambientLight.g; + b += ambientLight.b; result->setRed(core::clamp((s32)(r * 255.f), 0, 255)); result->setGreen(core::clamp((s32)(g * 255.f), 0, 255)); diff --git a/src/client/light_colors.h b/src/client/light_colors.h index 91fd0e9aa..bcf48ec20 100644 --- a/src/client/light_colors.h +++ b/src/client/light_colors.h @@ -47,7 +47,7 @@ void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio); * night light */ void final_color_blend(video::SColor *result, - u16 light, u32 daynight_ratio, video::SColor ambientLight=video::SColor(255,0,0,0)); + u16 light, u32 daynight_ratio, const video::SColorf &ambientLight=video::SColorf(0.0f, 0.0f, 0.0f, 1.0f)); /*! * Gives the final SColor shown on screen. @@ -58,4 +58,4 @@ void final_color_blend(video::SColor *result, */ void final_color_blend(video::SColor *result, const video::SColor &data, const video::SColorf &dayLight, - video::SColor ambientLight=video::SColor(255,0,0,0)); + const video::SColorf &ambientLight=video::SColorf(0.0f, 0.0f, 0.0f, 1.0f)); diff --git a/src/client/particles.cpp b/src/client/particles.cpp index 9ccbe9220..872010349 100644 --- a/src/client/particles.cpp +++ b/src/client/particles.cpp @@ -189,10 +189,12 @@ video::SColor Particle::updateLight(ClientEnvironment *env) light = decode_light(light + m_p.glow); - video::SColor light_color{0xFFFFFFFF}; + video::SColor light_color(0xFFFFFFFF); + video::SColor ambient_light = g_settings->getBool("enable_shaders") ? + env->getLocalPlayer()->getLighting().ambient_light : video::SColor(255, 0, 0, 0); final_color_blend(&light_color, static_cast(light) * 255, env->getDayNightRatio(), - env->getLocalPlayer()->getLighting().ambient_light); + ambient_light); return video::SColor(255, light_color.getRed() * m_base_color.getRed() / 255, light_color.getGreen() * m_base_color.getGreen() / 255,