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 FUi_Matrix3Df.h
20 * @brief Header file of _Matrix3Df class
22 * This file contains declarations _Matrix3Df class.
25 #ifndef _FUI_ANIM_INTERNAL_MATRIX3DF_H_
26 #define _FUI_ANIM_INTERNAL_MATRIX3DF_H_
28 #include <FOspCompat.h>
30 namespace Tizen { namespace Ui { namespace Animations
38 IdentityMatrix = 0x0001,
39 TranslationMatrix = 0x0002,
41 GenericMatrix = 0x0008
45 _Matrix3Df(const _Matrix3Df& rhs)
47 memcpy(__m, rhs.__m, sizeof(__m));
48 __complexity = rhs.__complexity;
51 explicit _Matrix3Df(const float* pValues);
53 _Matrix3Df& Assign(const _Matrix3Df& rhs);
55 bool operator ==(const _Matrix3Df& rhs) const;
56 bool operator !=(const _Matrix3Df& rhs) const;
57 _Matrix3Df& operator =(const _Matrix3Df& rhs);
58 _Matrix3Df& operator *=(const _Matrix3Df& rhs);
60 friend _Matrix3Df operator *(const _Matrix3Df& matrix1, const _Matrix3Df& matrix2);
63 bool IsIdentity(void) const { return __complexity == IdentityMatrix;}
64 bool IsTranslation(void) const { return __complexity == TranslationMatrix;}
65 bool IsScale(void) const { return __complexity == ScaleMatrix;}
66 bool IsGeneric(void) const { return __complexity == GenericMatrix;}
68 void LoadIdentity(void);
71 _Matrix3Df& MultiplyMatrix(const _Matrix3Df& matrix);
72 _Matrix3Df& Concatenate(const _Matrix3Df* matrix);
73 _Matrix3Df& Concatenate(const _Matrix3Df& matrix);
75 float GetDeterminant(void) const;
76 bool IsInvertible(void) const;
79 void Translate(float x, float y, float z);
80 void Shear(float xy, float yz, float zx, float yx, float zy, float xz);
81 void Scale(float sx, float sy, float sz);
82 void Rotate(float angle, float x, float y, float z);
83 void MakeOrthogonal(float left, float right, float bottom, float top, float n, float f);
84 void MakeFrustum(float left, float right, float bottom, float top, float n, float f);
85 void MakePerspective(float fovy, float aspect, float nearZ, float farZ);
86 void MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ);
87 _Matrix3Df& MakeTransformAtAnchor(float x, float y, float z);
88 float Normalize(void);
89 void Transform(float* pX, float* pY, float* pZ) const;
91 float operator ()(int row, int col) const { return __m[col][row];}
92 float GetItem(int row, int col) const { return __m[col][row];}
93 void SetItem(int row, int col, float value) { __m[col][row] = value; __complexity = GenericMatrix; }
95 const float* GetItems(void) const { return __m[0];}
98 float __m[4][4]; // column-major order (for OpenGL awareness...)
99 int __complexity; // for performance optimization. Most operations will be done with identity matrix.
104 operator *(const _Matrix3Df& matrix1, const _Matrix3Df& matrix2)
106 if (matrix1.__complexity == _Matrix3Df::IdentityMatrix)
109 if (matrix2.__complexity == _Matrix3Df::IdentityMatrix)
113 if (matrix1.__complexity == _Matrix3Df::TranslationMatrix)
115 if (matrix2.__complexity == _Matrix3Df::TranslationMatrix)
119 ret.__m[3][0] = matrix2.__m[3][0] + matrix1.__m[3][0] * matrix2.__m[3][3];
120 ret.__m[3][1] = matrix2.__m[3][1] + matrix1.__m[3][1] * matrix2.__m[3][3];
121 ret.__m[3][2] = matrix2.__m[3][2] + matrix1.__m[3][2] * matrix2.__m[3][3];
122 ret.__m[3][3] = matrix1.__m[3][3] * matrix2.__m[3][3];
124 ret.__complexity = _Matrix3Df::TranslationMatrix;
130 /* TODO: Can be optimized more cases....?? (scale??) */
133 /* Optimization with loop-unrolling.. really effective for this case ??? */
136 m[0][0] = (matrix1.__m[0][0] * matrix2.__m[0][0]) +
137 (matrix1.__m[1][0] * matrix2.__m[0][1]) +
138 (matrix1.__m[2][0] * matrix2.__m[0][2]) +
139 (matrix1.__m[3][0] * matrix2.__m[0][3]);
140 m[1][0] = (matrix1.__m[0][0] * matrix2.__m[1][0]) +
141 (matrix1.__m[1][0] * matrix2.__m[1][1]) +
142 (matrix1.__m[2][0] * matrix2.__m[1][2]) +
143 (matrix1.__m[3][0] * matrix2.__m[1][3]);
144 m[2][0] = (matrix1.__m[0][0] * matrix2.__m[2][0]) +
145 (matrix1.__m[1][0] * matrix2.__m[2][1]) +
146 (matrix1.__m[2][0] * matrix2.__m[2][2]) +
147 (matrix1.__m[3][0] * matrix2.__m[2][3]);
148 m[3][0] = (matrix1.__m[0][0] * matrix2.__m[3][0]) +
149 (matrix1.__m[1][0] * matrix2.__m[3][1]) +
150 (matrix1.__m[2][0] * matrix2.__m[3][2]) +
151 (matrix1.__m[3][0] * matrix2.__m[3][3]);
153 m[0][1] = (matrix1.__m[0][1] * matrix2.__m[0][0]) +
154 (matrix1.__m[1][1] * matrix2.__m[0][1]) +
155 (matrix1.__m[2][1] * matrix2.__m[0][2]) +
156 (matrix1.__m[3][1] * matrix2.__m[0][3]);
157 m[1][1] = (matrix1.__m[0][1] * matrix2.__m[1][0]) +
158 (matrix1.__m[1][1] * matrix2.__m[1][1]) +
159 (matrix1.__m[2][1] * matrix2.__m[1][2]) +
160 (matrix1.__m[3][1] * matrix2.__m[1][3]);
161 m[2][1] = (matrix1.__m[0][1] * matrix2.__m[2][0]) +
162 (matrix1.__m[1][1] * matrix2.__m[2][1]) +
163 (matrix1.__m[2][1] * matrix2.__m[2][2]) +
164 (matrix1.__m[3][1] * matrix2.__m[2][3]);
165 m[3][1] = (matrix1.__m[0][1] * matrix2.__m[3][0]) +
166 (matrix1.__m[1][1] * matrix2.__m[3][1]) +
167 (matrix1.__m[2][1] * matrix2.__m[3][2]) +
168 (matrix1.__m[3][1] * matrix2.__m[3][3]);
170 m[0][2] = (matrix1.__m[0][2] * matrix2.__m[0][0]) +
171 (matrix1.__m[1][2] * matrix2.__m[0][1]) +
172 (matrix1.__m[2][2] * matrix2.__m[0][2]) +
173 (matrix1.__m[3][2] * matrix2.__m[0][3]);
174 m[1][2] = (matrix1.__m[0][2] * matrix2.__m[1][0]) +
175 (matrix1.__m[1][2] * matrix2.__m[1][1]) +
176 (matrix1.__m[2][2] * matrix2.__m[1][2]) +
177 (matrix1.__m[3][2] * matrix2.__m[1][3]);
178 m[2][2] = (matrix1.__m[0][2] * matrix2.__m[2][0]) +
179 (matrix1.__m[1][2] * matrix2.__m[2][1]) +
180 (matrix1.__m[2][2] * matrix2.__m[2][2]) +
181 (matrix1.__m[3][2] * matrix2.__m[2][3]);
182 m[3][2] = (matrix1.__m[0][2] * matrix2.__m[3][0]) +
183 (matrix1.__m[1][2] * matrix2.__m[3][1]) +
184 (matrix1.__m[2][2] * matrix2.__m[3][2]) +
185 (matrix1.__m[3][2] * matrix2.__m[3][3]);
187 m[0][3] = (matrix1.__m[0][3] * matrix2.__m[0][0]) +
188 (matrix1.__m[1][3] * matrix2.__m[0][1]) +
189 (matrix1.__m[2][3] * matrix2.__m[0][2]) +
190 (matrix1.__m[3][3] * matrix2.__m[0][3]);
191 m[1][3] = (matrix1.__m[0][3] * matrix2.__m[1][0]) +
192 (matrix1.__m[1][3] * matrix2.__m[1][1]) +
193 (matrix1.__m[2][3] * matrix2.__m[1][2]) +
194 (matrix1.__m[3][3] * matrix2.__m[1][3]);
195 m[2][3] = (matrix1.__m[0][3] * matrix2.__m[2][0]) +
196 (matrix1.__m[1][3] * matrix2.__m[2][1]) +
197 (matrix1.__m[2][3] * matrix2.__m[2][2]) +
198 (matrix1.__m[3][3] * matrix2.__m[2][3]);
199 m[3][3] = (matrix1.__m[0][3] * matrix2.__m[3][0]) +
200 (matrix1.__m[1][3] * matrix2.__m[3][1]) +
201 (matrix1.__m[2][3] * matrix2.__m[3][2]) +
202 (matrix1.__m[3][3] * matrix2.__m[3][3]);
204 return _Matrix3Df((const float*)m);
211 _Matrix3DfTr(float tx, float ty, float tz)
216 __complexity = TranslationMatrix;
219 _Matrix3DfTr(const _Matrix3DfTr& rhs)
229 _Matrix3DfRot(float angle, float x, float y, float z)
231 Rotate(angle, x, y, z);
232 __complexity = GenericMatrix;
235 _Matrix3DfRot(const _Matrix3DfRot& rhs)
241 }}} // Tizen::Ui::Animations
243 #endif //_FUI_ANIM_INTERNAL_MATRIX3DF_H_