diff --git a/include/osg/Camera b/include/osg/Camera index 596dc0623..25dd56dee 100644 --- a/include/osg/Camera +++ b/include/osg/Camera @@ -71,6 +71,16 @@ class OSG_EXPORT Camera : public Transform, public CullSettings bool getAllowEventFocus() const { return _allowEventFocus; } + /** Set the DsplaySettings object associated with this view.*/ + void setDisplaySettings(osg::DisplaySettings* ds) { _displaySettings = ds; } + + /** Set the DsplaySettings object associated with this view.*/ + osg::DisplaySettings* getDisplaySettings() { return _displaySettings.get(); } + + /** Set the DsplaySettings object associated with this view.*/ + const osg::DisplaySettings* getDisplaySettings() const { return _displaySettings.get(); } + + /** Sets the clear color. */ inline void setClearColor(const Vec4& color) { _clearColor = color; } @@ -425,35 +435,37 @@ class OSG_EXPORT Camera : public Transform, public CullSettings virtual ~Camera(); - mutable OpenThreads::Mutex _dataChangeMutex; + mutable OpenThreads::Mutex _dataChangeMutex; - View* _view; + View* _view; - osg::ref_ptr _stats; + osg::ref_ptr _stats; - bool _allowEventFocus; + bool _allowEventFocus; - Vec4 _clearColor; - GLbitfield _clearMask; - ref_ptr _colorMask; - ref_ptr _viewport; + osg::ref_ptr _displaySettings; - TransformOrder _transformOrder; - ProjectionResizePolicy _projectionResizePolicy; + Vec4 _clearColor; + GLbitfield _clearMask; + ref_ptr _colorMask; + ref_ptr _viewport; - Matrixd _projectionMatrix; - Matrixd _viewMatrix; + TransformOrder _transformOrder; + ProjectionResizePolicy _projectionResizePolicy; + + Matrixd _projectionMatrix; + Matrixd _viewMatrix; - RenderOrder _renderOrder; - int _renderOrderNum; + RenderOrder _renderOrder; + int _renderOrderNum; - GLenum _drawBuffer; - GLenum _readBuffer; + GLenum _drawBuffer; + GLenum _readBuffer; - RenderTargetImplementation _renderTargetImplementation; - RenderTargetImplementation _renderTargetFallback; - BufferAttachmentMap _bufferAttachmentMap; + RenderTargetImplementation _renderTargetImplementation; + RenderTargetImplementation _renderTargetFallback; + BufferAttachmentMap _bufferAttachmentMap; ref_ptr _cameraThread; diff --git a/src/osg/Camera.cpp b/src/osg/Camera.cpp index 4f8f1d062..58d400ec9 100644 --- a/src/osg/Camera.cpp +++ b/src/osg/Camera.cpp @@ -38,6 +38,7 @@ Camera::Camera(const Camera& camera,const CopyOp& copyop): _view(camera._view), _allowEventFocus(camera._allowEventFocus), _clearColor(camera._clearColor), + _displaySettings(camera._displaySettings), _clearMask(camera._clearMask), _colorMask(camera._colorMask), _viewport(camera._viewport), diff --git a/src/osg/View.cpp b/src/osg/View.cpp index ef5fe107b..80fde1937 100644 --- a/src/osg/View.cpp +++ b/src/osg/View.cpp @@ -24,7 +24,18 @@ View::View() setCamera(new osg::Camera); +#if 1 + double height = osg::DisplaySettings::instance()->getScreenHeight(); + double width = osg::DisplaySettings::instance()->getScreenWidth(); + double distance = osg::DisplaySettings::instance()->getScreenWidth(); + + double vfov = osg::RadiansToDegrees(atan2(height/2.0f,distance)*2.0); + + _camera->setProjectionMatrixAsPerspective( vfov, width/height, 1.0f,10000.0f); +#else _camera->setProjectionMatrixAsFrustum(-0.325, 0.325, -0.26, 0.26, 1.0f,10000.0f); +#endif + _camera->setClearColor(osg::Vec4f(0.2f, 0.2f, 0.4f, 1.0f)); osg::StateSet* stateset = _camera->getOrCreateStateSet(); diff --git a/src/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index 7fa7696df..d4453392a 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -632,7 +632,7 @@ void CompositeViewer::setUpRenderingSupport() sceneView->setGlobalStateSet(view ? view->getCamera()->getStateSet() : 0); sceneView->setDefaults(); - sceneView->setDisplaySettings(ds); + sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds); sceneView->setCamera(camera); sceneView->setState(state); sceneView->setFrameStamp(frameStamp); @@ -677,7 +677,7 @@ void CompositeViewer::setUpRenderingSupport() sceneView->setGlobalStateSet(view->getCamera()->getStateSet()); sceneView->setDefaults(); - sceneView->setDisplaySettings(ds); + sceneView->setDisplaySettings(view->getCamera()->getDisplaySettings()!=0 ? view->getCamera()->getDisplaySettings() : ds); sceneView->setCamera(view->getCamera()); sceneView->setState(view->getCamera()->getGraphicsContext()->getState()); sceneView->setSceneData(view->getSceneData()); @@ -699,7 +699,7 @@ void CompositeViewer::setUpRenderingSupport() sceneView->setGlobalStateSet(view->getCamera()->getStateSet()); sceneView->setDefaults(); sceneView->setCamera(slave._camera.get()); - sceneView->setDisplaySettings(ds); + sceneView->setDisplaySettings(slave._camera->getDisplaySettings()!=0 ? slave._camera->getDisplaySettings() : ds); sceneView->setState(slave._camera->getGraphicsContext()->getState()); sceneView->setSceneData(view->getSceneData()); sceneView->setFrameStamp(frameStamp); diff --git a/src/osgViewer/View.cpp b/src/osgViewer/View.cpp index 4c42b0832..c5af967b6 100644 --- a/src/osgViewer/View.cpp +++ b/src/osgViewer/View.cpp @@ -316,6 +316,10 @@ void View::setUpViewAcrossAllScreens() wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(i), width, height); translate_x += double(width) / (double(height) * aspectRatio); } + + bool stereoSlitScreens = numScreens==2 && + ds->getStereoMode()==osg::DisplaySettings::HORIZONTAL_SPLIT && + ds->getStereo(); for(unsigned int i=0; isharedContext = 0; traits->sampleBuffers = ds->getMultiSamples(); traits->samples = ds->getNumMultiSamples(); - if (ds->getStereo() && (ds->getStereoMode() == osg::DisplaySettings::QUAD_BUFFER)) { + + if (ds->getStereo() && (ds->getStereoMode() == osg::DisplaySettings::QUAD_BUFFER)) + { traits->quadBufferStereo = true; } @@ -362,11 +368,24 @@ void View::setUpViewAcrossAllScreens() camera->setDrawBuffer(buffer); camera->setReadBuffer(buffer); - double newAspectRatio = double(traits->width) / double(traits->height); - double aspectRatioChange = newAspectRatio / aspectRatio; + if (stereoSlitScreens) + { + unsigned int leftCameraNum = (ds->getSplitStereoHorizontalEyeMapping()==osg::DisplaySettings::LEFT_EYE_LEFT_VIEWPORT) ? 0 : 1; + + osg::ref_ptr ds_local = new osg::DisplaySettings(*ds); + ds_local->setStereoMode(leftCameraNum==i ? osg::DisplaySettings::LEFT_EYE : osg::DisplaySettings::RIGHT_EYE); + camera->setDisplaySettings(ds_local.get()); + + addSlave(camera.get(), osg::Matrixd(), osg::Matrixd() ); + } + else + { + double newAspectRatio = double(traits->width) / double(traits->height); + double aspectRatioChange = newAspectRatio / aspectRatio; - addSlave(camera.get(), osg::Matrixd::translate( translate_x - aspectRatioChange, 0.0, 0.0) * osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0), osg::Matrixd() ); - translate_x -= aspectRatioChange * 2.0; + addSlave(camera.get(), osg::Matrixd::translate( translate_x - aspectRatioChange, 0.0, 0.0) * osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0), osg::Matrixd() ); + translate_x -= aspectRatioChange * 2.0; + } } } diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index 835106641..e0e7721a3 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -1560,7 +1560,7 @@ void Viewer::setUpRenderingSupport() sceneView->setGlobalStateSet(_camera->getStateSet()); sceneView->setDefaults(sceneViewOptions); - sceneView->setDisplaySettings(ds); + sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds); sceneView->setCamera(camera); sceneView->setState(state); sceneView->setFrameStamp(frameStamp); @@ -1584,6 +1584,7 @@ void Viewer::setUpRenderingSupport() sceneView->setDefaults(sceneViewOptions); sceneView->setDisplaySettings(ds); sceneView->setCamera(camera); + sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds); sceneView->setState(state); sceneView->setFrameStamp(frameStamp); @@ -1619,7 +1620,7 @@ void Viewer::setUpRenderingSupport() sceneView->setGlobalStateSet(_camera->getStateSet()); sceneView->setDefaults(sceneViewOptions); - sceneView->setDisplaySettings(ds); + sceneView->setDisplaySettings(camera->getDisplaySettings()!=0 ? camera->getDisplaySettings() : ds); sceneView->setCamera(camera); sceneView->setState(state); sceneView->setFrameStamp(frameStamp);