From 8f1d5d34a6191346d7f8cb5e012053bcd19795c4 Mon Sep 17 00:00:00 2001 From: Kahrl Date: Wed, 3 Jul 2013 02:22:39 +0200 Subject: Move generateTextureFromMesh to TextureSource to fix a texture leak TextureSource has a list of textures to delete (m_texture_trash) so this provides a proper, non-hacky way to delete RTT textures. Also, the prior, hacky way of deleting them seems to be broken (see pull request #803). To avoid header file clutter by repeating the same long list of arguments over and over again, store the arguments of generateTextureFromMesh in a struct called TextureFromMeshParams. Also fix issue #782 (Only use bilinear (and others) on item textures when settings allow it). --- src/itemdef.cpp | 60 +++++++++++++++------------------------------------------ 1 file changed, 15 insertions(+), 45 deletions(-) (limited to 'src/itemdef.cpp') diff --git a/src/itemdef.cpp b/src/itemdef.cpp index b582aef78..238ff58c0 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -229,7 +229,6 @@ public: #ifndef SERVER m_main_thread = get_current_thread_id(); - m_driver = NULL; #endif clear(); } @@ -246,13 +245,6 @@ public: 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 for (std::map::iterator iter = m_item_definitions.begin(); iter != m_item_definitions.end(); @@ -307,9 +299,6 @@ public: return m_item_definitions.find(name) != m_item_definitions.end(); } #ifndef SERVER -private: - static video::IVideoDriver * m_driver; - static std::vector m_extruded_textures; public: ClientCached* createClientCachedDirect(const std::string &name, IGameDef *gamedef) const @@ -416,31 +405,25 @@ public: */ if(cc->inventory_texture == NULL) { - core::dimension2d dim(64,64); - std::string rtt_texture_name = "INVENTORY_" + TextureFromMeshParams params; + params.mesh = node_mesh; + params.dim.set(64, 64); + params.rtt_texture_name = "INVENTORY_" + def->name + "_RTT"; - v3f camera_position(0, 1.0, -1.5); - camera_position.rotateXZBy(45); - v3f camera_lookat(0, 0, 0); - core::CMatrix4 camera_projection_matrix; + params.delete_texture_on_shutdown = true; + params.camera_position.set(0, 1.0, -1.5); + params.camera_position.rotateXZBy(45); + params.camera_lookat.set(0, 0, 0); // Set orthogonal projection - camera_projection_matrix.buildProjectionMatrixOrthoLH( + params.camera_projection_matrix.buildProjectionMatrixOrthoLH( 1.65, 1.65, 0, 100); + params.ambient_light.set(1.0, 0.2, 0.2, 0.2); + params.light_position.set(10, 100, -50); + params.light_color.set(1.0, 0.5, 0.5, 0.5); + params.light_radius = 1000; - video::SColorf ambient_light(0.2,0.2,0.2); - v3f light_position(10, 100, -50); - video::SColorf light_color(0.5,0.5,0.5); - f32 light_radius = 1000; - - cc->inventory_texture = generateTextureFromMesh( - node_mesh, device, dim, rtt_texture_name, - camera_position, - camera_lookat, - camera_projection_matrix, - ambient_light, - light_position, - light_color, - light_radius); + cc->inventory_texture = + tsrc->generateTextureFromMesh(params); // render-to-target didn't work if(cc->inventory_texture == NULL) @@ -449,13 +432,6 @@ public: tsrc->getTexture(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 @@ -681,9 +657,3 @@ IWritableItemDefManager* createItemDefManager() { return new CItemDefManager(); } - -#ifndef SERVER -//TODO very very very dirty hack! -video::IVideoDriver * CItemDefManager::m_driver = 0; -std::vector CItemDefManager::m_extruded_textures; -#endif -- cgit v1.2.3