From d76957ee22c27adab89cee551e3ab1c85d8717cc Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 6 Jan 2014 13:24:06 +0200 Subject: Create new instance of mesh every time it's required (Solves #703) --- src/client.cpp | 56 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 23 deletions(-) (limited to 'src/client.cpp') diff --git a/src/client.cpp b/src/client.cpp index 09c940a7a..b830bcdf3 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -893,30 +893,12 @@ bool Client::loadMedia(const std::string &data, const std::string &filename) name = removeStringEnd(filename, model_ext); if(name != "") { - verbosestream<<"Client: Storing model into Irrlicht: " + verbosestream<<"Client: Storing model into memory: " <<"\""<getSceneManager(); - - //check if mesh was already cached - scene::IAnimatedMesh *mesh = - smgr->getMeshCache()->getMeshByName(filename.c_str()); - - if (mesh != NULL) { - errorstream << "Multiple models with name: " << filename.c_str() << - " found replacing previous model!" << std::endl; - - smgr->getMeshCache()->removeMesh(mesh); - mesh = 0; - } - - io::IFileSystem *irrfs = m_device->getFileSystem(); - io::IReadFile *rfile = irrfs->createMemoryReadFile( - *data_rw, data_rw.getSize(), filename.c_str()); - assert(rfile); - - mesh = smgr->getMesh(rfile); - smgr->getMeshCache()->addMesh(filename.c_str(), mesh); - rfile->drop(); + if(m_mesh_data.count(filename)) + errorstream<<"Multiple models with name \""<::const_iterator i = + m_mesh_data.find(filename); + if(i == m_mesh_data.end()){ + errorstream<<"Client::getMesh(): Mesh not found: \""<second; + scene::ISceneManager *smgr = m_device->getSceneManager(); + + // Create the mesh, remove it from cache and return it + // This allows unique vertex colors and other properties for each instance + Buffer data_rw(data.c_str(), data.size()); // Const-incorrect Irrlicht + io::IFileSystem *irrfs = m_device->getFileSystem(); + io::IReadFile *rfile = irrfs->createMemoryReadFile( + *data_rw, data_rw.getSize(), filename.c_str()); + assert(rfile); + scene::IAnimatedMesh *mesh = smgr->getMesh(rfile); + rfile->drop(); + // NOTE: By playing with Irrlicht refcounts, maybe we could cache a bunch + // of uniquely named instances and re-use them + mesh->grab(); + smgr->getMeshCache()->removeMesh(mesh); + return mesh; +} + -- cgit v1.2.3