Added camera event callback support into osgViewer

This commit is contained in:
Robert Osfield
2007-05-27 17:29:29 +00:00
parent a49ec6e78d
commit 784383ac08
6 changed files with 107 additions and 15 deletions

View File

@@ -1136,9 +1136,26 @@ void CompositeViewer::eventTraversal()
_eventVisitor->addEvent( event );
view->getSceneData()->accept(*_eventVisitor);
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
// leave that to the scene update traversal.
osg::NodeVisitor::TraversalMode tm = _eventVisitor->getTraversalMode();
_eventVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
if (view->getCamera() && view->getCamera()->getEventCallback()) view->getCamera()->accept(*_eventVisitor);
for(unsigned int i=0; i<view->getNumSlaves(); ++i)
{
osg::Camera* camera = view->getSlave(i)._camera.get();
if (camera && camera->getEventCallback()) camera->accept(*_eventVisitor);
}
_eventVisitor->setTraversalMode(tm);
}
}
}
}
}
@@ -1153,7 +1170,8 @@ void CompositeViewer::updateTraversal()
sitr != scenes.end();
++sitr)
{
(*sitr)->frameUpdateTraversal();
(*sitr)->updateTraversal();
}
@@ -1162,6 +1180,28 @@ void CompositeViewer::updateTraversal()
++vitr)
{
View* view = vitr->get();
Scene* scene = view->getScene();
osgUtil::UpdateVisitor* uv = scene ? scene->getUpdateVisitor() : 0;
if (uv)
{
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
// leave that to the scene update traversal.
osg::NodeVisitor::TraversalMode tm = uv->getTraversalMode();
uv->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
if (view->getCamera() && view->getCamera()->getUpdateCallback()) view->getCamera()->accept(*uv);
for(unsigned int i=0; i<view->getNumSlaves(); ++i)
{
osg::Camera* camera = view->getSlave(i)._camera.get();
if (camera && camera->getUpdateCallback()) camera->accept(*uv);
}
uv->setTraversalMode(tm);
}
if (view->getCameraManipulator())
{
view->setFusionDistance( view->getCameraManipulator()->getFusionDistanceMode(),

View File

@@ -71,20 +71,20 @@ void Scene::setDatabasePager(osgDB::DatabasePager* dp)
_databasePager = dp;
}
void Scene::frameAdvance()
void Scene::advance()
{
// double previousTime = _frameStamp->getReferenceTime();
_frameStamp->setReferenceTime(osg::Timer::instance()->time_s());
_frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1);
_updateVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
// osg::notify(osg::NOTICE)<<"Frame rate = "<<1.0/(_frameStamp->getReferenceTime()-previousTime)<<std::endl;
}
void Scene::frameUpdateTraversal()
void Scene::updateTraversal()
{
_updateVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
if (!getSceneData()) return;
getSceneData()->accept(*_updateVisitor);

View File

@@ -2033,10 +2033,25 @@ void Viewer::eventTraversal()
_eventVisitor->addEvent( event );
getSceneData()->accept(*_eventVisitor);
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
// leave that to the scene update traversal.
osg::NodeVisitor::TraversalMode tm = _eventVisitor->getTraversalMode();
_eventVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
if (_camera.valid() && _camera->getEventCallback()) _camera->accept(*_eventVisitor);
for(unsigned int i=0; i<getNumSlaves(); ++i)
{
osg::Camera* camera = getSlave(i)._camera.get();
if (camera && camera->getEventCallback()) camera->accept(*_eventVisitor);
}
_eventVisitor->setTraversalMode(tm);
}
}
if (getStats() && getStats()->collectStats("event"))
{
double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
@@ -2056,18 +2071,27 @@ void Viewer::updateTraversal()
double beginUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
osgUtil::UpdateVisitor* uv = _scene.valid() ? _scene->getUpdateVisitor() : 0;
// do the update traversal of the scene.
if (_scene.valid()) _scene->updateTraversal();
if (_camera.valid() && _camera->getUpdateCallback() && uv)
osgUtil::UpdateVisitor* uv = _scene.valid() ? _scene->getUpdateVisitor() : 0;
if (uv)
{
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
// leave that to the scene update traversal.
osg::NodeVisitor::TraversalMode tm = uv->getTraversalMode();
uv->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
_camera->accept(*uv);
uv->setTraversalMode(tm);
}
if (_scene.valid()) _scene->frameUpdateTraversal();
if (_camera.valid() && _camera->getUpdateCallback()) _camera->accept(*uv);
for(unsigned int i=0; i<getNumSlaves(); ++i)
{
osg::Camera* camera = getSlave(i)._camera.get();
if (camera && camera->getUpdateCallback()) camera->accept(*uv);
}
uv->setTraversalMode(tm);
}
if (_cameraManipulator.valid())
{