From c5366cceb6d345d3526ab013b04eb815fe0a6845 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Tue, 15 Feb 2011 12:30:56 +0100 Subject: [PATCH] accomodate changes to osgDB::DatabasePager interface The change was introduced in OSG SVN revision 12080. Note: that revision has a bug that causes fgfs to crash. The bug is fixed in revision 12170. --- src/Scenery/SceneryPager.cxx | 39 ++++++++++++++++++++++++++++++------ src/Scenery/SceneryPager.hxx | 19 +++++------------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/Scenery/SceneryPager.cxx b/src/Scenery/SceneryPager.cxx index 183511361..9328973ef 100644 --- a/src/Scenery/SceneryPager.cxx +++ b/src/Scenery/SceneryPager.cxx @@ -44,15 +44,12 @@ SceneryPager::~SceneryPager() { } +#if SG_PAGEDLOD_HAS_OPTIONS +#else void SceneryPager::requestNodeFile(const std::string& fileName, Group* group, float priority, const FrameStamp* framestamp, ref_ptr& databaseRequest, -#if SG_OSG_MIN_VERSION_REQUIRED(2,9,5) - const osg::Referenced* options -#else - osgDB::ReaderWriter::Options* options -#endif - ) + osgDB::ReaderWriter::Options* options) { simgear::SGPagedLOD *sgplod = dynamic_cast(group); if(sgplod) @@ -64,6 +61,7 @@ void SceneryPager::requestNodeFile(const std::string& fileName, Group* group, databaseRequest, options); } +#endif void SceneryPager::queueRequest(const std::string& fileName, Group* group, float priority, FrameStamp* frameStamp, @@ -81,6 +79,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; diff --git a/src/Scenery/SceneryPager.hxx b/src/Scenery/SceneryPager.hxx index ba018993c..04e6ef5c4 100644 --- a/src/Scenery/SceneryPager.hxx +++ b/src/Scenery/SceneryPager.hxx @@ -28,6 +28,7 @@ #include #include +#include namespace flightgear { @@ -39,16 +40,14 @@ public: // Unhide DatabasePager::requestNodeFile using osgDB::DatabasePager::requestNodeFile; // reimplement to add readerWriterOptions from SGPagedLOD +#if SG_PAGEDLOD_HAS_OPTIONS +#else virtual void requestNodeFile(const std::string& fileName, osg::Group* group, float priority, const osg::FrameStamp* framestamp, osg::ref_ptr& databaseRequest, -#if SG_OSG_MIN_VERSION_REQUIRED(2,9,5) - const osg::Referenced* options -#else - osgDB::ReaderWriter::Options* options + osgDB::ReaderWriter::Options* options); #endif - ); void queueRequest(const std::string& fileName, osg::Group* node, float priority, osg::FrameStamp* frameStamp, osg::ref_ptr& databaseRequest, @@ -77,15 +76,7 @@ protected: _databaseRequest(&databaseRequest) {} - void doRequest(SceneryPager* pager) - { - if (_group->getNumChildren() == 0) - pager->requestNodeFile(_fileName, _group.get(), _priority, - _frameStamp.get(), - *_databaseRequest, - _options.get()); - } - + void doRequest(SceneryPager* pager); std::string _fileName; osg::ref_ptr _group; float _priority;