Mercurial > hg > dmlib
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)