Changeset 3245

Show
Ignore:
Timestamp:
08/06/04 10:22:58 (10 years ago)
Author:
robert
Message:

Added support for osg::AutoTransform::setAutoRotateMode(AutoRotateMode?) deprecating
the previous setAutoRotateToScreen(). Added support for ROTATE_TO_CAMERA mode.

Cleaned up the autotransform demo to use a sensible number of labels

Location:
OpenSceneGraph/trunk
Files:
4 modified

Legend:

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

    r2022 r3245  
    7272} 
    7373 
    74 osg::Node* createAxis(const osg::Vec3& s, const osg::Vec3& e, int numReps) 
     74osg::Node* createAxis(const osg::Vec3& s, const osg::Vec3& e, int numReps, osg::AutoTransform::AutoRotateMode autoRotateMode, const std::string& str) 
    7575{ 
    7676    osg::Group* group = new osg::Group; 
     
    8181    osg::Vec3 pos = s; 
    8282 
    83     bool useAuto = false; 
     83    bool useAuto = true; 
    8484    if (useAuto) 
    8585    { 
     
    9090            osg::AutoTransform* at = new osg::AutoTransform; 
    9191            at->setPosition(pos); 
    92             at->setAutoRotateToScreen(true); 
    93             at->setAutoScaleToScreen(true); 
    94             at->addChild(createLabel(osg::Vec3(0.0f,0.0f,0.0f),40.0f,"Test 2")); 
     92            at->setAutoRotateMode(autoRotateMode); 
     93            at->addChild(createLabel(osg::Vec3(0.0f,0.0f,0.0f),dv.length()*0.2f,str)); 
    9594            vertices->push_back(pos); 
    9695            pos += dv; 
     
    119118        for(int i=0;i<numReps;++i) 
    120119        { 
    121             group->addChild(createLabel3(osg::Vec3(pos),dv.length()*0.5f,"Test 2")); 
     120            group->addChild(createLabel3(osg::Vec3(pos),dv.length()*0.5f,str)); 
    122121            vertices->push_back(pos); 
    123122            pos += dv; 
     
    147146    osg::Group* root = new osg::Group; 
    148147     
    149     int numReps = 3333; 
    150 //    int numReps = 10; 
    151     root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(1000.0,0.0,0.0),numReps)); 
    152     root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(0.0,1000.0,0.0),numReps)); 
    153     root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(0.0,0.0,1000.0),numReps));     
     148//    int numReps = 3333; 
     149    int numReps = 10; 
     150    root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(1000.0,0.0,0.0),numReps,osg::AutoTransform::ROTATE_TO_CAMERA,"ROTATE_TO_CAMERA")); 
     151    root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(0.0,1000.0,0.0),numReps,osg::AutoTransform::ROTATE_TO_SCREEN,"ROTATE_TO_SCREEN")); 
     152    root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(0.0,0.0,1000.0),numReps,osg::AutoTransform::NO_ROTATION,"NO_ROTATION"));     
    154153     
    155154    return root; 
  • OpenSceneGraph/trunk/include/osg/AutoTransform

    r3241 r3245  
    11/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield  
     2 * 
     3 * This library is open source and may be redistributed and/or modified under   
     4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  
     5 * (at your option) any later version.  The full license is in LICENSE file 
     6 * included with this distribution, and on the openscenegraph.org website. 
    27 *  
    3  * This library is open source and may be redistributed and/or modified under  
    4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  
    5  * (at your option) any later version. The full license is in LICENSE file  
    6  * included with this distribution, and on the openscenegraph.org website.  
    7  *  
    8  * This library is distributed in the hope that it will be useful,  
    9  * but WITHOUT ANY WARRANTY; without even the implied warranty of  
    10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
    11  * OpenSceneGraph Public License for more details.  
    12 */  
     8 * This library is distributed in the hope that it will be useful, 
     9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
     10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
     11 * OpenSceneGraph Public License for more details. 
     12*/ 
    1313 
    14 #ifndef OSG_AUTOTRANSFORM  
    15 #define OSG_AUTOTRANSFORM 1  
     14#ifndef OSG_AUTOTRANSFORM 
     15#define OSG_AUTOTRANSFORM 1 
    1616 
    17 #include <osg/AnimationPath> 
    18 #include <osg/Group>  
    19 #include <osg/Transform>  
    20 #include <osg/Quat>  
     17#include <osg/Group> 
     18#include <osg/Transform> 
     19#include <osg/Quat> 
    2120 
    22 namespace osg {  
     21namespace osg { 
    2322 
    2423/** AutoTransform - is Transform the automatically scales or rotates  
    25   * to keep its children relative to screen space coordinates.  
    26 */  
    27 class SG_EXPORT AutoTransform : public Transform  
    28 {  
    29     public :  
    30         AutoTransform();  
     24  * to keep its children relative to screen space coordinates. 
     25*/ 
     26class SG_EXPORT AutoTransform : public Transform 
     27{ 
     28    public : 
     29        AutoTransform(); 
    3130 
    32         AutoTransform(const AutoTransform& pat,const CopyOp& copyop=CopyOp::SHALLOW_COPY);  
     31        AutoTransform(const AutoTransform& pat,const CopyOp& copyop=CopyOp::SHALLOW_COPY);             
    3332 
    34         virtual osg::Object* cloneType() const { return new AutoTransform (); }  
    35         virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new AutoTransform (*this,copyop); }  
    36         virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const AutoTransform *>(obj)!=NULL; }  
    37         virtual const char* className() const { return "AutoTransform"; }  
    38         virtual const char* libraryName() const { return "osg"; }  
     33        virtual osg::Object* cloneType() const { return new AutoTransform (); } 
     34        virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new AutoTransform (*this,copyop); } 
     35        virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const AutoTransform *>(obj)!=NULL; } 
     36        virtual const char* className() const { return "AutoTransform"; } 
     37        virtual const char* libraryName() const { return "osg"; } 
    3938 
    40         virtual void accept(NodeVisitor& nv);  
     39        virtual void accept(NodeVisitor& nv); 
    4140 
    42         virtual AutoTransform* asAutoTransform() { return this; }  
    43         virtual const AutoTransform* asAutoTransform() const { return this; }  
     41        virtual AutoTransform* asAutoTransform() { return this; } 
     42        virtual const AutoTransform* asAutoTransform() const { return this; } 
    4443 
    4544        inline void setPosition(const Vec3& pos) { _position = pos; _matrixDirty=true; dirtyBound(); } 
    46         inline const Vec3& getPosition() const { return _position; }  
     45        inline const Vec3& getPosition() const { return _position; } 
    4746 
    4847 
    4948        inline void setRotation(const Quat& quat) { _rotation = quat; _matrixDirty=true; dirtyBound(); } 
    50         inline const Quat& getRotation() const { return _rotation; }  
    51           
     49        inline const Quat& getRotation() const { return _rotation; } 
     50         
    5251        inline void setScale(float scale) { _scale.set(scale,scale,scale); _matrixDirty=true; dirtyBound(); } 
    53         inline void setScale(const Vec3& scale) { _scale = scale; dirtyBound(); }  
    54         inline const Vec3& getScale() const { return _scale; }  
    55           
     52        inline void setScale(const Vec3& scale) { _scale = scale; dirtyBound(); } 
     53        inline const Vec3& getScale() const { return _scale; } 
     54         
    5655        inline void setPivotPoint(const Vec3& pivot) { _pivotPoint = pivot; _matrixDirty=true; dirtyBound(); } 
    57         inline const Vec3& getPivotPoint() const { return _pivotPoint; }  
    58           
     56        inline const Vec3& getPivotPoint() const { return _pivotPoint; } 
     57         
    5958 
    60         void setAutoUpdateEyeMovementTolerance(float tolerance) { _autoUpdateEyeMovementTolerance = tolerance; }  
    61         float getAutoUpdateEyeMovementTolerance() const { return _autoUpdateEyeMovementTolerance; }  
    62  
    63         void setAutoRotateToScreen(bool autoRotateToScreen) { _autoRotateToScreen = autoRotateToScreen; _matrixDirty=true; } 
    64         bool getAutoRotateToScreen() const { return _autoRotateToScreen; }  
    65  
    66         void setAutoScaleToScreen(bool autoScaleToScreen) { _autoScaleToScreen = autoScaleToScreen; _matrixDirty=true; } 
    67         bool getAutoScaleToScreen() const { return _autoScaleToScreen; }  
    68  
    69  
    70         virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor* nv) const;  
    71  
    72         virtual bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor* nv) const;  
     59        void setAutoUpdateEyeMovementTolerance(float tolerance) { _autoUpdateEyeMovementTolerance = tolerance; } 
     60        float getAutoUpdateEyeMovementTolerance() const { return _autoUpdateEyeMovementTolerance; } 
    7361 
    7462 
    7563 
    76     protected :  
    77               
    78         virtual ~AutoTransform() {}  
    79           
    8064 
    81         Vec3 _position;  
    82         Vec3 _pivotPoint;  
    83         float _autoUpdateEyeMovementTolerance;  
    84         bool _autoRotateToScreen;  
    85         bool _autoScaleToScreen;  
    86           
    87         mutable Quat _rotation;  
    88         mutable Vec3 _scale;  
    89         mutable bool _firstTimeToInitEyePoint;  
    90         mutable osg::Vec3 _previousEyePoint;  
    91         mutable int _previousWidth;  
    92         mutable int _previousHeight;  
    93         mutable osg::Matrix _previousProjection;  
     65        enum AutoRotateMode 
     66        { 
     67            NO_ROTATION, 
     68            ROTATE_TO_SCREEN, 
     69            ROTATE_TO_CAMERA 
     70        }; 
     71         
     72        void setAutoRotateMode(AutoRotateMode mode) { _autoRotateMode = mode; } 
     73 
     74        AutoRotateMode getAutoRotateMode() const { return _autoRotateMode; } 
     75 
     76#ifdef USE_DEPRECATED_API 
     77        void setAutoRotateToScreen(bool autoRotateToScreen) 
     78        { 
     79            setAutoRotateMode(autoRotateToScreen?ROTATE_TO_SCREEN:NO_ROTATION); 
     80        } 
     81 
     82        bool getAutoRotateToCamera() const { return _autoRotateMode==ROTATE_TO_SCREEN; } 
     83 
     84        void setAutoRotateToCamera(bool autoRotateToCamera) 
     85        { 
     86            setAutoRotateMode(autoRotateToScreen?ROTATE_TO_CAMERA:NO_ROTATION); 
     87        } 
     88         
     89        bool getAutoRotateToCamera() const { return _autoRotateMode==ROTATE_TO_SCREEN; } 
     90#endif 
     91 
     92 
     93 
     94        void setAutoScaleToScreen(bool autoScaleToScreen) { _autoScaleToScreen = autoScaleToScreen; _matrixDirty=true; } 
     95 
     96        bool getAutoScaleToScreen() const { return _autoScaleToScreen; } 
     97 
     98 
     99        virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor* nv) const; 
     100 
     101        virtual bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor* nv) const; 
     102 
     103 
     104 
     105    protected : 
     106             
     107        virtual ~AutoTransform() {} 
     108         
     109 
     110        Vec3                _position; 
     111        Vec3                _pivotPoint; 
     112        float               _autoUpdateEyeMovementTolerance; 
     113 
     114        AutoRotateMode      _autoRotateMode; 
     115 
     116        bool                _autoScaleToScreen; 
     117         
     118        mutable Quat        _rotation; 
     119        mutable Vec3        _scale; 
     120        mutable bool        _firstTimeToInitEyePoint; 
     121        mutable osg::Vec3   _previousEyePoint; 
     122        mutable int         _previousWidth; 
     123        mutable int         _previousHeight;         
     124        mutable osg::Matrix _previousProjection; 
    94125        mutable osg::Vec3 _previousPosition; 
    95126 
    96127 
    97         void computeMatrix() const;  
     128        void computeMatrix() const; 
    98129 
    99         mutable bool _matrixDirty;  
    100         mutable osg::Matrix _cachedMatrix;  
    101           
     130        mutable bool        _matrixDirty; 
     131        mutable osg::Matrix _cachedMatrix; 
    102132         
    103           
    104 };  
     133        
     134         
     135}; 
    105136 
    106 }  
     137} 
    107138 
    108 #endif  
     139#endif 
  • OpenSceneGraph/trunk/src/osg/AutoTransform.cpp

    r3241 r3245  
    11/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield  
     2 * 
     3 * This library is open source and may be redistributed and/or modified under   
     4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  
     5 * (at your option) any later version.  The full license is in LICENSE file 
     6 * included with this distribution, and on the openscenegraph.org website. 
    27 *  
    3  * This library is open source and may be redistributed and/or modified under  
    4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  
    5  * (at your option) any later version. The full license is in LICENSE file  
    6  * included with this distribution, and on the openscenegraph.org website.  
    7  *  
    8  * This library is distributed in the hope that it will be useful,  
    9  * but WITHOUT ANY WARRANTY; without even the implied warranty of  
    10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
    11  * OpenSceneGraph Public License for more details.  
    12 */  
    13 #include <osg/AutoTransform>  
    14 #include <osg/CullStack>  
     8 * This library is distributed in the hope that it will be useful, 
     9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
     10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
     11 * OpenSceneGraph Public License for more details. 
     12*/ 
     13#include <osg/AutoTransform> 
     14#include <osg/CullStack> 
    1515 
    16 using namespace osg;  
     16using namespace osg; 
    1717 
    18 AutoTransform::AutoTransform():  
    19     _autoUpdateEyeMovementTolerance(0.0f),  
    20     _autoRotateToScreen(false),  
    21     _autoScaleToScreen(false),  
    22     _scale(1.0f,1.0f,1.0f),  
    23     _firstTimeToInitEyePoint(true),  
    24     _matrixDirty(true)  
    25 {  
    26 // setNumChildrenRequiringUpdateTraversal(1);  
    27 }  
     18AutoTransform::AutoTransform(): 
     19    _autoUpdateEyeMovementTolerance(0.0f), 
     20    _autoRotateMode(NO_ROTATION), 
     21    _autoScaleToScreen(false), 
     22    _scale(1.0f,1.0f,1.0f), 
     23    _firstTimeToInitEyePoint(true), 
     24    _matrixDirty(true) 
     25{ 
     26//    setNumChildrenRequiringUpdateTraversal(1); 
     27} 
    2828 
    29 AutoTransform::AutoTransform(const AutoTransform& pat,const CopyOp& copyop):  
    30         Transform(pat,copyop), 
     29AutoTransform::AutoTransform(const AutoTransform& pat,const CopyOp& copyop): 
     30    Transform(pat,copyop), 
    3131    _position(pat._position), 
    3232    _pivotPoint(pat._pivotPoint), 
    3333    _autoUpdateEyeMovementTolerance(pat._autoUpdateEyeMovementTolerance), 
    34     _autoRotateToScreen(pat._autoRotateToScreen), 
     34    _autoRotateMode(pat._autoRotateMode), 
    3535    _autoScaleToScreen(pat._autoScaleToScreen), 
    3636    _rotation(pat._rotation), 
     
    3838    _firstTimeToInitEyePoint(true), 
    3939    _matrixDirty(true) 
    40 {  
    41 // setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1);  
    42 }  
     40{ 
     41//    setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1);             
     42} 
    4343 
    44 bool AutoTransform::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const  
    45 {  
    46     if (_matrixDirty) computeMatrix();  
    47       
    48     if (_referenceFrame==RELATIVE_TO_PARENTS)  
    49     {  
    50         matrix.preMult(_cachedMatrix);  
    51     }  
    52     else // absolute  
    53     {  
    54         matrix = _cachedMatrix;  
    55     }  
    56     return true;  
    57 }  
     44bool AutoTransform::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const 
     45{ 
     46    if (_matrixDirty) computeMatrix(); 
     47     
     48    if (_referenceFrame==RELATIVE_TO_PARENTS) 
     49    { 
     50        matrix.preMult(_cachedMatrix); 
     51    } 
     52    else // absolute 
     53    { 
     54        matrix = _cachedMatrix; 
     55    } 
     56    return true; 
     57} 
    5858 
    5959 
    60 bool AutoTransform::computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const  
    61 {  
    62     if (_referenceFrame==RELATIVE_TO_PARENTS)  
    63     {  
    64         matrix.postMult(osg::Matrix::translate(-_position)*  
    65                         osg::Matrix::rotate(_rotation.inverse())*  
    66                         osg::Matrix::scale(1.0f/_scale.x(),1.0f/_scale.y(),1.0f/_scale.z())*  
    67                         osg::Matrix::translate(_pivotPoint));  
    68     }  
    69     else // absolute  
    70     {  
    71         matrix = osg::Matrix::translate(-_position)*  
    72                  osg::Matrix::rotate(_rotation.inverse())*  
    73                  osg::Matrix::scale(1.0f/_scale.x(),1.0f/_scale.y(),1.0f/_scale.z())*  
    74                  osg::Matrix::translate(_pivotPoint);  
    75     }  
    76     return true;  
    77 }  
     60bool AutoTransform::computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const 
     61{ 
     62    if (_referenceFrame==RELATIVE_TO_PARENTS) 
     63    { 
     64        matrix.postMult(osg::Matrix::translate(-_position)* 
     65                        osg::Matrix::rotate(_rotation.inverse())* 
     66                        osg::Matrix::scale(1.0f/_scale.x(),1.0f/_scale.y(),1.0f/_scale.z())* 
     67                        osg::Matrix::translate(_pivotPoint)); 
     68    } 
     69    else // absolute 
     70    { 
     71        matrix = osg::Matrix::translate(-_position)* 
     72                 osg::Matrix::rotate(_rotation.inverse())* 
     73                 osg::Matrix::scale(1.0f/_scale.x(),1.0f/_scale.y(),1.0f/_scale.z())* 
     74                 osg::Matrix::translate(_pivotPoint); 
     75    } 
     76    return true; 
     77} 
    7878 
    79 void AutoTransform::computeMatrix() const  
    80 {  
    81     if (!_matrixDirty) return;  
    82       
    83     _cachedMatrix.set(osg::Matrix::translate(-_pivotPoint)*  
    84                       osg::Matrix::scale(_scale)*  
    85                       osg::Matrix::rotate(_rotation)*  
    86                       osg::Matrix::translate(_position));  
    87       
    88     _matrixDirty = false;  
    89 }  
     79void AutoTransform::computeMatrix() const 
     80{ 
     81    if (!_matrixDirty) return; 
     82     
     83    _cachedMatrix.set(osg::Matrix::translate(-_pivotPoint)* 
     84                      osg::Matrix::scale(_scale)* 
     85                      osg::Matrix::rotate(_rotation)* 
     86                      osg::Matrix::translate(_position)); 
     87     
     88    _matrixDirty = false; 
     89} 
    9090 
    91 void AutoTransform::accept(NodeVisitor& nv)  
    92 {  
    93     // if app traversal update the frame count.  
    94     if (nv.getVisitorType()==NodeVisitor::UPDATE_VISITOR)  
    95     {  
    96     }  
    97     else  
    98     if (nv.getVisitorType()==NodeVisitor::CULL_VISITOR)  
    99     {  
     91void AutoTransform::accept(NodeVisitor& nv) 
     92{ 
     93    // if app traversal update the frame count. 
     94    if (nv.getVisitorType()==NodeVisitor::UPDATE_VISITOR) 
     95    { 
     96    } 
     97    else 
     98    if (nv.getVisitorType()==NodeVisitor::CULL_VISITOR) 
     99    { 
    100100 
    101         CullStack* cs = dynamic_cast<CullStack*>(&nv);  
    102         if (cs)  
    103         {  
     101        CullStack* cs = dynamic_cast<CullStack*>(&nv); 
     102        if (cs) 
     103        { 
    104104 
    105             int width = _previousWidth;  
    106             int height = _previousHeight;  
     105            int width = _previousWidth; 
     106            int height = _previousHeight; 
    107107 
    108             osg::Viewport* viewport = cs->getViewport();  
    109             if (viewport)  
    110             {  
    111                 width = viewport->width();  
    112                 height = viewport->height();  
    113             }  
     108            osg::Viewport* viewport = cs->getViewport(); 
     109            if (viewport) 
     110            { 
     111                width = viewport->width(); 
     112                height = viewport->height(); 
     113            } 
    114114 
    115115            osg::Vec3 eyePoint = cs->getEyeLocal();  
    116                         osg::Vec3 position = getPosition(); 
     116            osg::Vec3 position = getPosition(); 
    117117 
    118118            const osg::Matrix& projection = cs->getProjectionMatrix(); 
    119119 
    120             bool doUpdate = _firstTimeToInitEyePoint;  
    121             if (!_firstTimeToInitEyePoint)  
    122             {  
    123                 osg::Vec3 dv = _previousEyePoint-eyePoint;  
    124                 if (dv.length2()>getAutoUpdateEyeMovementTolerance()*(eyePoint-getPosition()).length2())  
    125                 {  
    126                     doUpdate = true;  
    127                 }  
    128                 else if (width!=_previousWidth || height!=_previousHeight)  
    129                 {  
    130                     doUpdate = true;  
    131                 }  
     120            bool doUpdate = _firstTimeToInitEyePoint; 
     121            if (!_firstTimeToInitEyePoint) 
     122            { 
     123                osg::Vec3 dv = _previousEyePoint-eyePoint; 
     124                if (dv.length2()>getAutoUpdateEyeMovementTolerance()*(eyePoint-getPosition()).length2()) 
     125                { 
     126                    doUpdate = true; 
     127                } 
     128                else if (width!=_previousWidth || height!=_previousHeight) 
     129                { 
     130                    doUpdate = true; 
     131                } 
    132132                else if (projection != _previousProjection)  
    133                 {  
    134                     doUpdate = true;  
    135                 }  
     133                { 
     134                    doUpdate = true; 
     135                }                 
    136136                else if (position != _previousPosition)  
    137137                {  
    138138                    doUpdate = true;  
    139139                }  
    140             }  
    141             _firstTimeToInitEyePoint = false;  
     140            } 
     141            _firstTimeToInitEyePoint = false; 
    142142 
    143             if (doUpdate)  
    144             {  
     143            if (doUpdate) 
     144            {             
    145145 
    146                 if (getAutoScaleToScreen())  
    147                 {  
    148                     float size = 1.0f/cs->pixelSize(getPosition(),1.0f);  
    149                     setScale(size);  
    150                 }  
     146                if (getAutoScaleToScreen()) 
     147                { 
     148                    float size = 1.0f/cs->pixelSize(getPosition(),1.0f); 
     149                    setScale(size); 
     150                } 
    151151 
    152                 if (getAutoRotateToScreen())  
    153                 {  
    154                     osg::Quat rotation;  
    155                     cs->getModelViewMatrix().get(rotation);  
    156                     setRotation(rotation.inverse());  
    157                 }  
     152                if (_autoRotateMode==ROTATE_TO_SCREEN) 
     153                { 
     154                    osg::Quat rotation; 
     155                    cs->getModelViewMatrix().get(rotation);             
     156                    setRotation(rotation.inverse()); 
     157                } 
     158                else if (_autoRotateMode==ROTATE_TO_CAMERA) 
     159                { 
     160                    osg::Vec3 PosToEye = _position - eyePoint; 
     161                    osg::Matrix lookto = osg::Matrix::lookAt( 
     162                        osg::Vec3(0,0,0), PosToEye, cs->getUpLocal()); 
     163                    Quat q; 
     164                    q.set(osg::Matrix::inverse(lookto)); 
     165                    setRotation(q); 
     166                } 
    158167 
    159                 _previousEyePoint = eyePoint;  
    160                 _previousWidth = width;  
    161                 _previousHeight = height;  
    162                 _previousProjection = projection;  
    163                                 _previousPosition = position; 
     168                _previousEyePoint = eyePoint; 
     169                _previousWidth = width; 
     170                _previousHeight = height; 
     171                _previousProjection = projection; 
     172                _previousPosition = position; 
    164173 
    165                 _matrixDirty = true;  
    166             }  
     174                _matrixDirty = true; 
     175            } 
    167176 
    168         }  
    169     }  
    170       
    171     // now do the proper accept  
    172     Transform::accept(nv);  
    173 }  
     177        } 
     178    } 
     179     
     180    // now do the proper accept 
     181    Transform::accept(nv); 
     182} 
  • OpenSceneGraph/trunk/src/osgPlugins/osg/AutoTransform.cpp

    r3073 r3245  
    9494        { 
    9595                std::string w(fr[1].getStr()); 
    96                 transform.setAutoRotateToScreen(w == "TRUE"); 
     96                transform.setAutoRotateMode((w == "TRUE") ? osg::AutoTransform::ROTATE_TO_SCREEN : osg::AutoTransform::NO_ROTATION); 
     97                fr += 2; 
     98                iteratorAdvanced = true; 
     99        } 
     100 
     101        if (fr.matchSequence("autoRotateMode %w")) 
     102        { 
     103                std::string w(fr[1].getStr()); 
     104                if (w=="ROTATE_TO_SCREEN") transform.setAutoRotateMode(osg::AutoTransform::ROTATE_TO_SCREEN); 
     105                else if (w=="ROTATE_TO_CAMERA") transform.setAutoRotateMode(osg::AutoTransform::ROTATE_TO_CAMERA); 
     106                else if (w=="NO_ROTATION") transform.setAutoRotateMode(osg::AutoTransform::NO_ROTATION); 
     107                 
    97108                fr += 2; 
    98109                iteratorAdvanced = true; 
     
    119130    fw.indent()<<"scale "<<transform.getScale()<<std::endl; 
    120131    fw.indent()<<"pivotPoint "<<transform.getPivotPoint()<<std::endl; 
    121         fw.indent()<<"autoUpdateEyeMovementTolerance "<<transform.getAutoUpdateEyeMovementTolerance()<<std::endl; 
    122         fw.indent()<<"autoRotateToScreen "<<(transform.getAutoRotateToScreen()?"TRUE":"FALSE")<<std::endl; 
    123         fw.indent()<<"autoScaleToScreen "<<(transform.getAutoScaleToScreen()?"TRUE":"FALSE")<<std::endl; 
     132    fw.indent()<<"autoUpdateEyeMovementTolerance "<<transform.getAutoUpdateEyeMovementTolerance()<<std::endl; 
     133    fw.indent()<<"autoRotateMode "; 
     134    switch(transform.getAutoRotateMode()) 
     135    { 
     136      case(osg::AutoTransform::ROTATE_TO_SCREEN): fw<<"ROTATE_TO_SCREEN"<<std::endl; break; 
     137      case(osg::AutoTransform::ROTATE_TO_CAMERA): fw<<"ROTATE_TO_CAMERA"<<std::endl; break; 
     138      case(osg::AutoTransform::NO_ROTATION): 
     139      default: fw<<"NO_ROTATION"<<std::endl; break; 
     140    } 
     141 
     142 
     143    fw.indent()<<"autoScaleToScreen "<<(transform.getAutoScaleToScreen()?"TRUE":"FALSE")<<std::endl; 
    124144 
    125145    return true;