diff --git a/NEWS b/NEWS index 5bac6e68d..8bf72c338 100644 --- a/NEWS +++ b/NEWS @@ -7,7 +7,8 @@ OSG News (most significant items from ChangeLog) >>> Support added for Solaris, texture cube mapping & muliple projections. The OpenSceneGraph now has new Makefile systems which supports all Unix - compilation including the new addition to the family - Solaris! + compilation including the new addition to the family - Solaris! Thanks + to Sun Microsystems for providing the hardware to do the port. Support has also been added for OpenGL's texture cube mapping which is ideal for accurate environmental reflections and much more. diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index 33ecf38de..eb00099cf 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -1041,6 +1041,8 @@ ImpostorSprite* CullVisitor::createImpostorSprite(Impostor& node) Viewport* new_viewport = osgNew Viewport; new_viewport->setViewport(center_x-new_s/2,center_y-new_t/2,new_s,new_t); rtts->setViewport(new_viewport); + + dummyState->setAttribute(new_viewport); // create the impostor sprite. diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index 5f5e492fd..997ffdc5f 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -43,6 +43,7 @@ void RenderStage::addToDependencyList(RenderStage* rs) { if (rs) _dependencyList.push_back(rs); } + void RenderStage::draw(osg::State& state,RenderLeaf*& previous) { if (_stageDrawnThisFrame) return; @@ -63,9 +64,7 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous) } // set up the back buffer. - - //state.applyAttribute(_viewport.get()); - _viewport->apply(state); + state.applyAttribute(_viewport.get()); #define USE_SISSOR_TEST #ifdef USE_SISSOR_TEST diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index 09d33bf45..588de76e8 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -434,6 +434,8 @@ void SceneView::draw() case(osg::DisplaySettings::QUAD_BUFFER): { + _globalState->setAttribute(_viewport.get()); + glDrawBuffer(GL_BACK_LEFT); drawStage(_renderStageLeft.get()); @@ -446,6 +448,8 @@ void SceneView::draw() case(osg::DisplaySettings::ANAGLYPHIC): { + _globalState->setAttribute(_viewport.get()); + // draw left eye. osg::ref_ptr red = osgNew osg::ColorMask; red->setMask(true,false,false,true); @@ -481,17 +485,21 @@ void SceneView::draw() if (_displaySettings->getSplitStereoHorizontalEyeMapping()==osg::DisplaySettings::LEFT_EYE_LEFT_VIEWPORT) { + _globalState->setAttribute(viewportLeft.get()); _renderStageLeft->setViewport(viewportLeft.get()); drawStage(_renderStageLeft.get()); + _globalState->setAttribute(viewportRight.get()); _renderStageRight->setViewport(viewportRight.get()); drawStage(_renderStageRight.get()); } else { + _globalState->setAttribute(viewportRight.get()); _renderStageLeft->setViewport(viewportRight.get()); drawStage(_renderStageLeft.get()); + _globalState->setAttribute(viewportLeft.get()); _renderStageRight->setViewport(viewportLeft.get()); drawStage(_renderStageRight.get()); } @@ -517,17 +525,21 @@ void SceneView::draw() if (_displaySettings->getSplitStereoVerticalEyeMapping()==osg::DisplaySettings::LEFT_EYE_TOP_VIEWPORT) { + _globalState->setAttribute(viewportTop.get()); _renderStageLeft->setViewport(viewportTop.get()); drawStage(_renderStageLeft.get()); + _globalState->setAttribute(viewportBottom.get()); _renderStageRight->setViewport(viewportBottom.get()); drawStage(_renderStageRight.get()); } else { + _globalState->setAttribute(viewportBottom.get()); _renderStageLeft->setViewport(viewportBottom.get()); drawStage(_renderStageLeft.get()); + _globalState->setAttribute(viewportTop.get()); _renderStageRight->setViewport(viewportTop.get()); drawStage(_renderStageRight.get()); } @@ -543,6 +555,8 @@ void SceneView::draw() } else { + _globalState->setAttribute(_viewport.get()); + // bog standard draw. drawStage(_renderStage.get()); } @@ -643,7 +657,7 @@ void SceneView::clearArea(int x,int y,int width,int height,const osg::Vec4& colo osg::ref_ptr viewport = osgNew osg::Viewport; viewport->setViewport(x,y,width,height); - viewport->apply(*_state); + _state->applyAttribute(viewport.get()); glScissor( x, y, width, height ); glEnable( GL_SCISSOR_TEST );