Added support for RenderBin::SortMode::TRAVERSAL_ORDER to enable rendering of scene graph drawables in the order that they were traversed in.

This commit is contained in:
Robert Osfield
2009-05-27 09:54:17 +00:00
parent f845b6790a
commit 45ec1a163c
5 changed files with 49 additions and 18 deletions

View File

@@ -88,7 +88,6 @@ CullVisitor* CullVisitor::create()
void CullVisitor::reset()
{
//
// first unref all referenced objects and then empty the containers.
//
@@ -99,6 +98,9 @@ void CullVisitor::reset()
_numberOfEncloseOverrideRenderBinDetails = 0;
// reset the traversal number
_traversalNumber = 0;
// reset the calculated near far planes.
_computed_znear = FLT_MAX;
_computed_zfar = -FLT_MAX;

View File

@@ -36,7 +36,9 @@ class RenderBinPrototypeList : public osg::Referenced, public std::map< std::str
// register a RenderStage prototype with the RenderBin prototype list.
RegisterRenderBinProxy s_registerRenderBinProxy("RenderBin",new RenderBin(RenderBin::getDefaultRenderBinSortMode()));
RegisterRenderBinProxy s_registerStateSortedBinProxy("StateSortedBin",new RenderBin(RenderBin::SORT_BY_STATE));
RegisterRenderBinProxy s_registerDepthSortedBinProxy("DepthSortedBin",new RenderBin(RenderBin::SORT_BACK_TO_FRONT));
RegisterRenderBinProxy s_registerTraversalOrderProxy("TraversalOrderBin",new RenderBin(RenderBin::TRAVERSAL_ORDER));
static RenderBinPrototypeList* renderBinPrototypeList()
@@ -122,6 +124,7 @@ RenderBin::SortMode RenderBin::getDefaultRenderBinSortMode()
else if (strcmp(str,"SORT_BY_STATE_THEN_FRONT_TO_BACK")==0) s_defaultBinSortMode = RenderBin::SORT_BY_STATE_THEN_FRONT_TO_BACK;
else if (strcmp(str,"SORT_FRONT_TO_BACK")==0) s_defaultBinSortMode = RenderBin::SORT_FRONT_TO_BACK;
else if (strcmp(str,"SORT_BACK_TO_FRONT")==0) s_defaultBinSortMode = RenderBin::SORT_BACK_TO_FRONT;
else if (strcmp(str,"TRAVERSAL_ORDER")==0) s_defaultBinSortMode = RenderBin::TRAVERSAL_ORDER;
}
}
@@ -231,7 +234,8 @@ void RenderBin::sortImplementation()
case(SORT_BACK_TO_FRONT):
sortBackToFront();
break;
default:
case(TRAVERSAL_ORDER):
sortTraversalOrder();
break;
}
}
@@ -312,6 +316,23 @@ void RenderBin::sortBackToFront()
// cout << "sort back to front"<<endl;
}
struct TraversalOrderFunctor
{
bool operator() (const RenderLeaf* lhs,const RenderLeaf* rhs) const
{
return (lhs->_traversalNumber<rhs->_traversalNumber);
}
};
void RenderBin::sortTraversalOrder()
{
copyLeavesFromStateGraphListToRenderLeafList();
// now sort the list into acending depth order.
std::sort(_renderLeafList.begin(),_renderLeafList.end(),TraversalOrderFunctor());
}
void RenderBin::copyLeavesFromStateGraphListToRenderLeafList()
{
_renderLeafList.clear();