fix extruded items texture leak
authorsapier <Sapier at GMX dot net>
Sun, 7 Apr 2013 18:00:25 +0000 (20:00 +0200)
committerkwolekr <kwolekr@minetest.net>
Tue, 9 Apr 2013 06:14:52 +0000 (02:14 -0400)
src/itemdef.cpp

index bb2946992b3baa664df964e4721ddf7eb2c13f6d..784919ae2deb371732118e6943511519c2be6c1d 100644 (file)
@@ -234,6 +234,7 @@ public:
                m_item_definitions.clear();
 #ifndef SERVER
                m_main_thread = get_current_thread_id();
+               m_driver = NULL;
 #endif
        
                clear();
@@ -249,6 +250,14 @@ public:
                        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 @@ public:
                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 @@ public:
                                                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