To osg::AutoTransform added support for MinimumScale, MaximumScale and AutoScaleTransitionWidth parameters

and a new scheme for computing the scaling when using autoscale that introduces smooth
transitions to the scaling of the subgraph so that it looks more natural.
This commit is contained in:
Robert Osfield
2008-03-18 15:37:38 +00:00
parent b08f438946
commit 1d1dcf2cf3
6 changed files with 80 additions and 7 deletions

View File

@@ -25,6 +25,7 @@ AutoTransform::AutoTransform():
_firstTimeToInitEyePoint(true),
_minimumScale(0.0f),
_maximumScale(FLT_MAX),
_autoScaleTransitionWidthRatio(0.25f),
_matrixDirty(true)
{
// setNumChildrenRequiringUpdateTraversal(1);
@@ -42,6 +43,7 @@ AutoTransform::AutoTransform(const AutoTransform& pat,const CopyOp& copyop):
_firstTimeToInitEyePoint(true),
_minimumScale(pat._minimumScale),
_maximumScale(pat._maximumScale),
_autoScaleTransitionWidthRatio(pat._autoScaleTransitionWidthRatio),
_matrixDirty(true)
{
// setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1);
@@ -178,9 +180,39 @@ void AutoTransform::accept(NodeVisitor& nv)
if (getAutoScaleToScreen())
{
float size = 1.0f/cs->pixelSize(getPosition(),0.48f);
if (size<_minimumScale) size = _minimumScale;
if (size>_maximumScale) size = _maximumScale;
if (_autoScaleTransitionWidthRatio>0.0f)
{
if (_minimumScale>0.0f)
{
float j = _minimumScale;
float i = (_maximumScale<FLT_MAX) ?
_minimumScale+(_maximumScale-_minimumScale)*_autoScaleTransitionWidthRatio :
_minimumScale*(1.0f+_autoScaleTransitionWidthRatio);
float c = 1.0f/(4.0f*(i-j));
float b = 1.0f - 2.0f*c*i;
float a = j + b*b / (4.0f*c);
float k = -b / (2.0f*c);
if (size<k) size = _minimumScale;
else if (size<i) size = a + b*size + c*(size*size);
}
if (_maximumScale<FLT_MAX)
{
float n = _maximumScale;
float m = (_minimumScale>0.0) ?
_maximumScale+(_minimumScale-_maximumScale)*_autoScaleTransitionWidthRatio :
_maximumScale*(1.0f-_autoScaleTransitionWidthRatio);
float c = 1.0f / (4.0f*(m-n));
float b = 1.0f - 2.0f*c*m;
float a = n + b*b/(4.0f*c);
float p = -b / (2.0f*c);
if (size>p) size = _maximumScale;
else if (size>m) size = a + b*size + c*(size*size);
}
}
setScale(size);
}