Hi Guys:

I've found a problem when upgrading our application to 3.0.1 (from 2.8) whereby 
files (fonts, models, etc) fail to load *after* an archive has been loaded.  If 
no archive has been loaded, everything is fine.

The offending code appears to be this in Registry::read() added at rev 12638:

    // check loaded archives.
    AvailableArchiveIterator aaitr(_archiveCache, _archiveCacheMutex);
    for(;aaitr.valid();++aaitr)
    {
        ReaderWriter::ReadResult rr = readFunctor.doRead(*aaitr);
        if (readFunctor.isValid(rr)) return rr;
        else results.push_back(rr);
    }

If an archive has been loaded, this code causes FILE_NOT_FOUND to be pushed 
onto the results vector if the file being loaded is not part of the archive.  
This causes the function to exit later before any other (currently not loaded) 
plugins get a chance at loading the file.

Making the following change fixes the issue for me, but it may be a bit naive?

    // check loaded archives.
    AvailableArchiveIterator aaitr(_archiveCache, _archiveCacheMutex);
    for(;aaitr.valid();++aaitr)
    {
        ReaderWriter::ReadResult rr = readFunctor.doRead(*aaitr);
        if (readFunctor.isValid(rr)) return rr;
        else if (rr.status() != ReaderWriter::ReadResult::FILE_NOT_FOUND) 
results.push_back(rr);
    }

A small test program reproduces the problem:

int main(int arg, char* argv[])
{
     osg::Node* pNode1 = osgDB::readNodeFile("a path to a .osga");
     osg::Node* pNode2 = osgDB::readNodeFile("a path to a .flt");// Needs to be 
a file type that is not contained in the archive
     return 0;
}

Given the above, pNode2 will be null ... reverse the order of the two lines and 
pNode1 and pNode2 will be valid.

Cheers

Anthony

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to