Changeset 3241

Show
Ignore:
Timestamp:
08/05/04 17:15:51 (10 years ago)
Author:
robert
Message:

From Jay Zuckerman, fixes to AutoTransform? so that it includes checking of
previous position value.

Location:
OpenSceneGraph/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osg/AutoTransform

    r3230 r3241  
    11/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield  
    2  * 
    3  * This library is open source and may be redistributed and/or modified under   
     2 *  
     3 * This library is open source and may be redistributed and/or modified under  
    44 * 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. 
     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.  
    77 *  
    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 
    1717#include <osg/AnimationPath> 
    18 #include <osg/Group> 
    19 #include <osg/Transform> 
    20 #include <osg/Quat> 
     18#include <osg/Group>  
     19#include <osg/Transform>  
     20#include <osg/Quat>  
    2121 
    22 namespace osg { 
     22namespace osg {  
    2323 
    2424/** 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(); 
     25  * to keep its children relative to screen space coordinates.  
     26*/  
     27class SG_EXPORT AutoTransform : public Transform  
     28{  
     29    public :  
     30        AutoTransform();  
    3131 
    32         AutoTransform(const AutoTransform& pat,const CopyOp& copyop=CopyOp::SHALLOW_COPY);             
     32        AutoTransform(const AutoTransform& pat,const CopyOp& copyop=CopyOp::SHALLOW_COPY);  
    3333 
    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"; } 
     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"; }  
    3939 
    40         virtual void accept(NodeVisitor& nv); 
     40        virtual void accept(NodeVisitor& nv);  
    4141 
    42         virtual AutoTransform* asAutoTransform() { return this; } 
    43         virtual const AutoTransform* asAutoTransform() const { return this; } 
     42        virtual AutoTransform* asAutoTransform() { return this; }  
     43        virtual const AutoTransform* asAutoTransform() const { return this; }  
    4444 
    4545        inline void setPosition(const Vec3& pos) { _position = pos; _matrixDirty=true; dirtyBound(); } 
    46         inline const Vec3& getPosition() const { return _position; } 
     46        inline const Vec3& getPosition() const { return _position; }  
    4747 
    4848 
    4949        inline void setRotation(const Quat& quat) { _rotation = quat; _matrixDirty=true; dirtyBound(); } 
    50         inline const Quat& getRotation() const { return _rotation; } 
    51          
     50        inline const Quat& getRotation() const { return _rotation; }  
     51          
    5252        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          
     53        inline void setScale(const Vec3& scale) { _scale = scale; dirtyBound(); }  
     54        inline const Vec3& getScale() const { return _scale; }  
     55          
    5656        inline void setPivotPoint(const Vec3& pivot) { _pivotPoint = pivot; _matrixDirty=true; dirtyBound(); } 
    57         inline const Vec3& getPivotPoint() const { return _pivotPoint; } 
    58          
     57        inline const Vec3& getPivotPoint() const { return _pivotPoint; }  
     58          
    5959 
    60         void setAutoUpdateEyeMovementTolerance(float tolerance) { _autoUpdateEyeMovementTolerance = tolerance; } 
    61         float getAutoUpdateEyeMovementTolerance() const { return _autoUpdateEyeMovementTolerance; } 
     60        void setAutoUpdateEyeMovementTolerance(float tolerance) { _autoUpdateEyeMovementTolerance = tolerance; }  
     61        float getAutoUpdateEyeMovementTolerance() const { return _autoUpdateEyeMovementTolerance; }  
    6262 
    6363        void setAutoRotateToScreen(bool autoRotateToScreen) { _autoRotateToScreen = autoRotateToScreen; _matrixDirty=true; } 
    64         bool getAutoRotateToScreen() const { return _autoRotateToScreen; } 
     64        bool getAutoRotateToScreen() const { return _autoRotateToScreen; }  
    6565 
    6666        void setAutoScaleToScreen(bool autoScaleToScreen) { _autoScaleToScreen = autoScaleToScreen; _matrixDirty=true; } 
    67         bool getAutoScaleToScreen() const { return _autoScaleToScreen; } 
     67        bool getAutoScaleToScreen() const { return _autoScaleToScreen; }  
    6868 
    6969 
    70         virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor* nv) const; 
     70        virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor* nv) const;  
    7171 
    72         virtual bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor* nv) const; 
     72        virtual bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor* nv) const;  
    7373 
    7474 
    7575 
    76     protected : 
    77              
    78         virtual ~AutoTransform() {} 
     76    protected :  
     77              
     78        virtual ~AutoTransform() {}  
     79          
     80 
     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;  
     94        mutable osg::Vec3 _previousPosition; 
     95 
     96 
     97        void computeMatrix() const;  
     98 
     99        mutable bool _matrixDirty;  
     100        mutable osg::Matrix _cachedMatrix;  
     101          
    79102         
     103          
     104};  
    80105 
    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; 
     106}  
    94107 
    95         void computeMatrix() const; 
    96  
    97         mutable bool        _matrixDirty; 
    98         mutable osg::Matrix _cachedMatrix; 
    99          
    100         
    101          
    102 }; 
    103  
    104 } 
    105  
    106 #endif 
     108#endif  
  • OpenSceneGraph/trunk/src/osg/AutoTransform.cpp

    r3076 r3241  
    11/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield  
    2  * 
    3  * This library is open source and may be redistributed and/or modified under   
     2 *  
     3 * This library is open source and may be redistributed and/or modified under  
    44 * 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. 
     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.  
    77 *  
    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    _autoRotateToScreen(false),  
     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), 
     
    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 
    115             const osg::Vec3& eyePoint = cs->getEyeLocal();     
     115            osg::Vec3 eyePoint = cs->getEyeLocal();  
     116                        osg::Vec3 position = getPosition(); 
    116117 
    117118            const osg::Matrix& projection = cs->getProjectionMatrix(); 
    118119 
    119             bool doUpdate = _firstTimeToInitEyePoint; 
    120             if (!_firstTimeToInitEyePoint) 
    121             { 
    122                 osg::Vec3 dv = _previousEyePoint-eyePoint; 
    123                 if (dv.length2()>getAutoUpdateEyeMovementTolerance()*(eyePoint-getPosition()).length2()) 
    124                 { 
    125                     doUpdate = true; 
    126                 } 
    127                 else if (width!=_previousWidth || height!=_previousHeight) 
    128                 { 
    129                     doUpdate = true; 
    130                 } 
     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                }  
    131132                else if (projection != _previousProjection)  
    132                 { 
    133                     doUpdate = true; 
    134                 }                 
    135             } 
    136             _firstTimeToInitEyePoint = false; 
     133                {  
     134                    doUpdate = true;  
     135                }  
     136                else if (position != _previousPosition)  
     137                {  
     138                    doUpdate = true;  
     139                }  
     140            }  
     141            _firstTimeToInitEyePoint = false;  
    137142 
    138             if (doUpdate) 
    139             {             
     143            if (doUpdate)  
     144            {  
    140145 
    141                 if (getAutoScaleToScreen()) 
    142                 { 
    143                     float size = 1.0f/cs->pixelSize(getPosition(),1.0f); 
    144                     setScale(size); 
    145                 } 
     146                if (getAutoScaleToScreen())  
     147                {  
     148                    float size = 1.0f/cs->pixelSize(getPosition(),1.0f);  
     149                    setScale(size);  
     150                }  
    146151 
    147                 if (getAutoRotateToScreen()) 
    148                 { 
    149                     osg::Quat rotation; 
    150                     cs->getModelViewMatrix().get(rotation);             
    151                     setRotation(rotation.inverse()); 
    152                 } 
     152                if (getAutoRotateToScreen())  
     153                {  
     154                    osg::Quat rotation;  
     155                    cs->getModelViewMatrix().get(rotation);  
     156                    setRotation(rotation.inverse());  
     157                }  
    153158 
    154                 _previousEyePoint = eyePoint; 
    155                 _previousWidth = width; 
    156                 _previousHeight = height; 
    157                 _previousProjection = projection; 
     159                _previousEyePoint = eyePoint;  
     160                _previousWidth = width;  
     161                _previousHeight = height;  
     162                _previousProjection = projection;  
     163                                _previousPosition = position; 
    158164 
    159                 _matrixDirty = true; 
    160             } 
     165                _matrixDirty = true;  
     166            }  
    161167 
    162         } 
    163     } 
    164      
    165     // now do the proper accept 
    166     Transform::accept(nv); 
    167 } 
     168        }  
     169    }  
     170      
     171    // now do the proper accept  
     172    Transform::accept(nv);  
     173}