aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRealBadAngel <maciej.kasatkin@o2.pl>2015-07-23 04:35:13 +0200
committerRealBadAngel <maciej.kasatkin@o2.pl>2015-07-23 04:35:13 +0200
commit1e0e85f82e030e761c36ba5a12427bec0fb4e4f2 (patch)
tree6941c7ed68b6cce623155aba16e68745237c638c /src
parent4eacce5e2f89bd6864f9a231488b507ac33e4902 (diff)
downloadminetest-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.h1
-rw-r--r--src/content_cao.cpp30
-rw-r--r--src/content_cao.h2
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();