From 58fd39de35fc541ee6f50cc7b85ff29ab749778a Mon Sep 17 00:00:00 2001
From: sapier <Sapier at GMX dot net>
Date: Sun, 7 Apr 2013 20:00:25 +0200
Subject: [PATCH] fix extruded items texture leak

---
 src/itemdef.cpp | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/itemdef.cpp b/src/itemdef.cpp
index bb2946992..784919ae2 100644
--- a/src/itemdef.cpp
+++ b/src/itemdef.cpp
@@ -234,6 +234,7 @@ class CItemDefManager: public IWritableItemDefManager
 		m_item_definitions.clear();
 #ifndef SERVER
 		m_main_thread = get_current_thread_id();
+		m_driver = NULL;
 #endif
 	
 		clear();
@@ -249,6 +250,14 @@ class CItemDefManager: public IWritableItemDefManager
 			cc->wield_mesh->drop();
 			delete cc;
 		}
+
+		if (m_driver != NULL) {
+			for (unsigned int i = 0; i < m_extruded_textures.size(); i++) {
+				m_driver->removeTexture(m_extruded_textures[i]);
+			}
+			m_extruded_textures.clear();
+		}
+		m_driver = NULL;
 #endif
 	}
 	virtual const ItemDefinition& get(const std::string &name_) const
@@ -297,6 +306,10 @@ class CItemDefManager: public IWritableItemDefManager
 		return m_item_definitions.find(name) != m_item_definitions.end();
 	}
 #ifndef SERVER
+private:
+	static video::IVideoDriver * m_driver;
+	static std::vector<video::ITexture*> m_extruded_textures;
+public:
 	ClientCached* createClientCachedDirect(const std::string &name,
 			IGameDef *gamedef) const
 	{
@@ -435,6 +448,13 @@ class CItemDefManager: public IWritableItemDefManager
 						tsrc->getTextureRaw(f.tiledef[0].name);
 				}
 			}
+			else
+			{
+				if (m_driver == 0)
+					m_driver = driver;
+
+				m_extruded_textures.push_back(cc->inventory_texture);
+			}
 
 			/*
 				Use the node mesh as the wield mesh
@@ -661,3 +681,8 @@ IWritableItemDefManager* createItemDefManager()
 	return new CItemDefManager();
 }
 
+#ifndef SERVER
+//TODO very very very dirty hack!
+video::IVideoDriver * CItemDefManager::m_driver = 0;
+std::vector<video::ITexture*> CItemDefManager::m_extruded_textures;
+#endif
-- 
GitLab