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

@@ -119,6 +119,26 @@ public:
}
};
class CameraUpdateCallback : public osg::NodeCallback
{
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
std::cout<<"Camera update callback - pre traverse"<<node<<std::endl;
traverse(node,nv);
std::cout<<"Camera update callback - post traverse"<<node<<std::endl;
}
};
class CameraEventCallback : public osg::NodeCallback
{
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
std::cout<<"Camera event callback - pre traverse"<<node<<std::endl;
traverse(node,nv);
std::cout<<"Camera event callback - post traverse"<<node<<std::endl;
}
};
int main( int argc, char **argv )
{
// use an ArgumentParser object to manage the program arguments.
@@ -147,6 +167,9 @@ int main( int argc, char **argv )
InsertCallbacksVisitor icv;
rootnode->accept(icv);
viewer.getCamera()->setUpdateCallback(new CameraUpdateCallback());
viewer.getCamera()->setEventCallback(new CameraEventCallback());
// set the scene to render
viewer.setSceneData(rootnode);

View File

@@ -628,6 +628,11 @@ int main(int argc, char **argv)
unsigned int testCase = 0;
if (arguments.read("-t", testCase)) {}
osgSim::OverlayNode::OverlayTechnique technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
while (arguments.read("--object")) technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
while (arguments.read("--ortho") || arguments.read("--orthographic")) technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
while (arguments.read("--persp") || arguments.read("--perspective")) technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY;
// if user request help write it out to cout.
if (arguments.read("-h") || arguments.read("--help"))

View File

@@ -50,9 +50,9 @@ class OSGVIEWER_EXPORT Scene : public virtual osg::Referenced
const osgUtil::UpdateVisitor* getUpdateVisitor() const { return _updateVisitor.get(); }
virtual void frameAdvance();
virtual void advance();
virtual void frameUpdateTraversal();
virtual void updateTraversal();

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())
{