From cf9518f346e8407d21894b0ba7429c03f9db1aaf Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 17 May 2007 19:58:57 +0000 Subject: [PATCH] Added support for View::setFustionDistance(..) --- examples/osgstereoimage/osgstereoimage.cpp | 11 +---------- include/osgViewer/View | 15 +++++++++++++++ src/osgViewer/CompositeViewer.cpp | 12 +++++++++++- src/osgViewer/View.cpp | 8 ++++++-- src/osgViewer/Viewer.cpp | 15 +++++++++++++++ 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/examples/osgstereoimage/osgstereoimage.cpp b/examples/osgstereoimage/osgstereoimage.cpp index 609630242..3bd0ce4fe 100644 --- a/examples/osgstereoimage/osgstereoimage.cpp +++ b/examples/osgstereoimage/osgstereoimage.cpp @@ -500,16 +500,7 @@ int main( int argc, char **argv ) (*itr)->useCursor(false); } -#if 0 - // set all the sceneview's up so that their left and right add cull masks are set up. - for(osgProducer::OsgCameraGroup::SceneHandlerList::iterator itr=viewer.getSceneHandlerList().begin(); - itr!=viewer.getSceneHandlerList().end(); - ++itr) - { - osgUtil::SceneView* sceneview = (*itr)->getSceneView(); - sceneview->setFusionDistance(osgUtil::SceneView::USE_FUSION_DISTANCE_VALUE,radius); - } -#endif + viewer.setFusionDistance(osgUtil::SceneView::USE_FUSION_DISTANCE_VALUE,radius); // set up the SlideEventHandler. seh->set(rootNode.get(),offsetX,offsetY,texmatLeft,texmatRight,timeDelayBetweenSlides,autoSteppingActive); diff --git a/include/osgViewer/View b/include/osgViewer/View index e01d79907..e8a1387ff 100644 --- a/include/osgViewer/View +++ b/include/osgViewer/View @@ -94,6 +94,19 @@ class OSGVIEWER_EXPORT View : public osg::View, public osgGA::GUIActionAdapter /** Set the DsplaySettings object associated with this view.*/ const osg::DisplaySettings* getDisplaySettings() const { return _displaySettings.get(); } + /** Set the FusionDistanceMode and Value. Note, is used only when working in stereo.*/ + void setFusionDistance(osgUtil::SceneView::FusionDistanceMode mode,float value=1.0f) + { + _fusionDistanceMode = mode; + _fusionDistanceValue = value; + } + + /** Get the FusionDistanceMode.*/ + osgUtil::SceneView::FusionDistanceMode getFusionDistanceMode() const { return _fusionDistanceMode; } + + /** Get the FusionDistanceValue. Note, only used for USE_FUSION_DISTANCE_VALUE & PROPORTIONAL_TO_SCREEN_DISTANCE modes.*/ + float getFusionDistanceValue() const { return _fusionDistanceValue; } + /** Convinience method for creating slave Cameras and associated GraphicsWindows across all screens.*/ void setUpViewAcrossAllScreens(); @@ -142,6 +155,8 @@ class OSGVIEWER_EXPORT View : public osg::View, public osgGA::GUIActionAdapter EventHandlers _eventHandlers; osg::ref_ptr _displaySettings; + osgUtil::SceneView::FusionDistanceMode _fusionDistanceMode; + float _fusionDistanceValue; }; } diff --git a/src/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index 9f461ff93..31d754763 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -553,6 +553,10 @@ struct CompositeViewerRenderingOperation : public osg::Operation // osg::notify(osg::NOTICE)<<"RenderingOperation"<(_sceneView->getCamera()->getView()); + if (view) _sceneView->setFusionDistance(view->getFusionDistanceMode(), view->getFusionDistanceValue()); + _sceneView->inheritCullSettings(*(_sceneView->getCamera())); _sceneView->cull(); _sceneView->draw(); @@ -1148,7 +1152,13 @@ void CompositeViewer::updateTraversal() ++vitr) { View* view = vitr->get(); - if (view->getCameraManipulator()) view->getCamera()->setViewMatrix( view->getCameraManipulator()->getInverseMatrix()); + if (view->getCameraManipulator()) + { + view->setFusionDistance( view->getCameraManipulator()->getFusionDistanceMode(), + view->getCameraManipulator()->getFusionDistanceValue() ); + + view->getCamera()->setViewMatrix( view->getCameraManipulator()->getInverseMatrix()); + } view->updateSlaves(); } diff --git a/src/osgViewer/View.cpp b/src/osgViewer/View.cpp index 6f5ce3dee..3510ad976 100644 --- a/src/osgViewer/View.cpp +++ b/src/osgViewer/View.cpp @@ -20,7 +20,9 @@ using namespace osgViewer; -View::View() +View::View(): + _fusionDistanceMode(osgUtil::SceneView::PROPORTIONAL_TO_SCREEN_DISTANCE), + _fusionDistanceValue(1.0f) { // osg::notify(osg::NOTICE)<<"Constructing osgViewer::View"<tick(); + // pass on the fusion distance settings from the View to the SceneView + osgViewer::View* view = dynamic_cast(_sceneView->getCamera()->getView()); + if (view) _sceneView->setFusionDistance(view->getFusionDistanceMode(), view->getFusionDistanceValue()); + _sceneView->inheritCullSettings(*(_sceneView->getCamera())); _sceneView->cull(); @@ -305,6 +309,10 @@ struct ViewerDoubleBufferedRenderingOperation : public osg::Operation, public Vi if (sceneView) { // osg::notify(osg::NOTICE)<<"Culling buffer "<<_currentCull<(sceneView->getCamera()->getView()); + if (view) sceneView->setFusionDistance(view->getFusionDistanceMode(), view->getFusionDistanceValue()); osg::Stats* stats = sceneView->getCamera()->getStats(); osg::State* state = sceneView->getState(); @@ -456,6 +464,10 @@ struct ViewerDoubleBufferedRenderingOperation : public osg::Operation, public Vi // osg::notify(osg::NOTICE)<<"RenderingOperation"<(sceneView->getCamera()->getView()); + if (view) sceneView->setFusionDistance(view->getFusionDistanceMode(), view->getFusionDistanceValue()); + osg::Stats* stats = sceneView->getCamera()->getStats(); osg::State* state = sceneView->getState(); const osg::FrameStamp* fs = state->getFrameStamp(); @@ -2043,6 +2055,9 @@ void Viewer::updateTraversal() if (_cameraManipulator.valid()) { + setFusionDistance( getCameraManipulator()->getFusionDistanceMode(), + getCameraManipulator()->getFusionDistanceValue() ); + _camera->setViewMatrix(_cameraManipulator->getInverseMatrix()); }