Fix issues with light of attached CAOs
authorRealBadAngel <maciej.kasatkin@o2.pl>
Thu, 23 Jul 2015 02:35:13 +0000 (04:35 +0200)
committerRealBadAngel <maciej.kasatkin@o2.pl>
Thu, 23 Jul 2015 02:35:13 +0000 (04:35 +0200)
src/clientobject.h
src/content_cao.cpp
src/content_cao.h

index 4a77139e2bc59f23215b91192ab7cd9d87470e33..be24e1388681e4776c9f537481457e5522124e7d 100644 (file)
@@ -54,6 +54,7 @@ public:
        virtual void removeFromScene(bool permanent){}
        // 0 <= light_at_pos <= LIGHT_SUN
        virtual void updateLight(u8 light_at_pos){}
+       virtual void updateLightNoCheck(u8 light_at_pos){}
        virtual v3s16 getLightPosition(){return v3s16(0,0,0);}
        virtual core::aabbox3d<f32>* getSelectionBox(){return NULL;}
        virtual bool getCollisionBox(aabb3f *toset){return false;}
index a16bd4efa5fd55c69ccc762f49fcaf7f342f1362..0293b798324c42b797df018c5f6532060027d409 100644 (file)
@@ -984,20 +984,38 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
 }
 
 void GenericCAO::updateLight(u8 light_at_pos)
+{
+       // Don't update light of attached one
+       if (getParent() != NULL) {
+               return;
+       }
+
+       updateLightNoCheck(light_at_pos);
+
+       // Update light of all children
+       for (std::vector<u16>::size_type i = 0; i < m_children.size(); i++) {
+               ClientActiveObject *obj = m_env->getActiveObject(m_children[i]);
+               if (obj) {
+                       obj->updateLightNoCheck(light_at_pos);
+               }
+       }
+}
+
+void GenericCAO::updateLightNoCheck(u8 light_at_pos)
 {
        u8 li = decode_light(light_at_pos);
-       if(li != m_last_light)
-       {
+       if (li != m_last_light) {
                m_last_light = li;
                video::SColor color(255,li,li,li);
-               if(m_meshnode)
+               if (m_meshnode) {
                        setMeshColor(m_meshnode->getMesh(), color);
-               if(m_animated_meshnode)
+               } else if (m_animated_meshnode) {
                        setMeshColor(m_animated_meshnode->getMesh(), color);
-               if(m_wield_meshnode)
+               } else if (m_wield_meshnode) {
                        m_wield_meshnode->setColor(color);
-               if(m_spritenode)
+               } else if (m_spritenode) {
                        m_spritenode->setColor(color);
+               }
        }
 }
 
index 1e526d1cd4fedce30d8dd265709a98613d96480f..299d6c73e0a54a34b77d541c5a2526521d17fa88 100644 (file)
@@ -178,6 +178,8 @@ public:
 
        void updateLight(u8 light_at_pos);
 
+       void updateLightNoCheck(u8 light_at_pos);
+
        v3s16 getLightPosition();
 
        void updateNodePos();