X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FScenery%2FSceneryPager.cxx;h=9e128787eb6192bbae81e32d2b491d5a5298ba8f;hb=8a087582bcf6bda954dee70ed1f48fe64a09aac2;hp=c72ffe47055e7ab3c6c075c2dfd7281721d3dbbe;hpb=a04d4cbed6c8af5e670187599c995a6672f0e23c;p=flightgear.git diff --git a/src/Scenery/SceneryPager.cxx b/src/Scenery/SceneryPager.cxx index c72ffe470..9e128787e 100644 --- a/src/Scenery/SceneryPager.cxx +++ b/src/Scenery/SceneryPager.cxx @@ -1,4 +1,4 @@ -// SceneryPager.hxx -- Interface to OSG database pager +// SceneryPager.cxx -- Interface to OSG database pager // // Copyright (C) 2007 Tim Moore timoore@redhat.com // @@ -16,20 +16,21 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -#include +#ifdef HAVE_CONFIG_H +# include +#endif + #include "SceneryPager.hxx" #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) : @@ -41,21 +42,15 @@ SceneryPager::~SceneryPager() { } -void SceneryPager::requestNodeFile(const std::string& fileName,osg::Group* group, - float priority, const osg::FrameStamp* framestamp) -{ - simgear::SGPagedLOD *sgplod = dynamic_cast(group); - if(sgplod) - DatabasePager::requestNodeFile(fileName,group,priority,framestamp,sgplod->getReaderWriterOptions()); - else - DatabasePager::requestNodeFile(fileName,group,priority,framestamp); -} - -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, + ref_ptr& databaseRequest, + osgDB::ReaderWriter::Options* options) { _pagerRequests.push_back(PagerRequest(fileName, group, priority, - frameStamp)); + frameStamp, + databaseRequest, + options)); } void SceneryPager::queueDeleteRequest(osg::ref_ptr& objptr) @@ -63,6 +58,35 @@ void SceneryPager::queueDeleteRequest(osg::ref_ptr& objptr) _deleteRequests.push_back(objptr); objptr = 0; } + +// Work around interface change in +// osgDB::DatabasePager::requestNodeFile +namespace +{ +struct NodePathProxy +{ + NodePathProxy(NodePath& nodePath) + : _nodePath(nodePath) + { + } + operator Group* () { return static_cast(_nodePath.back()); } + operator NodePath& () { return _nodePath; } + NodePath& _nodePath; +}; +} + +void SceneryPager::PagerRequest::doRequest(SceneryPager* pager) +{ + if (_group->getNumChildren() == 0) { + NodePath path; + path.push_back(_group.get()); + pager->requestNodeFile(_fileName, NodePathProxy(path), _priority, + _frameStamp.get(), + *_databaseRequest, + _options.get()); + } +} + void SceneryPager::signalEndFrame() { using namespace std; @@ -71,10 +95,11 @@ void SceneryPager::signalEndFrame() if (!_deleteRequests.empty()) { areDeleteRequests = true; OpenThreads::ScopedLock - lock(_childrenToDeleteListMutex); - _childrenToDeleteList.insert(_childrenToDeleteList.end(), - _deleteRequests.begin(), - _deleteRequests.end()); + lock(_fileRequestQueue->_childrenToDeleteListMutex); + ObjectList& deleteList = _fileRequestQueue->_childrenToDeleteList; + deleteList.insert(deleteList.end(), + _deleteRequests.begin(), + _deleteRequests.end()); _deleteRequests.clear(); } if (!_pagerRequests.empty()) { @@ -83,8 +108,9 @@ void SceneryPager::signalEndFrame() bind2nd(mem_fun_ref(&PagerRequest::doRequest), this)); _pagerRequests.clear(); } - if (areDeleteRequests && !arePagerRequests) - updateDatabasePagerThreadBlock(); + if (areDeleteRequests && !arePagerRequests) { + _fileRequestQueue->updateBlock(); + } DatabasePager::signalEndFrame(); }