Changes for new DatabasePager interface in OSG 2.5.1
This commit is contained in:
parent
32e9505eed
commit
8d1c97d94b
4 changed files with 89 additions and 34 deletions
|
@ -31,11 +31,8 @@
|
||||||
# error This library requires C++
|
# error This library requires C++
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <osg/Version>
|
#include <simgear/structure/OSGVersion.hxx>
|
||||||
|
#define FG_OSG_VERSION SG_OSG_VERSION
|
||||||
#define FG_OSG_VERSION \
|
|
||||||
((OPENSCENEGRAPH_MAJOR_VERSION*10000)\
|
|
||||||
+ (OPENSCENEGRAPH_MINOR_VERSION*1000) + OPENSCENEGRAPH_PATCH_VERSION)
|
|
||||||
|
|
||||||
// #define FANCY_FRAME_COUNTER
|
// #define FANCY_FRAME_COUNTER
|
||||||
#ifdef FANCY_FRAME_COUNTER
|
#ifdef FANCY_FRAME_COUNTER
|
||||||
|
|
|
@ -21,9 +21,8 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
using namespace osg;
|
||||||
using namespace flightgear;
|
using namespace flightgear;
|
||||||
using osg::ref_ptr;
|
|
||||||
using osg::Node;
|
|
||||||
|
|
||||||
SceneryPager::SceneryPager()
|
SceneryPager::SceneryPager()
|
||||||
{
|
{
|
||||||
|
@ -41,22 +40,42 @@ SceneryPager::~SceneryPager()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneryPager::requestNodeFile(const std::string& fileName,osg::Group* group,
|
void SceneryPager::requestNodeFile(const std::string& fileName, Group* group,
|
||||||
float priority, const osg::FrameStamp* framestamp)
|
float priority,
|
||||||
|
const FrameStamp* framestamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
ref_ptr<Referenced>& databaseRequest
|
||||||
|
#endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
simgear::SGPagedLOD *sgplod = dynamic_cast<simgear::SGPagedLOD*>(group);
|
simgear::SGPagedLOD *sgplod = dynamic_cast<simgear::SGPagedLOD*>(group);
|
||||||
if(sgplod)
|
if(sgplod)
|
||||||
DatabasePager::requestNodeFile(fileName,group,priority,framestamp,sgplod->getReaderWriterOptions());
|
DatabasePager::requestNodeFile(fileName, group, priority, framestamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
databaseRequest,
|
||||||
|
#endif
|
||||||
|
sgplod->getReaderWriterOptions());
|
||||||
else
|
else
|
||||||
DatabasePager::requestNodeFile(fileName,group,priority,framestamp);
|
DatabasePager::requestNodeFile(fileName, group, priority, framestamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
databaseRequest
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneryPager::queueRequest(const std::string& fileName, osg::Group* group,
|
void SceneryPager::queueRequest(const std::string& fileName, Group* group,
|
||||||
float priority, osg::FrameStamp* frameStamp,
|
float priority, FrameStamp* frameStamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
ref_ptr<Referenced>& databaseRequest,
|
||||||
|
#endif
|
||||||
osgDB::ReaderWriter::Options* options)
|
osgDB::ReaderWriter::Options* options)
|
||||||
{
|
{
|
||||||
_pagerRequests.push_back(PagerRequest(fileName, group, priority,
|
_pagerRequests.push_back(PagerRequest(fileName, group, priority,
|
||||||
frameStamp, options));
|
frameStamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
databaseRequest,
|
||||||
|
#endif
|
||||||
|
options));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneryPager::queueDeleteRequest(osg::ref_ptr<osg::Object>& objptr)
|
void SceneryPager::queueDeleteRequest(osg::ref_ptr<osg::Object>& objptr)
|
||||||
|
@ -71,9 +90,16 @@ void SceneryPager::signalEndFrame()
|
||||||
bool arePagerRequests = false;
|
bool arePagerRequests = false;
|
||||||
if (!_deleteRequests.empty()) {
|
if (!_deleteRequests.empty()) {
|
||||||
areDeleteRequests = true;
|
areDeleteRequests = true;
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex>
|
||||||
|
lock(_fileRequestQueue->_childrenToDeleteListMutex);
|
||||||
|
ObjectList& deleteList = _fileRequestQueue->_childrenToDeleteList;
|
||||||
|
#else
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex>
|
OpenThreads::ScopedLock<OpenThreads::Mutex>
|
||||||
lock(_childrenToDeleteListMutex);
|
lock(_childrenToDeleteListMutex);
|
||||||
_childrenToDeleteList.insert(_childrenToDeleteList.end(),
|
ObjectList& deleteList = _childrenToDeleteList;
|
||||||
|
#endif
|
||||||
|
deleteList.insert(deleteList.end(),
|
||||||
_deleteRequests.begin(),
|
_deleteRequests.begin(),
|
||||||
_deleteRequests.end());
|
_deleteRequests.end());
|
||||||
_deleteRequests.clear();
|
_deleteRequests.clear();
|
||||||
|
@ -84,8 +110,13 @@ void SceneryPager::signalEndFrame()
|
||||||
bind2nd(mem_fun_ref(&PagerRequest::doRequest), this));
|
bind2nd(mem_fun_ref(&PagerRequest::doRequest), this));
|
||||||
_pagerRequests.clear();
|
_pagerRequests.clear();
|
||||||
}
|
}
|
||||||
if (areDeleteRequests && !arePagerRequests)
|
if (areDeleteRequests && !arePagerRequests) {
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
_fileRequestQueue->updateBlock();
|
||||||
|
#else
|
||||||
updateDatabasePagerThreadBlock();
|
updateDatabasePagerThreadBlock();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
DatabasePager::signalEndFrame();
|
DatabasePager::signalEndFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,13 @@
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
#include <osgDB/DatabasePager>
|
#include <osgDB/DatabasePager>
|
||||||
|
|
||||||
|
#include <simgear/structure/OSGVersion.hxx>
|
||||||
|
|
||||||
|
// Pager request change in OpenSceneGraph 2.5.1
|
||||||
|
#if SG_OSG_VERSION >= 25001
|
||||||
|
#define FGOSGPAGER25
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace flightgear
|
namespace flightgear
|
||||||
{
|
{
|
||||||
class SceneryPager : public osgDB::DatabasePager
|
class SceneryPager : public osgDB::DatabasePager
|
||||||
|
@ -33,20 +40,22 @@ class SceneryPager : public osgDB::DatabasePager
|
||||||
public:
|
public:
|
||||||
SceneryPager();
|
SceneryPager();
|
||||||
SceneryPager(const SceneryPager& rhs);
|
SceneryPager(const SceneryPager& rhs);
|
||||||
|
// Unhide DatabasePager::requestNodeFile
|
||||||
|
using osgDB::DatabasePager::requestNodeFile;
|
||||||
// reimplement to add readerWriterOptions from SGPagedLOD
|
// reimplement to add readerWriterOptions from SGPagedLOD
|
||||||
virtual void requestNodeFile(const std::string& fileName, osg::Group* group,
|
virtual void requestNodeFile(const std::string& fileName, osg::Group* group,
|
||||||
float priority, const osg::FrameStamp* framestamp);
|
float priority,
|
||||||
|
const osg::FrameStamp* framestamp,
|
||||||
virtual void requestNodeFile(const std::string& fileName,osg::Group* group,
|
#ifdef FGOSGPAGER25
|
||||||
float priority, const osg::FrameStamp* framestamp,
|
osg::ref_ptr<osg::Referenced>&
|
||||||
osgDB::ReaderWriter::Options* options) {
|
databaseRequest
|
||||||
osgDB::DatabasePager::requestNodeFile(fileName, group, priority,
|
#endif
|
||||||
framestamp, options);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
void queueRequest(const std::string& fileName, osg::Group* node,
|
void queueRequest(const std::string& fileName, osg::Group* node,
|
||||||
float priority, osg::FrameStamp* frameStamp,
|
float priority, osg::FrameStamp* frameStamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
osg::ref_ptr<osg::Referenced>& databaseRequest,
|
||||||
|
#endif
|
||||||
osgDB::ReaderWriter::Options* options);
|
osgDB::ReaderWriter::Options* options);
|
||||||
// This is passed a ref_ptr so that it can "take ownership" of the
|
// This is passed a ref_ptr so that it can "take ownership" of the
|
||||||
// node to delete and decrement its refcount while holding the
|
// node to delete and decrement its refcount while holding the
|
||||||
|
@ -57,23 +66,36 @@ protected:
|
||||||
// Queue up file requests until the end of the frame
|
// Queue up file requests until the end of the frame
|
||||||
struct PagerRequest
|
struct PagerRequest
|
||||||
{
|
{
|
||||||
PagerRequest() {}
|
PagerRequest() : _priority(0.0f), _databaseRequest(0) {}
|
||||||
PagerRequest(const PagerRequest& rhs) :
|
PagerRequest(const PagerRequest& rhs) :
|
||||||
_fileName(rhs._fileName), _group(rhs._group),
|
_fileName(rhs._fileName), _group(rhs._group),
|
||||||
_priority(rhs._priority), _frameStamp(rhs._frameStamp),
|
_priority(rhs._priority), _frameStamp(rhs._frameStamp),
|
||||||
_options(rhs._options) {}
|
_options(rhs._options), _databaseRequest(rhs._databaseRequest) {}
|
||||||
|
|
||||||
PagerRequest(const std::string& fileName, osg::Group* group,
|
PagerRequest(const std::string& fileName, osg::Group* group,
|
||||||
float priority, osg::FrameStamp* frameStamp,
|
float priority, osg::FrameStamp* frameStamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
osg::ref_ptr<Referenced>& databaseRequest,
|
||||||
|
#endif
|
||||||
osgDB::ReaderWriter::Options* options):
|
osgDB::ReaderWriter::Options* options):
|
||||||
_fileName(fileName), _group(group), _priority(priority),
|
_fileName(fileName), _group(group), _priority(priority),
|
||||||
_frameStamp(frameStamp), _options(options) {}
|
_frameStamp(frameStamp), _options(options),
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
_databaseRequest(&databaseRequest)
|
||||||
|
#else
|
||||||
|
_databaseRequest(0)
|
||||||
|
#endif
|
||||||
|
{}
|
||||||
|
|
||||||
void doRequest(SceneryPager* pager)
|
void doRequest(SceneryPager* pager)
|
||||||
{
|
{
|
||||||
if (_group->getNumChildren() == 0)
|
if (_group->getNumChildren() == 0)
|
||||||
pager->requestNodeFile(_fileName, _group.get(), _priority,
|
pager->requestNodeFile(_fileName, _group.get(), _priority,
|
||||||
_frameStamp.get(), _options.get());
|
_frameStamp.get(),
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
*_databaseRequest,
|
||||||
|
#endif
|
||||||
|
_options.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string _fileName;
|
std::string _fileName;
|
||||||
|
@ -81,6 +103,7 @@ protected:
|
||||||
float _priority;
|
float _priority;
|
||||||
osg::ref_ptr<osg::FrameStamp> _frameStamp;
|
osg::ref_ptr<osg::FrameStamp> _frameStamp;
|
||||||
osg::ref_ptr<osgDB::ReaderWriter::Options> _options;
|
osg::ref_ptr<osgDB::ReaderWriter::Options> _options;
|
||||||
|
osg::ref_ptr<osg::Referenced>* _databaseRequest;
|
||||||
};
|
};
|
||||||
typedef std::vector<PagerRequest> PagerRequestList;
|
typedef std::vector<PagerRequest> PagerRequestList;
|
||||||
PagerRequestList _pagerRequests;
|
PagerRequestList _pagerRequests;
|
||||||
|
|
|
@ -279,7 +279,11 @@ public:
|
||||||
_pager->queueRequest(entry->tileFileName,
|
_pager->queueRequest(entry->tileFileName,
|
||||||
entry->getNode(),
|
entry->getNode(),
|
||||||
entry->get_inner_ring() ? 10.0f : 1.0f,
|
entry->get_inner_ring() ? 10.0f : 1.0f,
|
||||||
_framestamp, _options);
|
_framestamp,
|
||||||
|
#ifdef FGOSGPAGER25
|
||||||
|
entry->getDatabaseRequest(),
|
||||||
|
#endif
|
||||||
|
_options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Add table
Reference in a new issue