#include "FUi_Math.h"
#include "FUiAnim_MatrixUtil.h"
-
using namespace Tizen;
using namespace Tizen::Base;
using namespace Tizen::Graphics;
namespace Tizen { namespace Ui { namespace Animations
{
+const int MATRIX_SIZE = sizeof(float)*16;
static const float _IDENTITY_MATRIX[4][4] =
{
};
+#define _M4x4Multiply(_DEST, _MAT1, _MAT2) \
+ { \
+ float _TEMP_MAT_RESULT[4][4]; \
+ _TEMP_MAT_RESULT[0][0] = (_MAT1[0][0] * _MAT2[0][0]) + (_MAT1[1][0] * _MAT2[0][1]) + (_MAT1[2][0] * _MAT2[0][2]) + (_MAT1[3][0] * _MAT2[0][3]); \
+ _TEMP_MAT_RESULT[1][0] = (_MAT1[0][0] * _MAT2[1][0]) + (_MAT1[1][0] * _MAT2[1][1]) + (_MAT1[2][0] * _MAT2[1][2]) + (_MAT1[3][0] * _MAT2[1][3]); \
+ _TEMP_MAT_RESULT[2][0] = (_MAT1[0][0] * _MAT2[2][0]) + (_MAT1[1][0] * _MAT2[2][1]) + (_MAT1[2][0] * _MAT2[2][2]) + (_MAT1[3][0] * _MAT2[2][3]); \
+ _TEMP_MAT_RESULT[3][0] = (_MAT1[0][0] * _MAT2[3][0]) + (_MAT1[1][0] * _MAT2[3][1]) + (_MAT1[2][0] * _MAT2[3][2]) + (_MAT1[3][0] * _MAT2[3][3]); \
+ \
+ _TEMP_MAT_RESULT[0][1] = (_MAT1[0][1] * _MAT2[0][0]) + (_MAT1[1][1] * _MAT2[0][1]) + (_MAT1[2][1] * _MAT2[0][2]) + (_MAT1[3][1] * _MAT2[0][3]); \
+ _TEMP_MAT_RESULT[1][1] = (_MAT1[0][1] * _MAT2[1][0]) + (_MAT1[1][1] * _MAT2[1][1]) + (_MAT1[2][1] * _MAT2[1][2]) + (_MAT1[3][1] * _MAT2[1][3]); \
+ _TEMP_MAT_RESULT[2][1] = (_MAT1[0][1] * _MAT2[2][0]) + (_MAT1[1][1] * _MAT2[2][1]) + (_MAT1[2][1] * _MAT2[2][2]) + (_MAT1[3][1] * _MAT2[2][3]); \
+ _TEMP_MAT_RESULT[3][1] = (_MAT1[0][1] * _MAT2[3][0]) + (_MAT1[1][1] * _MAT2[3][1]) + (_MAT1[2][1] * _MAT2[3][2]) + (_MAT1[3][1] * _MAT2[3][3]); \
+ \
+ _TEMP_MAT_RESULT[0][2] = (_MAT1[0][2] * _MAT2[0][0]) + (_MAT1[1][2] * _MAT2[0][1]) + (_MAT1[2][2] * _MAT2[0][2]) + (_MAT1[3][2] * _MAT2[0][3]); \
+ _TEMP_MAT_RESULT[1][2] = (_MAT1[0][2] * _MAT2[1][0]) + (_MAT1[1][2] * _MAT2[1][1]) + (_MAT1[2][2] * _MAT2[1][2]) + (_MAT1[3][2] * _MAT2[1][3]); \
+ _TEMP_MAT_RESULT[2][2] = (_MAT1[0][2] * _MAT2[2][0]) + (_MAT1[1][2] * _MAT2[2][1]) + (_MAT1[2][2] * _MAT2[2][2]) + (_MAT1[3][2] * _MAT2[2][3]); \
+ _TEMP_MAT_RESULT[3][2] = (_MAT1[0][2] * _MAT2[3][0]) + (_MAT1[1][2] * _MAT2[3][1]) + (_MAT1[2][2] * _MAT2[3][2]) + (_MAT1[3][2] * _MAT2[3][3]); \
+ \
+ _TEMP_MAT_RESULT[0][3] = (_MAT1[0][3] * _MAT2[0][0]) + (_MAT1[1][3] * _MAT2[0][1]) + (_MAT1[2][3] * _MAT2[0][2]) + (_MAT1[3][3] * _MAT2[0][3]); \
+ _TEMP_MAT_RESULT[1][3] = (_MAT1[0][3] * _MAT2[1][0]) + (_MAT1[1][3] * _MAT2[1][1]) + (_MAT1[2][3] * _MAT2[1][2]) + (_MAT1[3][3] * _MAT2[1][3]); \
+ _TEMP_MAT_RESULT[2][3] = (_MAT1[0][3] * _MAT2[2][0]) + (_MAT1[1][3] * _MAT2[2][1]) + (_MAT1[2][3] * _MAT2[2][2]) + (_MAT1[3][3] * _MAT2[2][3]); \
+ _TEMP_MAT_RESULT[3][3] = (_MAT1[0][3] * _MAT2[3][0]) + (_MAT1[1][3] * _MAT2[3][1]) + (_MAT1[2][3] * _MAT2[3][2]) + (_MAT1[3][3] * _MAT2[3][3]); \
+ \
+ memcpy(_DEST, _TEMP_MAT_RESULT, MATRIX_SIZE); \
+ }
+
+#define _M4x4CopyTo(_DEST, _SRC) \
+ memcpy(_DEST, _SRC, MATRIX_SIZE)
+
+
+#define _M4x4SetIdentity(_MAT) \
+ memcpy(_MAT, _IDENTITY_MATRIX, MATRIX_SIZE)
+
+
Matrix4Type
_GetMatrix4Type(const Tizen::Graphics::FloatMatrix4& floatMatrix)
{
void
_MatrixUtilTransform(const Tizen::Graphics::FloatMatrix4& m, float* pX, float* pY, float* pZ)
{
- FloatVector4 vec4(*pX, *pY, *pZ, 1.0f);
- vec4 = m * vec4;
- *pX = vec4.x;
- *pY = vec4.y;
- *pZ = vec4.z;
+ float x = 0.f, y = 0.f, z = 0.f, w = 1.0f;
- if (vec4.w != 1.0f && vec4.w != 0.0f)
+ x = (m.matrix[0][0] * *pX) + (m.matrix[1][0] * *pY) + (m.matrix[2][0] * *pZ) + (m.matrix[3][0] * 1.0f);
+ y = (m.matrix[0][1] * *pX) + (m.matrix[1][1] * *pY) + (m.matrix[2][1] * *pZ) + (m.matrix[3][1] * 1.0f);
+ z = (m.matrix[0][2] * *pX) + (m.matrix[1][2] * *pY) + (m.matrix[2][2] * *pZ) + (m.matrix[3][2] * 1.0f);
+ w = (m.matrix[0][3] * *pX) + (m.matrix[1][3] * *pY) + (m.matrix[2][3] * *pZ) + (m.matrix[3][3] * 1.0f);
+
+ if (w != 1.0f && w != 0.0f)
{
- *pX /= vec4.w;
- *pY /= vec4.w;
- *pZ /= vec4.w;
+ *pX = x/w;
+ *pY = y/w;
+ *pZ = z/w;
+ }
+ else
+ {
+ *pX = x;
+ *pY = y;
+ *pZ = z;
}
}
return false;
}
+
void
_MatrixUtilScale(Tizen::Graphics::FloatMatrix4& m, float sx, float sy, float sz)
{
void
_MatrixUtilAtAnchor(Tizen::Graphics::FloatMatrix4& m, float x, float y, float z)
{
- Tizen::Graphics::FloatMatrix4 tr;
- Tizen::Graphics::FloatMatrix4 trInv;
+// org code
+// Tizen::Graphics::FloatMatrix4 tr;
+// Tizen::Graphics::FloatMatrix4 trInv;
+// tr.matrix[3][0] = x;
+// tr.matrix[3][1] = y;
+// tr.matrix[3][2] = z;
+
+// trInv.matrix[3][0] = -x;
+// trInv.matrix[3][1] = -y;
+// trInv.matrix[3][2] = -z;
- tr.matrix[3][0] = x;
- tr.matrix[3][1] = y;
- tr.matrix[3][2] = z;
+// m = tr * m * trInv;
- trInv.matrix[3][0] = -x;
- trInv.matrix[3][1] = -y;
- trInv.matrix[3][2] = -z;
+ float tr[4][4];
+ float temp[4][4];
- m = tr * m * trInv;
+ _M4x4SetIdentity(tr);
+
+ tr[3][0] = x;
+ tr[3][1] = y;
+ tr[3][2] = z;
+ _M4x4Multiply(temp, tr, m.matrix);
+
+ tr[3][0] = -x;
+ tr[3][1] = -y;
+ tr[3][2] = -z;
+ _M4x4Multiply(m.matrix, temp, tr);
}
void
mat[3][3] = 1.0f;
}
- m *= Tizen::Graphics::FloatMatrix4(mat);
+// m *= Tizen::Graphics::FloatMatrix4(mat); // org code
+ float morg[4][4];
+
+ _M4x4CopyTo(morg, m.matrix);
+
+ _M4x4Multiply(m.matrix, morg, mat);
}
bool
}
}
- memcpy(m.matrix, inverse_m, sizeof(m.matrix));
+ memcpy(m.matrix, inverse_m, MATRIX_SIZE);
return true;
}
void
_MatrixUtilMultiply(Tizen::Graphics::FloatMatrix4& d, const Tizen::Graphics::FloatMatrix4& m1, const Tizen::Graphics::FloatMatrix4& m2)
{
- d = m1 * m2;
+// d = m1 * m2;
+ _M4x4Multiply(d.matrix, m1.matrix, m2.matrix);
}
void