X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2FSceneryPager.cxx;h=159cc51f1beb5f0fa39595c383f44b80606a5ee1;hb=c6f88e5b9be767d93fd34f3b01c0e949fbd0044b;hp=6da6d4b726d58c8eff4bdae38deb5cf16e238443;hpb=fd492a297aee6d40c58f71b1889847b6668af3fd;p=flightgear.git diff --git a/src/Scenery/SceneryPager.cxx b/src/Scenery/SceneryPager.cxx index 6da6d4b72..159cc51f1 100644 --- a/src/Scenery/SceneryPager.cxx +++ b/src/Scenery/SceneryPager.cxx @@ -21,14 +21,14 @@ #include #include +using namespace osg; using namespace flightgear; -using osg::ref_ptr; -using osg::Node; SceneryPager::SceneryPager() { _pagerRequests.reserve(48); _deleteRequests.reserve(16); + setExpiryDelay(120.0); } SceneryPager::SceneryPager(const SceneryPager& rhs) : @@ -40,21 +40,42 @@ SceneryPager::~SceneryPager() { } -void SceneryPager::requestNodeFile(const std::string& fileName,osg::Group* group, - float priority, const osg::FrameStamp* framestamp) +void SceneryPager::requestNodeFile(const std::string& fileName, Group* group, + float priority, + const FrameStamp* framestamp +#ifdef FGOSGPAGER25 + , ref_ptr& databaseRequest +#endif + ) { simgear::SGPagedLOD *sgplod = dynamic_cast(group); if(sgplod) - DatabasePager::requestNodeFile(fileName,group,priority,framestamp,sgplod->getReaderWriterOptions()); + DatabasePager::requestNodeFile(fileName, group, priority, framestamp, +#ifdef FGOSGPAGER25 + databaseRequest, +#endif + sgplod->getReaderWriterOptions()); else - DatabasePager::requestNodeFile(fileName,group,priority,framestamp); + DatabasePager::requestNodeFile(fileName, group, priority, framestamp +#ifdef FGOSGPAGER25 + , databaseRequest +#endif + ); } -void SceneryPager::queueRequest(const std::string& fileName, osg::Group* group, - float priority, osg::FrameStamp* frameStamp) +void SceneryPager::queueRequest(const std::string& fileName, Group* group, + float priority, FrameStamp* frameStamp, +#ifdef FGOSGPAGER25 + ref_ptr& databaseRequest, +#endif + osgDB::ReaderWriter::Options* options) { _pagerRequests.push_back(PagerRequest(fileName, group, priority, - frameStamp)); + frameStamp, +#ifdef FGOSGPAGER25 + databaseRequest, +#endif + options)); } void SceneryPager::queueDeleteRequest(osg::ref_ptr& objptr) @@ -69,11 +90,18 @@ void SceneryPager::signalEndFrame() bool arePagerRequests = false; if (!_deleteRequests.empty()) { areDeleteRequests = true; +#ifdef FGOSGPAGER25 + OpenThreads::ScopedLock + lock(_fileRequestQueue->_childrenToDeleteListMutex); + ObjectList& deleteList = _fileRequestQueue->_childrenToDeleteList; +#else OpenThreads::ScopedLock lock(_childrenToDeleteListMutex); - _childrenToDeleteList.insert(_childrenToDeleteList.end(), - _deleteRequests.begin(), - _deleteRequests.end()); + ObjectList& deleteList = _childrenToDeleteList; +#endif + deleteList.insert(deleteList.end(), + _deleteRequests.begin(), + _deleteRequests.end()); _deleteRequests.clear(); } if (!_pagerRequests.empty()) { @@ -82,8 +110,13 @@ void SceneryPager::signalEndFrame() bind2nd(mem_fun_ref(&PagerRequest::doRequest), this)); _pagerRequests.clear(); } - if (areDeleteRequests && !arePagerRequests) + if (areDeleteRequests && !arePagerRequests) { +#ifdef FGOSGPAGER25 + _fileRequestQueue->updateBlock(); +#else updateDatabasePagerThreadBlock(); +#endif + } DatabasePager::signalEndFrame(); }