osg::ref_ptr<osg::Texture2D> FbxMaterialToOsgStateSet::fbxTextureToOsgTexture(const KFbxFileTexture* fbx) { ImageMap::iterator it = _imageMap.find(fbx->GetFileName()); if (it != _imageMap.end()) return it->second; osg::ref_ptr<osg::Image> pImage = NULL; // Warning: fbx->GetRelativeFileName() is relative TO EXECUTION DIR // fbx->GetFileName() is as stored initially in the FBX if ((pImage = osgDB::readImageFile(osgDB::concatPaths(_dir, fbx->GetFileName()), _options)) || // First try "export dir/name" (pImage = osgDB::readImageFile(fbx->GetFileName(), _options)) || // Then try "name" (if absolute) (pImage = osgDB::readImageFile(osgDB::concatPaths(_dir, fbx->GetRelativeFileName()), _options))) // Else try "current dir/name" { osg::ref_ptr<osg::Texture2D> pOsgTex = new osg::Texture2D; pOsgTex->setImage(pImage.get()); pOsgTex->setWrap(osg::Texture2D::WRAP_S, convertWrap(fbx->GetWrapModeU())); pOsgTex->setWrap(osg::Texture2D::WRAP_T, convertWrap(fbx->GetWrapModeV())); _imageMap.insert(std::make_pair(fbx->GetFileName(), pOsgTex.get())); return pOsgTex; } else { return NULL; } }
osg::ref_ptr<osg::Texture2D> FbxMaterialToOsgStateSet::fbxTextureToOsgTexture(const FbxFileTexture* fbx) { // Try to find image in cache ImageMap::iterator it = _imageMap.find(fbx->GetFileName()); if (it != _imageMap.end()) return it->second; // Try to locate valid filename std::string filename = ""; // Warning: fbx->GetRelativeFileName() is relative TO EXECUTION DIR // fbx->GetFileName() is as stored initially in the FBX if (osgDB::fileExists(osgDB::concatPaths(_dir, fbx->GetFileName()))) // First try "export dir/name" { filename = osgDB::concatPaths(_dir, fbx->GetFileName()); } else if (osgDB::fileExists(fbx->GetFileName())) // Then try "name" (if absolute) { filename = fbx->GetFileName(); } else if (osgDB::fileExists(osgDB::concatPaths(_dir, fbx->GetRelativeFileName()))) // Else try "current dir + relative filename" { filename = osgDB::concatPaths(_dir, fbx->GetRelativeFileName()); } else if (osgDB::fileExists(osgDB::concatPaths(_dir, osgDB::getSimpleFileName(fbx->GetFileName())))) // Else try "current dir + simple filename" { filename = osgDB::concatPaths(_dir, osgDB::getSimpleFileName(fbx->GetFileName())); } else { OSG_WARN << "Could not find valid file for " << fbx->GetFileName() << std::endl; return NULL; } osg::ref_ptr<osg::Image> pImage = osgDB::readRefImageFile(filename, _options); if (pImage.valid()) { osg::ref_ptr<osg::Texture2D> pOsgTex = new osg::Texture2D; pOsgTex->setImage(pImage.get()); pOsgTex->setWrap(osg::Texture2D::WRAP_S, convertWrap(fbx->GetWrapModeU())); pOsgTex->setWrap(osg::Texture2D::WRAP_T, convertWrap(fbx->GetWrapModeV())); _imageMap.insert(std::make_pair(fbx->GetFileName(), pOsgTex.get())); return pOsgTex; } else { return NULL; } }