Merge pull request #544 from bjornblissing/fbx_texture_warnings

Check existence of path before reading image
This commit is contained in:
OpenSceneGraph git repository 2018-05-03 16:11:00 +01:00 committed by GitHub
commit 4a6d928105
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -169,16 +169,37 @@ StateSetContent FbxMaterialToOsgStateSet::convert(const FbxSurfaceMaterial* pFbx
osg::ref_ptr<osg::Texture2D> FbxMaterialToOsgStateSet::fbxTextureToOsgTexture(const FbxFileTexture* fbx)
{
ImageMap::iterator it = _imageMap.find(fbx->GetFileName());
// Try to find image in cache
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::readRefImageFile(osgDB::concatPaths(_dir, fbx->GetFileName()), _options)) || // First try "export dir/name"
(pImage = osgDB::readRefImageFile(fbx->GetFileName(), _options)) || // Then try "name" (if absolute)
(pImage = osgDB::readRefImageFile(osgDB::concatPaths(_dir, fbx->GetRelativeFileName()), _options))) // Else try "current dir/name"
// 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/name"
{
filename = osgDB::concatPaths(_dir, fbx->GetRelativeFileName());
}
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());