]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scenery/SceneryPager.cxx
Whoops, case-sensitivity matters on Linux.
[flightgear.git] / src / Scenery / SceneryPager.cxx
index c72ffe47055e7ab3c6c075c2dfd7281721d3dbbe..9e128787eb6192bbae81e32d2b491d5a5298ba8f 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.
 
-#include <simgear/scene/model/SGPagedLOD.hxx>
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include "SceneryPager.hxx"
 #include <algorithm>
 #include <functional>
 
+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<simgear::SGPagedLOD*>(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<Referenced>& databaseRequest,
+                                osgDB::ReaderWriter::Options* options)
 {
     _pagerRequests.push_back(PagerRequest(fileName, group, priority,
-                                          frameStamp));
+                                          frameStamp,
+                                          databaseRequest,
+                                          options));
 }
 
 void SceneryPager::queueDeleteRequest(osg::ref_ptr<osg::Object>& objptr)
@@ -63,6 +58,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;
@@ -71,10 +95,11 @@ void SceneryPager::signalEndFrame()
     if (!_deleteRequests.empty()) {
         areDeleteRequests = true;
         OpenThreads::ScopedLock<OpenThreads::Mutex>
-            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();
 }