diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index eb5076e7f..cdad3146c 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -73,11 +73,23 @@ namespace { }; } +/* + ClientMap +*/ + static void on_settings_changed(const std::string &name, void *data) { - static_cast(data)->onSettingChanged(name); + static_cast(data)->onSettingChanged(name, false); } -// ClientMap + +static const std::string ClientMap_settings[] = { + "trilinear_filter", + "bilinear_filter", + "anisotropic_filter", + "transparency_sorting_distance", + "occlusion_culler", + "enable_raytraced_culling", +}; ClientMap::ClientMap( Client *client, @@ -102,37 +114,32 @@ ClientMap::ClientMap( m_box = aabb3f(-BS*1000000,-BS*1000000,-BS*1000000, BS*1000000,BS*1000000,BS*1000000); - /* TODO: Add a callback function so these can be updated when a setting - * changes. At this point in time it doesn't matter (e.g. /set - * is documented to change server settings only) - * - * TODO: Local caching of settings is not optimal and should at some stage - * be updated to use a global settings object for getting thse values - * (as opposed to the this local caching). This can be addressed in - * a later release. - */ - m_cache_trilinear_filter = g_settings->getBool("trilinear_filter"); - m_cache_bilinear_filter = g_settings->getBool("bilinear_filter"); - m_cache_anistropic_filter = g_settings->getBool("anisotropic_filter"); - m_cache_transparency_sorting_distance = g_settings->getU16("transparency_sorting_distance"); - m_loops_occlusion_culler = g_settings->get("occlusion_culler") == "loops"; - g_settings->registerChangedCallback("occlusion_culler", on_settings_changed, this); - m_enable_raytraced_culling = g_settings->getBool("enable_raytraced_culling"); - g_settings->registerChangedCallback("enable_raytraced_culling", on_settings_changed, this); + for (const auto &name : ClientMap_settings) + g_settings->registerChangedCallback(name, on_settings_changed, this); + // load all settings at once + onSettingChanged("", true); } -void ClientMap::onSettingChanged(const std::string &name) +void ClientMap::onSettingChanged(std::string_view name, bool all) { - if (name == "occlusion_culler") + if (all || name == "trilinear_filter") + m_cache_trilinear_filter = g_settings->getBool("trilinear_filter"); + if (all || name == "bilinear_filter") + m_cache_bilinear_filter = g_settings->getBool("bilinear_filter"); + if (all || name == "anisotropic_filter") + m_cache_anistropic_filter = g_settings->getBool("anisotropic_filter"); + if (all || name == "transparency_sorting_distance") + m_cache_transparency_sorting_distance = g_settings->getU16("transparency_sorting_distance"); + if (all || name == "occlusion_culler") m_loops_occlusion_culler = g_settings->get("occlusion_culler") == "loops"; - if (name == "enable_raytraced_culling") + if (all || name == "enable_raytraced_culling") m_enable_raytraced_culling = g_settings->getBool("enable_raytraced_culling"); } ClientMap::~ClientMap() { - g_settings->deregisterChangedCallback("occlusion_culler", on_settings_changed, this); - g_settings->deregisterChangedCallback("enable_raytraced_culling", on_settings_changed, this); + for (const auto &name : ClientMap_settings) + g_settings->deregisterChangedCallback(name, on_settings_changed, this); } void ClientMap::updateCamera(v3f pos, v3f dir, f32 fov, v3s16 offset, video::SColor light_color) diff --git a/src/client/clientmap.h b/src/client/clientmap.h index 6c424069a..7456902c8 100644 --- a/src/client/clientmap.h +++ b/src/client/clientmap.h @@ -112,7 +112,7 @@ public: f32 getWantedRange() const { return m_control.wanted_range; } f32 getCameraFov() const { return m_camera_fov; } - void onSettingChanged(const std::string &name); + void onSettingChanged(std::string_view name, bool all); protected: // use drop() instead