From 276dfbd0adc2f232203c5f926781fa92373e8ac7 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 19 May 2005 15:17:53 +0000 Subject: [PATCH] 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. --- include/osgUtil/RenderBin | 22 +++++++++----- include/osgUtil/RenderStage | 2 +- src/osgUtil/RenderBin.cpp | 60 +++++++++++++++++++++++++++++++++++-- src/osgUtil/RenderStage.cpp | 2 -- 4 files changed, 73 insertions(+), 13 deletions(-) diff --git a/include/osgUtil/RenderBin b/include/osgUtil/RenderBin index 9e30e3bbf..6ac21661c 100644 --- a/include/osgUtil/RenderBin +++ b/include/osgUtil/RenderBin @@ -38,21 +38,26 @@ class OSGUTIL_EXPORT RenderBin : public osg::Object typedef std::vector RenderGraphList; typedef std::map< int, osg::ref_ptr > 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(); diff --git a/include/osgUtil/RenderStage b/include/osgUtil/RenderStage index 492779ab2..76e681d1d 100644 --- a/include/osgUtil/RenderStage +++ b/include/osgUtil/RenderStage @@ -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); diff --git a/src/osgUtil/RenderBin.cpp b/src/osgUtil/RenderBin.cpp index 7b5d11e63..d399e4554 100644 --- a/src/osgUtil/RenderBin.cpp +++ b/src/osgUtil/RenderBin.cpp @@ -15,6 +15,7 @@ #include #include +#include #include @@ -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 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 ","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()"<_minimumDistance_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 diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index 82d0c4b52..b06aad6d0 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -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):