diff --git a/src/client/game.cpp b/src/client/game.cpp index 61d067ef3..08be9c809 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -204,10 +204,6 @@ class GameGlobalShaderUniformSetter : public IShaderUniformSetter CachedVertexShaderSetting m_camera_offset_vertex{"cameraOffset"}; CachedPixelShaderSetting m_camera_position_pixel{ "cameraPosition" }; CachedVertexShaderSetting m_camera_position_vertex{ "cameraPosition" }; - CachedPixelShaderSetting m_texture0{"texture0"}; - CachedPixelShaderSetting m_texture1{"texture1"}; - CachedPixelShaderSetting m_texture2{"texture2"}; - CachedPixelShaderSetting m_texture3{"texture3"}; CachedVertexShaderSetting m_texel_size0_vertex{"texelSize0"}; CachedPixelShaderSetting m_texel_size0_pixel{"texelSize0"}; v2f m_texel_size0; @@ -298,16 +294,6 @@ public: m_camera_position_pixel.set(camera_position, services); m_camera_position_pixel.set(camera_position, services); - SamplerLayer_t tex_id; - tex_id = 0; - m_texture0.set(&tex_id, services); - tex_id = 1; - m_texture1.set(&tex_id, services); - tex_id = 2; - m_texture2.set(&tex_id, services); - tex_id = 3; - m_texture3.set(&tex_id, services); - m_texel_size0_vertex.set(m_texel_size0, services); m_texel_size0_pixel.set(m_texel_size0, services); @@ -423,6 +409,90 @@ public: } }; +class NodeShaderConstantSetter : public IShaderConstantSetter +{ +public: + NodeShaderConstantSetter() = default; + ~NodeShaderConstantSetter() = default; + + void onGenerate(const std::string &name, ShaderConstants &constants) override + { + if (constants.find("DRAWTYPE") == constants.end()) + return; // not a node shader + [[maybe_unused]] const auto drawtype = + static_cast(std::get(constants["DRAWTYPE"])); + [[maybe_unused]] const auto material_type = + static_cast(std::get(constants["MATERIAL_TYPE"])); + +#define PROVIDE(constant) constants[ #constant ] = (int)constant + + PROVIDE(NDT_NORMAL); + PROVIDE(NDT_AIRLIKE); + PROVIDE(NDT_LIQUID); + PROVIDE(NDT_FLOWINGLIQUID); + PROVIDE(NDT_GLASSLIKE); + PROVIDE(NDT_ALLFACES); + PROVIDE(NDT_ALLFACES_OPTIONAL); + PROVIDE(NDT_TORCHLIKE); + PROVIDE(NDT_SIGNLIKE); + PROVIDE(NDT_PLANTLIKE); + PROVIDE(NDT_FENCELIKE); + PROVIDE(NDT_RAILLIKE); + PROVIDE(NDT_NODEBOX); + PROVIDE(NDT_GLASSLIKE_FRAMED); + PROVIDE(NDT_FIRELIKE); + PROVIDE(NDT_GLASSLIKE_FRAMED_OPTIONAL); + PROVIDE(NDT_PLANTLIKE_ROOTED); + + PROVIDE(TILE_MATERIAL_BASIC); + PROVIDE(TILE_MATERIAL_ALPHA); + PROVIDE(TILE_MATERIAL_LIQUID_TRANSPARENT); + PROVIDE(TILE_MATERIAL_LIQUID_OPAQUE); + PROVIDE(TILE_MATERIAL_WAVING_LEAVES); + PROVIDE(TILE_MATERIAL_WAVING_PLANTS); + PROVIDE(TILE_MATERIAL_OPAQUE); + PROVIDE(TILE_MATERIAL_WAVING_LIQUID_BASIC); + PROVIDE(TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT); + PROVIDE(TILE_MATERIAL_WAVING_LIQUID_OPAQUE); + PROVIDE(TILE_MATERIAL_PLAIN); + PROVIDE(TILE_MATERIAL_PLAIN_ALPHA); + +#undef PROVIDE + + bool enable_waving_water = g_settings->getBool("enable_waving_water"); + constants["ENABLE_WAVING_WATER"] = enable_waving_water ? 1 : 0; + if (enable_waving_water) { + constants["WATER_WAVE_HEIGHT"] = g_settings->getFloat("water_wave_height"); + constants["WATER_WAVE_LENGTH"] = g_settings->getFloat("water_wave_length"); + constants["WATER_WAVE_SPEED"] = g_settings->getFloat("water_wave_speed"); + } + switch (material_type) { + case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT: + case TILE_MATERIAL_WAVING_LIQUID_OPAQUE: + case TILE_MATERIAL_WAVING_LIQUID_BASIC: + constants["MATERIAL_WAVING_LIQUID"] = 1; + break; + default: + constants["MATERIAL_WAVING_LIQUID"] = 0; + break; + } + switch (material_type) { + case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT: + case TILE_MATERIAL_WAVING_LIQUID_OPAQUE: + case TILE_MATERIAL_WAVING_LIQUID_BASIC: + case TILE_MATERIAL_LIQUID_TRANSPARENT: + constants["MATERIAL_WATER_REFLECTIONS"] = 1; + break; + default: + constants["MATERIAL_WATER_REFLECTIONS"] = 0; + break; + } + + constants["ENABLE_WAVING_LEAVES"] = g_settings->getBool("enable_waving_leaves") ? 1 : 0; + constants["ENABLE_WAVING_PLANTS"] = g_settings->getBool("enable_waving_plants") ? 1 : 0; + } +}; + /**************************************************************************** ****************************************************************************/ @@ -837,11 +907,6 @@ Game::Game() : } - -/**************************************************************************** - MinetestApp Public - ****************************************************************************/ - Game::~Game() { delete client; @@ -1289,6 +1354,8 @@ bool Game::createClient(const GameStartData &start_data) return false; } + shader_src->addShaderConstantSetter(new NodeShaderConstantSetter()); + auto *scsf = new GameGlobalShaderUniformSetterFactory(client); shader_src->addShaderUniformSetterFactory(scsf); diff --git a/src/client/shader.cpp b/src/client/shader.cpp index 643c381c0..e2985e66b 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -187,8 +187,7 @@ public: /* - MainShaderConstantSetter: Set some random general constants - NodeShaderConstantSetter: Set constants for node rendering + MainShaderConstantSetter: Sets some random general constants */ class MainShaderConstantSetter : public IShaderConstantSetter @@ -250,96 +249,14 @@ public: }; -class NodeShaderConstantSetter : public IShaderConstantSetter -{ -public: - NodeShaderConstantSetter() = default; - ~NodeShaderConstantSetter() = default; - - void onGenerate(const std::string &name, ShaderConstants &constants) override - { - if (constants.find("DRAWTYPE") == constants.end()) - return; // not a node shader - [[maybe_unused]] const auto drawtype = - static_cast(std::get(constants["DRAWTYPE"])); - [[maybe_unused]] const auto material_type = - static_cast(std::get(constants["MATERIAL_TYPE"])); - -#define PROVIDE(constant) constants[ #constant ] = (int)constant - - PROVIDE(NDT_NORMAL); - PROVIDE(NDT_AIRLIKE); - PROVIDE(NDT_LIQUID); - PROVIDE(NDT_FLOWINGLIQUID); - PROVIDE(NDT_GLASSLIKE); - PROVIDE(NDT_ALLFACES); - PROVIDE(NDT_ALLFACES_OPTIONAL); - PROVIDE(NDT_TORCHLIKE); - PROVIDE(NDT_SIGNLIKE); - PROVIDE(NDT_PLANTLIKE); - PROVIDE(NDT_FENCELIKE); - PROVIDE(NDT_RAILLIKE); - PROVIDE(NDT_NODEBOX); - PROVIDE(NDT_GLASSLIKE_FRAMED); - PROVIDE(NDT_FIRELIKE); - PROVIDE(NDT_GLASSLIKE_FRAMED_OPTIONAL); - PROVIDE(NDT_PLANTLIKE_ROOTED); - - PROVIDE(TILE_MATERIAL_BASIC); - PROVIDE(TILE_MATERIAL_ALPHA); - PROVIDE(TILE_MATERIAL_LIQUID_TRANSPARENT); - PROVIDE(TILE_MATERIAL_LIQUID_OPAQUE); - PROVIDE(TILE_MATERIAL_WAVING_LEAVES); - PROVIDE(TILE_MATERIAL_WAVING_PLANTS); - PROVIDE(TILE_MATERIAL_OPAQUE); - PROVIDE(TILE_MATERIAL_WAVING_LIQUID_BASIC); - PROVIDE(TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT); - PROVIDE(TILE_MATERIAL_WAVING_LIQUID_OPAQUE); - PROVIDE(TILE_MATERIAL_PLAIN); - PROVIDE(TILE_MATERIAL_PLAIN_ALPHA); - -#undef PROVIDE - - bool enable_waving_water = g_settings->getBool("enable_waving_water"); - constants["ENABLE_WAVING_WATER"] = enable_waving_water ? 1 : 0; - if (enable_waving_water) { - constants["WATER_WAVE_HEIGHT"] = g_settings->getFloat("water_wave_height"); - constants["WATER_WAVE_LENGTH"] = g_settings->getFloat("water_wave_length"); - constants["WATER_WAVE_SPEED"] = g_settings->getFloat("water_wave_speed"); - } - switch (material_type) { - case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT: - case TILE_MATERIAL_WAVING_LIQUID_OPAQUE: - case TILE_MATERIAL_WAVING_LIQUID_BASIC: - constants["MATERIAL_WAVING_LIQUID"] = 1; - break; - default: - constants["MATERIAL_WAVING_LIQUID"] = 0; - break; - } - switch (material_type) { - case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT: - case TILE_MATERIAL_WAVING_LIQUID_OPAQUE: - case TILE_MATERIAL_WAVING_LIQUID_BASIC: - case TILE_MATERIAL_LIQUID_TRANSPARENT: - constants["MATERIAL_WATER_REFLECTIONS"] = 1; - break; - default: - constants["MATERIAL_WATER_REFLECTIONS"] = 0; - break; - } - - constants["ENABLE_WAVING_LEAVES"] = g_settings->getBool("enable_waving_leaves") ? 1 : 0; - constants["ENABLE_WAVING_PLANTS"] = g_settings->getBool("enable_waving_plants") ? 1 : 0; - } -}; - /* MainShaderUniformSetter: Set basic uniforms required for almost everything */ class MainShaderUniformSetter : public IShaderUniformSetter { + using SamplerLayer_t = s32; + CachedVertexShaderSetting m_world_view_proj{"mWorldViewProj"}; CachedVertexShaderSetting m_world{"mWorld"}; @@ -348,6 +265,11 @@ class MainShaderUniformSetter : public IShaderUniformSetter // Texture matrix CachedVertexShaderSetting m_texture{"mTexture"}; + CachedPixelShaderSetting m_texture0{"texture0"}; + CachedPixelShaderSetting m_texture1{"texture1"}; + CachedPixelShaderSetting m_texture2{"texture2"}; + CachedPixelShaderSetting m_texture3{"texture3"}; + // commonly used way to pass material color to shader video::SColor m_material_color; CachedPixelShaderSetting m_material_color_setting{"materialColor"}; @@ -385,6 +307,16 @@ public: m_texture.set(texture, services); } + SamplerLayer_t tex_id; + tex_id = 0; + m_texture0.set(&tex_id, services); + tex_id = 1; + m_texture1.set(&tex_id, services); + tex_id = 2; + m_texture2.set(&tex_id, services); + tex_id = 3; + m_texture3.set(&tex_id, services); + video::SColorf colorf(m_material_color); m_material_color_setting.set(colorf, services); } @@ -508,7 +440,6 @@ ShaderSource::ShaderSource() // Add global stuff addShaderConstantSetter(new MainShaderConstantSetter()); - addShaderConstantSetter(new NodeShaderConstantSetter()); addShaderUniformSetterFactory(new MainShaderUniformSetterFactory()); } diff --git a/src/client/shadows/dynamicshadowsrender.cpp b/src/client/shadows/dynamicshadowsrender.cpp index 1297bf175..17260e21d 100644 --- a/src/client/shadows/dynamicshadowsrender.cpp +++ b/src/client/shadows/dynamicshadowsrender.cpp @@ -514,6 +514,9 @@ void ShadowRenderer::mixShadowsQuad() * Shaders system with custom IShaderConstantSetCallBack without messing up the * code too much. If anyone knows how to integrate this with the standard MT * shaders, please feel free to change it. + * + * TODO: as of now (2025) it should be possible to hook these up to the normal + * shader system. */ void ShadowRenderer::createShaders()