Added _sorted flag into RenderBin to prevent a bin being sorted twice in one frame

This commit is contained in:
Robert Osfield
2007-01-27 12:54:33 +00:00
parent 36330f7e40
commit 5bf2dfe3b1
2 changed files with 14 additions and 9 deletions

View File

@@ -153,7 +153,8 @@ class OSGUTIL_EXPORT RenderBin : public osg::Object
RenderBinList _bins;
StateGraphList _stateGraphList;
RenderLeafList _renderLeafList;
bool _sorted;
SortMode _sortMode;
osg::ref_ptr<SortCallback> _sortCallback;

View File

@@ -120,6 +120,7 @@ RenderBin::RenderBin()
_binNum = 0;
_parent = NULL;
_stage = NULL;
_sorted = false;
_sortMode = getDefaultRenderBinSortMode();
}
@@ -128,6 +129,7 @@ RenderBin::RenderBin(SortMode mode)
_binNum = 0;
_parent = NULL;
_stage = NULL;
_sorted = false;
_sortMode = mode;
#if 1
@@ -154,6 +156,7 @@ RenderBin::RenderBin(const RenderBin& rhs,const CopyOp& copyop):
_bins(rhs._bins),
_stateGraphList(rhs._stateGraphList),
_renderLeafList(rhs._renderLeafList),
_sorted(rhs._sorted),
_sortMode(rhs._sortMode),
_sortCallback(rhs._sortCallback),
_drawCallback(rhs._drawCallback),
@@ -169,11 +172,15 @@ RenderBin::~RenderBin()
void RenderBin::reset()
{
_stateGraphList.clear();
_renderLeafList.clear();
_bins.clear();
_sorted = false;
}
void RenderBin::sort()
{
if (_sorted) return;
for(RenderBinList::iterator itr = _bins.begin();
itr!=_bins.end();
++itr)
@@ -186,6 +193,8 @@ void RenderBin::sort()
_sortCallback->sortImplementation(this);
}
else sortImplementation();
_sorted = true;
}
void RenderBin::setSortMode(SortMode mode)
@@ -292,7 +301,7 @@ void RenderBin::sortBackToFront()
void RenderBin::copyLeavesFromStateGraphListToRenderLeafList()
{
_renderLeafList.clear();
// _renderLeafList.clear();
int totalsize=0;
StateGraphList::iterator itr;
@@ -379,6 +388,7 @@ void RenderBin::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& prev
state.pushStateSet(_stateset.get());
}
// draw first set of draw bins.
RenderBinList::iterator rbitr;
for(rbitr = _bins.begin();
@@ -387,7 +397,6 @@ void RenderBin::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& prev
{
rbitr->second->draw(renderInfo,previous);
}
// draw fine grained ordering.
for(RenderLeafList::iterator rlitr= _renderLeafList.begin();
@@ -433,12 +442,7 @@ void RenderBin::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& prev
previous = 0;
if (_stateset.valid())
{
}
//osg::notify(osg::NOTICE)<<"end RenderBin::drawImplementation "<<className()<<std::endl;
// osg::notify(osg::NOTICE)<<"end RenderBin::drawImplementation "<<className()<<std::endl;
}
// stats