From 7b9b13b6c089d297d818d41686f316ed7e563a2a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 30 Jan 2007 09:55:34 +0000 Subject: [PATCH] Added support for per frame alternating the direction that SORT_BY_STATE bins are rendered. The alternation makes it more likely that OpenGL objects will still be in video ram. --- src/osgUtil/RenderBin.cpp | 42 +++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/osgUtil/RenderBin.cpp b/src/osgUtil/RenderBin.cpp index 079ced12d..99189222c 100644 --- a/src/osgUtil/RenderBin.cpp +++ b/src/osgUtil/RenderBin.cpp @@ -409,23 +409,45 @@ void RenderBin::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& prev } + bool draw_forward = (_sortMode!=SORT_BY_STATE) || (state.getFrameStamp()->getFrameNumber() % 2)==0; + // draw coarse grained ordering. - for(StateGraphList::iterator oitr=_stateGraphList.begin(); - oitr!=_stateGraphList.end(); - ++oitr) + if (draw_forward) { - - for(StateGraph::LeafList::iterator dw_itr = (*oitr)->_leaves.begin(); - dw_itr != (*oitr)->_leaves.end(); - ++dw_itr) + for(StateGraphList::iterator oitr=_stateGraphList.begin(); + oitr!=_stateGraphList.end(); + ++oitr) { - RenderLeaf* rl = dw_itr->get(); - rl->render(renderInfo,previous); - previous = rl; + for(StateGraph::LeafList::iterator dw_itr = (*oitr)->_leaves.begin(); + dw_itr != (*oitr)->_leaves.end(); + ++dw_itr) + { + RenderLeaf* rl = dw_itr->get(); + rl->render(renderInfo,previous); + previous = rl; + + } } } + else + { + for(StateGraphList::reverse_iterator oitr=_stateGraphList.rbegin(); + oitr!=_stateGraphList.rend(); + ++oitr) + { + for(StateGraph::LeafList::iterator dw_itr = (*oitr)->_leaves.begin(); + dw_itr != (*oitr)->_leaves.end(); + ++dw_itr) + { + RenderLeaf* rl = dw_itr->get(); + rl->render(renderInfo,previous); + previous = rl; + + } + } + } // draw post bins. for(;