1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Move NodeShaderConstantSetter to game.cpp

This commit is contained in:
sfan5 2025-04-18 10:09:00 +02:00
parent f3c2bbfb48
commit 900cf896db
3 changed files with 107 additions and 106 deletions

View file

@ -204,10 +204,6 @@ class GameGlobalShaderUniformSetter : public IShaderUniformSetter
CachedVertexShaderSetting<float, 3> m_camera_offset_vertex{"cameraOffset"}; CachedVertexShaderSetting<float, 3> m_camera_offset_vertex{"cameraOffset"};
CachedPixelShaderSetting<float, 3> m_camera_position_pixel{ "cameraPosition" }; CachedPixelShaderSetting<float, 3> m_camera_position_pixel{ "cameraPosition" };
CachedVertexShaderSetting<float, 3> m_camera_position_vertex{ "cameraPosition" }; CachedVertexShaderSetting<float, 3> m_camera_position_vertex{ "cameraPosition" };
CachedPixelShaderSetting<SamplerLayer_t> m_texture0{"texture0"};
CachedPixelShaderSetting<SamplerLayer_t> m_texture1{"texture1"};
CachedPixelShaderSetting<SamplerLayer_t> m_texture2{"texture2"};
CachedPixelShaderSetting<SamplerLayer_t> m_texture3{"texture3"};
CachedVertexShaderSetting<float, 2> m_texel_size0_vertex{"texelSize0"}; CachedVertexShaderSetting<float, 2> m_texel_size0_vertex{"texelSize0"};
CachedPixelShaderSetting<float, 2> m_texel_size0_pixel{"texelSize0"}; CachedPixelShaderSetting<float, 2> m_texel_size0_pixel{"texelSize0"};
v2f m_texel_size0; 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);
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_vertex.set(m_texel_size0, services);
m_texel_size0_pixel.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<NodeDrawType>(std::get<int>(constants["DRAWTYPE"]));
[[maybe_unused]] const auto material_type =
static_cast<MaterialType>(std::get<int>(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() Game::~Game()
{ {
delete client; delete client;
@ -1289,6 +1354,8 @@ bool Game::createClient(const GameStartData &start_data)
return false; return false;
} }
shader_src->addShaderConstantSetter(new NodeShaderConstantSetter());
auto *scsf = new GameGlobalShaderUniformSetterFactory(client); auto *scsf = new GameGlobalShaderUniformSetterFactory(client);
shader_src->addShaderUniformSetterFactory(scsf); shader_src->addShaderUniformSetterFactory(scsf);

View file

@ -187,8 +187,7 @@ public:
/* /*
MainShaderConstantSetter: Set some random general constants MainShaderConstantSetter: Sets some random general constants
NodeShaderConstantSetter: Set constants for node rendering
*/ */
class MainShaderConstantSetter : public IShaderConstantSetter 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<NodeDrawType>(std::get<int>(constants["DRAWTYPE"]));
[[maybe_unused]] const auto material_type =
static_cast<MaterialType>(std::get<int>(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 MainShaderUniformSetter: Set basic uniforms required for almost everything
*/ */
class MainShaderUniformSetter : public IShaderUniformSetter class MainShaderUniformSetter : public IShaderUniformSetter
{ {
using SamplerLayer_t = s32;
CachedVertexShaderSetting<f32, 16> m_world_view_proj{"mWorldViewProj"}; CachedVertexShaderSetting<f32, 16> m_world_view_proj{"mWorldViewProj"};
CachedVertexShaderSetting<f32, 16> m_world{"mWorld"}; CachedVertexShaderSetting<f32, 16> m_world{"mWorld"};
@ -348,6 +265,11 @@ class MainShaderUniformSetter : public IShaderUniformSetter
// Texture matrix // Texture matrix
CachedVertexShaderSetting<float, 16> m_texture{"mTexture"}; CachedVertexShaderSetting<float, 16> m_texture{"mTexture"};
CachedPixelShaderSetting<SamplerLayer_t> m_texture0{"texture0"};
CachedPixelShaderSetting<SamplerLayer_t> m_texture1{"texture1"};
CachedPixelShaderSetting<SamplerLayer_t> m_texture2{"texture2"};
CachedPixelShaderSetting<SamplerLayer_t> m_texture3{"texture3"};
// commonly used way to pass material color to shader // commonly used way to pass material color to shader
video::SColor m_material_color; video::SColor m_material_color;
CachedPixelShaderSetting<float, 4> m_material_color_setting{"materialColor"}; CachedPixelShaderSetting<float, 4> m_material_color_setting{"materialColor"};
@ -385,6 +307,16 @@ public:
m_texture.set(texture, services); 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); video::SColorf colorf(m_material_color);
m_material_color_setting.set(colorf, services); m_material_color_setting.set(colorf, services);
} }
@ -508,7 +440,6 @@ ShaderSource::ShaderSource()
// Add global stuff // Add global stuff
addShaderConstantSetter(new MainShaderConstantSetter()); addShaderConstantSetter(new MainShaderConstantSetter());
addShaderConstantSetter(new NodeShaderConstantSetter());
addShaderUniformSetterFactory(new MainShaderUniformSetterFactory()); addShaderUniformSetterFactory(new MainShaderUniformSetterFactory());
} }

View file

@ -514,6 +514,9 @@ void ShadowRenderer::mixShadowsQuad()
* Shaders system with custom IShaderConstantSetCallBack without messing up the * Shaders system with custom IShaderConstantSetCallBack without messing up the
* code too much. If anyone knows how to integrate this with the standard MT * code too much. If anyone knows how to integrate this with the standard MT
* shaders, please feel free to change it. * 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() void ShadowRenderer::createShaders()