svn merge -r 21041:21301 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender.git] / intern / moto / include / MT_Matrix3x3.h
old mode 100755 (executable)
new mode 100644 (file)
index fb899a7..c6d299d
@@ -1,14 +1,11 @@
 /**
  * $Id$
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License.  See http://www.blender.org/BL/ for information
- * about this.
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -26,7 +23,7 @@
  *
  * Contributor(s): none yet.
  *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * ***** END GPL LICENSE BLOCK *****
  */
 
 /*
@@ -101,6 +98,18 @@ public:
         m_el[0][2] = *m++; m_el[1][2] = *m++; m_el[2][2] = *m;
     }
 
+    void setValue3x3(const float *m) {
+        m_el[0][0] = *m++; m_el[1][0] = *m++; m_el[2][0] = *m++;
+        m_el[0][1] = *m++; m_el[1][1] = *m++; m_el[2][1] = *m++;
+        m_el[0][2] = *m++; m_el[1][2] = *m++; m_el[2][2] = *m;
+    }
+
+    void setValue3x3(const double *m) {
+        m_el[0][0] = *m++; m_el[1][0] = *m++; m_el[2][0] = *m++;
+        m_el[0][1] = *m++; m_el[1][1] = *m++; m_el[2][1] = *m++;
+        m_el[0][2] = *m++; m_el[1][2] = *m++; m_el[2][2] = *m;
+    }
+
     void setValue(MT_Scalar xx, MT_Scalar xy, MT_Scalar xz, 
                   MT_Scalar yx, MT_Scalar yy, MT_Scalar yz, 
                   MT_Scalar zx, MT_Scalar zy, MT_Scalar zz) {
@@ -147,6 +156,26 @@ public:
                                 -sj,      cj * si,      cj * ci);
        }
 
+       void getEuler(MT_Scalar& yaw, MT_Scalar& pitch, MT_Scalar& roll) const
+               {                       
+                       if (m_el[2][0] != -1.0 && m_el[2][0] != 1.0) {
+                               pitch = MT_Scalar(-asin(m_el[2][0]));
+                               yaw = MT_Scalar(atan2(m_el[2][1] / cos(pitch), m_el[2][2] / cos(pitch)));
+                               roll = MT_Scalar(atan2(m_el[1][0] / cos(pitch), m_el[0][0] / cos(pitch)));                              
+                       }
+                       else {
+                               roll = MT_Scalar(0);
+                               if (m_el[2][0] == -1.0) {
+                                       pitch = MT_PI / 2.0;
+                                       yaw = MT_Scalar(atan2(m_el[0][1], m_el[0][2]));
+                               }
+                               else {
+                                       pitch = - MT_PI / 2.0;
+                                       yaw = MT_Scalar(atan2(m_el[0][1], m_el[0][2]));
+                               }
+                       }
+               }
+
     void scale(MT_Scalar x, MT_Scalar y, MT_Scalar z) {
         m_el[0][0] *= x; m_el[0][1] *= y; m_el[0][2] *= z;
         m_el[1][0] *= x; m_el[1][1] *= y; m_el[1][2] *= z;
@@ -177,6 +206,18 @@ public:
         *m++ = m_el[0][2]; *m++ = m_el[1][2]; *m++ = m_el[2][2]; *m   = 0.0;
     }
 
+    void getValue3x3(float *m) const {
+        *m++ = (float) m_el[0][0]; *m++ = (float) m_el[1][0]; *m++ = (float) m_el[2][0];
+        *m++ = (float) m_el[0][1]; *m++ = (float) m_el[1][1]; *m++ = (float) m_el[2][1];
+        *m++ = (float) m_el[0][2]; *m++ = (float) m_el[1][2]; *m++ = (float) m_el[2][2];
+    }
+
+    void getValue3x3(double *m) const {
+        *m++ = m_el[0][0]; *m++ = m_el[1][0]; *m++ = m_el[2][0];
+        *m++ = m_el[0][1]; *m++ = m_el[1][1]; *m++ = m_el[2][1];
+        *m++ = m_el[0][2]; *m++ = m_el[1][2]; *m++ = m_el[2][2];
+    }
+
     MT_Quaternion getRotation() const;
 
     MT_Matrix3x3& operator*=(const MT_Matrix3x3& m);