From 307bf7002f2c18e47b8f821c0681f386a0951302 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 17 Mar 2011 11:49:22 +0000 Subject: [PATCH] First cut at LOD support in RayTracedTechnique, which lowers the number of samples taken when the view of the volume is changing. --- include/osgVolume/RayTracedTechnique | 9 ++++++- src/osgVolume/RayTracedTechnique.cpp | 39 ++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/include/osgVolume/RayTracedTechnique b/include/osgVolume/RayTracedTechnique index 23c06b703..58ab6bbba 100644 --- a/include/osgVolume/RayTracedTechnique +++ b/include/osgVolume/RayTracedTechnique @@ -44,8 +44,15 @@ class OSGVOLUME_EXPORT RayTracedTechnique : public VolumeTechnique protected: virtual ~RayTracedTechnique(); - + osg::ref_ptr _transform; + + typedef std::map ModelViewMatrixMap; + + OpenThreads::Mutex _mutex; + ModelViewMatrixMap _modelViewMatrixMap; + + osg::ref_ptr _lodStateSet; }; } diff --git a/src/osgVolume/RayTracedTechnique.cpp b/src/osgVolume/RayTracedTechnique.cpp index 939eda2fa..14d9c7eee 100644 --- a/src/osgVolume/RayTracedTechnique.cpp +++ b/src/osgVolume/RayTracedTechnique.cpp @@ -534,6 +534,9 @@ void RayTracedTechnique::init() } + _lodStateSet = new osg::StateSet; + _lodStateSet->addUniform(new osg::Uniform("SampleDensityValue",0.01f), osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); + } void RayTracedTechnique::update(osgUtil::UpdateVisitor* uv) @@ -543,8 +546,40 @@ void RayTracedTechnique::update(osgUtil::UpdateVisitor* uv) void RayTracedTechnique::cull(osgUtil::CullVisitor* cv) { - //OSG_NOTICE<<"RayTracedTechnique::cull(osgUtil::CullVisitor* nv)"< lock(_mutex); + ModelViewMatrixMap::iterator itr = _modelViewMatrixMap.find(cv); + if (itr!=_modelViewMatrixMap.end()) + { + osg::Matrix newModelViewMatrix = *(cv->getModelViewMatrix()); + osg::Matrix& previousModelViewMatrix = itr->second; + moving = (newModelViewMatrix != previousModelViewMatrix); + + previousModelViewMatrix = newModelViewMatrix; + } + else + { + _modelViewMatrixMap[cv] = *(cv->getModelViewMatrix()); + } + } + + if (moving) + { + cv->pushStateSet(_lodStateSet.get()); + _transform->accept(*cv); + cv->popStateSet(); + } + else + { + _transform->accept(*cv); + } + } + else { _transform->accept(*cv); }