]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scenery/SceneryPager.cxx
Don't crash if built with --disable-atcdcl
[flightgear.git] / src / Scenery / SceneryPager.cxx
index c72ffe47055e7ab3c6c075c2dfd7281721d3dbbe..6f79a56eec8e5685f6cb3e9f9ce550d37d1dd816 100644 (file)
 // 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>
 
+using namespace osg;
 using namespace flightgear;
-using osg::ref_ptr;
-using osg::Node;
 
 SceneryPager::SceneryPager()
 {
@@ -41,21 +45,36 @@ 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,
+                                   ref_ptr<Referenced>& databaseRequest,
+#if SG_OSG_MIN_VERSION_REQUIRED(2,9,5)
+                                   const osg::Referenced* options
+#else
+                                   osgDB::ReaderWriter::Options* options
+#endif
+                                   )
 {
     simgear::SGPagedLOD *sgplod = dynamic_cast<simgear::SGPagedLOD*>(group);
     if(sgplod)
-        DatabasePager::requestNodeFile(fileName,group,priority,framestamp,sgplod->getReaderWriterOptions());
+        DatabasePager::requestNodeFile(fileName, group, priority, framestamp,
+                                       databaseRequest,
+                                       sgplod->getReaderWriterOptions());
     else
-        DatabasePager::requestNodeFile(fileName,group,priority,framestamp);
+        DatabasePager::requestNodeFile(fileName, group, priority, framestamp,
+                                       databaseRequest,
+                                       options);
 }
 
-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)
@@ -71,10 +90,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 +103,9 @@ void SceneryPager::signalEndFrame()
                  bind2nd(mem_fun_ref(&PagerRequest::doRequest), this));
         _pagerRequests.clear();
     }
-    if (areDeleteRequests && !arePagerRequests)
-        updateDatabasePagerThreadBlock();
+    if (areDeleteRequests && !arePagerRequests) {
+        _fileRequestQueue->updateBlock();
+    }
     DatabasePager::signalEndFrame();
 }