From baf139c75bd5776a039b3c74488a2f171ea2fe64 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 28 Aug 2014 15:11:29 +0000 Subject: [PATCH] Improved support for controlling the ShadingModel via the VolumeSettings object git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14428 16af8721-9629-0410-8352-f15c8da7e697 --- src/osgVolume/MultipassTechnique.cpp | 47 ++++++++++++++++++---------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/osgVolume/MultipassTechnique.cpp b/src/osgVolume/MultipassTechnique.cpp index 392ebc640..450847bd0 100644 --- a/src/osgVolume/MultipassTechnique.cpp +++ b/src/osgVolume/MultipassTechnique.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -953,6 +954,26 @@ class RTTBackfaceCameraCullCallback : public osg::NodeCallback osg::observer_ptr _mt; }; +class ShadingModelVisitor : public osgVolume::PropertyVisitor +{ + public: + + ShadingModelVisitor(): + PropertyVisitor(true), + _shadingModel(VolumeSettings::Standard), + _usesTransferFunction(false) {} + + virtual void apply(IsoSurfaceProperty& iso) { _shadingModel = VolumeSettings::Isosurface; } + virtual void apply(MaximumIntensityProjectionProperty& mip) { _shadingModel = VolumeSettings::MaximumIntensityProjection; } + virtual void apply(LightingProperty& lp) { _shadingModel = VolumeSettings::Light; } + virtual void apply(TransferFunctionProperty& tf) { _usesTransferFunction = true; } + virtual void apply(VolumeSettings& vs) { _shadingModel = vs.getShadingModel(); } + + VolumeSettings::ShadingModel _shadingModel; + bool _usesTransferFunction; + +}; + void MultipassTechnique::cull(osgUtil::CullVisitor* cv) { std::string traversalPass; @@ -1018,29 +1039,21 @@ void MultipassTechnique::cull(osgUtil::CullVisitor* cv) int shaderMask = 0; if (_volumeTile->getLayer()->getProperty()) { - CollectPropertiesVisitor cpv; - _volumeTile->getLayer()->getProperty()->accept(cpv); + ShadingModelVisitor smv; - if (cpv._tfProperty.valid()) + _volumeTile->getLayer()->getProperty()->accept(smv); + + if (smv._usesTransferFunction) { shaderMask |= TF_SHADERS; } - if (cpv._isoProperty.valid()) + switch(smv._shadingModel) { - shaderMask |= ISO_SHADERS; - } - else if (cpv._mipProperty.valid()) - { - shaderMask |= MIP_SHADERS; - } - else if (cpv._lightingProperty.valid()) - { - shaderMask |= LIT_SHADERS; - } - else - { - shaderMask |= STANDARD_SHADERS; + case(VolumeSettings::Isosurface): shaderMask |= ISO_SHADERS; break; + case(VolumeSettings::MaximumIntensityProjection): shaderMask |= MIP_SHADERS; break; + case(VolumeSettings::Light): shaderMask |= LIT_SHADERS; break; + default: shaderMask |= STANDARD_SHADERS; break; } }