Fixed the ambient light for particles, some code improvements

This commit is contained in:
Andrey2470T 2024-05-24 23:33:46 +03:00
parent 56392c2d08
commit 385bb3c801
5 changed files with 16 additions and 14 deletions

@ -264,10 +264,9 @@ void ClientEnvironment::step(float dtime)
u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef()); u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef());
lplayer->light_color = encode_light(light, 0); // this transfers light.alpha 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); final_color_blend(&lplayer->light_color, light, day_night_ratio, ambient_light);
} }

@ -475,7 +475,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
get_sunlight_color(&sunlight, daynight_ratio); get_sunlight_color(&sunlight, daynight_ratio);
m_day_light.set(sunlight, services); 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); video::SColorf ambient_light_f(lighting.ambient_light);
m_ambient_light.set(ambient_light_f, services); m_ambient_light.set(ambient_light_f, services);

@ -47,7 +47,8 @@ video::SColor encode_light(u16 light, u8 emissive_light)
return video::SColor(r, b, b, b); 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 rg = daynight_ratio / 1000.0f - 0.04f;
f32 b = (0.98f * daynight_ratio) / 1000.0f + 0.078f; f32 b = (0.98f * daynight_ratio) / 1000.0f + 0.078f;
sunlight->r = rg; sunlight->r = rg;
@ -56,7 +57,7 @@ void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio){
} }
void final_color_blend(video::SColor *result, 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; video::SColorf dayLight;
get_sunlight_color(&dayLight, daynight_ratio); get_sunlight_color(&dayLight, daynight_ratio);
@ -66,7 +67,7 @@ void final_color_blend(video::SColor *result,
void final_color_blend(video::SColor *result, void final_color_blend(video::SColor *result,
const video::SColor &data, const video::SColorf &dayLight, 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); 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; 0, 255) / 8] / 255.0f;
// Add ambient light // Add ambient light
r += ambientLight.getRed() / 255.f; r += ambientLight.r;
g += ambientLight.getGreen() / 255.f; g += ambientLight.g;
b += ambientLight.getBlue() / 255.f; b += ambientLight.b;
result->setRed(core::clamp((s32)(r * 255.f), 0, 255)); result->setRed(core::clamp((s32)(r * 255.f), 0, 255));
result->setGreen(core::clamp((s32)(g * 255.f), 0, 255)); result->setGreen(core::clamp((s32)(g * 255.f), 0, 255));

@ -47,7 +47,7 @@ void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio);
* night light * night light
*/ */
void final_color_blend(video::SColor *result, 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. * 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, void final_color_blend(video::SColor *result,
const video::SColor &data, const video::SColorf &dayLight, 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));

@ -189,10 +189,12 @@ video::SColor Particle::updateLight(ClientEnvironment *env)
light = decode_light(light + m_p.glow); 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<u16>(light) * 255, env->getDayNightRatio(), final_color_blend(&light_color, static_cast<u16>(light) * 255, env->getDayNightRatio(),
env->getLocalPlayer()->getLighting().ambient_light); ambient_light);
return video::SColor(255, return video::SColor(255,
light_color.getRed() * m_base_color.getRed() / 255, light_color.getRed() * m_base_color.getRed() / 255,
light_color.getGreen() * m_base_color.getGreen() / 255, light_color.getGreen() * m_base_color.getGreen() / 255,