forked from Mirrorlandia_minetest/minetest
Make the GameGlobalShaderConstantSetter use the settings callback (8% perf improvement in game loop)
Amend the settings callback to support userdata
This commit is contained in:
parent
aafbbcd537
commit
a555e2d9b0
@ -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();
|
||||
}
|
||||
|
||||
|
20
src/game.cpp
20
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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user