optimize matrix calculation
authorDae Young Ryu <karzia@samsung.com>
Fri, 29 Nov 2013 04:57:35 +0000 (13:57 +0900)
committerGerrit Code Review <gerrit@gerrit.vlan144.tizendev.org>
Fri, 29 Nov 2013 13:56:36 +0000 (13:56 +0000)
Change-Id: Ib4ea403e5d292024737a974d932ecc83b533f106
Signed-off-by: Dae Young Ryu <karzia@samsung.com>
src/ui/animations/FUiAnim_MatrixUtil.cpp

index 4344379..70cfc19 100644 (file)
 #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] =
 {
@@ -54,6 +54,40 @@ 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)
 {
@@ -119,17 +153,24 @@ _MatrixUtilSetTranslation(Tizen::Graphics::FloatMatrix4& m, float tx, float ty,
 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;
        }
 }
 
@@ -154,6 +195,7 @@ _MatrixUtilIsTranslation(const Tizen::Graphics::FloatMatrix4& m)
        return false;
 }
 
+
 void
 _MatrixUtilScale(Tizen::Graphics::FloatMatrix4& m, float sx, float sy, float sz)
 {
@@ -185,18 +227,33 @@ _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
@@ -298,7 +355,12 @@ _MatrixUtilRotate(Tizen::Graphics::FloatMatrix4& m, float angle, float x, float
                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
@@ -379,7 +441,7 @@ _MatrixUtilInvert(Tizen::Graphics::FloatMatrix4& m)
                }
        }
 
-       memcpy(m.matrix, inverse_m, sizeof(m.matrix));
+       memcpy(m.matrix, inverse_m, MATRIX_SIZE);
 
        return true;
 }
@@ -387,7 +449,8 @@ _MatrixUtilInvert(Tizen::Graphics::FloatMatrix4& m)
 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