Fix wielditem entity drawtype brightness control
authorPerttu Ahola <celeron55@gmail.com>
Sun, 9 Sep 2012 10:26:52 +0000 (13:26 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 9 Sep 2012 10:26:52 +0000 (13:26 +0300)
src/content_cao.cpp
src/environment.cpp

index aa5c2d674039ab054fbbe3f71dd5292c27de0c5e..cb14cf39564014ca155a025a2a4186fee265362f 100644 (file)
@@ -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);
+                       }
                }
        }
 
index a49a5e384edecbe36fa5a79dcfd2ac8f3fa46673..05629b09db3613ace46fb0313b2af4ab4bbf97ee 100644 (file)
@@ -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;