From c4f400acd01d1951c6355e2eec42d10d0a2d871a Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Sun, 9 Sep 2012 13:26:52 +0300
Subject: [PATCH] Fix wielditem entity drawtype brightness control

---
 src/content_cao.cpp | 30 ++++++++++++++++++++----------
 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;
-- 
2.25.1