]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scenery/SceneryPager.cxx
Merge branch 'next' into durk-atc
[flightgear.git] / src / Scenery / SceneryPager.cxx
index 77aac61c3e619dded7f1d54bf2254c2a6e0691a0..9328973ef4c6162deb3c5e1ca60d690a41269106 100644 (file)
@@ -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
 //
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include <simgear/scene/model/SGPagedLOD.hxx>
+#include <simgear/math/SGMath.hxx>
 #include "SceneryPager.hxx"
 #include <algorithm>
 #include <functional>
@@ -28,7 +33,6 @@ SceneryPager::SceneryPager()
 {
     _pagerRequests.reserve(48);
     _deleteRequests.reserve(16);
-    setExpiryDelay(120.0);
 }
 
 SceneryPager::SceneryPager(const SceneryPager& rhs) :
@@ -40,41 +44,33 @@ SceneryPager::~SceneryPager()
 {
 }
 
+#if SG_PAGEDLOD_HAS_OPTIONS
+#else
 void SceneryPager::requestNodeFile(const std::string& fileName, Group* group,
-                                   float priority,
-                                   const FrameStamp* framestamp,
-#ifdef FGOSGPAGER25
-                                   ref_ptr<Referenced>& databaseRequest
-#endif
-    )
+                                   float priority, const FrameStamp* framestamp,
+                                   ref_ptr<Referenced>& databaseRequest,
+                                   osgDB::ReaderWriter::Options* options)
 {
     simgear::SGPagedLOD *sgplod = dynamic_cast<simgear::SGPagedLOD*>(group);
     if(sgplod)
         DatabasePager::requestNodeFile(fileName, group, priority, framestamp,
-#ifdef FGOSGPAGER25
                                        databaseRequest,
-#endif
                                        sgplod->getReaderWriterOptions());
     else
         DatabasePager::requestNodeFile(fileName, group, priority, framestamp,
-#ifdef FGOSGPAGER25
-                                       databaseRequest
-#endif
-            );
+                                       databaseRequest,
+                                       options);
 }
+#endif
 
 void SceneryPager::queueRequest(const std::string& fileName, Group* group,
                                 float priority, FrameStamp* frameStamp,
-#ifdef FGOSGPAGER25
                                 ref_ptr<Referenced>& databaseRequest,
-#endif
                                 osgDB::ReaderWriter::Options* options)
 {
     _pagerRequests.push_back(PagerRequest(fileName, group, priority,
                                           frameStamp,
-#ifdef FGOSGPAGER25
                                           databaseRequest,
-#endif
                                           options));
 }
 
@@ -83,6 +79,35 @@ void SceneryPager::queueDeleteRequest(osg::ref_ptr<osg::Object>& 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<Group*>(_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;
@@ -90,15 +115,9 @@ void SceneryPager::signalEndFrame()
     bool arePagerRequests = false;
     if (!_deleteRequests.empty()) {
         areDeleteRequests = true;
-#ifdef FGOSGPAGER25
         OpenThreads::ScopedLock<OpenThreads::Mutex>
             lock(_fileRequestQueue->_childrenToDeleteListMutex);
         ObjectList& deleteList = _fileRequestQueue->_childrenToDeleteList;
-#else
-        OpenThreads::ScopedLock<OpenThreads::Mutex>
-            lock(_childrenToDeleteListMutex);
-        ObjectList& deleteList = _childrenToDeleteList;
-#endif
         deleteList.insert(deleteList.end(),
                           _deleteRequests.begin(),
                           _deleteRequests.end());
@@ -111,11 +130,7 @@ void SceneryPager::signalEndFrame()
         _pagerRequests.clear();
     }
     if (areDeleteRequests && !arePagerRequests) {
-#ifdef FGOSGPAGER25
         _fileRequestQueue->updateBlock();
-#else
-        updateDatabasePagerThreadBlock();
-#endif        
     }
     DatabasePager::signalEndFrame();
 }