From fad832425fe1b2529e2c6e5c79e367701e53fb95 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 10 Oct 2003 19:25:14 +0000 Subject: [PATCH] Improvements to DatabasePager --- include/osg/NodeVisitor | 2 +- include/osgDB/DatabasePager | 15 ++++++++----- src/osg/PagedLOD.cpp | 5 +++-- src/osgDB/DatabasePager.cpp | 43 +++++++++++++++++++++++++++++++++---- 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/include/osg/NodeVisitor b/include/osg/NodeVisitor index aec919cf5..15ae4a20a 100644 --- a/include/osg/NodeVisitor +++ b/include/osg/NodeVisitor @@ -243,7 +243,7 @@ class SG_EXPORT NodeVisitor : public virtual Referenced class DatabaseRequestHandler : public osg::Referenced { public: - virtual void requestNodeFile(const std::string& fileName,osg::Group* group) = 0; + virtual void requestNodeFile(const std::string& fileName,osg::Group* group, float priority, const FrameStamp* framestamp) = 0; protected: virtual ~DatabaseRequestHandler() {} diff --git a/include/osgDB/DatabasePager b/include/osgDB/DatabasePager index 9bd92b5da..125eea329 100644 --- a/include/osgDB/DatabasePager +++ b/include/osgDB/DatabasePager @@ -38,7 +38,7 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl DatabasePager(); /** Add a request to load a node file to end the the database request list.*/ - 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); /** run does the database paging.*/ virtual void run(); @@ -113,17 +113,18 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl typedef std::set ActiveGraphicsContexts; - protected : - - virtual ~DatabasePager(); struct DatabaseRequest : public osg::Referenced { DatabaseRequest(): _numOfRequests(0) {} - + std::string _fileName; + double _timestampFirstRequest; + float _priorityFirstRequest; + double _timestampLastRequest; + float _priorityLastRequest; unsigned int _numOfRequests; osg::ref_ptr _groupForAddingLoadedSubgraph; osg::ref_ptr _loadedModel; @@ -133,6 +134,10 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl typedef std::vector< osg::ref_ptr > DatabaseRequestList; + protected : + + virtual ~DatabasePager(); + DatabaseRequestList _fileRequestList; OpenThreads::Mutex _fileRequestListMutex; diff --git a/src/osg/PagedLOD.cpp b/src/osg/PagedLOD.cpp index 610a2d82e..2f321b3e2 100644 --- a/src/osg/PagedLOD.cpp +++ b/src/osg/PagedLOD.cpp @@ -57,8 +57,9 @@ void PagedLOD::traverse(NodeVisitor& nv) // now request the loading of the next unload child. if (nv.getDatabaseRequestHandler() && numChildren<_fileNameList.size()) { - //std::cout<<" requesting child "<<_fileNameList[numChildren]<requestNodeFile(_fileNameList[numChildren],this); + float priority = (_rangeList[numChildren].second-distance)/(_rangeList[numChildren].second-_rangeList[numChildren].first); + //std::cout<<" requesting child "<<_fileNameList[numChildren]<<" priotity = "<requestNodeFile(_fileNameList[numChildren],this,priority,nv.getFrameStamp()); } diff --git a/src/osgDB/DatabasePager.cpp b/src/osgDB/DatabasePager.cpp index 4b1067fe8..5532cbec7 100644 --- a/src/osgDB/DatabasePager.cpp +++ b/src/osgDB/DatabasePager.cpp @@ -43,9 +43,11 @@ DatabasePager::~DatabasePager() } -void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* group) +void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* group, float priority, const osg::FrameStamp* framestamp) { + double timestamp = framestamp?framestamp->getReferenceTime():0.0; + // search to see if filename already exist in the file loaded list. bool foundEntry = false; @@ -58,6 +60,8 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou if ((*litr)->_fileName==fileName) { foundEntry = true; + (*litr)->_timestampLastRequest = timestamp; + (*litr)->_priorityLastRequest = priority; ++((*litr)->_numOfRequests); } } @@ -75,6 +79,8 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou if ((*litr)->_fileName==fileName) { foundEntry = true; + (*litr)->_timestampLastRequest = timestamp; + (*litr)->_priorityLastRequest = priority; ++((*litr)->_numOfRequests); } } @@ -96,6 +102,8 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou if ((*ritr)->_fileName==fileName) { foundEntry = true; + (*ritr)->_timestampLastRequest = timestamp; + (*ritr)->_priorityLastRequest = priority; ++((*ritr)->_numOfRequests); } } @@ -105,6 +113,10 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou osg::ref_ptr databaseRequest = new DatabaseRequest; databaseRequest->_fileName = fileName; + databaseRequest->_timestampFirstRequest = timestamp; + databaseRequest->_priorityFirstRequest = priority; + databaseRequest->_timestampLastRequest = timestamp; + databaseRequest->_priorityLastRequest = priority; databaseRequest->_groupForAddingLoadedSubgraph = group; _fileRequestList.push_back(databaseRequest); @@ -199,6 +211,17 @@ public: }; +struct SortFileRequestFunctor +{ + bool operator() (const osg::ref_ptr& lhs,const osg::ref_ptr& rhs) const + { + if (lhs->_timestampLastRequest>rhs->_timestampLastRequest) return true; + else if (lhs->_timestampLastRequest_timestampLastRequest) return false; + else return (lhs->_priorityLastRequest>rhs->_priorityLastRequest); + } +}; + + void DatabasePager::run() { osg::notify(osg::NOTICE)<<"DatabasePager::run()"<