Changeset 7968

Show
Ignore:
Timestamp:
03/18/08 16:37:38 (5 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.

Location:
OpenSceneGraph/trunk
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgautotransform/osgautotransform.cpp

    r7967 r7968  
    2929#include <osg/Geometry> 
    3030 
     31#include <osgDB/WriteFile> 
     32 
    3133#include <osgText/Text> 
    3234 
     
    113115        geom->setVertexArray(vertices); 
    114116        geom->setColorArray(colors); 
     117        geom->setColorBinding(osg::Geometry::BIND_OVERALL); 
    115118        geom->addPrimitiveSet(new osg::DrawArrays(GL_LINE_STRIP,0,vertices->size())); 
    116119 
     
    139142        geom->setVertexArray(vertices); 
    140143        geom->setColorArray(colors); 
     144        geom->setColorBinding(osg::Geometry::BIND_OVERALL); 
    141145        geom->addPrimitiveSet(new osg::DrawArrays(GL_LINE_STRIP,0,vertices->size())); 
    142146 
  • OpenSceneGraph/trunk/include/osg/AutoTransform

    r7965 r7968  
    8484        bool getAutoScaleToScreen() const { return _autoScaleToScreen; } 
    8585 
     86        void setAutoScaleTransistionWidthRatio(float ratio) { _autoScaleTransitionWidthRatio = ratio; } 
     87        float getAutoScaleTransistionWidthRatio() const { return _autoScaleTransitionWidthRatio; } 
     88 
    8689 
    8790        virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor* nv) const; 
     
    116119        float                           _minimumScale; 
    117120        float                           _maximumScale; 
    118  
     121        float                           _autoScaleTransitionWidthRatio; 
    119122 
    120123        void computeMatrix() const; 
  • 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); 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/AutoTransform.cpp

    r4992 r7968  
    3838    out->writeBool(getAutoScaleToScreen()); 
    3939 
     40    if ( out->getVersion() >= VERSION_0025 ) 
     41    { 
     42        out->writeFloat(getMinimumScale()); 
     43        out->writeFloat(getMaximumScale()); 
     44        out->writeFloat(getAutoScaleTransistionWidthRatio()); 
     45    } 
     46 
    4047    out->writeQuat(getRotation()); 
    4148    out->writeVec3(getScale()); 
     49     
    4250} 
    4351 
     
    6573        setAutoScaleToScreen(in->readBool()); 
    6674 
     75        if ( in->getVersion() >= VERSION_0025 ) 
     76        { 
     77            setMinimumScale(in->readFloat()); 
     78            setMaximumScale(in->readFloat()); 
     79            setAutoScaleTransistionWidthRatio(in->readFloat()); 
     80        } 
     81 
    6782        setRotation(in->readQuat()); 
    6883        setScale(in->readVec3()); 
     84 
     85 
    6986    } 
    7087    else{ 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/IveVersion.h

    r7891 r7968  
    3434#define VERSION_0023 23 
    3535#define VERSION_0024 24 
     36#define VERSION_0025 25 
    3637 
    37 #define VERSION VERSION_0024 
     38#define VERSION VERSION_0025 
    3839 
    3940/* The BYTE_SEX tag is used to check the endian 
  • OpenSceneGraph/trunk/src/osgPlugins/osg/AutoTransform.cpp

    r7965 r7968  
    141141    } 
    142142 
     143    if (fr.matchSequence("autoScaleTransistionWidthRatio %f")) 
     144    { 
     145        float ratio; 
     146        fr[1].getFloat(ratio); 
     147         
     148        transform.setAutoScaleTransistionWidthRatio(ratio); 
     149 
     150        fr += 2; 
     151        iteratorAdvanced = true; 
     152    } 
     153 
     154 
    143155    return iteratorAdvanced; 
    144156} 
     
    168180    } 
    169181 
    170  
    171182    fw.indent()<<"autoScaleToScreen "<<(transform.getAutoScaleToScreen()?"TRUE":"FALSE")<<std::endl; 
    172  
     183     
     184    if (transform.getAutoScaleTransistionWidthRatio()!=0.25)  
     185    { 
     186            fw.indent()<<"autoScaleTransistionWidthRatio "<<transform.getAutoScaleTransistionWidthRatio()<<std::endl; 
     187    } 
     188     
    173189    return true; 
    174190}