From 1aa03addec537282b782794a48982432367c845e Mon Sep 17 00:00:00 2001 From: Andrey2470T Date: Sat, 13 Apr 2024 13:19:32 +0300 Subject: [PATCH] Moved ambient light applying to the vertex shaders, tiny code cleanups --- client/shaders/nodes_shader/opengl_fragment.glsl | 3 +-- client/shaders/nodes_shader/opengl_vertex.glsl | 4 ++++ client/shaders/object_shader/opengl_fragment.glsl | 3 +-- client/shaders/object_shader/opengl_vertex.glsl | 3 +++ doc/lua_api.md | 7 ++++--- src/client/clientenvironment.h | 1 + src/client/content_mapblock.h | 1 - src/client/game.cpp | 4 +++- src/client/mapblock_mesh.cpp | 10 +++++----- src/client/mapblock_mesh.h | 2 +- src/client/particles.cpp | 4 ++-- src/network/clientpackethandler.cpp | 1 - src/script/lua_api/l_object.cpp | 2 -- 13 files changed, 25 insertions(+), 20 deletions(-) diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index b5a93e5e9..086856237 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -9,7 +9,6 @@ uniform float fogShadingParameter; uniform highp vec3 cameraOffset; uniform float animationTimer; -uniform vec3 ambientLight; #ifdef ENABLE_DYNAMIC_SHADOWS // shadow texture uniform sampler2D ShadowMapSampler; @@ -378,7 +377,7 @@ void main(void) color = base.rgb; - vec4 col = vec4(color.rgb * min(varColor.rgb + ambientLight, 1.0), 1.0); + vec4 col = vec4(color.rgb * varColor.rgb, 1.0); #ifdef ENABLE_DYNAMIC_SHADOWS if (f_shadow_strength > 0.0) { diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index d96164d76..bcb4ab4fb 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -6,6 +6,8 @@ uniform vec3 dayLight; uniform highp vec3 cameraOffset; uniform float animationTimer; +uniform vec3 ambientLight; + varying vec3 vNormal; varying vec3 vPosition; // World position in the visible world (i.e. relative to the cameraOffset.) @@ -220,6 +222,8 @@ void main(void) color.b += max(0.0, 0.021 - abs(0.2 * brightness - 0.021) + 0.07 * brightness); + color.rgb += ambientLight; + varColor = clamp(color, 0.0, 1.0); #ifdef ENABLE_DYNAMIC_SHADOWS diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl index f7a851b0e..e2f3bc2cb 100644 --- a/client/shaders/object_shader/opengl_fragment.glsl +++ b/client/shaders/object_shader/opengl_fragment.glsl @@ -9,7 +9,6 @@ uniform float fogShadingParameter; uniform highp vec3 cameraOffset; uniform float animationTimer; -uniform vec3 ambientLight; #ifdef ENABLE_DYNAMIC_SHADOWS // shadow texture uniform sampler2D ShadowMapSampler; @@ -381,7 +380,7 @@ void main(void) color = base.rgb; - vec4 col = vec4(color.rgb * min(varColor.rgb + ambientLight, 1.0), 1.0); + vec4 col = vec4(color.rgb * varColor.rgb, 1.0); col.rgb *= vIDiff; #ifdef ENABLE_DYNAMIC_SHADOWS diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl index d5a434da5..e1930aad0 100644 --- a/client/shaders/object_shader/opengl_vertex.glsl +++ b/client/shaders/object_shader/opengl_vertex.glsl @@ -2,6 +2,7 @@ uniform mat4 mWorld; uniform vec3 dayLight; uniform float animationTimer; uniform lowp vec4 emissiveColor; +uniform vec3 ambientLight; varying vec3 vNormal; varying vec3 vPosition; @@ -129,6 +130,8 @@ void main(void) color.b += max(0.0, 0.021 - abs(0.2 * brightness - 0.021) + 0.07 * brightness); + color.rgb += ambientLight; + varColor = clamp(color, 0.0, 1.0); diff --git a/doc/lua_api.md b/doc/lua_api.md index fd190761b..41a6b3d23 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -8395,9 +8395,10 @@ child will follow movement and rotation of that bone. * `set_lighting(light_definition)`: sets lighting for the player * Passing no arguments resets lighting to its default values. * `light_definition` is a table with the following optional fields: - * `ambient_light` is a ColorSpec controlling lightness & color of ambient light; alpha is ignored (always set to 255) - (global lighting; default: `{a = 255, r = 0, g = 0, b = 0}` / last set value). - * It works only if 'enable_shaders' is set to true. + * `ambient_light` is a ColorSpec controlling color of global ambient light; + (default: `{a = 255, r = 0, g = 0, b = 0}` / last set value). + * It works only if shaders are enabled. + * Alpha is ignored (it is always set to 255). * `saturation` sets the saturation (vividness; default: `1.0`). * values > 1 increase the saturation * values in [0,1] decrease the saturation diff --git a/src/client/clientenvironment.h b/src/client/clientenvironment.h index 99276a2a5..bdb8b9726 100644 --- a/src/client/clientenvironment.h +++ b/src/client/clientenvironment.h @@ -149,6 +149,7 @@ class ClientEnvironment : public Environment void updateFrameTime(bool is_paused); u64 getFrameTime() const { return m_frame_time; } u64 getFrameTimeDelta() const { return m_frame_dtime; } + private: ClientMap *m_map; LocalPlayer *m_local_player = nullptr; diff --git a/src/client/content_mapblock.h b/src/client/content_mapblock.h index 57c8b439e..730330a03 100644 --- a/src/client/content_mapblock.h +++ b/src/client/content_mapblock.h @@ -21,7 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include -#include "client/localplayer.h" struct MeshMakeData; struct MeshCollector; diff --git a/src/client/game.cpp b/src/client/game.cpp index f38282403..669950b81 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -382,7 +382,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedPixelShaderSetting m_animation_timer_delta_pixel{"animationTimerDelta"}; CachedPixelShaderSetting m_day_light{"dayLight"}; - CachedPixelShaderSetting m_ambient_light{"ambientLight"}; + CachedVertexShaderSetting m_ambient_light{"ambientLight"}; CachedPixelShaderSetting m_minimap_yaw{"yawVec"}; CachedPixelShaderSetting m_camera_offset_pixel{"cameraOffset"}; CachedVertexShaderSetting m_camera_offset_vertex{"cameraOffset"}; @@ -527,6 +527,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter m_bloom_radius_pixel.set(&m_bloom_radius, services); m_bloom_strength_pixel.set(&m_bloom_strength, services); } + float saturation = lighting.saturation; m_saturation_pixel.set(&saturation, services); @@ -569,6 +570,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter float moon_brightness = 0.f; m_moon_brightness_pixel.set(&moon_brightness, services); } + float volumetric_light_strength = lighting.volumetric_light_strength; m_volumetric_light_strength_pixel.set(&volumetric_light_strength, services); } diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 2fb303ace..4121379d2 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -300,7 +300,7 @@ 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 &ambientLight) + video::SColor ambientLight) { static const video::SColorf artificialColor(1.04f, 1.04f, 1.04f); @@ -813,7 +813,8 @@ MapBlockMesh::~MapBlockMesh() delete block; } -bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_ratio) +bool MapBlockMesh::animate(bool faraway, float time, int crack, + u32 daynight_ratio) { if (!m_has_animation) { m_animation_force_timer = 100000; @@ -884,7 +885,8 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat getMeshBuffer(daynight_diff.first.second); video::S3DVertex *vertices = (video::S3DVertex *)buf->getVertices(); for (const auto &j : daynight_diff.second) - final_color_blend(&(vertices[j.first].Color), j.second, day_color); + final_color_blend(&(vertices[j.first].Color), j.second, + day_color); } m_last_daynight_ratio = daynight_ratio; } @@ -958,10 +960,8 @@ video::SColor encode_light(u16 light, u8 emissive_light) // Get components u32 day = (light & 0xff); u32 night = (light >> 8); - // Add emissive light night += emissive_light * 2.5f; - if (night > 255) night = 255; // Since we don't know if the day light is sunlight or diff --git a/src/client/mapblock_mesh.h b/src/client/mapblock_mesh.h index fa90bd551..442f0a577 100644 --- a/src/client/mapblock_mesh.h +++ b/src/client/mapblock_mesh.h @@ -329,7 +329,7 @@ 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 &ambientLight=video::SColor(255,0,0,0)); + video::SColor ambientLight=video::SColor(255,0,0,0)); // Retrieves the TileSpec of a face of a node // Adds MATERIAL_FLAG_CRACK if the node is cracked diff --git a/src/client/particles.cpp b/src/client/particles.cpp index e5e654518..86592c776 100644 --- a/src/client/particles.cpp +++ b/src/client/particles.cpp @@ -186,11 +186,11 @@ video::SColor Particle::updateLight(ClientEnvironment *env) else light = blend_light(env->getDayNightRatio(), LIGHT_SUN, 0); - u8 m_light = decode_light(light + m_p.glow); + light += m_p.glow; video::SColor light_color{0xFFFFFFFF}; - final_color_blend(&light_color, m_light, env->getDayNightRatio(), + final_color_blend(&light_color, u16(light), env->getDayNightRatio(), env->getLocalPlayer()->getLighting().ambient_light); return video::SColor(255, light_color.getRed() * m_base_color.getRed() / 255, diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 4884e177c..5f2a4d8ee 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -47,7 +47,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "skyparams.h" #include "particles.h" #include -#include "client/clientmap.h" void Client::handleCommand_Deprecated(NetworkPacket* pkt) { diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 1c37fb09e..06b044f48 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -19,7 +19,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_object.h" #include -#include "common/c_types.h" #include "lua_api/l_internal.h" #include "lua_api/l_inventory.h" #include "lua_api/l_item.h" @@ -36,7 +35,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server/player_sao.h" #include "server/serverinventorymgr.h" #include "server/unit_sao.h" -#include "light.h" /* ObjectRef