2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiEffects_RendererMathMatrix.h
20 * @brief The Matrix class
24 #ifndef _FUI_EFFECTS_INTERNAL_RENDERER_MATH_MATRIX_H_
25 #define _FUI_EFFECTS_INTERNAL_RENDERER_MATH_MATRIX_H_
27 #include <renderer/math/FUiEffects_RendererMathVector.h>
28 #include <renderer/math/FUiEffects_RendererMathMatrix1Traits.h>
29 #include <renderer/math/FUiEffects_RendererMathMatrix2Traits.h>
30 #include <renderer/math/FUiEffects_RendererMathMatrix3Traits.h>
31 #include <renderer/math/FUiEffects_RendererMathCommon.h>
32 #include <renderer/math/FUiEffects_RendererMathAdapterFunctions.h>
33 #include <renderer/system/FUiEffects_RendererSystemStaticAssert.h>
35 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace Math
37 template<typename T, int Dimension>
39 public MatrixTraits<T, Dimension>
42 typedef Matrix<T, Dimension> MatrixType;
43 typedef Vector<T, Dimension> VectorType;
44 typedef MatrixTraitsBase<T, Dimension> MatrixTraitsBaseType;
45 typedef typename MatrixTraitsBaseType::TypeReference TypeReference;
47 using MatrixTraitsBaseType::data;
48 using MatrixTraits<T, Dimension>::Set;
49 using MatrixTraits<T, Dimension>::CreateScale;
50 using MatrixTraits<T, Dimension>::MakeScale;
51 using MatrixTraits<T, Dimension>::Scale;
52 using MatrixTraits<T, Dimension>::SetScale;
53 using MatrixTraits<T, Dimension>::ApplyTransform;
54 using MatrixTraits<T, Dimension>::GetAppliedTransform;
57 inline explicit Matrix(const TypeReference value);
58 inline Matrix(const TypeReference a11, const TypeReference a12,
59 const TypeReference a21, const TypeReference a22);
61 inline Matrix(const TypeReference a11, const TypeReference a12, const TypeReference a13,
62 const TypeReference a21, const TypeReference a22, const TypeReference a23,
63 const TypeReference a31, const TypeReference a32, const TypeReference a33);
65 inline Matrix(const TypeReference a11, const TypeReference a12, const TypeReference a13, const TypeReference a14,
66 const TypeReference a21, const TypeReference a22, const TypeReference a23, const TypeReference a24,
67 const TypeReference a31, const TypeReference a32, const TypeReference a33, const TypeReference a34,
68 const TypeReference a41, const TypeReference a42, const TypeReference a43, const TypeReference a44);
70 inline Matrix(const VectorType& i, const VectorType& j);
71 inline Matrix(const VectorType& i, const VectorType& j, const VectorType& k);
72 inline Matrix(const VectorType& i, const VectorType& j, const VectorType& k, const VectorType& c);
74 inline Matrix(const MatrixType& other);
76 inline MatrixType& operator = (const MatrixType& rhv);
78 inline MatrixType& Set(const MatrixType& other);
79 inline MatrixType& Set(const TypeReference value);
81 inline MatrixType& FillFromArray(const T* pArray);
82 static inline MatrixType MakeFromArray(const T* pArray);
84 inline MatrixType& Identity(void);
85 inline bool IsIdentity(void) const;
87 inline MatrixType operator-(void) const;
88 inline MatrixType& Inverse(void);
89 inline MatrixType GetInversed(void) const;
91 inline MatrixType& Transpose(void);
92 inline MatrixType GetTransposed(void) const;
94 inline MatrixType& operator+=(const MatrixType& rhv);
95 inline MatrixType& operator+=(const TypeReference rhv);
96 inline MatrixType& operator-=(const MatrixType& rhv);
97 inline MatrixType& operator-=(const TypeReference rhv);
98 inline MatrixType& operator*=(const MatrixType& rhv);
99 inline MatrixType& operator*=(const TypeReference rhv);
100 inline MatrixType& operator/=(const TypeReference rhv);
101 inline MatrixType GetMultipliedByMember(const MatrixType& rhv) const;
102 inline MatrixType& MultiplyByMember(const MatrixType& rhv);
103 static inline MatrixType CreateMultipliedByMember(const MatrixType& lhv, const MatrixType& rhv);
104 inline MatrixType GetDividedByMember(const MatrixType& rhv) const;
105 inline MatrixType& DivideByMember(const MatrixType& rhv);
106 static inline MatrixType CreateDividedByMember(const MatrixType& lhv, const MatrixType& rhv);
108 inline T* GetPointer(void);
109 inline const T* GetPointer(void) const;
110 inline TypeReference Get(unsigned int row, unsigned int column);
111 inline const TypeReference Get(unsigned int row, unsigned int column) const;
112 inline TypeReference Get(unsigned int absIndex);
113 inline const TypeReference Get(unsigned int absIndex) const;
114 inline MatrixType& Set(unsigned int row, unsigned int column, const TypeReference value);
115 inline MatrixType& Set(unsigned int absIndex, const TypeReference value);
116 inline VectorType GetColumn(unsigned int column) const;
117 inline MatrixType& SetColumn(unsigned int column, const VectorType& value);
118 inline VectorType& GetRow(unsigned int row);
119 inline const VectorType& GetRow(unsigned int row) const;
120 inline MatrixType& SetRow(unsigned int row, const VectorType& value);
121 inline TypeReference operator()(unsigned int row, unsigned int column);
122 inline const TypeReference operator()(unsigned int row, unsigned int column) const;
123 inline TypeReference operator()(unsigned int absIndex);
124 inline const TypeReference operator()(unsigned int absIndex) const;
125 inline TypeReference operator[](unsigned int absIndex);
126 inline const TypeReference operator[](unsigned int absIndex) const;
128 inline MatrixType& Lerp(const MatrixType& to, const TypeReference coeff);
129 inline MatrixType GetLerped(const MatrixType& to, const TypeReference coeff) const;
130 inline MatrixType& MakeLerped(const MatrixType& from, const MatrixType& to, const TypeReference coeff);
131 static inline MatrixType CreateLerped(const MatrixType& from, const MatrixType& to, const TypeReference coeff);
133 inline TypeReference Magnitude(void) const;
134 inline TypeReference MagnitudeSqr(void) const;
135 inline TypeReference Trace(void) const;
136 inline Matrix<T, (Dimension == 1 ? Dimension : Dimension - 1)> MinorMatrix(unsigned int row, unsigned int column) const;
138 inline TypeReference Determinant(void) const;
140 inline VectorType& ApplyTransform(VectorType& vector) const;
141 inline VectorType GetAppliedTransform(const VectorType& vector) const;
143 template<int VectorDimension>
144 inline MatrixType& MakeScale(const Vector<T, VectorDimension>& scale);
145 template<int VectorDimension>
146 inline MatrixType& SetScale(const Vector<T, VectorDimension>& scale);
147 template<int VectorDimension>
148 static inline MatrixType CreateScale(const Vector<T, VectorDimension>& scale);
149 template<int VectorDimension>
150 inline MatrixType& Scale(const Vector<T, VectorDimension>& scale);
152 inline bool IsEqual(const Matrix<T, Dimension>& rhv, const TypeReference epsilon = EffectsEpsilon<T>::epsilon()) const;
155 template<typename T, int Dimension>
156 inline bool IsEqual(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv, const typename Matrix<T, Dimension>::TypeReference epsilon);
157 template<typename T, int Dimension> inline Matrix<T, Dimension> operator+(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv);
158 template<typename T, int Dimension> inline Matrix<T, Dimension> operator+(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv);
159 template<typename T, int Dimension> inline Matrix<T, Dimension> operator+(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv);
160 template<typename T, int Dimension> inline Matrix<T, Dimension> operator-(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv);
161 template<typename T, int Dimension> inline Matrix<T, Dimension> operator-(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv);
162 template<typename T, int Dimension> inline Matrix<T, Dimension> operator-(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv);
163 template<typename T, int Dimension> inline Matrix<T, Dimension> operator*(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv);
164 template<typename T, int Dimension> inline Matrix<T, Dimension> operator*(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv);
165 template<typename T, int Dimension> inline Matrix<T, Dimension> operator*(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv);
166 template<typename T, int Dimension> inline Vector<T, Dimension> operator*(const Matrix<T, Dimension>& lhv, const Vector<T, Dimension>& rhv);
167 template<typename T, int Dimension> inline Vector<T, Dimension> operator*(const Vector<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv);
168 template<typename T, int Dimension> inline Vector<T, Dimension - 1> operator*(const Matrix<T, Dimension>& lhv, const Vector<T, Dimension - 1>& rhv);
169 template<typename T, int Dimension> inline Vector<T, Dimension - 1> operator*(const Vector<T, Dimension - 1>& lhv, const Matrix<T, Dimension>& rhv);
170 template<typename T, int Dimension> inline Matrix<T, Dimension> operator/(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv);
171 template<typename T, int Dimension> inline Matrix<T, Dimension> operator/(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv);
172 template<typename T, int Dimension> inline bool operator==(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv);
173 template<typename T, int Dimension> inline bool operator==(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv);
174 template<typename T, int Dimension> inline bool operator==(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv);
175 template<typename T, int Dimension> inline bool operator!=(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv);
176 template<typename T, int Dimension> inline bool operator!=(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv);
177 template<typename T, int Dimension> inline bool operator!=(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv);
179 typedef Matrix<float, 1> Matrix1f;
180 typedef Matrix<double, 1> Matrix1d;
181 typedef Matrix<float, 2> Matrix2f;
182 typedef Matrix<double, 2> Matrix2d;
183 typedef Matrix<float, 3> Matrix3f;
184 typedef Matrix<double, 3> Matrix3d;
185 typedef Matrix<float, 4> Matrix4f;
186 typedef Matrix<double, 4> Matrix4d;
188 template<typename T, int Dimension>
189 Matrix<T, Dimension>::Matrix(void)
194 template<typename T, int Dimension>
195 Matrix<T, Dimension>::Matrix(const TypeReference value)
197 for (int i = 0; i < Dimension; i++)
199 data[i] = VectorType(value);
203 template<typename T, int Dimension>
204 Matrix<T, Dimension>::Matrix(const TypeReference a11, const TypeReference a12,
205 const TypeReference a21, const TypeReference a22)
207 EffectsStaticAssert(Dimension == 2);
209 data[0].Set(a11, a12);
210 data[1].Set(a21, a22);
213 template<typename T, int Dimension>
214 Matrix<T, Dimension>::Matrix(const TypeReference a11, const TypeReference a12, const TypeReference a13,
215 const TypeReference a21, const TypeReference a22, const TypeReference a23,
216 const TypeReference a31, const TypeReference a32, const TypeReference a33)
218 EffectsStaticAssert(Dimension == 3);
220 data[0].Set(a11, a12, a13);
221 data[1].Set(a21, a22, a23);
222 data[2].Set(a31, a32, a33);
225 template<typename T, int Dimension>
226 Matrix<T, Dimension>::Matrix(const TypeReference a11, const TypeReference a12, const TypeReference a13, const TypeReference a14,
227 const TypeReference a21, const TypeReference a22, const TypeReference a23, const TypeReference a24,
228 const TypeReference a31, const TypeReference a32, const TypeReference a33, const TypeReference a34,
229 const TypeReference a41, const TypeReference a42, const TypeReference a43, const TypeReference a44)
231 EffectsStaticAssert(Dimension == 4);
233 data[0].Set(a11, a12, a13, a14);
234 data[1].Set(a21, a22, a23, a24);
235 data[2].Set(a31, a32, a33, a34);
236 data[3].Set(a41, a42, a43, a44);
239 template<typename T, int Dimension>
240 Matrix<T, Dimension>::Matrix(const VectorType& i, const VectorType& j)
242 EffectsStaticAssert(Dimension == 2);
247 template<typename T, int Dimension>
248 Matrix<T, Dimension>::Matrix(const VectorType& i, const VectorType& j, const VectorType& k)
250 EffectsStaticAssert(Dimension == 3);
256 template<typename T, int Dimension>
257 Matrix<T, Dimension>::Matrix(const VectorType& i, const VectorType& j, const VectorType& k, const VectorType& c)
259 EffectsStaticAssert(Dimension == 4);
267 template<typename T, int Dimension>
268 Matrix<T, Dimension>::Matrix(const MatrixType& other)
270 for (int i = 0; i < Dimension; i++)
272 data[i] = other.data[i];
276 template<typename T, int Dimension>
277 Matrix<T, Dimension>& Matrix<T, Dimension>::operator=(const MatrixType& rhv)
279 for (int i = 0; i < Dimension; i++)
281 data[i] = rhv.data[i];
286 template<typename T, int Dimension>
287 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Set(const MatrixType& other)
289 for (int i = 0; i < Dimension; i++)
291 data[i] = other.data[i];
296 template<typename T, int Dimension>
297 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Set(const TypeReference value)
299 for (int i = 0; i < Dimension; i++)
301 data[i] = VectorType(value);
306 template<typename T, int Dimension>
307 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::FillFromArray(const T* pValue)
309 for (int i = 0; i < Dimension; i++)
311 data[i] = VectorType::MakeFromArray(&pValue[Dimension * i]);
317 template<typename T, int Dimension>
318 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::MakeFromArray(const T* pValue)
321 result.FillFromArray(pValue);
325 template<typename T, int Dimension>
326 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Identity(void)
328 *this = MatrixType::GetIdentity();
332 template<typename T, int Dimension>
333 bool Matrix<T, Dimension>::IsIdentity(void) const
335 return *this == MatrixType::GetIdentity();
338 template<typename T, int Dimension>
339 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::operator-(void) const
342 for (int i = 0; i < Dimension; ++i)
344 result.data[i] = -data[i];
349 template<typename T, int Dimension>
350 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Inverse(void)
352 static const T t0(0.0f);
353 static const T t1(1.0f);
355 T det = Determinant();
356 if (EffectsEqual(det, t0)) return *this;
360 for (int i = 0; i < Dimension; ++i)
362 for (int j = 0; j < Dimension; ++j)
364 result.data[i].data[j] = ((i+j) % 2 == 0 ? 1 : -1) * det * MinorMatrix(j, i).Determinant();
367 return *this = result;
370 template<typename T, int Dimension>
371 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::GetInversed(void) const
373 MatrixType result(*this);
374 return result.Inverse();
377 template<typename T, int Dimension>
378 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Transpose(void)
380 for (int i = 0; i < Dimension; ++i)
382 for (int j = i + 1; j < Dimension; ++j)
384 EffectsSwap(data[j].data[i], data[i].data[j]);
390 template<typename T, int Dimension>
391 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::GetTransposed(void) const
393 MatrixType trasposed = *this;
394 return trasposed.Transpose();
397 template<typename T, int Dimension>
398 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::operator+=(const MatrixType& rhv)
400 for (int i = 0; i < Dimension; ++i)
402 data[i] += rhv.data[i];
407 template<typename T, int Dimension>
408 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::operator+=(const TypeReference rhv)
410 for (int i = 0; i < Dimension; ++i)
417 template<typename T, int Dimension>
418 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::operator-=(const MatrixType& rhv)
420 for (int i = 0; i < Dimension; ++i)
422 data[i] -= rhv.data[i];
427 template<typename T, int Dimension>
428 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::operator-=(const TypeReference rhv)
430 for (int i = 0; i < Dimension; ++i)
437 template<typename T, int Dimension>
438 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::operator*=(const MatrixType& rhv)
440 MatrixType result(T(0.0f));
441 for (int i = 0; i < Dimension; ++i)
443 for (int j = 0; j < Dimension; ++j)
445 for (int k = 0; k < Dimension; ++k)
446 result.data[i].data[j] += data[i].data[k] * rhv.data[k].data[j];
453 template<typename T, int Dimension>
454 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::operator*=(const TypeReference rhv)
456 for (int i = 0; i < Dimension; ++i)
463 template<typename T, int Dimension>
464 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::operator/=(const TypeReference rhv)
466 for (int i = 0; i < Dimension; ++i)
473 template<typename T, int Dimension>
474 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::GetMultipliedByMember(const MatrixType& rhv) const
477 for (int i = 0; i < Dimension; ++i)
479 result.data[i].Set(data[i] * rhv.data[i]);
484 template<typename T, int Dimension>
485 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::MultiplyByMember(const MatrixType& rhv)
487 for (int i = 0; i < Dimension; ++i)
489 data[i] = data[i] * rhv.data[i];
494 template<typename T, int Dimension>
495 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::CreateMultipliedByMember(const MatrixType& lhv, const MatrixType& rhv)
497 MatrixType temp(lhv);
498 temp.MultiplyByMember(rhv);
502 template<typename T, int Dimension>
503 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::GetDividedByMember(const MatrixType& rhv) const
506 for (int i = 0; i < Dimension; ++i)
508 result.data[i].Set(data[i] / rhv.data[i]);
513 template<typename T, int Dimension>
514 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::DivideByMember(const MatrixType& rhv)
516 for (int i = 0; i < Dimension; ++i)
518 data[i] = data[i] / rhv.data[i];
523 template<typename T, int Dimension>
524 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::CreateDividedByMember(const MatrixType& lhv, const MatrixType& rhv)
526 MatrixType temp(lhv);
527 temp.DivideByMember(rhv);
531 template<typename T, int Dimension>
532 T* Matrix<T, Dimension>::GetPointer(void)
534 return data[0].GetPointer();
537 template<typename T, int Dimension>
538 const T* Matrix<T, Dimension>::GetPointer(void) const
540 return data[0].GetPointer();
543 template<typename T, int Dimension>
544 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::Get(unsigned int row, unsigned int column)
546 return operator()(row, column);
549 template<typename T, int Dimension>
550 const typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::Get(unsigned int row, unsigned int column) const
552 return operator()(row, column);
555 template<typename T, int Dimension>
556 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::Get(unsigned int absIndex)
558 return operator()(absIndex);
561 template<typename T, int Dimension>
562 const typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::Get(unsigned int absIndex) const
564 return operator()(absIndex);
567 template<typename T, int Dimension>
568 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Set(unsigned int row, unsigned int column, const TypeReference value)
570 data[row].data[column] = value;
574 template<typename T, int Dimension>
575 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Set(unsigned int absIndex, const TypeReference value)
577 data[absIndex / Dimension].data[absIndex % Dimension] = value;
581 template<typename T, int Dimension>
582 typename Matrix<T, Dimension>::VectorType Matrix<T, Dimension>::GetColumn(unsigned int column) const
585 for (int i = 0; i < Dimension; ++i)
587 result.data[i] = data[i].data[column];
592 template<typename T, int Dimension>
593 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::SetColumn(unsigned int column, const VectorType& value)
595 for (int i = 0; i < Dimension; ++i)
597 data[i].data[column] = value.data[i];
603 template<typename T, int Dimension>
604 typename Matrix<T, Dimension>::VectorType& Matrix<T, Dimension>::GetRow(unsigned int row)
609 template<typename T, int Dimension>
610 const typename Matrix<T, Dimension>::VectorType& Matrix<T, Dimension>::GetRow(unsigned int row) const
615 template<typename T, int Dimension>
616 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::SetRow(unsigned int row, const VectorType& value)
622 template<typename T, int Dimension>
623 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::operator()(unsigned int row, unsigned int column)
625 return data[row].data[column];
628 template<typename T, int Dimension>
629 const typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::operator()(unsigned int row, unsigned int column) const
631 return data[row].data[column];
634 template<typename T, int Dimension>
635 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::operator()(unsigned int absIndex)
637 return operator[](absIndex);
640 template<typename T, int Dimension>
641 const typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::operator()(unsigned int absIndex) const
643 return operator[](absIndex);
646 template<typename T, int Dimension>
647 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::operator[](unsigned int absIndex)
649 return data[absIndex / Dimension].data[absIndex % Dimension];
652 template<typename T, int Dimension>
653 const typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::operator[](unsigned int absIndex) const
655 return data[absIndex / Dimension].data[absIndex % Dimension];
658 template<typename T, int Dimension>
659 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Lerp(const MatrixType& to, const TypeReference coeff)
661 for (int i = 0; i < Dimension; ++i)
663 data[i].Lerp(to.data[i], coeff);
668 template<typename T, int Dimension>
669 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::GetLerped(const MatrixType& to, const TypeReference coeff) const
672 for (int i = 0; i < Dimension; ++i)
674 result.data[i] = data[i].GetLerped(to.data[i], coeff);
679 template<typename T, int Dimension>
680 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::MakeLerped(const MatrixType& from, const MatrixType& to, const TypeReference coeff)
682 for (int i = 0; i < Dimension; ++i)
684 data[i] = VectorType().MakeLerped(from.data[i], to.data[i], coeff);
689 template<typename T, int Dimension>
690 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::CreateLerped(const MatrixType& from, const MatrixType& to, const TypeReference coeff)
693 for (int i = 0; i < Dimension; ++i)
695 result.data[i] = VectorType().MakeLerped(from.data[i], to.data[i], coeff);
700 template<typename T, int Dimension>
701 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::Magnitude(void) const
703 return effects_sqrt(MagnitudeSqr());
706 template<typename T, int Dimension>
707 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::MagnitudeSqr(void) const
710 for (int i = 0; i < Dimension; ++i)
712 result += data[i].dot(data[i]);
717 template<typename T, int Dimension>
718 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::Trace(void) const
721 for (int i = 0; i < Dimension; ++i)
723 result += data[i].data[i];
728 template<typename T, int Dimension>
729 Matrix<T, (Dimension == 1 ? Dimension : Dimension - 1)> Matrix<T, Dimension>::MinorMatrix(unsigned int row, unsigned int column) const
731 Matrix<T, (Dimension == 1 ? Dimension : Dimension - 1)> result;
733 int columnCounter = 0;
734 for (unsigned int i = 0; i < Dimension; ++i)
739 for (unsigned int j = 0; j < Dimension; ++j)
743 result.data[rowCounter].data[columnCounter] = data[j].data[i];
753 template<typename T, int Dimension>
754 typename Matrix<T, Dimension>::TypeReference Matrix<T, Dimension>::Determinant(void) const
758 return data[0].data[0];
762 for (int i = 0; i < Dimension; ++i)
764 result += (i % 2 == 0 ? 1 : -1) * data[i].data[0] * MinorMatrix(i, 0).Determinant();
769 template<typename T, int Dimension>
770 typename Matrix<T, Dimension>::VectorType& Matrix<T, Dimension>::ApplyTransform(VectorType& vector) const
772 VectorType temp(vector);
773 for (int i = 0; i < Dimension; ++i)
775 vector.data[i] = data[i].dot(temp);
780 template<typename T, int Dimension>
781 typename Matrix<T, Dimension>::VectorType Matrix<T, Dimension>::GetAppliedTransform(const VectorType& vector) const
783 VectorType result(vector);
784 return ApplyTransform(result);
787 template<typename T, int Dimension>
788 template<int VectorDimension>
789 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::MakeScale(const Vector<T, VectorDimension>& scale)
792 for (int i = 0; i < VectorDimension; ++i)
796 data[i].data[i] = scale.data[i];
802 template<typename T, int Dimension>
803 template<int VectorDimension>
804 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::SetScale(const Vector<T, VectorDimension>& scale)
806 for (int i = 0; i < VectorDimension; ++i)
808 for (int j = 0; j < VectorDimension; ++j)
810 if (i < Dimension && j < Dimension)
813 data[i].data[i] = scale.data[i];
815 data[i].data[j] = T(0.0f);
822 template<typename T, int Dimension>
823 template<int VectorDimension>
824 typename Matrix<T, Dimension>::MatrixType Matrix<T, Dimension>::CreateScale(const Vector<T, VectorDimension>& scale)
826 return MatrixType().MakeScale(scale);
829 template<typename T, int Dimension>
830 template<int VectorDimension>
831 typename Matrix<T, Dimension>::MatrixType& Matrix<T, Dimension>::Scale(const Vector<T, VectorDimension>& scale)
833 for (int i = 0; i < VectorDimension; ++i)
835 for (int j = 0; j < VectorDimension; ++j)
837 if (i < Dimension && j < Dimension)
839 data[i].data[j] *= scale.data[i];
846 template<typename T, int Dimension>
847 bool Matrix<T, Dimension>::IsEqual(const MatrixType& rhv, const TypeReference epsilon) const
849 for (int i = 0; i < Dimension; ++i)
851 if (!data[i].IsEqual(rhv.data[i], epsilon))
859 template<typename T, int Dimension>
860 bool IsEqual(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv, const typename Matrix<T, Dimension>::TypeReference epsilon)
862 return lhv.IsEqual(rhv, epsilon);
865 template<typename T, int Dimension>
866 Matrix<T, Dimension> operator+(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv)
868 Matrix<T, Dimension> result;
869 for (int i = 0; i < Dimension; ++i)
871 result.data[i] = lhv.data[i] + rhv.data[i];
877 template<typename T, int Dimension>
878 Matrix<T, Dimension> operator+(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv)
880 Matrix<T, Dimension> result;
881 for (int i = 0; i < Dimension; ++i)
883 result.data[i] = lhv.data[i] + rhv;
889 template<typename T, int Dimension>
890 Matrix<T, Dimension> operator+(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv)
892 Matrix<T, Dimension> result;
893 for (int i = 0; i < Dimension; ++i)
895 result.data[i] = lhv + rhv.data[i];
901 template<typename T, int Dimension>
902 Matrix<T, Dimension> operator-(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv)
904 Matrix<T, Dimension> result;
905 for (int i = 0; i < Dimension; ++i)
907 result.data[i] = lhv.data[i] - rhv.data[i];
913 template<typename T, int Dimension> Matrix<T, Dimension> operator-(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv)
915 Matrix<T, Dimension> result;
916 for (int i = 0; i < Dimension; ++i)
918 result.data[i] = lhv.data[i] - rhv;
924 template<typename T, int Dimension>
925 Matrix<T, Dimension> operator-(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv)
927 Matrix<T, Dimension> result;
928 for (int i = 0; i < Dimension; ++i)
930 result.data[i] = lhv - rhv.data[i];
936 template<typename T, int Dimension>
937 Matrix<T, Dimension> operator*(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv)
939 Matrix<T, Dimension> result(lhv);
940 return result *= rhv;
943 template<typename T, int Dimension>
944 Matrix<T, Dimension> operator*(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv)
946 Matrix<T, Dimension> result(lhv);
947 return result *= rhv;
950 template<typename T, int Dimension>
951 Matrix<T, Dimension> operator*(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv)
953 Matrix<T, Dimension> result(rhv);
954 return result *= lhv;
957 template<typename T, int Dimension>
958 Vector<T, Dimension> operator*(const Matrix<T, Dimension>& lhv, const Vector<T, Dimension>& rhv)
960 Vector<T, Dimension> result;
961 for (int i = 0; i < Dimension; ++i)
963 result.data[i] = lhv.data[i].dot(rhv);
969 template<typename T, int Dimension>
970 Vector<T, Dimension> operator*(const Vector<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv)
972 Vector<T, Dimension> temp;
973 for (int i = 0; i < Dimension; ++i)
975 temp.data[i] = rhv.GetColumn(i).Dot(lhv);
980 template<typename T, int Dimension>
981 Vector<T, Dimension - 1> operator*(const Matrix<T, Dimension>& lhv, const Vector<T, Dimension - 1>& rhv)
983 Matrix<T, Dimension - 1> minor = lhv.MinorMatrix(Dimension - 1, Dimension - 1);
984 Vector<T, Dimension - 1> result = minor * rhv;
985 for (int i = 0; i < Dimension - 1; ++i)
987 result.data[i] += lhv.data[i].data[Dimension - 1];
993 template<typename T, int Dimension>
994 Vector<T, Dimension - 1> operator*(const Vector<T, Dimension - 1>& lhv, const Matrix<T, Dimension>& rhv)
996 Matrix<T, Dimension - 1> minor = rhv.MinorMatrix(Dimension - 1, Dimension - 1);
997 Vector<T, Dimension - 1> result = lhv * minor;
998 for (int i = 0; i < Dimension - 1; ++i)
1000 result.data[i] += rhv.data[i].data[Dimension - 1];
1005 template<typename T, int Dimension>
1006 Matrix<T, Dimension> operator/(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv)
1008 Matrix<T, Dimension> result;
1009 for (int i = 0; i < Dimension; ++i)
1011 result.data[i] = lhv.data[i] / rhv;
1017 template<typename T, int Dimension>
1018 Matrix<T, Dimension> operator/(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv)
1020 Matrix<T, Dimension> result;
1021 for (int i = 0; i < Dimension; ++i)
1023 result.data[i] = lhv / rhv.data[i];
1029 template<typename T, int Dimension>
1030 bool operator==(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv)
1032 for (int i = 0; i < Dimension; ++i)
1034 if (lhv.data[i] != rhv.data[i])
1042 template<typename T, int Dimension>
1043 bool operator==(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv)
1045 for (int i = 0; i < Dimension; ++i)
1047 if (lhv.data[i] != rhv)
1055 template<typename T, int Dimension>
1056 bool operator==(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv)
1058 for (int i = 0; i < Dimension; ++i)
1060 if (lhv != rhv.data[i])
1068 template<typename T, int Dimension>
1069 bool operator!=(const Matrix<T, Dimension>& lhv, const Matrix<T, Dimension>& rhv)
1071 return !(lhv == rhv);
1074 template<typename T, int Dimension>
1075 bool operator!=(const Matrix<T, Dimension>& lhv, const typename Matrix<T, Dimension>::TypeReference rhv)
1077 return !(lhv == rhv);
1080 template<typename T, int Dimension>
1081 bool operator!=(const typename Matrix<T, Dimension>::TypeReference lhv, const Matrix<T, Dimension>& rhv)
1083 return !(lhv == rhv);
1086 }}}}} //Tizen::Ui::Effects::_Renderer::Math
1088 #endif //_FUI_EFFECTS_INTERNAL_RENDERER_MATH_MATRIX_H_