@@ -363,6 +363,15 @@ Client::~Client()
363
363
for (std::list<MediaFetchThread*>::iterator i = m_media_fetch_threads.begin ();
364
364
i != m_media_fetch_threads.end (); ++i)
365
365
delete *i;
366
+
367
+ // cleanup 3d model meshes on client shutdown
368
+ while (m_device->getSceneManager ()->getMeshCache ()->getMeshCount () != 0 ) {
369
+ scene::IAnimatedMesh * mesh =
370
+ m_device->getSceneManager ()->getMeshCache ()->getMeshByIndex (0 );
371
+
372
+ if (mesh != NULL )
373
+ m_device->getSceneManager ()->getMeshCache ()->removeMesh (mesh);
374
+ }
366
375
}
367
376
368
377
void Client::connect (Address address)
@@ -976,14 +985,26 @@ bool Client::loadMedia(const std::string &data, const std::string &filename)
976
985
{
977
986
verbosestream<<" Client: Storing model into Irrlicht: "
978
987
<<" \" " <<filename<<" \" " <<std::endl;
988
+ scene::ISceneManager *smgr = m_device->getSceneManager ();
989
+
990
+ // check if mesh was already cached
991
+ scene::IAnimatedMesh *mesh =
992
+ smgr->getMeshCache ()->getMeshByName (filename.c_str ());
993
+
994
+ if (mesh != NULL ) {
995
+ errorstream << " Multiple models with name: " << filename.c_str () <<
996
+ " found replacing previous model!" << std::endl;
997
+
998
+ smgr->getMeshCache ()->removeMesh (mesh);
999
+ mesh = 0 ;
1000
+ }
979
1001
980
1002
io::IFileSystem *irrfs = m_device->getFileSystem ();
981
1003
io::IReadFile *rfile = irrfs->createMemoryReadFile (
982
1004
*data_rw, data_rw.getSize (), filename.c_str ());
983
1005
assert (rfile);
984
1006
985
- scene::ISceneManager *smgr = m_device->getSceneManager ();
986
- scene::IAnimatedMesh *mesh = smgr->getMesh (rfile);
1007
+ mesh = smgr->getMesh (rfile);
987
1008
smgr->getMeshCache ()->addMesh (filename.c_str (), mesh);
988
1009
989
1010
return true ;
0 commit comments