From 5868022ca168866c95c53820acfb2aef45c43592 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 9 Nov 2010 17:17:13 +0000 Subject: [PATCH] Added traversal of salve camera subgraphs when the slave camera doesn't share it's scene graph wiht the View's master scene graph. --- src/osgViewer/CompositeViewer.cpp | 38 +++++++++++++++++++++++++--- src/osgViewer/Viewer.cpp | 42 +++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index 93bb52862..dfaddb81c 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -953,7 +953,18 @@ void CompositeViewer::eventTraversal() view->getSceneData()->accept(*_eventVisitor); - // call any camera update callbacks, but only traverse that callback, don't traverse its subgraph + // Do EventTraversal for slaves with their own subgraph + for(unsigned int i=0; igetNumSlaves(); ++i) + { + osg::View::Slave& slave = view->getSlave(i); + osg::Camera* camera = slave._camera.get(); + if(camera && !slave._useMastersSceneData) + { + camera->accept(*_eventVisitor); + } + } + + // call any camera event 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); @@ -962,8 +973,12 @@ void CompositeViewer::eventTraversal() for(unsigned int i=0; igetNumSlaves(); ++i) { + osg::View::Slave& slave = view->getSlave(i); osg::Camera* camera = view->getSlave(i)._camera.get(); - if (camera && camera->getEventCallback()) camera->accept(*_eventVisitor); + if (camera && slave._useMastersSceneData && camera->getEventCallback()) + { + camera->accept(*_eventVisitor); + } } _eventVisitor->setTraversalMode(tm); @@ -1075,6 +1090,17 @@ void CompositeViewer::updateTraversal() View* view = vitr->get(); { + // Do UpdateTraversal for slaves with their own subgraph + for(unsigned int i=0; igetNumSlaves(); ++i) + { + osg::View::Slave& slave = view->getSlave(i); + osg::Camera* camera = slave._camera.get(); + if(camera && !slave._useMastersSceneData) + { + camera->accept(*_updateVisitor); + } + } + // 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 = _updateVisitor->getTraversalMode(); @@ -1084,8 +1110,12 @@ void CompositeViewer::updateTraversal() for(unsigned int i=0; igetNumSlaves(); ++i) { - osg::Camera* camera = view->getSlave(i)._camera.get(); - if (camera && camera->getUpdateCallback()) camera->accept(*_updateVisitor); + osg::View::Slave& slave = view->getSlave(i); + osg::Camera* camera = slave._camera.get(); + if (camera && slave._useMastersSceneData && camera->getUpdateCallback()) + { + camera->accept(*_updateVisitor); + } } _updateVisitor->setTraversalMode(tm); diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index 96275fabd..1c4e72c08 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -881,7 +881,19 @@ void Viewer::eventTraversal() getSceneData()->accept(*_eventVisitor); - // call any camera update callbacks, but only traverse that callback, don't traverse its subgraph + // Do EventTraversal for slaves with their own subgraph + for(unsigned int i=0; iaccept(*_eventVisitor); + } + } + + + // call any camera event 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); @@ -890,8 +902,12 @@ void Viewer::eventTraversal() for(unsigned int i=0; igetEventCallback()) camera->accept(*_eventVisitor); + osg::View::Slave& slave = getSlave(i); + osg::Camera* camera = slave._camera.get(); + if (camera && slave._useMastersSceneData && camera->getEventCallback()) + { + camera->accept(*_eventVisitor); + } } _eventVisitor->setTraversalMode(tm); @@ -970,6 +986,18 @@ void Viewer::updateTraversal() _incrementalCompileOperation->mergeCompiledSubgraphs(); } + { + // Do UpdateTraversal for slaves with their own subgraph + for(unsigned int i=0; iaccept(*_updateVisitor); + } + } + } { // call any camera update callbacks, but only traverse that callback, don't traverse its subgraph @@ -981,8 +1009,12 @@ void Viewer::updateTraversal() for(unsigned int i=0; igetUpdateCallback()) camera->accept(*_updateVisitor); + osg::View::Slave& slave = getSlave(i); + osg::Camera* camera = slave._camera.get(); + if (camera && slave._useMastersSceneData && camera->getUpdateCallback()) + { + camera->accept(*_updateVisitor); + } } _updateVisitor->setTraversalMode(tm);