Show
Ignore:
Timestamp:
05/11/09 13:39:12 (6 years ago)
Author:
robert
Message:

Moved Registry::ReadFileCallback? + WriteFileCallback?, and osgDB::ReaderWriter::Options into their own separate Options file and into the osgDB namespace.

Introduced a new callback osgDB::FindFileCallback? that overrides the default behavior of findDataFile/findLibraryFile.

Introduced support for assigning ReaderWriter::Options directory to PagedLOD.

Introduced new osgDB::FileLocationCallback? for assistancing the DatabasePager? to know when a file is hosted on a local or remote file system.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgDB/DatabasePager.cpp

    r10171 r10174  
    446446            break; 
    447447    } 
    448      
    449     //Getting CURL Environment Variables (If found rewrite OSG Options) 
    450     osg::ref_ptr<FileCache> fileCache = osgDB::Registry::instance()->getFileCache(); 
     448 
    451449 
    452450    do 
     
    482480 
    483481        bool readFromFileCache = false; 
    484                  
     482 
     483        osg::ref_ptr<FileCache> fileCache = osgDB::Registry::instance()->getFileCache(); 
     484        osg::ref_ptr<FileLocationCallback> fileLocationCallback = osgDB::Registry::instance()->getFileLocationCallback(); 
     485 
    485486        if (databaseRequest.valid()) 
    486487        { 
     488            if (databaseRequest->_loadOptions.valid()) 
     489            { 
     490                if (databaseRequest->_loadOptions->getFileCache()) fileCache = databaseRequest->_loadOptions->getFileCache(); 
     491                if (databaseRequest->_loadOptions->getFileLocationCallback()) fileLocationCallback = databaseRequest->_loadOptions->getFileLocationCallback(); 
     492            } 
     493 
     494            // disable the FileCache if the fileLocationCallback tells us that it isn't required for this request. 
     495            if (fileLocationCallback.valid() && !fileLocationCallback->useFileCache()) fileCache = 0; 
     496 
     497 
    487498            // check if databaseRequest is still relevant 
    488499            if ((_pager->_frameNumber-databaseRequest->_frameNumberLastRequest)<=1) 
     
    493504                { 
    494505                    case(HANDLE_ALL_REQUESTS): 
     506                    { 
    495507                        // do nothing as this thread can handle the load 
    496                         if (osgDB::containsServerAddress(databaseRequest->_fileName)) 
     508                        if (fileCache.valid() && fileCache->isFileAppropriateForFileCache(databaseRequest->_fileName)) 
    497509                        { 
    498                             if (fileCache.valid() && fileCache->existsInCache(databaseRequest->_fileName)) 
     510                            if (fileCache->existsInCache(databaseRequest->_fileName)) 
    499511                            { 
    500512                                readFromFileCache = true; 
     
    502514                        } 
    503515                        break; 
    504                          
     516                    } 
    505517                    case(HANDLE_NON_HTTP): 
     518                    { 
    506519                        // check the cache first 
    507                         if (osgDB::containsServerAddress(databaseRequest->_fileName)) 
     520                        bool isHighLatencyFileRequest = false; 
     521 
     522                        if (fileLocationCallback.valid()) 
     523                        { 
     524                            isHighLatencyFileRequest = fileLocationCallback->fileLocation(databaseRequest->_fileName, databaseRequest->_loadOptions.get()) == FileLocationCallback::REMOTE_FILE; 
     525                        } 
     526                        else  if (fileCache.valid() && fileCache->isFileAppropriateForFileCache(databaseRequest->_fileName)) 
     527                        { 
     528                            isHighLatencyFileRequest = true; 
     529                        } 
     530 
     531                        if (isHighLatencyFileRequest) 
    508532                        { 
    509533                            if (fileCache.valid() && fileCache->existsInCache(databaseRequest->_fileName)) 
     
    519543                        } 
    520544                        break; 
    521                          
     545                    } 
    522546                    case(HANDLE_ONLY_HTTP): 
    523                         // make sure the request is a http request 
    524                         if (!osgDB::containsServerAddress(databaseRequest->_fileName)) 
    525                         { 
    526                             osg::notify(osg::NOTICE)<<_name<<": Help we have request we shouldn't have "<<databaseRequest->_fileName<<std::endl; 
    527                             databaseRequest = 0; 
    528                         } 
     547                    { 
     548                        // accept all requests, as we'll assume only high latency requests will have got here. 
    529549                        break; 
     550                    } 
    530551                } 
    531552            } 
     
    555576 
    556577            if (databaseRequest->_loadedModel.valid() && 
    557                 osgDB::containsServerAddress(databaseRequest->_fileName) && 
    558578                fileCache.valid() && 
     579                fileCache->isFileAppropriateForFileCache(databaseRequest->_fileName) && 
    559580                !readFromFileCache) 
    560581            { 
     
    12311252void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* group, 
    12321253                                    float priority, const osg::FrameStamp* framestamp, 
    1233                                     osg::ref_ptr<osg::Referenced>& databaseRequest) 
    1234 { 
    1235     requestNodeFile(fileName,group,priority,framestamp,databaseRequest,Registry::instance()->getOptions()); 
    1236 } 
    1237  
    1238 void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* group, 
    1239                                     float priority, const osg::FrameStamp* framestamp, 
    12401254                                    osg::ref_ptr<osg::Referenced>& databaseRequestRef, 
    1241                                     Options* loadOptions) 
    1242 { 
     1255                                    const osg::Referenced* options) 
     1256{ 
     1257    osgDB::Options* loadOptions = dynamic_cast<osgDB::Options*>(const_cast<osg::Referenced*>(options)); 
     1258    if (!loadOptions) 
     1259    { 
     1260       loadOptions = Registry::instance()->getOptions(); 
     1261 
     1262        osg::notify(osg::NOTICE)<<"Using options from Registry "<<std::endl; 
     1263    } 
     1264    else 
     1265    { 
     1266        osg::notify(osg::NOTICE)<<"options from requestNodeFile "<<std::endl; 
     1267    } 
     1268 
     1269 
    12431270    if (!_acceptNewRequests) return; 
    12441271