From 68384e984bc2af3e5a0f7ef16882ea9885c7a86e Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 19 Sep 2002 09:52:50 +0000 Subject: [PATCH] Made the calls to the drawing of the pre rendering stages exclit, using a seperate method in RenderStage and associated calls in sceneView.cpp. This fixes problems when doing stereo and prerender at the same time. --- include/osgUtil/RenderStage | 2 + include/osgUtil/SceneView | 1 - src/osgUtil/RenderStage.cpp | 17 ++++---- src/osgUtil/SceneView.cpp | 81 +++++++++++++++++-------------------- 4 files changed, 48 insertions(+), 53 deletions(-) diff --git a/include/osgUtil/RenderStage b/include/osgUtil/RenderStage index 5a4eab33b..813ec4c74 100644 --- a/include/osgUtil/RenderStage +++ b/include/osgUtil/RenderStage @@ -108,6 +108,8 @@ class OSGUTIL_EXPORT RenderStage : public RenderBin getRenderStageLighting()->addPositionedAttribute(matrix,attr); } + virtual void drawPreRenderStages(osg::State& state,RenderLeaf*& previous); + virtual void draw(osg::State& state,RenderLeaf*& previous); void addToDependencyList(RenderStage* rs); diff --git a/include/osgUtil/SceneView b/include/osgUtil/SceneView index ff2b1811f..6f80c4008 100644 --- a/include/osgUtil/SceneView +++ b/include/osgUtil/SceneView @@ -281,7 +281,6 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced /** Do cull traversal of attached scene graph using Cull NodeVisitor.*/ virtual void cullStage(osg::Matrix* projection,osg::Matrix* modelview,osgUtil::CullVisitor* cullVisitor, osgUtil::RenderGraph* rendergraph, osgUtil::RenderStage* renderStage); - virtual void drawStage(osgUtil::RenderStage* renderStage); const osg::Matrix computeMVPW() const; diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index 499fc0683..388738035 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -65,6 +65,16 @@ void RenderStage::addToDependencyList(RenderStage* rs) if (rs) _dependencyList.push_back(rs); } +void RenderStage::drawPreRenderStages(osg::State& state,RenderLeaf*& previous) +{ + for(DependencyList::iterator itr=_dependencyList.begin(); + itr!=_dependencyList.end(); + ++itr) + { + (*itr)->draw(state,previous); + } +} + void RenderStage::draw(osg::State& state,RenderLeaf*& previous) { if (_stageDrawnThisFrame) return; @@ -76,13 +86,6 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous) } _stageDrawnThisFrame = true; - - for(DependencyList::iterator itr=_dependencyList.begin(); - itr!=_dependencyList.end(); - ++itr) - { - (*itr)->draw(state,previous); - } // set up the back buffer. state.applyAttribute(_viewport.get()); diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index 18e88ae60..cd71a6083 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -471,6 +471,14 @@ void SceneView::cullStage(osg::Matrix* projection,osg::Matrix* modelview,osgUtil void SceneView::draw() { + // note, to support multi-pipe systems the deletion of OpenGL display list + // and texture objects is deferred until the OpenGL context is the correct + // context for when the object were originally created. Here we know what + // context we are in so can flush the appropriate caches. + osg::Drawable::flushDeletedDisplayLists(_state->getContextID()); + osg::Texture::flushDeletedTextureObjects(_state->getContextID()); + + RenderLeaf* previous = NULL; if (_displaySettings.valid() && _displaySettings->getStereo()) { @@ -481,12 +489,14 @@ void SceneView::draw() _globalState->setAttribute(_viewport.get()); - glDrawBuffer(GL_BACK_LEFT); - drawStage(_renderStageLeft.get()); + _renderStageLeft->drawPreRenderStages(*_state,previous); + _renderStageRight->drawPreRenderStages(*_state,previous); + glDrawBuffer(GL_BACK_LEFT); + _renderStageLeft->draw(*_state,previous); glDrawBuffer(GL_BACK_RIGHT); - drawStage(_renderStageRight.get()); + _renderStageRight->draw(*_state,previous); } break; @@ -495,24 +505,30 @@ void SceneView::draw() _globalState->setAttribute(_viewport.get()); + _renderStageLeft->drawPreRenderStages(*_state,previous); + _renderStageRight->drawPreRenderStages(*_state,previous); + // draw left eye. osg::ref_ptr red = osgNew osg::ColorMask; red->setMask(true,false,false,true); _globalState->setAttribute(red.get()); _renderStageLeft->setColorMask(red.get()); - drawStage(_renderStageLeft.get()); + _renderStageLeft->draw(*_state,previous); // draw right eye. osg::ref_ptr green = osgNew osg::ColorMask; green->setMask(false,true,true,true); _globalState->setAttribute(green.get()); _renderStageRight->setColorMask(green.get()); - drawStage(_renderStageRight.get()); + _renderStageRight->draw(*_state,previous); } break; case(osg::DisplaySettings::HORIZONTAL_SPLIT): { + _renderStageLeft->drawPreRenderStages(*_state,previous); + _renderStageRight->drawPreRenderStages(*_state,previous); + int separation = _displaySettings->getSplitStereoHorizontalSeparation(); int left_half_width = (_viewport->width()-separation)/2; @@ -532,21 +548,21 @@ void SceneView::draw() { _globalState->setAttribute(viewportLeft.get()); _renderStageLeft->setViewport(viewportLeft.get()); - drawStage(_renderStageLeft.get()); + _renderStageLeft->draw(*_state,previous); _globalState->setAttribute(viewportRight.get()); _renderStageRight->setViewport(viewportRight.get()); - drawStage(_renderStageRight.get()); + _renderStageRight->draw(*_state,previous); } else { _globalState->setAttribute(viewportRight.get()); _renderStageLeft->setViewport(viewportRight.get()); - drawStage(_renderStageLeft.get()); + _renderStageLeft->draw(*_state,previous); _globalState->setAttribute(viewportLeft.get()); _renderStageRight->setViewport(viewportLeft.get()); - drawStage(_renderStageRight.get()); + _renderStageRight->draw(*_state,previous); } } @@ -554,6 +570,9 @@ void SceneView::draw() case(osg::DisplaySettings::VERTICAL_SPLIT): { + _renderStageLeft->drawPreRenderStages(*_state,previous); + _renderStageRight->drawPreRenderStages(*_state,previous); + int separation = _displaySettings->getSplitStereoVerticalSeparation(); int bottom_half_height = (_viewport->height()-separation)/2; @@ -572,21 +591,21 @@ void SceneView::draw() { _globalState->setAttribute(viewportTop.get()); _renderStageLeft->setViewport(viewportTop.get()); - drawStage(_renderStageLeft.get()); + _renderStageLeft->draw(*_state,previous); _globalState->setAttribute(viewportBottom.get()); _renderStageRight->setViewport(viewportBottom.get()); - drawStage(_renderStageRight.get()); + _renderStageRight->draw(*_state,previous); } else { _globalState->setAttribute(viewportBottom.get()); _renderStageLeft->setViewport(viewportBottom.get()); - drawStage(_renderStageLeft.get()); + _renderStageLeft->draw(*_state,previous); _globalState->setAttribute(viewportTop.get()); _renderStageRight->setViewport(viewportTop.get()); - drawStage(_renderStageRight.get()); + _renderStageRight->draw(*_state,previous); } } break; @@ -594,7 +613,8 @@ void SceneView::draw() { osg::notify(osg::NOTICE)<<"Warning: stereo camera mode not implemented yet."<< std::endl; _globalState->setAttribute(_viewport.get()); - drawStage(_renderStageLeft.get()); + _renderStageLeft->drawPreRenderStages(*_state,previous); + _renderStageLeft->draw(*_state,previous); } break; } @@ -607,46 +627,17 @@ void SceneView::draw() _globalState->setAttribute(cmask.get()); // bog standard draw. - drawStage(_renderStage.get()); + _renderStage->drawPreRenderStages(*_state,previous); + _renderStage->draw(*_state,previous); } -// const osg::Polytope& polytope = _state->getViewFrustum(); -// const osg::Polytope::PlaneList& pl = polytope.getPlaneList(); -// std::cout <<"draw frustum"<valid()) return; - - - // note, to support multi-pipe systems the deletion of OpenGL display list - // and texture objects is deferred until the OpenGL context is the correct - // context for when the object were originally created. Here we know what - // context we are in so can flush the appropriate caches. - osg::Drawable::flushDeletedDisplayLists(_state->getContextID()); - osg::Texture::flushDeletedTextureObjects(_state->getContextID()); - - RenderLeaf* previous = NULL; - - renderStage->draw(*_state,previous); - GLenum errorNo = glGetError(); if (errorNo!=GL_NO_ERROR) { osg::notify(WARN)<<"Warning: detected OpenGL error '"<