diff --git a/include/osg/StateSet b/include/osg/StateSet index 10aa93307..4de9bc739 100644 --- a/include/osg/StateSet +++ b/include/osg/StateSet @@ -333,9 +333,11 @@ class OSG_EXPORT StateSet : public Object enum RenderBinMode { - INHERIT_RENDERBIN_DETAILS, - USE_RENDERBIN_DETAILS, - OVERRIDE_RENDERBIN_DETAILS + INHERIT_RENDERBIN_DETAILS =0, + USE_RENDERBIN_DETAILS =1, + OVERRIDE_RENDERBIN_DETAILS =2, + PROTECTED_RENDERBIN_DETAILS =4, + OVERRIDE_PROTECTED_RENDERBIN_DETAILS = OVERRIDE_RENDERBIN_DETAILS|PROTECTED_RENDERBIN_DETAILS }; /** Set the render bin details.*/ diff --git a/include/osg/Version b/include/osg/Version index 23e5cf641..c3381caf6 100644 --- a/include/osg/Version +++ b/include/osg/Version @@ -21,7 +21,7 @@ extern "C" { #define OPENSCENEGRAPH_MAJOR_VERSION 3 #define OPENSCENEGRAPH_MINOR_VERSION 3 #define OPENSCENEGRAPH_PATCH_VERSION 3 -#define OPENSCENEGRAPH_SOVERSION 114 +#define OPENSCENEGRAPH_SOVERSION 115 /* Convenience macro that can be used to decide whether a feature is present or not i.e. * #if OSG_MIN_VERSION_REQUIRED(2,9,5) diff --git a/include/osgUtil/CullVisitor b/include/osgUtil/CullVisitor index b824c1e4c..774b8b678 100644 --- a/include/osgUtil/CullVisitor +++ b/include/osgUtil/CullVisitor @@ -117,7 +117,10 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac { _currentStateGraph = _currentStateGraph->find_or_insert(ss); - if (_numberOfEncloseOverrideRenderBinDetails==0 && ss->useRenderBinDetails() && !ss->getBinName().empty()) + bool useRenderBinDetails = (ss->useRenderBinDetails() && !ss->getBinName().empty()) && + (_numberOfEncloseOverrideRenderBinDetails==0 || (ss->getRenderBinMode()&osg::StateSet::PROTECTED_RENDERBIN_DETAILS)!=0); + + if (useRenderBinDetails) { _renderBinStack.push_back(_currentRenderBin); @@ -126,7 +129,7 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac _currentRenderBin->getStage()->find_or_insert(ss->getBinNumber(),ss->getBinName()); } - if (ss->getRenderBinMode()==osg::StateSet::OVERRIDE_RENDERBIN_DETAILS) + if ((ss->getRenderBinMode()&osg::StateSet::OVERRIDE_RENDERBIN_DETAILS)!=0) { ++_numberOfEncloseOverrideRenderBinDetails; } @@ -139,11 +142,15 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac inline void popStateSet() { const osg::StateSet* ss = _currentStateGraph->getStateSet(); - if (ss->getRenderBinMode()==osg::StateSet::OVERRIDE_RENDERBIN_DETAILS) + if ((ss->getRenderBinMode()&osg::StateSet::OVERRIDE_RENDERBIN_DETAILS)!=0) { --_numberOfEncloseOverrideRenderBinDetails; } - if (_numberOfEncloseOverrideRenderBinDetails==0 && ss->useRenderBinDetails() && !ss->getBinName().empty()) + + bool useRenderBinDetails = (ss->useRenderBinDetails() && !ss->getBinName().empty()) && + (_numberOfEncloseOverrideRenderBinDetails==0 || (ss->getRenderBinMode()&osg::StateSet::PROTECTED_RENDERBIN_DETAILS)!=0); + + if (useRenderBinDetails) { if (_renderBinStack.empty()) { diff --git a/src/osgWrappers/serializers/osg/StateSet.cpp b/src/osgWrappers/serializers/osg/StateSet.cpp index cd5add18b..ff891b615 100644 --- a/src/osgWrappers/serializers/osg/StateSet.cpp +++ b/src/osgWrappers/serializers/osg/StateSet.cpp @@ -286,6 +286,8 @@ REGISTER_OBJECT_WRAPPER( StateSet, ADD_ENUM_VALUE( INHERIT_RENDERBIN_DETAILS ); ADD_ENUM_VALUE( USE_RENDERBIN_DETAILS ); ADD_ENUM_VALUE( OVERRIDE_RENDERBIN_DETAILS ); + ADD_ENUM_VALUE( PROTECTED_RENDERBIN_DETAILS ); + ADD_ENUM_VALUE( OVERRIDE_PROTECTED_RENDERBIN_DETAILS ); END_ENUM_SERIALIZER(); // _binMode ADD_INT_SERIALIZER( BinNumber, 0 ); // _binNum