1 /* -*-c++-*- 2 * 3 * Copyright (C) 2006-2007 Mathias Froehlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 18 * MA 02110-1301, USA. 19 * 20 */ 21 22 #ifndef SG_ROTATE_TRANSFORM_HXX 23 #define SG_ROTATE_TRANSFORM_HXX 24 25 #include <osg/Transform> 26 #include <simgear/math/SGMath.hxx> 27 28 class SGRotateTransform : public osg::Transform { 29 public: 30 SGRotateTransform(); 31 SGRotateTransform(const SGRotateTransform&, 32 const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY); 33 34 META_Node(simgear, SGRotateTransform); 35 setCenter(const SGVec3f & center)36 void setCenter(const SGVec3f& center) 37 { setCenter(toVec3d(center)); } setCenter(const SGVec3d & center)38 void setCenter(const SGVec3d& center) 39 { _center = center; dirtyBound(); } getCenter() const40 const SGVec3d& getCenter() const 41 { return _center; } 42 setAxis(const SGVec3f & axis)43 void setAxis(const SGVec3f& axis) 44 { setAxis(toVec3d(axis)); } setAxis(const SGVec3d & axis)45 void setAxis(const SGVec3d& axis) 46 { _axis = axis; dirtyBound(); } getAxis() const47 const SGVec3d& getAxis() const 48 { return _axis; } 49 setAngleRad(double angle)50 void setAngleRad(double angle) 51 { _angleRad = angle; } getAngleRad() const52 double getAngleRad() const 53 { return _angleRad; } 54 setAngleDeg(double angle)55 void setAngleDeg(double angle) 56 { _angleRad = SGMiscd::deg2rad(angle); } getAngleDeg() const57 double getAngleDeg() const 58 { return SGMiscd::rad2deg(_angleRad); } 59 60 virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix, 61 osg::NodeVisitor* nv) const; 62 virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix, 63 osg::NodeVisitor* nv) const; 64 65 virtual osg::BoundingSphere computeBound() const; 66 67 // Useful for other classes too. 68 static void set_rotation (osg::Matrix &matrix, double position_rad, 69 const SGVec3d ¢er, const SGVec3d &axis); 70 private: 71 SGVec3d _center; 72 SGVec3d _axis; 73 double _angleRad; 74 }; 75 76 #endif 77