diff options
author | RealBadAngel <maciej.kasatkin@o2.pl> | 2015-07-23 04:35:13 +0200 |
---|---|---|
committer | RealBadAngel <maciej.kasatkin@o2.pl> | 2015-07-23 04:35:13 +0200 |
commit | 1e0e85f82e030e761c36ba5a12427bec0fb4e4f2 (patch) | |
tree | 6941c7ed68b6cce623155aba16e68745237c638c /src | |
parent | 4eacce5e2f89bd6864f9a231488b507ac33e4902 (diff) | |
download | minetest-1e0e85f82e030e761c36ba5a12427bec0fb4e4f2.tar.gz minetest-1e0e85f82e030e761c36ba5a12427bec0fb4e4f2.tar.bz2 minetest-1e0e85f82e030e761c36ba5a12427bec0fb4e4f2.zip |
Fix issues with light of attached CAOs
Diffstat (limited to 'src')
-rw-r--r-- | src/clientobject.h | 1 | ||||
-rw-r--r-- | src/content_cao.cpp | 30 | ||||
-rw-r--r-- | src/content_cao.h | 2 |
3 files changed, 27 insertions, 6 deletions
diff --git a/src/clientobject.h b/src/clientobject.h index 4a77139e2..be24e1388 100644 --- a/src/clientobject.h +++ b/src/clientobject.h @@ -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;} diff --git a/src/content_cao.cpp b/src/content_cao.cpp index a16bd4efa..0293b7983 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -985,19 +985,37 @@ 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); + } } } diff --git a/src/content_cao.h b/src/content_cao.h index 1e526d1cd..299d6c73e 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -178,6 +178,8 @@ public: void updateLight(u8 light_at_pos); + void updateLightNoCheck(u8 light_at_pos); + v3s16 getLightPosition(); void updateNodePos(); |