From a555e2d9b0ccee452996381a44677b8bec210036 Mon Sep 17 00:00:00 2001 From: gregorycu Date: Sat, 24 Jan 2015 13:03:57 +1100 Subject: [PATCH] Make the GameGlobalShaderConstantSetter use the settings callback (8% perf improvement in game loop) Amend the settings callback to support userdata --- src/fontengine.cpp | 2 +- src/game.cpp | 20 ++++++++++++++++++-- src/settings.cpp | 10 +++++----- src/settings.h | 6 +++--- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/fontengine.cpp b/src/fontengine.cpp index 79d53c989..2df6bf833 100644 --- a/src/fontengine.cpp +++ b/src/fontengine.cpp @@ -36,7 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc., FontEngine* g_fontengine = NULL; /** callback to be used on change of font size setting */ -static void font_setting_changed(const std::string) { +static void font_setting_changed(const std::string, void *userdata) { g_fontengine->readSettings(); } diff --git a/src/game.cpp b/src/game.cpp index cedaabb1b..af744dcbb 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -809,15 +809,31 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter bool *m_force_fog_off; f32 *m_fog_range; Client *m_client; + bool m_fogEnabled; public: + + void onSettingsChange(const std::string &name) + { + if (name == "enable_fog") + m_fogEnabled = g_settings->getBool("enable_fog"); + } + + static void SettingsCallback(const std::string name, void *userdata) + { + reinterpret_cast(userdata)->onSettingsChange(name); + } + GameGlobalShaderConstantSetter(Sky *sky, bool *force_fog_off, f32 *fog_range, Client *client) : m_sky(sky), m_force_fog_off(force_fog_off), m_fog_range(fog_range), m_client(client) - {} + { + g_settings->registerChangedCallback("enable_fog", SettingsCallback, this); + } + ~GameGlobalShaderConstantSetter() {} virtual void onSetConstants(video::IMaterialRendererServices *services, @@ -840,7 +856,7 @@ public: // Fog distance float fog_distance = 10000 * BS; - if (g_settings->getBool("enable_fog") && !*m_force_fog_off) + if (m_fogEnabled && !*m_force_fog_off) fog_distance = *m_fog_range; services->setPixelShaderConstant("fogDistance", &fog_distance, 1); diff --git a/src/settings.cpp b/src/settings.cpp index 2f515caba..3416066e2 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -965,15 +965,15 @@ void Settings::clearNoLock() void Settings::registerChangedCallback(std::string name, - setting_changed_callback cbf) + setting_changed_callback cbf, void *userdata) { - m_callbacks[name].push_back(cbf); + m_callbacks[name].push_back(std::make_pair(cbf,userdata)); } void Settings::doCallbacks(const std::string name) { - std::vector tempvector; + std::vector > tempvector; { JMutexAutoLock lock(m_mutex); if (m_callbacks.find(name) != m_callbacks.end()) @@ -982,9 +982,9 @@ void Settings::doCallbacks(const std::string name) } } - std::vector::iterator iter; + std::vector >::iterator iter; for (iter = tempvector.begin(); iter != tempvector.end(); iter++) { - (*iter)(name); + (iter->first)(name,iter->second); } } diff --git a/src/settings.h b/src/settings.h index 89f7589df..47feb1755 100644 --- a/src/settings.h +++ b/src/settings.h @@ -32,7 +32,7 @@ class Settings; struct NoiseParams; /** function type to register a changed callback */ -typedef void (*setting_changed_callback)(const std::string); +typedef void (*setting_changed_callback)(const std::string, void *userdata); enum ValueType { VALUETYPE_STRING, @@ -204,7 +204,7 @@ public: void clear(); void updateValue(const Settings &other, const std::string &name); void update(const Settings &other); - void registerChangedCallback(std::string name, setting_changed_callback cbf); + void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL); private: @@ -215,7 +215,7 @@ private: std::map m_settings; std::map m_defaults; - std::map > m_callbacks; + std::map > > m_callbacks; // All methods that access m_settings/m_defaults directly should lock this. mutable JMutex m_mutex; };