SFML logo
  • Main Page
  • Namespaces
  • Classes
  • Files
  • File List

Matrix3.inl

00001 
00002 //
00003 // SFGE - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00025 
00029 inline Matrix3::Matrix3()
00030 {
00031     myData[0] = 1.f; myData[4] = 0.f; myData[8]  = 0.f; myData[12] = 0.f;
00032     myData[1] = 0.f; myData[5] = 1.f; myData[9]  = 0.f; myData[13] = 0.f;
00033     myData[2] = 0.f; myData[6] = 0.f; myData[10] = 1.f; myData[14] = 0.f;
00034     myData[3] = 0.f; myData[7] = 0.f; myData[11] = 0.f; myData[15] = 1.f;
00035 }
00036 
00037 
00041 inline Matrix3::Matrix3(float a00, float a01, float a02,
00042                         float a10, float a11, float a12,
00043                         float a20, float a21, float a22)
00044 {
00045     myData[0] = a00; myData[4] = a01; myData[8]  = 0.f; myData[12] = a02;
00046     myData[1] = a10; myData[5] = a11; myData[9]  = 0.f; myData[13] = a12;
00047     myData[2] = 0.f; myData[6] = 0.f; myData[10] = 1.f; myData[14] = 0.f;
00048     myData[3] = a20; myData[7] = a21; myData[11] = 0.f; myData[15] = a22;
00049 }
00050 
00051 
00055 inline void Matrix3::SetFromTransformations(const Vector2f& origin, const Vector2f& translation, float rotation, const Vector2f& scale)
00056 {
00057     // Combine the transformations
00058     float angle  = rotation * 3.141592654f / 180.f;
00059     float cosine = static_cast<float>(cos(angle));
00060     float sine   = static_cast<float>(sin(angle));
00061     float sxCos  = scale.x * cosine;
00062     float syCos  = scale.y * cosine;
00063     float sxSin  = scale.x * sine;
00064     float sySin  = scale.y * sine;
00065     float tx     = -origin.x * sxCos - origin.y * sySin + translation.x;
00066     float ty     =  origin.x * sxSin - origin.y * syCos + translation.y;
00067 
00068     // Rebuild the matrix
00069     myData[0] =  sxCos; myData[4] = sySin; myData[8]  = 0.f; myData[12] = tx;
00070     myData[1] = -sxSin; myData[5] = syCos; myData[9]  = 0.f; myData[13] = ty;
00071     myData[2] =  0.f;   myData[6] = 0.f;   myData[10] = 1.f; myData[14] = 0.f;
00072     myData[3] =  0.f;   myData[7] = 0.f;   myData[11] = 0.f; myData[15] = 1.f;
00073 }
00074 
00075 
00079 inline void Matrix3::SetFromProjection(const Vector2f& center, const Vector2f& size, float rotation)
00080 {
00081     // Rotation components
00082     float angle  = rotation * 3.141592654f / 180.f;
00083     float cosine = static_cast<float>(cos(angle));
00084     float sine   = static_cast<float>(sin(angle));
00085     float tx     = -center.x * cosine - center.y * sine + center.x;
00086     float ty     =  center.x * sine - center.y * cosine + center.y;
00087 
00088     // Projection components
00089     float a =  2.f / size.x;
00090     float b = -2.f / size.y;
00091     float c = -a * center.x;
00092     float d = -b * center.y;
00093 
00094     // Rebuild the projection matrix
00095     myData[0] =  a * cosine; myData[4] = a * sine;   myData[8]  = 0.f; myData[12] = a * tx + c;
00096     myData[1] = -b * sine;   myData[5] = b * cosine; myData[9]  = 0.f; myData[13] = b * ty + d;
00097     myData[2] = 0.f;         myData[6] = 0.f;        myData[10] = 1.f; myData[14] = 0.f;
00098     myData[3] = 0.f;         myData[7] = 0.f;        myData[11] = 0.f; myData[15] = 1.f;
00099 }
00100 
00101 
00105 inline Vector2f Matrix3::Transform(const Vector2f& point) const
00106 {
00107     return Vector2f(myData[0] * point.x + myData[4] * point.y + myData[12],
00108                     myData[1] * point.x + myData[5] * point.y + myData[13]);
00109 }
00110 
00111 
00115 inline Matrix3 Matrix3::GetInverse() const
00116 {
00117     // Compute the determinant
00118     float det = myData[0] * (myData[15] * myData[5] - myData[7] * myData[13]) -
00119                 myData[1] * (myData[15] * myData[4] - myData[7] * myData[12]) +
00120                 myData[3] * (myData[13] * myData[4] - myData[5] * myData[12]);
00121 
00122     // Compute the inverse if determinant is not zero
00123     if (det != 0.f) // don't use an epsilon because the determinant may *really* be tiny
00124     {
00125         return Matrix3( (myData[15] * myData[5] - myData[7] * myData[13]) / det,
00126                        -(myData[15] * myData[4] - myData[7] * myData[12]) / det,
00127                         (myData[13] * myData[4] - myData[5] * myData[12]) / det,
00128                        -(myData[15] * myData[1] - myData[3] * myData[13]) / det,
00129                         (myData[15] * myData[0] - myData[3] * myData[12]) / det,
00130                        -(myData[13] * myData[0] - myData[1] * myData[12]) / det,
00131                         (myData[7]  * myData[1] - myData[3] * myData[5])  / det,
00132                        -(myData[7]  * myData[0] - myData[3] * myData[4])  / det,
00133                         (myData[5]  * myData[0] - myData[1] * myData[4])  / det);
00134     }
00135     else
00136     {
00137         return Identity;
00138     }
00139 }
00140 
00141 
00146 inline const float* Matrix3::Get4x4Elements() const
00147 {
00148     return myData;
00149 }
00150 
00151 
00155 inline float Matrix3::operator ()(unsigned int row, unsigned int column) const
00156 {
00157     switch (row + column * 3)
00158     {
00159         case 0 : return myData[0];
00160         case 1 : return myData[1];
00161         case 2 : return myData[3];
00162         case 3 : return myData[4];
00163         case 4 : return myData[5];
00164         case 5 : return myData[7];
00165         case 6 : return myData[12];
00166         case 7 : return myData[13];
00167         case 8 : return myData[15];
00168 
00169         default : return myData[0];
00170     }
00171 }
00172 inline float& Matrix3::operator ()(unsigned int row, unsigned int column)
00173 {
00174     switch (row + column * 3)
00175     {
00176         case 0 : return myData[0];
00177         case 1 : return myData[1];
00178         case 2 : return myData[3];
00179         case 3 : return myData[4];
00180         case 4 : return myData[5];
00181         case 5 : return myData[7];
00182         case 6 : return myData[12];
00183         case 7 : return myData[13];
00184         case 8 : return myData[15];
00185 
00186         default : return myData[0];
00187     }
00188 }
00189 
00190 
00194 inline Matrix3 Matrix3::operator *(const Matrix3& right) const
00195 {
00196     return Matrix3(myData[0] * right.myData[0]  + myData[4] * right.myData[1]  + myData[12] * right.myData[3],
00197                    myData[0] * right.myData[4]  + myData[4] * right.myData[5]  + myData[12] * right.myData[7],
00198                    myData[0] * right.myData[12] + myData[4] * right.myData[13] + myData[12] * right.myData[15],
00199                    myData[1] * right.myData[0]  + myData[5] * right.myData[1]  + myData[13] * right.myData[3],
00200                    myData[1] * right.myData[4]  + myData[5] * right.myData[5]  + myData[13] * right.myData[7],
00201                    myData[1] * right.myData[12] + myData[5] * right.myData[13] + myData[13] * right.myData[15],
00202                    myData[3] * right.myData[0]  + myData[7] * right.myData[1]  + myData[15] * right.myData[3],
00203                    myData[3] * right.myData[4]  + myData[7] * right.myData[5]  + myData[15] * right.myData[7],
00204                    myData[3] * right.myData[12] + myData[7] * right.myData[13] + myData[15] * right.myData[15]);
00205 }
00206 
00207 
00211 inline Matrix3& Matrix3::operator *=(const Matrix3& right)
00212 {
00213     return *this = *this * right;
00214 }

 ::  Copyright © 2007-2008 Laurent Gomila, all rights reserved  ::  Documentation generated by doxygen 1.5.2  ::