First cut at LOD support in RayTracedTechnique, which lowers the number of samples taken when the view of the volume is changing.
This commit is contained in:
parent
127b103edd
commit
307bf7002f
@ -46,6 +46,13 @@ class OSGVOLUME_EXPORT RayTracedTechnique : public VolumeTechnique
|
|||||||
virtual ~RayTracedTechnique();
|
virtual ~RayTracedTechnique();
|
||||||
|
|
||||||
osg::ref_ptr<osg::MatrixTransform> _transform;
|
osg::ref_ptr<osg::MatrixTransform> _transform;
|
||||||
|
|
||||||
|
typedef std::map<osgUtil::CullVisitor*, osg::Matrix> ModelViewMatrixMap;
|
||||||
|
|
||||||
|
OpenThreads::Mutex _mutex;
|
||||||
|
ModelViewMatrixMap _modelViewMatrixMap;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::StateSet> _lodStateSet;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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)
|
void RayTracedTechnique::update(osgUtil::UpdateVisitor* uv)
|
||||||
@ -543,8 +546,40 @@ void RayTracedTechnique::update(osgUtil::UpdateVisitor* uv)
|
|||||||
|
|
||||||
void RayTracedTechnique::cull(osgUtil::CullVisitor* cv)
|
void RayTracedTechnique::cull(osgUtil::CullVisitor* cv)
|
||||||
{
|
{
|
||||||
//OSG_NOTICE<<"RayTracedTechnique::cull(osgUtil::CullVisitor* nv)"<<std::endl;
|
if (!_transform.valid()) return;
|
||||||
if (_transform.valid())
|
|
||||||
|
if (_lodStateSet.valid())
|
||||||
|
{
|
||||||
|
bool moving = false;
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> 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);
|
_transform->accept(*cv);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user