osgEarth 2.1.1
|
Public Member Functions | |
DynamicLODScaleCallback (float fallOff) | |
void | operator() (osg::Node *node, osg::NodeVisitor *nv) |
Public Attributes | |
float | _fallOff |
Cull callback that dynamically computes an LOD scale based on distance to the camera and a "fall off" metric. As the fall off increases, farther objects' LOD scale will increase. A good range for the fall-off number is 0..5.
Definition at line 32 of file DynamicLODScaleCallback.
DynamicLODScaleCallback::DynamicLODScaleCallback | ( | float | fallOff | ) | [inline] |
Definition at line 34 of file DynamicLODScaleCallback.
: _fallOff(fallOff) { }
void DynamicLODScaleCallback::operator() | ( | osg::Node * | node, |
osg::NodeVisitor * | nv | ||
) | [inline] |
Definition at line 36 of file DynamicLODScaleCallback.
{ osg::CullStack* cs = dynamic_cast<osg::CullStack*>(nv); if ( cs ) { osg::LOD* lod = static_cast<osg::LOD*>( node ); osg::Vec3 center = lod->getCenter(); osg::Vec3 eye = nv->getEyePoint(); osg::Vec3 eyeVec = eye; eyeVec.normalize(); float has = osg::clampAbove( eye.length() - 6356752.3142f, 0.0f ); float centerToEye = nv->getDistanceToViewPoint(center, false); float bsToEye = centerToEye - lod->getChild(0)->getBound().radius(); float scaleAdj = 1.0f; if ( bsToEye > has ) { float denom = osg::maximum(0.1f, (1.0f/_fallOff)) * 10000.0f; scaleAdj = osg::clampBetween( log10f(bsToEye/denom), 1.0f, 3.0f ); //OE_INFO << LC // << std::fixed // << "centerToEye=" << centerToEye // << ", bsToEye=" << bsToEye // << ", scaleAdj=" << scaleAdj // << std::endl; } float lodScale = cs->getLODScale(); cs->setLODScale( lodScale * scaleAdj ); traverse( node, nv ); cs->setLODScale( lodScale ); } else { traverse( node, nv ); } }
Definition at line 75 of file DynamicLODScaleCallback.