diff options
author | gregorycu <gregory.currie@gmail.com> | 2015-01-24 13:03:57 +1100 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-01-23 21:27:51 -0500 |
commit | a555e2d9b0ccee452996381a44677b8bec210036 (patch) | |
tree | b9a20391fba2c462701fd7547b9c66e0c7738289 | |
parent | aafbbcd537abf5a31bba665d4255917c813f8dd3 (diff) | |
download | minetest-a555e2d9b0ccee452996381a44677b8bec210036.tar.gz minetest-a555e2d9b0ccee452996381a44677b8bec210036.tar.bz2 minetest-a555e2d9b0ccee452996381a44677b8bec210036.zip |
Make the GameGlobalShaderConstantSetter use the settings callback (8% perf improvement in game loop)
Amend the settings callback to support userdata
-rw-r--r-- | src/fontengine.cpp | 2 | ||||
-rw-r--r-- | src/game.cpp | 20 | ||||
-rw-r--r-- | src/settings.cpp | 10 | ||||
-rw-r--r-- | 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<GameGlobalShaderConstantSetter*>(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<setting_changed_callback> tempvector; + std::vector<std::pair<setting_changed_callback,void*> > 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<setting_changed_callback>::iterator iter; + std::vector<std::pair<setting_changed_callback, void*> >::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<std::string, SettingsEntry> m_settings; std::map<std::string, SettingsEntry> m_defaults; - std::map<std::string, std::vector<setting_changed_callback> > m_callbacks; + std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks; // All methods that access m_settings/m_defaults directly should lock this. mutable JMutex m_mutex; }; |