From 784383ac08dd2cb61f23ab923f0894e49a6eb9f3 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 27 May 2007 17:29:29 +0000 Subject: [PATCH] Added camera event callback support into osgViewer --- examples/osgcallback/osgcallback.cpp | 23 ++++++++++ .../osgspheresegment/osgspheresegment.cpp | 5 +++ include/osgViewer/Scene | 4 +- src/osgViewer/CompositeViewer.cpp | 42 ++++++++++++++++++- src/osgViewer/Scene.cpp | 8 ++-- src/osgViewer/Viewer.cpp | 40 ++++++++++++++---- 6 files changed, 107 insertions(+), 15 deletions(-) diff --git a/examples/osgcallback/osgcallback.cpp b/examples/osgcallback/osgcallback.cpp index eee678abb..11eda6ed0 100644 --- a/examples/osgcallback/osgcallback.cpp +++ b/examples/osgcallback/osgcallback.cpp @@ -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"<accept(icv); + viewer.getCamera()->setUpdateCallback(new CameraUpdateCallback()); + viewer.getCamera()->setEventCallback(new CameraEventCallback()); + // set the scene to render viewer.setSceneData(rootnode); diff --git a/examples/osgspheresegment/osgspheresegment.cpp b/examples/osgspheresegment/osgspheresegment.cpp index 94ce4e39e..597f81f3d 100644 --- a/examples/osgspheresegment/osgspheresegment.cpp +++ b/examples/osgspheresegment/osgspheresegment.cpp @@ -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")) diff --git a/include/osgViewer/Scene b/include/osgViewer/Scene index ba70642c0..063c8dd76 100644 --- a/include/osgViewer/Scene +++ b/include/osgViewer/Scene @@ -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(); diff --git a/src/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index 7311145a3..bee0be49f 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -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; igetNumSlaves(); ++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; igetNumSlaves(); ++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(), diff --git a/src/osgViewer/Scene.cpp b/src/osgViewer/Scene.cpp index e001d6537..d82c428e3 100644 --- a/src/osgViewer/Scene.cpp +++ b/src/osgViewer/Scene.cpp @@ -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)<setTraversalNumber(_frameStamp->getFrameNumber()); + if (!getSceneData()) return; getSceneData()->accept(*_updateVisitor); diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index 52bd1f5af..4f65600d8 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -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; igetEventCallback()) 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; igetUpdateCallback()) camera->accept(*uv); + } + + uv->setTraversalMode(tm); + } if (_cameraManipulator.valid()) {