]> git.mxchange.org Git - flightgear.git/blob - src/Scenery/SceneryPager.cxx
Use the OSG DatabasePager instead of FGTileLoader
[flightgear.git] / src / Scenery / SceneryPager.cxx
1 #include "SceneryPager.hxx"
2 #include <algorithm>
3 #include <functional>
4
5 using namespace flightgear;
6 using osg::ref_ptr;
7 using osg::Node;
8
9 SceneryPager::SceneryPager()
10 {
11     _pagerRequests.reserve(48);
12     _deleteRequests.reserve(16);
13 }
14
15 SceneryPager::SceneryPager(const SceneryPager& rhs) :
16     DatabasePager(rhs)
17 {
18 }
19
20 SceneryPager::~SceneryPager()
21 {
22 }
23
24 void SceneryPager::queueRequest(const std::string& fileName, osg::Group* group,
25                                 float priority, osg::FrameStamp* frameStamp)
26 {
27     _pagerRequests.push_back(PagerRequest(fileName, group, priority,
28                                           frameStamp));
29 }
30
31 void SceneryPager::queueDeleteRequest(osg::ref_ptr<osg::Object>& objptr)
32 {
33     _deleteRequests.push_back(objptr);
34     objptr = 0;
35 }
36 void SceneryPager::signalEndFrame()
37 {
38     using namespace std;
39     bool areDeleteRequests = false;
40     bool arePagerRequests = false;
41     if (!_deleteRequests.empty()) {
42         areDeleteRequests = true;
43         OpenThreads::ScopedLock<OpenThreads::Mutex>
44             lock(_childrenToDeleteListMutex);
45         _childrenToDeleteList.insert(_childrenToDeleteList.end(),
46                                      _deleteRequests.begin(),
47                                      _deleteRequests.end());
48         _deleteRequests.clear();
49     }
50     if (!_pagerRequests.empty()) {
51         arePagerRequests = true;
52         for_each(_pagerRequests.begin(), _pagerRequests.end(),
53                  bind2nd(mem_fun_ref(&PagerRequest::doRequest), this));
54         _pagerRequests.clear();
55     }
56     if (areDeleteRequests && !arePagerRequests)
57         updateDatabasePagerThreadBlock();
58     DatabasePager::signalEndFrame();
59 }
60