Another set of UI messages fixes and tweaks! No functional changes.
[blender.git] / extern / Eigen3 / Eigen / src / Eigen2Support / Geometry / RotationBase.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra. Eigen itself is part of the KDE project.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5 //
6 // Eigen is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 3 of the License, or (at your option) any later version.
10 //
11 // Alternatively, you can redistribute it and/or
12 // modify it under the terms of the GNU General Public License as
13 // published by the Free Software Foundation; either version 2 of
14 // the License, or (at your option) any later version.
15 //
16 // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU Lesser General Public
22 // License and a copy of the GNU General Public License along with
23 // Eigen. If not, see <http://www.gnu.org/licenses/>.
24
25 // no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
26
27 // this file aims to contains the various representations of rotation/orientation
28 // in 2D and 3D space excepted Matrix and Quaternion.
29
30 /** \class RotationBase
31   *
32   * \brief Common base class for compact rotation representations
33   *
34   * \param Derived is the derived type, i.e., a rotation type
35   * \param _Dim the dimension of the space
36   */
37 template<typename Derived, int _Dim>
38 class RotationBase
39 {
40   public:
41     enum { Dim = _Dim };
42     /** the scalar type of the coefficients */
43     typedef typename ei_traits<Derived>::Scalar Scalar;
44     
45     /** corresponding linear transformation matrix type */
46     typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;
47
48     inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
49     inline Derived& derived() { return *static_cast<Derived*>(this); }
50
51     /** \returns an equivalent rotation matrix */
52     inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }
53
54     /** \returns the inverse rotation */
55     inline Derived inverse() const { return derived().inverse(); }
56
57     /** \returns the concatenation of the rotation \c *this with a translation \a t */
58     inline Transform<Scalar,Dim> operator*(const Translation<Scalar,Dim>& t) const
59     { return toRotationMatrix() * t; }
60
61     /** \returns the concatenation of the rotation \c *this with a scaling \a s */
62     inline RotationMatrixType operator*(const Scaling<Scalar,Dim>& s) const
63     { return toRotationMatrix() * s; }
64
65     /** \returns the concatenation of the rotation \c *this with an affine transformation \a t */
66     inline Transform<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const
67     { return toRotationMatrix() * t; }
68 };
69
70 /** \geometry_module
71   *
72   * Constructs a Dim x Dim rotation matrix from the rotation \a r
73   */
74 template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
75 template<typename OtherDerived>
76 Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
77 ::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
78 {
79   EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
80   *this = r.toRotationMatrix();
81 }
82
83 /** \geometry_module
84   *
85   * Set a Dim x Dim rotation matrix from the rotation \a r
86   */
87 template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
88 template<typename OtherDerived>
89 Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>&
90 Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
91 ::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
92 {
93   EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
94   return *this = r.toRotationMatrix();
95 }
96
97 /** \internal
98   *
99   * Helper function to return an arbitrary rotation object to a rotation matrix.
100   *
101   * \param Scalar the numeric type of the matrix coefficients
102   * \param Dim the dimension of the current space
103   *
104   * It returns a Dim x Dim fixed size matrix.
105   *
106   * Default specializations are provided for:
107   *   - any scalar type (2D),
108   *   - any matrix expression,
109   *   - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)
110   *
111   * Currently ei_toRotationMatrix is only used by Transform.
112   *
113   * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis
114   */
115 template<typename Scalar, int Dim>
116 inline static Matrix<Scalar,2,2> ei_toRotationMatrix(const Scalar& s)
117 {
118   EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
119   return Rotation2D<Scalar>(s).toRotationMatrix();
120 }
121
122 template<typename Scalar, int Dim, typename OtherDerived>
123 inline static Matrix<Scalar,Dim,Dim> ei_toRotationMatrix(const RotationBase<OtherDerived,Dim>& r)
124 {
125   return r.toRotationMatrix();
126 }
127
128 template<typename Scalar, int Dim, typename OtherDerived>
129 inline static const MatrixBase<OtherDerived>& ei_toRotationMatrix(const MatrixBase<OtherDerived>& mat)
130 {
131   EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim,
132     YOU_MADE_A_PROGRAMMING_MISTAKE)
133   return mat;
134 }