Added support for setting the default render bin sort mode via the
env OSG_DEFAULT_BIN_SORT_MODE variable or via or RenderBin::setDefaultRenderBinSortMode() method.
This commit is contained in:
@@ -38,21 +38,26 @@ class OSGUTIL_EXPORT RenderBin : public osg::Object
|
||||
typedef std::vector<RenderGraph*> RenderGraphList;
|
||||
typedef std::map< int, osg::ref_ptr<RenderBin> > RenderBinList;
|
||||
|
||||
enum SortMode
|
||||
{
|
||||
SORT_BY_STATE,
|
||||
SORT_BY_STATE_THEN_FRONT_TO_BACK,
|
||||
SORT_FRONT_TO_BACK,
|
||||
SORT_BACK_TO_FRONT
|
||||
};
|
||||
|
||||
// static methods.
|
||||
static RenderBin* createRenderBin(const std::string& binName);
|
||||
static RenderBin* getRenderBinPrototype(const std::string& binName);
|
||||
static void addRenderBinPrototype(const std::string& binName,RenderBin* proto);
|
||||
static void removeRenderBinPrototype(RenderBin* proto);
|
||||
|
||||
enum SortMode
|
||||
{
|
||||
SORT_BY_STATE,
|
||||
SORT_FRONT_TO_BACK,
|
||||
SORT_BACK_TO_FRONT
|
||||
};
|
||||
|
||||
static void setDefaultRenderBinSortMode(SortMode mode);
|
||||
static SortMode getDefaultRenderBinSortMode();
|
||||
|
||||
|
||||
RenderBin(SortMode mode=SORT_BY_STATE);
|
||||
|
||||
RenderBin(SortMode mode=getDefaultRenderBinSortMode());
|
||||
|
||||
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/
|
||||
RenderBin(const RenderBin& rhs,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
|
||||
@@ -98,6 +103,7 @@ class OSGUTIL_EXPORT RenderBin : public osg::Object
|
||||
SortMode getSortMode() const { return _sortMode; }
|
||||
|
||||
virtual void sortByState();
|
||||
virtual void sortByStateThenFrontToBack();
|
||||
virtual void sortFrontToBack();
|
||||
virtual void sortBackToFront();
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ class OSGUTIL_EXPORT RenderStage : public RenderBin
|
||||
public:
|
||||
|
||||
|
||||
RenderStage(SortMode mode=SORT_BY_STATE);
|
||||
RenderStage(SortMode mode=getDefaultRenderBinSortMode());
|
||||
|
||||
RenderStage(const RenderStage& rhs,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <osgUtil/Statistics>
|
||||
|
||||
#include <osg/Notify>
|
||||
#include <osg/ApplicationUsage>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
@@ -30,11 +31,11 @@ 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::SORT_BY_STATE));
|
||||
RegisterRenderBinProxy s_registerRenderBinProxy("RenderBin",new RenderBin(RenderBin::getDefaultRenderBinSortMode()));
|
||||
RegisterRenderBinProxy s_registerDepthSortedBinProxy("DepthSortedBin",new RenderBin(RenderBin::SORT_BACK_TO_FRONT));
|
||||
|
||||
|
||||
RenderBinPrototypeList* renderBinPrototypeList()
|
||||
static RenderBinPrototypeList* renderBinPrototypeList()
|
||||
{
|
||||
static osg::ref_ptr<RenderBinPrototypeList> s_renderBinPrototypeList = new RenderBinPrototypeList;
|
||||
return s_renderBinPrototypeList.get();
|
||||
@@ -83,6 +84,36 @@ void RenderBin::removeRenderBinPrototype(RenderBin* proto)
|
||||
}
|
||||
}
|
||||
|
||||
static bool s_defaultBinSortModeInitialized = false;
|
||||
static RenderBin::SortMode s_defaultBinSortMode = RenderBin::SORT_BY_STATE;
|
||||
static osg::ApplicationUsageProxy RenderBin_e0(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_DEFAULT_BIN_SORT_MODE <type>","SORT_BY_STATE | SORT_BY_STATE_THEN_FRONT_TO_BACK | SORT_FRONT_TO_BACK | SORT_BACK_TO_FRONT");
|
||||
|
||||
void RenderBin::setDefaultRenderBinSortMode(RenderBin::SortMode mode)
|
||||
{
|
||||
s_defaultBinSortModeInitialized = true;
|
||||
s_defaultBinSortMode = mode;
|
||||
}
|
||||
|
||||
|
||||
RenderBin::SortMode RenderBin::getDefaultRenderBinSortMode()
|
||||
{
|
||||
if (!s_defaultBinSortModeInitialized)
|
||||
{
|
||||
s_defaultBinSortModeInitialized = true;
|
||||
|
||||
const char* str = getenv("OSG_DEFAULT_BIN_SORT_MODE");
|
||||
if (str)
|
||||
{
|
||||
if (strcmp(str,"SORT_BY_STATE")==0) s_defaultBinSortMode = RenderBin::SORT_BY_STATE;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
return s_defaultBinSortMode;
|
||||
}
|
||||
|
||||
RenderBin::RenderBin(SortMode mode)
|
||||
{
|
||||
_binNum = 0;
|
||||
@@ -144,6 +175,9 @@ void RenderBin::sortImplementation()
|
||||
case(SORT_BY_STATE):
|
||||
sortByState();
|
||||
break;
|
||||
case(SORT_BY_STATE_THEN_FRONT_TO_BACK):
|
||||
sortByStateThenFrontToBack();
|
||||
break;
|
||||
case(SORT_FRONT_TO_BACK):
|
||||
sortFrontToBack();
|
||||
break;
|
||||
@@ -165,6 +199,7 @@ struct SortByStateFunctor
|
||||
|
||||
void RenderBin::sortByState()
|
||||
{
|
||||
//osg::notify(osg::NOTICE)<<"sortByState()"<<std::endl;
|
||||
// actually we'll do nothing right now, as fine grained sorting by state
|
||||
// appears to cost more to do than it saves in draw. The contents of
|
||||
// the RenderGraph leaves is already coarse grained sorted, this
|
||||
@@ -172,6 +207,27 @@ void RenderBin::sortByState()
|
||||
// cout << "doing sortByState "<<this<<endl;
|
||||
}
|
||||
|
||||
|
||||
struct RenderGraphFrontToBackSortFunctor
|
||||
{
|
||||
bool operator() (const RenderGraph* lhs,const RenderGraph* rhs) const
|
||||
{
|
||||
return (lhs->_minimumDistance<rhs->_minimumDistance);
|
||||
}
|
||||
};
|
||||
|
||||
void RenderBin::sortByStateThenFrontToBack()
|
||||
{
|
||||
for(RenderGraphList::iterator itr=_renderGraphList.begin();
|
||||
itr!=_renderGraphList.end();
|
||||
++itr)
|
||||
{
|
||||
(*itr)->sortFrontToBack();
|
||||
(*itr)->getMinimumDistance();
|
||||
}
|
||||
std::sort(_renderGraphList.begin(),_renderGraphList.end(),RenderGraphFrontToBackSortFunctor());
|
||||
}
|
||||
|
||||
struct FrontToBackSortFunctor
|
||||
{
|
||||
bool operator() (const RenderLeaf* lhs,const RenderLeaf* rhs) const
|
||||
|
||||
@@ -36,8 +36,6 @@ RenderStage::RenderStage(SortMode mode):
|
||||
_clearAccum.set(0.0f,0.0f,0.0f,0.0f);
|
||||
_clearDepth = 1.0;
|
||||
_clearStencil = 0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
RenderStage::RenderStage(const RenderStage& rhs,const osg::CopyOp& copyop):
|
||||
|
||||
Reference in New Issue
Block a user