2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file FBaseFloatMatrix4.cpp
19 * @brief This is the implementation for FloatMatrix class.
21 #include <FBaseFloatMatrix4.h>
22 #include <FBaseSysLog.h>
24 namespace Tizen { namespace Base
27 static const int MATRIX_SIZE = sizeof(float) * 16;
28 #define SWAP_VALUES(a, b, tmp) \
33 FloatMatrix4::FloatMatrix4(void)
39 FloatMatrix4::FloatMatrix4(const FloatMatrix4& rhs)
42 memcpy(matrix, rhs.matrix, MATRIX_SIZE);
45 FloatMatrix4::FloatMatrix4(const float matrix[4][4])
48 memcpy(this->matrix, matrix, MATRIX_SIZE);
51 FloatMatrix4::~FloatMatrix4(void)
56 FloatMatrix4::operator ==(const FloatMatrix4& rhs) const
63 return (matrix[0][0] == rhs.matrix[0][0] &&
64 matrix[0][1] == rhs.matrix[0][1] &&
65 matrix[0][2] == rhs.matrix[0][2] &&
66 matrix[0][3] == rhs.matrix[0][3] &&
67 matrix[1][0] == rhs.matrix[1][0] &&
68 matrix[1][1] == rhs.matrix[1][1] &&
69 matrix[1][2] == rhs.matrix[1][2] &&
70 matrix[1][3] == rhs.matrix[1][3] &&
71 matrix[2][0] == rhs.matrix[2][0] &&
72 matrix[2][1] == rhs.matrix[2][1] &&
73 matrix[2][2] == rhs.matrix[2][2] &&
74 matrix[2][3] == rhs.matrix[2][3] &&
75 matrix[3][0] == rhs.matrix[3][0] &&
76 matrix[3][1] == rhs.matrix[3][1] &&
77 matrix[3][2] == rhs.matrix[3][2] &&
78 matrix[3][3] == rhs.matrix[3][3]);
82 FloatMatrix4::operator !=(const FloatMatrix4& rhs) const
84 return !(*this == rhs);
88 FloatMatrix4::operator =(const FloatMatrix4& rhs)
92 memcpy(matrix, rhs.matrix, MATRIX_SIZE);
99 FloatMatrix4::operator =(float value)
101 matrix[0][0] = value;
102 matrix[1][0] = value;
103 matrix[2][0] = value;
104 matrix[3][0] = value;
106 matrix[0][1] = value;
107 matrix[1][1] = value;
108 matrix[2][1] = value;
109 matrix[3][1] = value;
111 matrix[0][2] = value;
112 matrix[1][2] = value;
113 matrix[2][2] = value;
114 matrix[3][2] = value;
116 matrix[0][3] = value;
117 matrix[1][3] = value;
118 matrix[2][3] = value;
119 matrix[3][3] = value;
125 FloatMatrix4::operator *(const FloatMatrix4& rhs) const // need to check performance
127 FloatMatrix4 resultMatrix;
129 resultMatrix.matrix[0][0] = matrix[0][0] * rhs.matrix[0][0] + matrix[0][1] * rhs.matrix[1][0] + matrix[0][2] * rhs.matrix[2][0] + matrix[0][3] * rhs.matrix[3][0];
130 resultMatrix.matrix[0][1] = matrix[0][0] * rhs.matrix[0][1] + matrix[0][1] * rhs.matrix[1][1] + matrix[0][2] * rhs.matrix[2][1] + matrix[0][3] * rhs.matrix[3][1];
131 resultMatrix.matrix[0][2] = matrix[0][0] * rhs.matrix[0][2] + matrix[0][1] * rhs.matrix[1][2] + matrix[0][2] * rhs.matrix[2][2] + matrix[0][3] * rhs.matrix[3][2];
132 resultMatrix.matrix[0][3] = matrix[0][0] * rhs.matrix[0][3] + matrix[0][1] * rhs.matrix[1][3] + matrix[0][2] * rhs.matrix[2][3] + matrix[0][3] * rhs.matrix[3][3];
134 resultMatrix.matrix[1][0] = matrix[1][0] * rhs.matrix[0][0] + matrix[1][1] * rhs.matrix[1][0] + matrix[1][2] * rhs.matrix[2][0] + matrix[1][3] * rhs.matrix[3][0];
135 resultMatrix.matrix[1][1] = matrix[1][0] * rhs.matrix[0][1] + matrix[1][1] * rhs.matrix[1][1] + matrix[1][2] * rhs.matrix[2][1] + matrix[1][3] * rhs.matrix[3][1];
136 resultMatrix.matrix[1][2] = matrix[1][0] * rhs.matrix[0][2] + matrix[1][1] * rhs.matrix[1][2] + matrix[1][2] * rhs.matrix[2][2] + matrix[1][3] * rhs.matrix[3][2];
137 resultMatrix.matrix[1][3] = matrix[1][0] * rhs.matrix[0][3] + matrix[1][1] * rhs.matrix[1][3] + matrix[1][2] * rhs.matrix[2][3] + matrix[1][3] * rhs.matrix[3][3];
139 resultMatrix.matrix[2][0] = matrix[2][0] * rhs.matrix[0][0] + matrix[2][1] * rhs.matrix[1][0] + matrix[2][2] * rhs.matrix[2][0] + matrix[2][3] * rhs.matrix[3][0];
140 resultMatrix.matrix[2][1] = matrix[2][0] * rhs.matrix[0][1] + matrix[2][1] * rhs.matrix[1][1] + matrix[2][2] * rhs.matrix[2][1] + matrix[2][3] * rhs.matrix[3][1];
141 resultMatrix.matrix[2][2] = matrix[2][0] * rhs.matrix[0][2] + matrix[2][1] * rhs.matrix[1][2] + matrix[2][2] * rhs.matrix[2][2] + matrix[2][3] * rhs.matrix[3][2];
142 resultMatrix.matrix[2][3] = matrix[2][0] * rhs.matrix[0][3] + matrix[2][1] * rhs.matrix[1][3] + matrix[2][2] * rhs.matrix[2][3] + matrix[2][3] * rhs.matrix[3][3];
144 resultMatrix.matrix[3][0] = matrix[3][0] * rhs.matrix[0][0] + matrix[3][1] * rhs.matrix[1][0] + matrix[3][2] * rhs.matrix[2][0] + matrix[3][3] * rhs.matrix[3][0];
145 resultMatrix.matrix[3][1] = matrix[3][0] * rhs.matrix[0][1] + matrix[3][1] * rhs.matrix[1][1] + matrix[3][2] * rhs.matrix[2][1] + matrix[3][3] * rhs.matrix[3][1];
146 resultMatrix.matrix[3][2] = matrix[3][0] * rhs.matrix[0][2] + matrix[3][1] * rhs.matrix[1][2] + matrix[3][2] * rhs.matrix[2][2] + matrix[3][3] * rhs.matrix[3][2];
147 resultMatrix.matrix[3][3] = matrix[3][0] * rhs.matrix[0][3] + matrix[3][1] * rhs.matrix[1][3] + matrix[3][2] * rhs.matrix[2][3] + matrix[3][3] * rhs.matrix[3][3];
153 FloatMatrix4::operator *(float value) const
155 FloatMatrix4 resultMatrix(matrix);
157 resultMatrix.matrix[0][0] *= value;
158 resultMatrix.matrix[0][1] *= value;
159 resultMatrix.matrix[0][2] *= value;
160 resultMatrix.matrix[0][3] *= value;
162 resultMatrix.matrix[1][0] *= value;
163 resultMatrix.matrix[1][1] *= value;
164 resultMatrix.matrix[1][2] *= value;
165 resultMatrix.matrix[1][3] *= value;
167 resultMatrix.matrix[2][0] *= value;
168 resultMatrix.matrix[2][1] *= value;
169 resultMatrix.matrix[2][2] *= value;
170 resultMatrix.matrix[2][3] *= value;
172 resultMatrix.matrix[3][0] *= value;
173 resultMatrix.matrix[3][1] *= value;
174 resultMatrix.matrix[3][2] *= value;
175 resultMatrix.matrix[3][3] *= value;
181 FloatMatrix4::operator +(const FloatMatrix4& rhs) const
183 FloatMatrix4 resultMatrix(matrix);
185 resultMatrix.matrix[0][0] += rhs.matrix[0][0];
186 resultMatrix.matrix[0][1] += rhs.matrix[0][1];
187 resultMatrix.matrix[0][2] += rhs.matrix[0][2];
188 resultMatrix.matrix[0][3] += rhs.matrix[0][3];
190 resultMatrix.matrix[1][0] += rhs.matrix[1][0];
191 resultMatrix.matrix[1][1] += rhs.matrix[1][1];
192 resultMatrix.matrix[1][2] += rhs.matrix[1][2];
193 resultMatrix.matrix[1][3] += rhs.matrix[1][3];
195 resultMatrix.matrix[2][0] += rhs.matrix[2][0];
196 resultMatrix.matrix[2][1] += rhs.matrix[2][1];
197 resultMatrix.matrix[2][2] += rhs.matrix[2][2];
198 resultMatrix.matrix[2][3] += rhs.matrix[2][3];
200 resultMatrix.matrix[3][0] += rhs.matrix[3][0];
201 resultMatrix.matrix[3][1] += rhs.matrix[3][1];
202 resultMatrix.matrix[3][2] += rhs.matrix[3][2];
203 resultMatrix.matrix[3][3] += rhs.matrix[3][3];
209 FloatMatrix4::operator +(float value) const
211 FloatMatrix4 resultMatrix(matrix);
213 resultMatrix.matrix[0][0] += value;
214 resultMatrix.matrix[0][1] += value;
215 resultMatrix.matrix[0][2] += value;
216 resultMatrix.matrix[0][3] += value;
218 resultMatrix.matrix[1][0] += value;
219 resultMatrix.matrix[1][1] += value;
220 resultMatrix.matrix[1][2] += value;
221 resultMatrix.matrix[1][3] += value;
223 resultMatrix.matrix[2][0] += value;
224 resultMatrix.matrix[2][1] += value;
225 resultMatrix.matrix[2][2] += value;
226 resultMatrix.matrix[2][3] += value;
228 resultMatrix.matrix[3][0] += value;
229 resultMatrix.matrix[3][1] += value;
230 resultMatrix.matrix[3][2] += value;
231 resultMatrix.matrix[3][3] += value;
237 FloatMatrix4::operator -(const FloatMatrix4& rhs) const
239 FloatMatrix4 resultMatrix(matrix);
241 resultMatrix.matrix[0][0] -= rhs.matrix[0][0];
242 resultMatrix.matrix[0][1] -= rhs.matrix[0][1];
243 resultMatrix.matrix[0][2] -= rhs.matrix[0][2];
244 resultMatrix.matrix[0][3] -= rhs.matrix[0][3];
246 resultMatrix.matrix[1][0] -= rhs.matrix[1][0];
247 resultMatrix.matrix[1][1] -= rhs.matrix[1][1];
248 resultMatrix.matrix[1][2] -= rhs.matrix[1][2];
249 resultMatrix.matrix[1][3] -= rhs.matrix[1][3];
251 resultMatrix.matrix[2][0] -= rhs.matrix[2][0];
252 resultMatrix.matrix[2][1] -= rhs.matrix[2][1];
253 resultMatrix.matrix[2][2] -= rhs.matrix[2][2];
254 resultMatrix.matrix[2][3] -= rhs.matrix[2][3];
256 resultMatrix.matrix[3][0] -= rhs.matrix[3][0];
257 resultMatrix.matrix[3][1] -= rhs.matrix[3][1];
258 resultMatrix.matrix[3][2] -= rhs.matrix[3][2];
259 resultMatrix.matrix[3][3] -= rhs.matrix[3][3];
265 FloatMatrix4::operator -(float value) const
267 FloatMatrix4 resultMatrix(matrix);
269 resultMatrix.matrix[0][0] -= value;
270 resultMatrix.matrix[0][1] -= value;
271 resultMatrix.matrix[0][2] -= value;
272 resultMatrix.matrix[0][3] -= value;
274 resultMatrix.matrix[1][0] -= value;
275 resultMatrix.matrix[1][1] -= value;
276 resultMatrix.matrix[1][2] -= value;
277 resultMatrix.matrix[1][3] -= value;
279 resultMatrix.matrix[2][0] -= value;
280 resultMatrix.matrix[2][1] -= value;
281 resultMatrix.matrix[2][2] -= value;
282 resultMatrix.matrix[2][3] -= value;
284 resultMatrix.matrix[3][0] -= value;
285 resultMatrix.matrix[3][1] -= value;
286 resultMatrix.matrix[3][2] -= value;
287 resultMatrix.matrix[3][3] -= value;
293 FloatMatrix4::operator *=(const FloatMatrix4& rhs)
300 FloatMatrix4::operator *=(float value)
302 *this = *this * value;
307 FloatMatrix4::operator +=(const FloatMatrix4& rhs)
314 FloatMatrix4::operator +=(float value)
316 *this = *this + value;
321 FloatMatrix4::operator -=(const FloatMatrix4& rhs)
328 FloatMatrix4::operator -=(float value)
330 *this = *this - value;
335 operator +(const float& value, const FloatMatrix4& rhs)
341 operator *(const float& value, const FloatMatrix4& rhs)
347 operator -(const float& value, const FloatMatrix4& rhs)
349 FloatMatrix4 returnMatrix(rhs);
350 returnMatrix.Negate();
351 returnMatrix += value;
356 FloatMatrix4::Equals(const Tizen::Base::Object& obj) const
358 const FloatMatrix4* pMatrix = dynamic_cast< const FloatMatrix4* >(&obj);
365 return (*this == *pMatrix);
369 FloatMatrix4::GetHashCode(void) const
371 return (Tizen::Base::Float::GetHashCode(matrix[0][0]) + Tizen::Base::Float::GetHashCode(matrix[1][0]) +
372 Tizen::Base::Float::GetHashCode(matrix[2][0]) + Tizen::Base::Float::GetHashCode(matrix[3][0]) +
373 Tizen::Base::Float::GetHashCode(matrix[0][1]) + Tizen::Base::Float::GetHashCode(matrix[1][1]) +
374 Tizen::Base::Float::GetHashCode(matrix[2][1]) + Tizen::Base::Float::GetHashCode(matrix[3][1]) +
375 Tizen::Base::Float::GetHashCode(matrix[0][2]) + Tizen::Base::Float::GetHashCode(matrix[1][2]) +
376 Tizen::Base::Float::GetHashCode(matrix[2][2]) + Tizen::Base::Float::GetHashCode(matrix[3][2]) +
377 Tizen::Base::Float::GetHashCode(matrix[0][3]) + Tizen::Base::Float::GetHashCode(matrix[1][3]) +
378 Tizen::Base::Float::GetHashCode(matrix[2][3]) + Tizen::Base::Float::GetHashCode(matrix[3][3]));
382 FloatMatrix4::GetDeterminant(void) const
384 float a0 = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
385 float a1 = matrix[0][0] * matrix[1][2] - matrix[0][2] * matrix[1][0];
386 float a2 = matrix[0][0] * matrix[1][3] - matrix[0][3] * matrix[1][0];
387 float a3 = matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1];
388 float a4 = matrix[0][1] * matrix[1][3] - matrix[0][3] * matrix[1][1];
389 float a5 = matrix[0][2] * matrix[1][3] - matrix[0][3] * matrix[1][2];
391 float b0 = matrix[2][0] * matrix[3][1] - matrix[2][1] * matrix[3][0];
392 float b1 = matrix[2][0] * matrix[3][2] - matrix[2][2] * matrix[3][0];
393 float b2 = matrix[2][0] * matrix[3][3] - matrix[2][3] * matrix[3][0];
394 float b3 = matrix[2][1] * matrix[3][2] - matrix[2][2] * matrix[3][1];
395 float b4 = matrix[2][1] * matrix[3][3] - matrix[2][3] * matrix[3][1];
396 float b5 = matrix[2][2] * matrix[3][3] - matrix[2][3] * matrix[3][2];
398 return a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;
402 FloatMatrix4::GetInverse(void) const
404 float a0 = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
405 float a1 = matrix[0][0] * matrix[1][2] - matrix[0][2] * matrix[1][0];
406 float a2 = matrix[0][0] * matrix[1][3] - matrix[0][3] * matrix[1][0];
407 float a3 = matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1];
408 float a4 = matrix[0][1] * matrix[1][3] - matrix[0][3] * matrix[1][1];
409 float a5 = matrix[0][2] * matrix[1][3] - matrix[0][3] * matrix[1][2];
411 float b0 = matrix[2][0] * matrix[3][1] - matrix[2][1] * matrix[3][0];
412 float b1 = matrix[2][0] * matrix[3][2] - matrix[2][2] * matrix[3][0];
413 float b2 = matrix[2][0] * matrix[3][3] - matrix[2][3] * matrix[3][0];
414 float b3 = matrix[2][1] * matrix[3][2] - matrix[2][2] * matrix[3][1];
415 float b4 = matrix[2][1] * matrix[3][3] - matrix[2][3] * matrix[3][1];
416 float b5 = matrix[2][2] * matrix[3][3] - matrix[2][3] * matrix[3][2];
418 float determinant = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;
420 if (Tizen::Base::Float::Compare(determinant, 0.0f) == 0)
425 float inverseMatrix[4][4];
427 inverseMatrix[0][0] = (matrix[1][1] * b5 - matrix[1][2] * b4 + matrix[1][3] * b3) / determinant;
428 inverseMatrix[1][0] = (-matrix[1][0] * b5 + matrix[1][2] * b2 - matrix[1][3] * b1) / determinant;
429 inverseMatrix[2][0] = (matrix[1][0] * b4 - matrix[1][1] * b2 + matrix[1][3] * b0) / determinant;
430 inverseMatrix[3][0] = (-matrix[1][0] * b3 + matrix[1][1] * b1 - matrix[1][2] * b0) / determinant;
432 inverseMatrix[0][1] = (-matrix[0][1] * b5 + matrix[0][2] * b4 - matrix[0][3] * b3) / determinant;
433 inverseMatrix[1][1] = (matrix[0][0] * b5 - matrix[0][2] * b2 + matrix[0][3] * b1) / determinant;
434 inverseMatrix[2][1] = (-matrix[0][0] * b4 + matrix[0][1] * b2 - matrix[0][3] * b0) / determinant;
435 inverseMatrix[3][1] = (matrix[0][0] * b3 - matrix[0][1] * b1 + matrix[0][2] * b0) / determinant;
437 inverseMatrix[0][2] = (matrix[3][1] * a5 - matrix[3][2] * a4 + matrix[3][3] * a3) / determinant;
438 inverseMatrix[1][2] = (-matrix[3][0] * a5 + matrix[3][2] * a2 - matrix[3][3] * a1) / determinant;
439 inverseMatrix[2][2] = (matrix[3][0] * a4 - matrix[3][1] * a2 + matrix[3][3] * a0) / determinant;
440 inverseMatrix[3][2] = (-matrix[3][0] * a3 + matrix[3][1] * a1 - matrix[3][2] * a0) / determinant;
442 inverseMatrix[0][3] = (-matrix[2][1] * a5 + matrix[2][2] * a4 - matrix[2][3] * a3) / determinant;
443 inverseMatrix[1][3] = (matrix[2][0] * a5 - matrix[2][2] * a2 + matrix[2][3] * a1) / determinant;
444 inverseMatrix[2][3] = (-matrix[2][0] * a4 + matrix[2][1] * a2 - matrix[2][3] * a0) / determinant;
445 inverseMatrix[3][3] = (matrix[2][0] * a3 - matrix[2][1] * a1 + matrix[2][2] * a0) / determinant;
447 return FloatMatrix4(inverseMatrix);
451 FloatMatrix4::GetTrace(void) const
453 return matrix[0][0] + matrix[1][1] + matrix[2][2] + matrix[3][3];
457 FloatMatrix4::GetTranspose(void) const
459 FloatMatrix4 transposeMatrix(matrix);
460 transposeMatrix.Transpose();
462 return transposeMatrix;
466 FloatMatrix4::IsIdentity(void) const
468 if ((Tizen::Base::Float::Compare(matrix[0][0], 1.0f) != 0) || (Tizen::Base::Float::Compare(matrix[1][1], 1.0f) != 0) ||
469 (Tizen::Base::Float::Compare(matrix[2][2], 1.0f) != 0) || (Tizen::Base::Float::Compare(matrix[3][3], 1.0f) != 0))
474 if ((Tizen::Base::Float::Compare(matrix[0][1], 0.0f) != 0) || (Tizen::Base::Float::Compare(matrix[0][2], 0.0f) != 0) ||
475 (Tizen::Base::Float::Compare(matrix[0][3], 0.0f) != 0) || (Tizen::Base::Float::Compare(matrix[1][0], 0.0f) != 0) ||
476 (Tizen::Base::Float::Compare(matrix[1][2], 0.0f) != 0) || (Tizen::Base::Float::Compare(matrix[1][3], 0.0f) != 0) ||
477 (Tizen::Base::Float::Compare(matrix[2][0], 0.0f) != 0) || (Tizen::Base::Float::Compare(matrix[2][1], 0.0f) != 0) ||
478 (Tizen::Base::Float::Compare(matrix[2][3], 0.0f) != 0) || (Tizen::Base::Float::Compare(matrix[3][0], 0.0f) != 0) ||
479 (Tizen::Base::Float::Compare(matrix[3][1], 0.0f) != 0) || (Tizen::Base::Float::Compare(matrix[3][2], 0.0f) != 0))
488 FloatMatrix4::IsInvertible(void) const
490 if (Tizen::Base::Float::Compare(GetDeterminant(), 0.0f) == 0)
499 FloatMatrix4::Negate(void)
501 matrix[0][0] = -matrix[0][0];
502 matrix[0][1] = -matrix[0][1];
503 matrix[0][2] = -matrix[0][2];
504 matrix[0][3] = -matrix[0][3];
506 matrix[1][0] = -matrix[1][0];
507 matrix[1][1] = -matrix[1][1];
508 matrix[1][2] = -matrix[1][2];
509 matrix[1][3] = -matrix[1][3];
511 matrix[2][0] = -matrix[2][0];
512 matrix[2][1] = -matrix[2][1];
513 matrix[2][2] = -matrix[2][2];
514 matrix[2][3] = -matrix[2][3];
516 matrix[3][0] = -matrix[3][0];
517 matrix[3][1] = -matrix[3][1];
518 matrix[3][2] = -matrix[3][2];
519 matrix[3][3] = -matrix[3][3];
523 FloatMatrix4::SetAsIdentity(void)
547 FloatMatrix4::Invert(void)
549 float a0 = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
550 float a1 = matrix[0][0] * matrix[1][2] - matrix[0][2] * matrix[1][0];
551 float a2 = matrix[0][0] * matrix[1][3] - matrix[0][3] * matrix[1][0];
552 float a3 = matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1];
553 float a4 = matrix[0][1] * matrix[1][3] - matrix[0][3] * matrix[1][1];
554 float a5 = matrix[0][2] * matrix[1][3] - matrix[0][3] * matrix[1][2];
556 float b0 = matrix[2][0] * matrix[3][1] - matrix[2][1] * matrix[3][0];
557 float b1 = matrix[2][0] * matrix[3][2] - matrix[2][2] * matrix[3][0];
558 float b2 = matrix[2][0] * matrix[3][3] - matrix[2][3] * matrix[3][0];
559 float b3 = matrix[2][1] * matrix[3][2] - matrix[2][2] * matrix[3][1];
560 float b4 = matrix[2][1] * matrix[3][3] - matrix[2][3] * matrix[3][1];
561 float b5 = matrix[2][2] * matrix[3][3] - matrix[2][3] * matrix[3][2];
563 float determinant = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;
565 SysTryReturnResult(NID_BASE, Tizen::Base::Float::Compare(determinant, 0.0f) != 0, E_INVALID_OPERATION, "The current instance is not invertible.");
567 float inverseMatrix[4][4];
569 inverseMatrix[0][0] = (matrix[1][1] * b5 - matrix[1][2] * b4 + matrix[1][3] * b3) / determinant;
570 inverseMatrix[1][0] = (-matrix[1][0] * b5 + matrix[1][2] * b2 - matrix[1][3] * b1) / determinant;
571 inverseMatrix[2][0] = (matrix[1][0] * b4 - matrix[1][1] * b2 + matrix[1][3] * b0) / determinant;
572 inverseMatrix[3][0] = (-matrix[1][0] * b3 + matrix[1][1] * b1 - matrix[1][2] * b0) / determinant;
574 inverseMatrix[0][1] = (-matrix[0][1] * b5 + matrix[0][2] * b4 - matrix[0][3] * b3) / determinant;
575 inverseMatrix[1][1] = (matrix[0][0] * b5 - matrix[0][2] * b2 + matrix[0][3] * b1) / determinant;
576 inverseMatrix[2][1] = (-matrix[0][0] * b4 + matrix[0][1] * b2 - matrix[0][3] * b0) / determinant;
577 inverseMatrix[3][1] = (matrix[0][0] * b3 - matrix[0][1] * b1 + matrix[0][2] * b0) / determinant;
579 inverseMatrix[0][2] = (matrix[3][1] * a5 - matrix[3][2] * a4 + matrix[3][3] * a3) / determinant;
580 inverseMatrix[1][2] = (-matrix[3][0] * a5 + matrix[3][2] * a2 - matrix[3][3] * a1) / determinant;
581 inverseMatrix[2][2] = (matrix[3][0] * a4 - matrix[3][1] * a2 + matrix[3][3] * a0) / determinant;
582 inverseMatrix[3][2] = (-matrix[3][0] * a3 + matrix[3][1] * a1 - matrix[3][2] * a0) / determinant;
584 inverseMatrix[0][3] = (-matrix[2][1] * a5 + matrix[2][2] * a4 - matrix[2][3] * a3) / determinant;
585 inverseMatrix[1][3] = (matrix[2][0] * a5 - matrix[2][2] * a2 + matrix[2][3] * a1) / determinant;
586 inverseMatrix[2][3] = (-matrix[2][0] * a4 + matrix[2][1] * a2 - matrix[2][3] * a0) / determinant;
587 inverseMatrix[3][3] = (matrix[2][0] * a3 - matrix[2][1] * a1 + matrix[2][2] * a0) / determinant;
589 memcpy(matrix, inverseMatrix, MATRIX_SIZE);
595 FloatMatrix4::Transpose(void)
598 SWAP_VALUES(matrix[0][1], matrix[1][0], tmp);
599 SWAP_VALUES(matrix[0][2], matrix[2][0], tmp);
600 SWAP_VALUES(matrix[0][3], matrix[3][0], tmp);
602 SWAP_VALUES(matrix[1][2], matrix[2][1], tmp);
603 SWAP_VALUES(matrix[1][3], matrix[3][1], tmp);
605 SWAP_VALUES(matrix[2][3], matrix[3][2], tmp);
609 FloatMatrix4::SetAsNull(void)