|
osgEarth 2.1.1
|
Public Member Functions | |
| void | operator() (osg::Node *node, osg::NodeVisitor *nv) |
Definition at line 29 of file LODFactorCallback.
| void osgEarth::Drivers::LODFactorCallback::operator() | ( | osg::Node * | node, |
| osg::NodeVisitor * | nv | ||
| ) |
Definition at line 39 of file LODFactorCallback.cpp.
{
// test the type since this is not always a PagedLOD.
osg::PagedLOD* lod = static_cast<osg::PagedLOD*>(node);
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(nv);
osg::LOD::RangeMode rangeMode = lod->getRangeMode();
float requiredRange = 0.0f;
float rangeFactor = 1.0f;
const osg::LOD::RangeList& rangeList = lod->getRangeList();
if (rangeMode == osg::LOD::DISTANCE_FROM_EYE_POINT)
{
requiredRange = cv->getDistanceToViewPoint(lod->getCenter(), true);
}
else if (cv->getLODScale() > 0.0f)
{
requiredRange = cv->clampedPixelSize(lod->getBound()) / cv->getLODScale();
}
else
{
// The comment in osg/PagedLOD.cpp says that this algorithm
// finds the highest res tile, but it actually finds the
// lowest res tile!
for (osg::LOD::RangeList::const_iterator itr = rangeList.begin(), end = rangeList.end();
itr != end;
++itr)
{
requiredRange = osg::maximum(requiredRange, itr->first);
}
}
// We're counting on only finding one valid LOD, unlike the
// general OSG behavior.
if (!rangeList.empty() && rangeList[0].first <= requiredRange
&& requiredRange < rangeList[0].second)
{
rangeFactor = 1.0f - (requiredRange - rangeList[0].first) / rangeList[0].first;
rangeFactor = osg::clampTo(rangeFactor, 0.0f, 1.0f);
}
osg::ref_ptr<osg::Uniform> ufact
= new osg::Uniform("osgearth_LODRangeFactor", rangeFactor);
osg::ref_ptr<osg::StateSet> ss = new osg::StateSet;
ss->addUniform(ufact.get());
cv->pushStateSet(ss.get());
traverse(node, nv);
cv->popStateSet();
}
}
1.7.3