diff dmvecmat.h @ 269:159264c27929

Add some new vector and matrix operations, and introduce some SSE inline assembler optimized versions.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 10 Oct 2012 16:35:43 +0300
parents 00785510b743
children 4d42b8910d7e
line wrap: on
line diff
--- a/dmvecmat.h	Wed Oct 10 14:08:39 2012 +0300
+++ b/dmvecmat.h	Wed Oct 10 16:35:43 2012 +0300
@@ -26,12 +26,20 @@
     DMFloat m[DM_MATRIX_SIZE][DM_MATRIX_SIZE];
 } DMMatrix;
 
+
+void    dm_vector_add_n(DMVector *dst, const DMVector *src, const int nlist);
+void    dm_vector_add_r_n(DMVector *dst, const DMVector *src1, const DMVector *src2, const int nlist);
+void    dm_vector_sub_n(DMVector *dst, const DMVector *src, const int nlist);
+void    dm_vector_sub_r_n(DMVector *dst, const DMVector *src1, const DMVector *src2, const int nlist);
+
+void    dm_vector_mul_by_mat(DMVector *vd, const DMVector *vs, const DMMatrix *mat);
 void    dm_vector_mul_by_mat_n(DMVector *list, const int nlist, const DMMatrix *mat);
 
 void    dm_matrix_unit(DMMatrix *mat);
 void    dm_matrix_transpose(DMMatrix *mat1, const DMMatrix *mat2);
 
 void    dm_matrix_mul(DMMatrix *mat1, const DMMatrix *mat2);
+void    dm_matrix_mul_r(DMMatrix *dst, const DMMatrix *mat1, const DMMatrix *mat2);
 void    dm_matrix_mul_n(DMMatrix *list, const int nlist, const DMMatrix *mat);
 
 void    dm_matrix_rot(DMMatrix *mat,
@@ -39,14 +47,14 @@
         const DMFloat cx, const DMFloat cy, const DMFloat cz);
 
 
+/* Basic vector operations
+ */
 static inline void dm_vector_copy(DMVector *vd, const DMVector *vs)
 {
     memcpy(vd, vs, sizeof(DMVector));
 }
 
 
-/* Basic vector operations
- */
 static inline void dm_vector_add(DMVector *vr, const DMVector *v2)
 {
 #ifdef DM_USE_SIMD
@@ -171,16 +179,6 @@
 }
 
 
-/* Multiply given vector with a matrix
- */
-static inline void dm_vector_mul_by_mat(DMVector *vd, const DMVector *vs, const DMMatrix *mat)
-{
-    vd->x = (vs->x * mat->m[0][0]) + (vs->y * mat->m[1][0]) + (vs->z * mat->m[2][0]);
-    vd->y = (vs->x * mat->m[0][1]) + (vs->y * mat->m[1][1]) + (vs->z * mat->m[2][1]);
-    vd->z = (vs->x * mat->m[0][2]) + (vs->y * mat->m[1][2]) + (vs->z * mat->m[2][2]);
-}
-
-
 /* Make rotation matrix from given angles (radians)
  */
 static inline void dm_matrix_rot_a(DMMatrix *mat, const DMFloat ax, const DMFloat ay, const DMFloat az)