From c92b7308177639f00de57e8271a6679fab1a0404 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 4 Dec 2001 12:31:10 +0000 Subject: [PATCH] Improved support for anaglyphic stereo. Integrated texture CLAMP_TO_EDGE, submitted by Ulrich Hertlein. --- src/Demos/osgtexture/osgtexture.cpp | 16 ++++++++++ src/Demos/sgv/sgv.cpp | 3 ++ src/osg/Camera.cpp | 9 +----- src/osg/Texture.cpp | 42 ++++++++++++++------------ src/osgPlugins/osg/Texture.cpp | 2 ++ src/osgPlugins/pfb/ReaderWriterPFB.cpp | 3 ++ src/osgUtil/SceneView.cpp | 23 +++++++++----- 7 files changed, 62 insertions(+), 36 deletions(-) diff --git a/src/Demos/osgtexture/osgtexture.cpp b/src/Demos/osgtexture/osgtexture.cpp index 949318a27..045eeca81 100644 --- a/src/Demos/osgtexture/osgtexture.cpp +++ b/src/Demos/osgtexture/osgtexture.cpp @@ -254,6 +254,22 @@ osg::Node* createLayer(const osg::Vec3& offset,osg::Image* image,osg::Node* geom } + // clamp-to-edge mode. + { + // create the texture attribute + osg::Texture* texture = new osg::Texture; + texture->setImage(image); + + texture->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE); + texture->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE); + + // add the transform node to root group node. + top_transform->addChild(createTexturedItem(local_offset,texture,geometryRep)); + + local_offset += local_delta; + + } + // repeat wrap mode. { // create the texture attribute diff --git a/src/Demos/sgv/sgv.cpp b/src/Demos/sgv/sgv.cpp index d2c627832..f5a14edc4 100644 --- a/src/Demos/sgv/sgv.cpp +++ b/src/Demos/sgv/sgv.cpp @@ -148,6 +148,9 @@ int main( int argc, char **argv ) // initialize the viewer. osgGLUT::Viewer viewer; viewer.addViewport( rootnode ); + + osgUtil::SceneView* sceneview = viewer.getViewportSceneView(0); + sceneview->setStereoMode(osgUtil::SceneView::ANAGLYPHIC_STEREO); // register trackball, flight and drive. viewer.registerCameraManipulator(new osgUtil::TrackballManipulator); diff --git a/src/osg/Camera.cpp b/src/osg/Camera.cpp index 63e30f367..2e0fd2457 100644 --- a/src/osg/Camera.cpp +++ b/src/osg/Camera.cpp @@ -597,7 +597,6 @@ void Camera::calculateMatricesAndClippingVolume() const float dx = -_eyeOffset.x()*(1.0f/_screenDistance); left += dx; right += dx; - cout << "dx="<getRequiresClear()) { _renderStage->setClearColor(earthSky->getClearColor()); + _renderStage->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // really should set clear mask here, but what to? Need // to consider the stencil and accumulation buffers.. // will defer to later. Robert Osfield. October 2001. @@ -302,44 +303,50 @@ void SceneView::draw() { osg::ref_ptr left_camera = new osg::Camera(*_camera); osg::ref_ptr right_camera = new osg::Camera(*_camera); - float screenDistance = 3.5f; float iod = 0.05; - left_camera->adjustEyeOffsetForStereo(osg::Vec3(-iod*0.5,0.0f,0.0f),screenDistance); - right_camera->adjustEyeOffsetForStereo(osg::Vec3(iod*0.5,0.0f,0.0f),screenDistance); + left_camera->adjustEyeOffsetForStereo(osg::Vec3(-iod*0.5,0.0f,0.0f),_screenDistance); + right_camera->adjustEyeOffsetForStereo(osg::Vec3(iod*0.5,0.0f,0.0f),_screenDistance); - cout << "draw"<setCamera(left_camera.get()); _renderStage->draw(*_state,previous); - cout << " back right"<setCamera(right_camera.get()); _renderStage->_stageDrawnThisFrame = false; _renderStage->draw(*_state,previous); } break; - case(RED_GREEN_STEREO): + case(ANAGLYPHIC_STEREO): { + osg::ref_ptr left_camera = new osg::Camera(*_camera); + osg::ref_ptr right_camera = new osg::Camera(*_camera); + float iod = 0.05; + + left_camera->adjustEyeOffsetForStereo(osg::Vec3(-iod*0.5,0.0f,0.0f),_screenDistance); + right_camera->adjustEyeOffsetForStereo(osg::Vec3(iod*0.5,0.0f,0.0f),_screenDistance); + osg::ColorMask* red = new osg::ColorMask; osg::ColorMask* green = new osg::ColorMask; red->setMask(true,false,false,true); _renderStage->setColorMask(red); + _renderStage->setCamera(left_camera.get()); _renderStage->draw(*_state,previous); - green->setMask(false,true,false,true); + green->setMask(false,true,true,true); _renderStage->setColorMask(green); _renderStage->_stageDrawnThisFrame = false; + _renderStage->setCamera(right_camera.get()); _renderStage->draw(*_state,previous); } break; default: { + osg::notify(osg::NOTICE)<<"Warning: stereo camera mode not implemented yet."<draw(*_state,previous); } break;