Refactored the way the Scene is used in Viewer and CompositeViewer to ensure

that only on Scene exists per scene graph.
This commit is contained in:
Robert Osfield
2007-08-10 10:52:35 +00:00
parent 9b04594126
commit 7366daca91
11 changed files with 234 additions and 245 deletions

View File

@@ -16,35 +16,35 @@
using namespace osgViewer;
Scene::Scene():
_firstFrame(true)
{
_frameStamp = new osg::FrameStamp;
_frameStamp->setFrameNumber(0);
_frameStamp->setReferenceTime(0);
typedef std::vector< osg::observer_ptr<Scene> > SceneCache;
static OpenThreads::Mutex s_sceneCacheMutex;
static SceneCache s_sceneCache;
_updateVisitor = new osgUtil::UpdateVisitor;
_updateVisitor->setFrameStamp(_frameStamp.get());
Scene::Scene():
osg::Referenced(true)
{
setDatabasePager(osgDB::DatabasePager::create());
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_sceneCacheMutex);
s_sceneCache.push_back(this);
}
Scene::~Scene()
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_sceneCacheMutex);
for(SceneCache::iterator itr = s_sceneCache.begin();
itr != s_sceneCache.end();
++itr)
{
Scene* scene = itr->get();
if (scene==this)
{
s_sceneCache.erase(itr);
break;
}
}
}
void Scene::setFrameStamp(osg::FrameStamp* frameStamp)
{
_frameStamp = frameStamp;
_updateVisitor->setFrameStamp(_frameStamp.get());
}
void Scene::init()
{
osg::notify(osg::NOTICE)<<"Scene::init() not implementated yet."<<std::endl;
}
void Scene::setSceneData(osg::Node* node)
{
_sceneData = node;
@@ -71,31 +71,17 @@ void Scene::setDatabasePager(osgDB::DatabasePager* dp)
_databasePager = dp;
}
void Scene::advance()
Scene* Scene::getScene(osg::Node* node)
{
// double previousTime = _frameStamp->getReferenceTime();
_frameStamp->setReferenceTime(osg::Timer::instance()->time_s());
_frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1);
// osg::notify(osg::NOTICE)<<"Frame rate = "<<1.0/(_frameStamp->getReferenceTime()-previousTime)<<std::endl;
}
void Scene::updateTraversal()
{
_updateVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
if (!getSceneData()) return;
getSceneData()->accept(*_updateVisitor);
if (_databasePager.valid())
{
// syncronize changes required by the DatabasePager thread to the scene graph
_databasePager->updateSceneGraph(_frameStamp->getReferenceTime());
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_sceneCacheMutex);
for(SceneCache::iterator itr = s_sceneCache.begin();
itr != s_sceneCache.end();
++itr)
{
Scene* scene = itr->get();
if (scene && scene->getSceneData()==node) return scene;
}
return 0;
}