diff --git a/include/osgUtil/SceneView b/include/osgUtil/SceneView index 9d5b065ff..ca78bc45d 100644 --- a/include/osgUtil/SceneView +++ b/include/osgUtil/SceneView @@ -140,6 +140,17 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced void setLODBias(float bias) { _lodBias = bias; } float getLODBias() const { return _lodBias; } + + void setCullMask(const osg::Node::NodeMask nm) { _cullMask = nm; } + const osg::Node::NodeMask getCullMask() const { return _cullMask; } + + void setCullMaskLeft(const osg::Node::NodeMask nm) { _cullMaskLeft = nm; } + const osg::Node::NodeMask getCullMaskLeft() const { return _cullMaskLeft; } + + void setCullMaskRight(const osg::Node::NodeMask nm) { _cullMaskRight = nm; } + const osg::Node::NodeMask getCullMaskRight() const { return _cullMaskRight; } + + /** Set to true if you want SceneView to automatically calculate values for the near/far clipping planes, each frame, set false to use camera's internal near and far planes. Default value is true. @@ -228,15 +239,18 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced bool _initCalled; osg::ref_ptr _initVisitor; osg::ref_ptr _appVisitor; + osg::Node::NodeMask _cullMask; osg::ref_ptr _cullVisitor; osg::ref_ptr _rendergraph; osg::ref_ptr _renderStage; + osg::Node::NodeMask _cullMaskLeft; osg::ref_ptr _cameraLeft; osg::ref_ptr _cullVisitorLeft; osg::ref_ptr _rendergraphLeft; osg::ref_ptr _renderStageLeft; + osg::Node::NodeMask _cullMaskRight; osg::ref_ptr _cameraRight; osg::ref_ptr _cullVisitorRight; osg::ref_ptr _rendergraphRight; diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index a9a480538..b4a9ca0cf 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -34,6 +35,10 @@ SceneView::SceneView(DisplaySettings* ds) _initCalled = false; + _cullMask = 0xffffffff; + _cullMaskLeft = 0xffffffff; + _cullMaskLeft = 0xffffffff; + } @@ -97,8 +102,15 @@ void SceneView::setDefaults() texenv->setMode(osg::TexEnv::MODULATE); _globalState->setAttributeAndModes(texenv, osg::StateAttribute::ON); + osg::LightModel* lightmodel = new osg::LightModel; + lightmodel->setAmbientIntensity(osg::Vec4(0.0f,0.0f,0.0f,1.0f)); + _globalState->setAttributeAndModes(lightmodel, osg::StateAttribute::ON); + _backgroundColor.set(0.2f, 0.2f, 0.4f, 1.0f); + _cullMask = 0xffffffff; + _cullMaskLeft = 0xffffffff; + _cullMaskLeft = 0xffffffff; } void SceneView::init() @@ -166,13 +178,16 @@ void SceneView::cull() if (!_rendergraphRight.valid()) _rendergraphRight = dynamic_cast(_rendergraph->cloneType()); if (!_renderStageRight.valid()) _renderStageRight = dynamic_cast(_renderStage->cloneType()); + _cullVisitorLeft->setTraversalMask(_cullMaskLeft); cullStage(_cameraLeft.get(),_cullVisitorLeft.get(),_rendergraphLeft.get(),_renderStageLeft.get()); + + _cullVisitorRight->setTraversalMask(_cullMaskRight); cullStage(_cameraRight.get(),_cullVisitorRight.get(),_rendergraphRight.get(),_renderStageRight.get()); } else { - + _cullVisitor->setTraversalMask(_cullMask); cullStage(_camera.get(),_cullVisitor.get(),_rendergraph.get(),_renderStage.get()); }