eina: add eina_matrix4_multiply and eina_matrix4_identity function.

This commit is contained in:
Cedric BAIL 2015-06-30 18:39:39 +02:00
parent 26f33dc6bd
commit abfe65e05d
2 changed files with 135 additions and 0 deletions

View File

@ -24,6 +24,7 @@
#include <math.h>
#include <float.h>
#include <string.h>
#include "eina_fp.h"
#include "eina_rectangle.h"
@ -936,3 +937,115 @@ eina_matrix4_transpose(Eina_Matrix4 *out, const Eina_Matrix4 *in)
MATRIX_WZ(out) = MATRIX_ZW(in);
MATRIX_WW(out) = MATRIX_WW(in);
}
EAPI void
eina_matrix4_multiply(Eina_Matrix4 *out,
const Eina_Matrix4 *a, const Eina_Matrix4 *b)
{
// FIXME: start implementing SSE multiplication here
MATRIX_XX(out) =
MATRIX_XX(a) * MATRIX_XX(b)
+ MATRIX_XY(a) * MATRIX_YX(b)
+ MATRIX_XZ(a) * MATRIX_ZX(b)
+ MATRIX_XW(a) * MATRIX_WX(b);
MATRIX_XY(out) =
MATRIX_XX(a) * MATRIX_XY(b)
+ MATRIX_XY(a) * MATRIX_YY(b)
+ MATRIX_XZ(a) * MATRIX_ZY(b)
+ MATRIX_XW(a) * MATRIX_WY(b);
MATRIX_XZ(out) =
MATRIX_XX(a) * MATRIX_XZ(b)
+ MATRIX_XY(a) * MATRIX_YZ(b)
+ MATRIX_XZ(a) * MATRIX_ZZ(b)
+ MATRIX_XW(a) * MATRIX_WZ(b);
MATRIX_XW(out) =
MATRIX_XX(a) * MATRIX_XW(b)
+ MATRIX_XY(a) * MATRIX_YW(b)
+ MATRIX_XZ(a) * MATRIX_ZW(b)
+ MATRIX_XW(a) * MATRIX_WW(b);
MATRIX_YX(out) =
MATRIX_YX(a) * MATRIX_XX(b)
+ MATRIX_YY(a) * MATRIX_YX(b)
+ MATRIX_YZ(a) * MATRIX_ZX(b)
+ MATRIX_YW(a) * MATRIX_WX(b);
MATRIX_YY(out) =
MATRIX_YX(a) * MATRIX_XY(b)
+ MATRIX_YY(a) * MATRIX_YY(b)
+ MATRIX_YZ(a) * MATRIX_ZY(b)
+ MATRIX_YW(a) * MATRIX_WY(b);
MATRIX_YZ(out) =
MATRIX_YX(a) * MATRIX_XZ(b)
+ MATRIX_YY(a) * MATRIX_YZ(b)
+ MATRIX_YZ(a) * MATRIX_ZZ(b)
+ MATRIX_YW(a) * MATRIX_WZ(b);
MATRIX_YW(out) =
MATRIX_YX(a) * MATRIX_XW(b)
+ MATRIX_YY(a) * MATRIX_YW(b)
+ MATRIX_YZ(a) * MATRIX_ZW(b)
+ MATRIX_YW(a) * MATRIX_WW(b);
MATRIX_ZX(out) =
MATRIX_ZX(a) * MATRIX_XX(b)
+ MATRIX_ZY(a) * MATRIX_YX(b)
+ MATRIX_ZZ(a) * MATRIX_ZX(b)
+ MATRIX_ZW(a) * MATRIX_WX(b);
MATRIX_ZY(out) =
MATRIX_ZX(a) * MATRIX_XY(b)
+ MATRIX_ZY(a) * MATRIX_YY(b)
+ MATRIX_ZZ(a) * MATRIX_ZY(b)
+ MATRIX_ZW(a) * MATRIX_WY(b);
MATRIX_ZZ(out) =
MATRIX_ZX(a) * MATRIX_XZ(b)
+ MATRIX_ZY(a) * MATRIX_YZ(b)
+ MATRIX_ZZ(a) * MATRIX_ZZ(b)
+ MATRIX_ZW(a) * MATRIX_WZ(b);
MATRIX_ZW(out) =
MATRIX_ZX(a) * MATRIX_XW(b)
+ MATRIX_ZY(a) * MATRIX_YW(b)
+ MATRIX_ZZ(a) * MATRIX_ZW(b)
+ MATRIX_ZW(a) * MATRIX_WW(b);
MATRIX_WX(out) =
MATRIX_WX(a) * MATRIX_XX(b)
+ MATRIX_WY(a) * MATRIX_YX(b)
+ MATRIX_WZ(a) * MATRIX_ZX(b)
+ MATRIX_WW(a) * MATRIX_WX(b);
MATRIX_WY(out) =
MATRIX_WX(a) * MATRIX_XY(b)
+ MATRIX_WY(a) * MATRIX_YY(b)
+ MATRIX_WZ(a) * MATRIX_ZY(b)
+ MATRIX_WW(a) * MATRIX_WY(b);
MATRIX_WZ(out) =
MATRIX_WX(a) * MATRIX_XZ(b)
+ MATRIX_WY(a) * MATRIX_YZ(b)
+ MATRIX_WZ(a) * MATRIX_ZZ(b)
+ MATRIX_WW(a) * MATRIX_WZ(b);
MATRIX_WW(out) =
MATRIX_WX(a) * MATRIX_XW(b)
+ MATRIX_WY(a) * MATRIX_YW(b)
+ MATRIX_WZ(a) * MATRIX_ZW(b)
+ MATRIX_WW(a) * MATRIX_WW(b);
}
EAPI void
eina_matrix4_identity(Eina_Matrix4 *out)
{
memset(out, 0, sizeof (Eina_Matrix4));
MATRIX_XX(out) = 1;
MATRIX_YY(out) = 1;
MATRIX_ZZ(out) = 1;
MATRIX_WW(out) = 1;
}

View File

@ -581,6 +581,28 @@ EAPI void eina_matrix4_matrix3_to(Eina_Matrix3 *m3, const Eina_Matrix4 *m4);
*/
EAPI void eina_matrix3_matrix4_to(Eina_Matrix4 *m4, const Eina_Matrix3 *m3);
/**
* @brief Set an identity matrix
*
* @param out The matrix to set
*
* @since 1.15
*/
EAPI void eina_matrix4_identity(Eina_Matrix4 *out);
/**
* @brief Multiply two matrix
*
* @param out The resulting matrix
* @param a The first member of the multiplication
* @param b The second member of the multiplication
*
* @since 1.15
*/
EAPI void eina_matrix4_multiply(Eina_Matrix4 *out,
const Eina_Matrix4 *a, const Eina_Matrix4 *b);
/**
* @}
*/