Guest User

Untitled

a guest
May 10th, 2012
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.80 KB | None | 0 0
  1. template <typename T>
  2. class CMatrix4
  3. {
  4. public:
  5.     CMatrix4 ()
  6.     {
  7.         _BuildMatrix ();
  8.         _FlushMatrix ();
  9.  
  10.         m_Data [0][0] = T (1);
  11.         m_Data [1][1] = T (1);
  12.         m_Data [2][2] = T (1);
  13.         m_Data [3][3] = T (1);
  14.     }
  15.  
  16.     CMatrix4 (
  17.         T m11, T m12, T m13, T m14,
  18.         T m21, T m22, T m23, T m24,
  19.         T m31, T m32, T m33, T m34,
  20.         T m41, T m42, T m43, T m44)
  21.     {
  22.         _BuildMatrix ();
  23.  
  24.         m_Data [0][0] = m11; m_Data [0][1] = m12; m_Data [0][2] = m13; m_Data [0][3] = m14;
  25.         m_Data [1][0] = m21; m_Data [1][1] = m22; m_Data [1][2] = m23; m_Data [1][3] = m24;
  26.         m_Data [2][0] = m31; m_Data [2][1] = m32; m_Data [2][2] = m33; m_Data [2][3] = m34;
  27.         m_Data [3][0] = m41; m_Data [3][1] = m42; m_Data [3][2] = m43; m_Data [3][3] = m44;
  28.     }
  29.  
  30.     CMatrix4 (const CMatrix4 & m)
  31.     {
  32.         _BuildMatrix ();
  33.        
  34.         for (int i = 0; i < 4; i++)
  35.         {
  36.             for (int ii = 0; ii < 4; ii++)
  37.             {
  38.                 m_Data [i][ii] = m [i][ii];
  39.             }
  40.         }
  41.     }
  42.  
  43.     ~CMatrix4 ()
  44.     {
  45.         _FreeMatrix ();
  46.     }
  47.  
  48.     CMatrix4 operator* (const CMatrix4 & o)
  49.     {
  50.         CMatrix4 result;
  51.  
  52.         //  Loop through the result indices
  53.         for (int i = 0; i < 4; i++)
  54.         {
  55.             for (int ii = 0; ii < 4; ii++)
  56.             {
  57.                 //  Then we get to the math of it
  58.                 result [i][ii] = 0;
  59.                 for (int a = 0; a < 4; a++)
  60.                 {
  61.                     result [i][ii] += m_Data [i][a] * o [a][ii];
  62.                 }
  63.             }
  64.         }
  65.  
  66.         return result;
  67.     }
  68.  
  69.     CMatrix4 operator* (const T& s) const
  70.     {
  71.         CMatrix4 result (*this);
  72.  
  73.         for (int i = 0; i < 4; i++)
  74.         {
  75.             for (int ii = 0; ii < 4; ii++)
  76.             {
  77.                 result [i][ii] *= s;
  78.             }
  79.         }
  80.  
  81.         return result;
  82.     }
  83.  
  84.     CMatrix4 & operator *= (const T& s)
  85.     {
  86.         //  TODO: FASTER
  87.         (*this) = (*this) * s;
  88.         return *this;
  89.     }
  90.  
  91.     CMatrix4 operator- ()
  92.     {
  93.         CMatrix4 result (*this);
  94.         result *= T (-1);
  95.         return result;
  96.     }
  97.  
  98.     CMatrix4 & operator= (const CMatrix4 & o)
  99.     {
  100.         for (int i = 0; i < 4; i++)
  101.         {
  102.             for (int ii = 0; ii < 4; ii++)
  103.             {
  104.                 m_Data [i][ii] = o [i][ii];
  105.             }
  106.         }
  107.        
  108.         return *this;
  109.     }
  110.  
  111.     T * operator[] (ore::t_UInteger i)
  112.     {
  113.         return m_Data [i];
  114.     }
  115.  
  116.     const T * operator[] (ore::t_UInteger i) const
  117.     {
  118.         return m_Data [i];
  119.     }
  120.  
  121.     void Transpose ()
  122.     {
  123.         CMatrix4 original (*this);
  124.  
  125.         for (int i = 0; i < 4; i++)
  126.         {
  127.             for (int ii = 0; ii < 4; ii++)
  128.             {
  129.                 m_Data [i][ii] = original [ii][i];
  130.             }
  131.         }
  132.     }
  133.  
  134.     void Translate (const T& x, const T& y, const T& z)
  135.     {
  136.         T w = T (1);
  137.  
  138.         //  Components of the transformed vector
  139.         T vec1, vec2, vec3;
  140.  
  141.         //  Transform the translation vector
  142.         vec1 = x*m_Data[0][0] + y*m_Data[1][0] + z*m_Data[2][0] + w*m_Data[3][0];
  143.         vec2 = x*m_Data[0][1] + y*m_Data[1][1] + z*m_Data[2][1] + w*m_Data[3][1];
  144.         vec3 = x*m_Data[0][2] + y*m_Data[1][2] + z*m_Data[2][2] + w*m_Data[3][2];
  145.  
  146.         m_Data [3][0] += vec1;
  147.         m_Data [3][1] += vec2;
  148.         m_Data [3][2] += vec3;
  149.     }
  150.  
  151.     void RotateX (float radians)
  152.     {
  153.         (*this) = (*this) * CMatrix4 (
  154.             10,              0,              0,
  155.             0cos (radians)sin (radians)0,
  156.             0, -sin (radians)cos (radians)0,
  157.             00,              0,              1
  158.             );
  159.     }
  160.  
  161.     void RotateY (float radians)
  162.     {
  163.         (*this) = (*this) * CMatrix4 (
  164.             cos (radians)0-sin (radians), 0,
  165.             0,      10,      0,
  166.             sin (radians)0cos (radians)0,
  167.             0,      00,      1
  168.             );
  169.     }
  170.  
  171.     void RotateZ (float radians)
  172.     {
  173.         (*this) = (*this) * CMatrix4 (
  174.             cos (radians)sin (radians)00,
  175.             -sin (radians), cos (radians)00,
  176.             0,      0,      10,
  177.             0,      0,      01
  178.             );
  179.     }
  180.  
  181.     void Rotate (float x, float y, float z)
  182.     {
  183.         RotateX (x);
  184.         RotateY (y);
  185.         RotateZ (z);
  186.     }
  187.  
  188.     void Scale (float x, float y, float z)
  189.     {
  190.         (*this) = (*this) * CMatrix4 (
  191.             x,  000,
  192.             0,  y,  00,
  193.             00,  z,  0,
  194.             0001
  195.             );
  196.     }
  197.  
  198.     void PrintContents ()
  199.     {
  200.         ore::Diagnostics::Message (true)
  201.             .Append ("4x4 Matrix Contents:\n")
  202.             .Append ("{ ").Append (m_Data[0][0]).Append (", ").Append (m_Data [0][1]).Append (", ").Append (m_Data [0][2]).Append (", ").Append (m_Data [0][3]).Append ("}\n")
  203.             .Append ("{ ").Append (m_Data[1][0]).Append (", ").Append (m_Data [1][1]).Append (", ").Append (m_Data [1][2]).Append (", ").Append (m_Data [1][3]).Append ("}\n")
  204.             .Append ("{ ").Append (m_Data[2][0]).Append (", ").Append (m_Data [2][1]).Append (", ").Append (m_Data [2][2]).Append (", ").Append (m_Data [2][3]).Append ("}\n")
  205.             .Append ("{ ").Append (m_Data[3][0]).Append (", ").Append (m_Data [3][1]).Append (", ").Append (m_Data [3][2]).Append (", ").Append (m_Data [3][3]).Append ("}\n")
  206.             .Display ();
  207.     }
  208.  
  209.  
  210.  
  211. private:
  212.     T ** m_Data;
  213.  
  214.     void _BuildMatrix ()
  215.     {
  216.         m_Data = new T* [4];
  217.         for (int i = 0; i < 4; i++)
  218.         {
  219.             m_Data [i] = new T [4];
  220.         }
  221.     }
  222.  
  223.     void _FreeMatrix ()
  224.     {
  225.         for (int i = 0; i < 4; i++)
  226.         {
  227.             delete [] m_Data [i];
  228.         }
  229.  
  230.         delete [] m_Data;
  231.     }
  232.  
  233.     //  NULLs the matrix
  234.     void _FlushMatrix ()
  235.     {
  236.         for (int i = 0; i < 4; i++)
  237.         {
  238.             for (int ii = 0; ii < 4; ii++)
  239.             {
  240.                 m_Data [i][ii] = NULL;
  241.             }
  242.         }
  243.     }
  244. };
Advertisement
Add Comment
Please, Sign In to add comment