Show
Ignore:
Timestamp:
03/18/08 16:37:38 (7 years ago)
Author:
robert
Message:

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.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osg/AutoTransform.cpp

    r7965 r7968  
    2626    _minimumScale(0.0f), 
    2727    _maximumScale(FLT_MAX), 
     28    _autoScaleTransitionWidthRatio(0.25f), 
    2829    _matrixDirty(true) 
    2930{ 
     
    4344    _minimumScale(pat._minimumScale), 
    4445    _maximumScale(pat._maximumScale), 
     46    _autoScaleTransitionWidthRatio(pat._autoScaleTransitionWidthRatio), 
    4547    _matrixDirty(true) 
    4648{ 
     
    179181                    { 
    180182                        float size = 1.0f/cs->pixelSize(getPosition(),0.48f); 
    181                          
    182                         if (size<_minimumScale) size = _minimumScale; 
    183                         if (size>_maximumScale) size = _maximumScale; 
     183 
     184                        if (_autoScaleTransitionWidthRatio>0.0f) 
     185                        {  
     186                            if (_minimumScale>0.0f) 
     187                            { 
     188                                float j = _minimumScale; 
     189                                float i = (_maximumScale<FLT_MAX) ?  
     190                                            _minimumScale+(_maximumScale-_minimumScale)*_autoScaleTransitionWidthRatio : 
     191                                            _minimumScale*(1.0f+_autoScaleTransitionWidthRatio); 
     192                                float c = 1.0f/(4.0f*(i-j)); 
     193                                float b = 1.0f - 2.0f*c*i; 
     194                                float a = j + b*b / (4.0f*c); 
     195                                float k = -b / (2.0f*c); 
     196 
     197                                if (size<k) size = _minimumScale; 
     198                                else if (size<i) size = a + b*size + c*(size*size); 
     199                            } 
     200 
     201                            if (_maximumScale<FLT_MAX) 
     202                            { 
     203                                float n = _maximumScale; 
     204                                float m = (_minimumScale>0.0) ? 
     205                                            _maximumScale+(_minimumScale-_maximumScale)*_autoScaleTransitionWidthRatio : 
     206                                            _maximumScale*(1.0f-_autoScaleTransitionWidthRatio); 
     207                                float c = 1.0f / (4.0f*(m-n)); 
     208                                float b = 1.0f - 2.0f*c*m; 
     209                                float a = n + b*b/(4.0f*c); 
     210                                float p = -b / (2.0f*c); 
     211 
     212                                if (size>p) size = _maximumScale; 
     213                                else if (size>m) size = a + b*size + c*(size*size); 
     214                            }         
     215                        } 
    184216                         
    185217                        setScale(size);