From 8a737dd2cad7f482f70ddf92baf368a55e3869b7 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 8 Aug 2003 00:36:51 +0000 Subject: [PATCH] Added support for clampping the near and far values in othrographic projection. Fixed the handling of anaglyphic/stereo state in SceneView::draw(). --- src/osgUtil/CullVisitor.cpp | 24 ++++++++- src/osgUtil/SceneView.cpp | 105 +++++++++++++++++++++++++++++++++--- 2 files changed, 119 insertions(+), 10 deletions(-) diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index ca12efa34..cc6149596 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -179,16 +179,36 @@ void CullVisitor::popProjectionMatrix() if (projection(0,3)==0.0f && projection(1,3)==0.0f && projection(2,3)==0.0f) { - //cout << "Orthographic projection "<setAttribute(_viewport.get()); + // ensure that all color planes are active. + osg::ColorMask* cmask = static_cast(_localStateSet->getAttribute(osg::StateAttribute::COLORMASK)); + if (cmask) + { + cmask->setMask(true,true,true,true); + } + else + { + cmask = new osg::ColorMask(true,true,true,true); + _localStateSet->setAttribute(cmask); + } + _renderStageLeft->setColorMask(cmask); + _renderStageRight->setColorMask(cmask); + _renderStageLeft->drawPreRenderStages(*_state,previous); _renderStageRight->drawPreRenderStages(*_state,previous); @@ -585,13 +599,36 @@ void SceneView::draw() _renderStageLeft->drawPreRenderStages(*_state,previous); _renderStageRight->drawPreRenderStages(*_state,previous); - // draw left eye. - osg::ref_ptr red = new osg::ColorMask; - red->setMask(true,false,false,true); - _localStateSet->setAttribute(red.get()); - _renderStageLeft->setColorMask(red.get()); + + // ensure that all color planes are active. + osg::ColorMask* red = _renderStageLeft->getColorMask(); + if (red) + { + red->setMask(true,false,false,true); + } + else + { + red = new osg::ColorMask(true,false,false,true); + } + _localStateSet->setAttribute(red); + _renderStageLeft->setColorMask(red); + + // draw left eye. _renderStageLeft->draw(*_state,previous); + // ensure that all color planes are active. + osg::ColorMask* cyan = _renderStageLeft->getColorMask(); + if (cyan) + { + cyan->setMask(false,true,true,true); + } + else + { + cyan = new osg::ColorMask(false,true,true,true); + } + _localStateSet->setAttribute(cyan); + _renderStageRight->setColorMask(cyan); + // draw right eye. osg::ref_ptr green = new osg::ColorMask; green->setMask(false,true,true,true); @@ -603,6 +640,20 @@ void SceneView::draw() break; case(osg::DisplaySettings::HORIZONTAL_SPLIT): { + // ensure that all color planes are active. + osg::ColorMask* cmask = static_cast(_localStateSet->getAttribute(osg::StateAttribute::COLORMASK)); + if (cmask) + { + cmask->setMask(true,true,true,true); + } + else + { + cmask = new osg::ColorMask(true,true,true,true); + _localStateSet->setAttribute(cmask); + } + _renderStageLeft->setColorMask(cmask); + _renderStageRight->setColorMask(cmask); + _renderStageLeft->drawPreRenderStages(*_state,previous); _renderStageRight->drawPreRenderStages(*_state,previous); @@ -646,7 +697,20 @@ void SceneView::draw() break; case(osg::DisplaySettings::VERTICAL_SPLIT): { + // ensure that all color planes are active. + osg::ColorMask* cmask = static_cast(_localStateSet->getAttribute(osg::StateAttribute::COLORMASK)); + if (cmask) + { + cmask->setMask(true,true,true,true); + } + else + { + cmask = new osg::ColorMask(true,true,true,true); + _localStateSet->setAttribute(cmask); + } + _renderStageLeft->setColorMask(cmask); + _renderStageRight->setColorMask(cmask); _renderStageLeft->drawPreRenderStages(*_state,previous); _renderStageRight->drawPreRenderStages(*_state,previous); @@ -689,6 +753,20 @@ void SceneView::draw() case(osg::DisplaySettings::RIGHT_EYE): case(osg::DisplaySettings::LEFT_EYE): { + // ensure that all color planes are active. + osg::ColorMask* cmask = static_cast(_localStateSet->getAttribute(osg::StateAttribute::COLORMASK)); + if (cmask) + { + cmask->setMask(true,true,true,true); + } + else + { + cmask = new osg::ColorMask(true,true,true,true); + _localStateSet->setAttribute(cmask); + } + _renderStage->setColorMask(cmask); + _renderStage->setColorMask(cmask); + _localStateSet->setAttribute(_viewport.get()); _renderStage->drawPreRenderStages(*_state,previous); _renderStage->draw(*_state,previous); @@ -708,9 +786,20 @@ void SceneView::draw() glDrawBuffer(GL_BACK); _localStateSet->setAttribute(_viewport.get()); - osg::ref_ptr cmask = new osg::ColorMask; - cmask->setMask(true,true,true,true); - _localStateSet->setAttribute(cmask.get()); + + + // ensure that all color planes are active. + osg::ColorMask* cmask = static_cast(_localStateSet->getAttribute(osg::StateAttribute::COLORMASK)); + if (cmask) + { + cmask->setMask(true,true,true,true); + } + else + { + cmask = new osg::ColorMask(true,true,true,true); + _localStateSet->setAttribute(cmask); + } + _renderStage->setColorMask(cmask); // bog standard draw. _renderStage->drawPreRenderStages(*_state,previous);