this are replaced by the osg::computeLocalToWorld/WorldToLocal() functions found in osg/Transform. Made the ReleaseTextureAndDisplayListsVisitor a public nested class of osgDB::DatabasePager to allow it to be used in the TXP plugin, and added usage of this visitor to the TXP plugin to make sure that textures and display lists are released during the update thread.
161 lines
6.0 KiB
C++
161 lines
6.0 KiB
C++
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield
|
|
*
|
|
* This library is open source and may be redistributed and/or modified under
|
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
* included with this distribution, and on the openscenegraph.org website.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* OpenSceneGraph Public License for more details.
|
|
*/
|
|
|
|
#ifndef OSGDB_DATABASEPAGER
|
|
#define OSGDB_DATABASEPAGER 1
|
|
|
|
#include <osg/NodeVisitor>
|
|
#include <osg/Group>
|
|
#include <osg/PagedLOD>
|
|
#include <osg/Drawable>
|
|
|
|
#include <OpenThreads/Thread>
|
|
#include <OpenThreads/Mutex>
|
|
|
|
#include <osgDB/Export>
|
|
|
|
#include <map>
|
|
#include <set>
|
|
|
|
namespace osgDB {
|
|
|
|
/** Database paging class which manages the loading of files in a background thread,
|
|
* and syncronizing of loaded models with the main scene graph.*/
|
|
class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandler, public OpenThreads::Thread
|
|
{
|
|
public :
|
|
|
|
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);
|
|
|
|
/** run does the database paging.*/
|
|
virtual void run();
|
|
|
|
|
|
/** Add the loaded data to the scene graph.*/
|
|
void addLoadedDataToSceneGraph(double timeStamp);
|
|
|
|
|
|
/** Find all PagedLOD nodes in a subgraph and register them with
|
|
* the DatabasePager so it can keep track of expired nodes.
|
|
* note, should be only be called from the update thread. */
|
|
void registerPagedLODs(osg::Node* subgraph);
|
|
|
|
|
|
/** Set the amount of time that a subgraph will be kept without being visited in the cull traversal
|
|
* before being removed.*/
|
|
void setExpiryDelay(double expiryDelay) { _expiryDelay = expiryDelay; }
|
|
|
|
/** Get the amount of time that a subgraph will be kept without being visited in the cull traversal
|
|
* before being removed.*/
|
|
double getExpiryDelay() const { return _expiryDelay; }
|
|
|
|
/** set whether the removed subgraphs should be deleted in the database thread or not.*/
|
|
void setDeleteRemovedSubgraphsInDatabaseThread(bool flag) { _deleteRemovedSubgraphsInDatabaseThread = flag; }
|
|
|
|
/** get whether the removed subgraphs should be deleted in the database thread or not.*/
|
|
bool getDeleteRemovedSubgraphsInDatabaseThread() const { return _deleteRemovedSubgraphsInDatabaseThread; }
|
|
|
|
/** Iterate through the active PagedLOD nodes children removing
|
|
* children which havn't been visited since specified expiryTime.
|
|
* note, should be only be called from the update thread. */
|
|
void removeExpiredSubgraphs(double currentFrameTime);
|
|
|
|
|
|
/** Turn the compilation of rendering objects for specfied graphics context on (true) or off(false).*/
|
|
void setCompileRenderingObjectsForContexID(unsigned int contextID, bool on);
|
|
|
|
/** Get whether the compilation of rendering objects for specfied graphics context on (true) or off(false).*/
|
|
bool getCompileRenderingObjectsForContexID(unsigned int contextID);
|
|
|
|
/** Compile the rendering objects (display lists,texture objects, VBO's) on loaded subgraph.
|
|
* note, should only be called from the draw thread.*/
|
|
void compileRenderingObjects(osg::State& state,double& availableTime);
|
|
|
|
/** Helper class used internally to force the release of texture objects
|
|
* and displace lists.*/
|
|
class OSGDB_EXPORT ReleaseTexturesAndDrawablesVisitor : public osg::NodeVisitor
|
|
{
|
|
public:
|
|
ReleaseTexturesAndDrawablesVisitor():
|
|
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
|
{
|
|
}
|
|
|
|
virtual void apply(osg::Node& node);
|
|
virtual void apply(osg::Geode& geode);
|
|
inline void apply(osg::StateSet* stateset);
|
|
inline void apply(osg::Drawable* drawable);
|
|
|
|
};
|
|
|
|
public:
|
|
|
|
typedef std::vector< osg::ref_ptr<osg::PagedLOD> > PagedLODList;
|
|
|
|
typedef std::vector< osg::ref_ptr<osg::StateSet> > StateSetList;
|
|
typedef std::vector< osg::ref_ptr<osg::Drawable> > DrawableList;
|
|
typedef std::pair<StateSetList,DrawableList> DataToCompile;
|
|
typedef std::map< unsigned int, DataToCompile > DataToCompileMap;
|
|
|
|
typedef std::set<unsigned int> ActiveGraphicsContexts;
|
|
|
|
|
|
protected :
|
|
|
|
virtual ~DatabasePager() {}
|
|
|
|
struct DatabaseRequest : public osg::Referenced
|
|
{
|
|
DatabaseRequest():
|
|
_numOfRequests(0)
|
|
{}
|
|
|
|
std::string _fileName;
|
|
unsigned int _numOfRequests;
|
|
osg::ref_ptr<osg::Group> _groupForAddingLoadedSubgraph;
|
|
osg::ref_ptr<osg::Node> _loadedModel;
|
|
DataToCompileMap _dataToCompileMap;
|
|
|
|
};
|
|
|
|
typedef std::vector< osg::ref_ptr<DatabaseRequest> > DatabaseRequestList;
|
|
|
|
DatabaseRequestList _fileRequestList;
|
|
OpenThreads::Mutex _fileRequestListMutex;
|
|
|
|
DatabaseRequestList _dataToCompileList;
|
|
OpenThreads::Mutex _dataToCompileListMutex;
|
|
|
|
bool _deleteRemovedSubgraphsInDatabaseThread;
|
|
osg::NodeList _childrenToDeleteList;
|
|
OpenThreads::Mutex _childrenToDeleteListMutex;
|
|
|
|
DatabaseRequestList _dataToMergeList;
|
|
OpenThreads::Mutex _dataToMergeListMutex;
|
|
|
|
|
|
PagedLODList _pagedLODList;
|
|
|
|
double _expiryDelay;
|
|
|
|
ActiveGraphicsContexts _activeGraphicsContexts;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|