From ad530c0fc736bbcdc60e3013d093c6b30f0d9cbd Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 14 Jan 2011 11:49:55 +0000 Subject: [PATCH] From Sukender, "Small submission: - 3DS reader now takes care to not create Texture2D duplicates" --- src/osgPlugins/3ds/ReaderWriter3DS.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/osgPlugins/3ds/ReaderWriter3DS.cpp b/src/osgPlugins/3ds/ReaderWriter3DS.cpp index eb5abaf56..9df4fedcd 100644 --- a/src/osgPlugins/3ds/ReaderWriter3DS.cpp +++ b/src/osgPlugins/3ds/ReaderWriter3DS.cpp @@ -211,7 +211,10 @@ protected: bool restoreMatrixTransformsNoMeshes; typedef std::map SmoothingFaceMap; void addDrawableFromFace(osg::Geode * geode, FaceList & faceList, Lib3dsMesh * mesh, const osg::Matrix * matrix, osg::StateSet * stateSet); - }; + + typedef std::map > TexturesMap; // Should be an unordered map (faster) + TexturesMap texturesMap; +}; }; // now register with Registry to instantiate the above @@ -967,6 +970,14 @@ osg::Texture2D* ReaderWriter3DS::ReaderObject::createTexture(Lib3dsTextureMap * { OSG_INFO<<"texture->name="<name<<", _directory="<<_directory<name); + if (itTex != texturesMap.end()) { + OSG_DEBUG << "Texture '" << texture->name << "' found in cache." << std::endl; + return itTex->second.get(); + } + + // Texture not in cache: locate and load. std::string fileName = osgDB::findFileInDirectory(texture->name,_directory,osgDB::CASE_INSENSITIVE); if (fileName.empty()) { @@ -1028,6 +1039,8 @@ osg::Texture2D* ReaderWriter3DS::ReaderObject::createTexture(Lib3dsTextureMap * // bilinear. osg_texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR_MIPMAP_NEAREST); + // Insert in cache map + texturesMap.insert(TexturesMap::value_type(texture->name, osg_texture)); return osg_texture; } else