cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=abfe65e05d6ef483432def7a4554f401e33657ca

commit abfe65e05d6ef483432def7a4554f401e33657ca
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Tue Jun 30 18:39:39 2015 +0200

    eina: add eina_matrix4_multiply and eina_matrix4_identity function.
---
 src/lib/eina/eina_matrix.c | 113 +++++++++++++++++++++++++++++++++++++++++++++
 src/lib/eina/eina_matrix.h |  22 +++++++++
 2 files changed, 135 insertions(+)

diff --git a/src/lib/eina/eina_matrix.c b/src/lib/eina/eina_matrix.c
index 96a0971..4263322 100644
--- a/src/lib/eina/eina_matrix.c
+++ b/src/lib/eina/eina_matrix.c
@@ -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;
+}
diff --git a/src/lib/eina/eina_matrix.h b/src/lib/eina/eina_matrix.h
index ab6be4c..17af8d3 100644
--- a/src/lib/eina/eina_matrix.h
+++ b/src/lib/eina/eina_matrix.h
@@ -582,6 +582,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);
+
+
+/**
  * @}
  */
 #endif /*EINA_MATRIX3_H_*/

-- 


Reply via email to