diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/content_cao.cpp | 30 | ||||
-rw-r--r-- | src/environment.cpp | 3 |
2 files changed, 22 insertions, 11 deletions
diff --git a/src/content_cao.cpp b/src/content_cao.cpp index aa5c2d674..cb14cf395 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -40,6 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "util/mathconstants.h" #include "map.h" +#include <IMeshManipulator.h> class Settings; struct ToolCapabilities; @@ -797,8 +798,15 @@ public: infostream<<"textures[0]: "<<m_prop.textures[0]<<std::endl; IItemDefManager *idef = m_gamedef->idef(); ItemStack item(m_prop.textures[0], 1, 0, "", idef); - scene::IMesh *mesh = item.getDefinition(idef).wield_mesh; + scene::IMesh *item_mesh = item.getDefinition(idef).wield_mesh; + + // Copy mesh to be able to set unique vertex colors + scene::IMeshManipulator *manip = + irr->getVideoDriver()->getMeshManipulator(); + scene::IMesh *mesh = manip->createMeshUniquePrimitives(item_mesh); + m_meshnode = smgr->addMeshSceneNode(mesh, NULL); + mesh->drop(); m_meshnode->setScale(v3f(m_prop.visual_size.X/2, m_prop.visual_size.Y/2, @@ -838,15 +846,17 @@ public: { bool is_visible = (m_hp != 0); u8 li = decode_light(light_at_pos); - m_last_light = li; - video::SColor color(255,li,li,li); - if(m_meshnode){ - setMeshColor(m_meshnode->getMesh(), color); - m_meshnode->setVisible(is_visible); - } - if(m_spritenode){ - m_spritenode->setColor(color); - m_spritenode->setVisible(is_visible); + if(li != m_last_light){ + m_last_light = li; + video::SColor color(255,li,li,li); + if(m_meshnode){ + setMeshColor(m_meshnode->getMesh(), color); + m_meshnode->setVisible(is_visible); + } + if(m_spritenode){ + m_spritenode->setColor(color); + m_spritenode->setVisible(is_visible); + } } } diff --git a/src/environment.cpp b/src/environment.cpp index a49a5e384..05629b09d 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -2129,6 +2129,7 @@ void ClientEnvironment::step(float dtime) Step active objects and update lighting of them */ + bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21); for(core::map<u16, ClientActiveObject*>::Iterator i = m_active_objects.getIterator(); i.atEnd()==false; i++) @@ -2137,7 +2138,7 @@ void ClientEnvironment::step(float dtime) // Step object obj->step(dtime, this); - if(m_active_object_light_update_interval.step(dtime, 0.21)) + if(update_lighting) { // Update lighting u8 light = 0; |