//C++ header - Open Scene Graph - Copyright (C) 1998-2002 Robert Osfield //Distributed under the terms of the GNU Library General Public License (LGPL) //as published by the Free Software Foundation. #ifndef OSG_MATRIXTRANSFORM #define OSG_MATRIXTRANSFORM 1 #include namespace osg { /** MatrixTransform - is a subclass of Transform which has an osg::Matrix * which represent a 4x4 transformation of its children from local cordinates * into the Transform's parent coordinates. */ class SG_EXPORT MatrixTransform : public Transform { public : MatrixTransform(); /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ MatrixTransform(const MatrixTransform&,const CopyOp& copyop=CopyOp::SHALLOW_COPY); MatrixTransform(const Matrix& matix); META_Node(osg, MatrixTransform); /** Set the transform's matrix.*/ void setMatrix(const Matrix& mat) { (*_matrix) = mat; _inverseDirty=true; computeInverse(); dirtyBound(); } /** Get the transform's matrix. */ inline const Matrix& getMatrix() const { return *_matrix; } /** preMult transform.*/ void preMult(const Matrix& mat) { _matrix->preMult(mat); _inverseDirty=true; computeInverse(); dirtyBound(); } /** postMult transform.*/ void postMult(const Matrix& mat) { _matrix->postMult(mat); _inverseDirty=true; computeInverse(); dirtyBound(); } virtual const bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const { if (_referenceFrame==RELATIVE_TO_PARENTS) { matrix.preMult(*_matrix); } else // absolute { matrix = *_matrix; } return true; } virtual const bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const { if (_referenceFrame==RELATIVE_TO_PARENTS) { matrix.postMult(*_inverse); } else // absolute { matrix = *_inverse; } return true; } protected : virtual ~MatrixTransform(); inline void computeInverse() const { if (_inverseDirty) { _inverse->invert(*_matrix); _inverseDirty = false; } } ref_ptr _matrix; mutable ref_ptr _inverse; mutable bool _inverseDirty; }; } #endif