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 ::