ContentCAO: Update light of all attached entities (#9975)
[oweals/minetest.git] / src / client / content_cao.cpp
index dde31899b933e589d2aca80a5e0b888ee85ab81d..d0682e51eab82f9743106a01ccb41ff2061ae1b8 100644 (file)
@@ -181,7 +181,7 @@ public:
 
        void addToScene(ITextureSource *tsrc);
        void removeFromScene(bool permanent);
-       void updateLight(u8 light_at_pos);
+       void updateLight(u32 day_night_ratio);
        v3s16 getLightPosition();
        void updateNodePos();
 
@@ -254,7 +254,7 @@ void TestCAO::removeFromScene(bool permanent)
        m_node = NULL;
 }
 
-void TestCAO::updateLight(u8 light_at_pos)
+void TestCAO::updateLight(u32 day_night_ratio)
 {
 }
 
@@ -784,34 +784,22 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
        setNodeLight(m_last_light);
 }
 
-void GenericCAO::updateLight(u8 light_at_pos)
+void GenericCAO::updateLight(u32 day_night_ratio)
 {
-       // Don't update light of attached one
-       if (getParent() != NULL) {
-               return;
-       }
-
-       updateLightNoCheck(light_at_pos);
-
-       // Update light of all children
-       for (u16 i : m_attachment_child_ids) {
-               ClientActiveObject *obj = m_env->getActiveObject(i);
-               if (obj) {
-                       obj->updateLightNoCheck(light_at_pos);
-               }
-       }
-}
-
-void GenericCAO::updateLightNoCheck(u8 light_at_pos)
-{
-       if (m_glow < 0)
-               return;
+       u8 light_at_pos = 0;
+       bool pos_ok;
 
-       u8 li = decode_light(light_at_pos + m_glow);
+       v3s16 p = getLightPosition();
+       MapNode n = m_env->getMap().getNode(p, &pos_ok);
+       if (pos_ok)
+               light_at_pos = n.getLightBlend(day_night_ratio, m_client->ndef());
+       else
+               light_at_pos = blend_light(day_night_ratio, LIGHT_SUN, 0);
 
-       if (li != m_last_light) {
-               m_last_light = li;
-               setNodeLight(li);
+       u8 light = decode_light(light_at_pos);
+       if (light != m_last_light) {
+               m_last_light = light;
+               setNodeLight(light);
        }
 }