]> git.lizzy.rs Git - minetest.git/blobdiff - src/clouds.cpp
Set acceleration only once in falling node
[minetest.git] / src / clouds.cpp
index ff3f603d95454b13adb98de853be2cc4a8aec860..82b63b6b35006d64609a8e9609d40697de32a004 100644 (file)
@@ -30,6 +30,11 @@ class Clouds;
 Clouds *g_menuclouds = NULL;
 irr::scene::ISceneManager *g_menucloudsmgr = NULL;
 
+static void cloud_3d_setting_changed(const std::string &settingname, void *data)
+{
+       ((Clouds *)data)->readSettings();
+}
+
 Clouds::Clouds(
                scene::ISceneNode* parent,
                scene::ISceneManager* mgr,
@@ -52,18 +57,20 @@ Clouds::Clouds(
        //m_material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
        m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
 
-       m_cloud_y = BS * (cloudheight ? cloudheight :
-                               g_settings->getS16("cloud_height"));
-
-       m_cloud_radius_i = g_settings->getU16("cloud_radius");
+       m_passed_cloud_y = cloudheight;
+       readSettings();
+       g_settings->registerChangedCallback("enable_3d_clouds",
+               &cloud_3d_setting_changed, this);
 
-       m_box = core::aabbox3d<f32>(-BS*1000000,m_cloud_y-BS,-BS*1000000,
+       m_box = aabb3f(-BS*1000000,m_cloud_y-BS,-BS*1000000,
                        BS*1000000,m_cloud_y+BS,BS*1000000);
 
 }
 
 Clouds::~Clouds()
 {
+       g_settings->deregisterChangedCallback("enable_3d_clouds",
+               &cloud_3d_setting_changed, this);
 }
 
 void Clouds::OnRegisterSceneNode()
@@ -89,10 +96,9 @@ void Clouds::render()
 
        ScopeProfiler sp(g_profiler, "Rendering of clouds, avg", SPT_AVG);
        
-       bool enable_3d = g_settings->getBool("enable_3d_clouds");
-       int num_faces_to_draw = enable_3d ? 6 : 1;
+       int num_faces_to_draw = m_enable_3d ? 6 : 1;
        
-       m_material.setFlag(video::EMF_BACK_FACE_CULLING, enable_3d);
+       m_material.setFlag(video::EMF_BACK_FACE_CULLING, m_enable_3d);
 
        driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
        driver->setMaterial(m_material);
@@ -350,3 +356,11 @@ void Clouds::update(v2f camera_p, video::SColorf color)
        //dstream<<"m_brightness="<<m_brightness<<std::endl;
 }
 
+void Clouds::readSettings()
+{
+       m_cloud_y = BS * (m_passed_cloud_y ? m_passed_cloud_y :
+               g_settings->getS16("cloud_height"));
+       m_cloud_radius_i = g_settings->getU16("cloud_radius");
+       m_enable_3d = g_settings->getBool("enable_3d_clouds");
+}
+