Initial revision
[blender.git] / intern / moto / include / MT_Transform.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
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
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 /*
33
34   MoTo - 3D Motion Toolkit 
35   Copyright (C) 2000  Gino van den Bergen <gino@acm.org>
36
37   This library is free software; you can redistribute it and/or
38   modify it under the terms of the GNU Library General Public
39   License as published by the Free Software Foundation; either
40   version 2 of the License, or (at your option) any later version.
41
42   This library is distributed in the hope that it will be useful,
43   but WITHOUT ANY WARRANTY; without even the implied warranty of
44   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
45   Library General Public License for more details.
46
47   You should have received a copy of the GNU Library General Public
48   License along with this library; if not, write to the Free
49   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
50
51 */
52
53 #ifndef MT_TRANSFORM_H
54 #define MT_TRANSFORM_H
55
56 #include "MT_Point3.h"
57 #include "MT_Matrix3x3.h"
58
59 class MT_Transform {
60 public:
61     MT_Transform() {}
62     MT_Transform(const float *m) { setValue(m); }
63     MT_Transform(const double *m) { setValue(m); }
64     MT_Transform(const MT_Point3& p, const MT_Quaternion& q) { 
65                 setOrigin(p);
66                 setRotation(q);
67         }
68
69     MT_Transform(const MT_Point3& p, const MT_Matrix3x3& m) { 
70                 setOrigin(p);
71                 setBasis(m);
72         }
73
74
75
76     MT_Point3 operator()(const MT_Point3& p) const {
77         return MT_Point3(MT_dot(m_basis[0], p) + m_origin[0], 
78                          MT_dot(m_basis[1], p) + m_origin[1], 
79                          MT_dot(m_basis[2], p) + m_origin[2]);
80     }
81     
82     MT_Point3 operator*(const MT_Point3& p) const {
83         return (*this)(p);
84     }
85     
86     MT_Matrix3x3&         getBasis()          { return m_basis; }
87     const MT_Matrix3x3&   getBasis()    const { return m_basis; }
88     MT_Point3&            getOrigin()         { return m_origin; }
89     const MT_Point3&      getOrigin()   const { return m_origin; }
90     MT_Quaternion         getRotation() const { return m_basis.getRotation(); }
91     
92     void setValue(const float *m);
93     void setValue(const double *m);
94
95     void setOrigin(const MT_Point3& origin) { 
96         m_origin = origin;
97                 m_type |= TRANSLATION;
98     }
99
100     void setBasis(const MT_Matrix3x3& basis) { 
101         m_basis = basis;
102                 m_type |= LINEAR;
103     }
104
105     void setRotation(const MT_Quaternion& q) {
106         m_basis.setRotation(q);
107                 m_type &= ~SCALING;
108                 m_type |= ROTATION;
109     }
110     
111     void getValue(float *m) const;
112     void getValue(double *m) const;
113
114     void setIdentity();
115     
116     MT_Transform& operator*=(const MT_Transform& t);
117
118         /**
119          * Translate the origin of the transform according to the vector.
120          * @param v The vector to translate over. The vector is specified
121          *          in the coordinate system of the transform itself.
122          */
123     void translate(const MT_Vector3& v);
124     void rotate(const MT_Quaternion& q);
125     void scale(MT_Scalar x, MT_Scalar y, MT_Scalar z);
126     
127     void invert(const MT_Transform& t);
128     void mult(const MT_Transform& t1, const MT_Transform& t2);
129     void multInverseLeft(const MT_Transform& t1, const MT_Transform& t2); 
130     
131 private:
132     enum { 
133         IDENTITY    = 0x00, 
134         TRANSLATION = 0x01,
135         ROTATION    = 0x02,
136         RIGID       = TRANSLATION | ROTATION,  
137         SCALING     = 0x04,
138         LINEAR      = ROTATION | SCALING,
139         AFFINE      = TRANSLATION | LINEAR
140     };
141     
142     MT_Transform(const MT_Matrix3x3& basis, const MT_Point3& origin,
143                  unsigned int type) {
144         setValue(basis, origin, type);
145     }
146     
147     void setValue(const MT_Matrix3x3& basis, const MT_Point3& origin,
148                   unsigned int type) {
149         m_basis  = basis;
150         m_origin = origin;
151         m_type   = type;
152     }
153     
154     friend MT_Transform operator*(const MT_Transform& t1, const MT_Transform& t2);
155
156     MT_Matrix3x3 m_basis;
157     MT_Point3    m_origin;
158     unsigned int m_type;
159 };
160
161 inline MT_Transform operator*(const MT_Transform& t1, const MT_Transform& t2) {
162     return MT_Transform(t1.m_basis * t2.m_basis, 
163                         t1(t2.m_origin), 
164                         t1.m_type | t2.m_type);
165 }
166
167 #endif
168
169
170
171
172