Mercurial > hg > dmlib
annotate dmvecmat.h @ 239:07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
functions to dmvecmat.h as static inline for speed, etc.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 09 Oct 2012 12:59:09 +0300 |
parents | 32250b436bca |
children | 00785510b743 |
rev | line source |
---|---|
0 | 1 /* |
2 * DMLib | |
3 * -- Vector and matrix functions | |
4 * Programmed and designed by Matti 'ccr' Hamalainen | |
5 * (C) Copyright 2011 Tecnic Software productions (TNSP) | |
6 */ | |
7 #ifndef DMVECMAT_H | |
8 #define DMVECMAT_H | |
9 #include "dmlib.h" | |
10 | |
239
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
11 #include <math.h> |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
12 |
0 | 13 #ifdef __cplusplus |
14 extern "C" { | |
15 #endif | |
16 | |
239
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
17 #define DM_MATRIX_SIZE (4) |
0 | 18 |
19 typedef struct | |
20 { | |
239
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
21 DMFloat x, y, z, W; |
0 | 22 } DMVector; |
23 | |
24 typedef struct | |
25 { | |
26 DMFloat m[DM_MATRIX_SIZE][DM_MATRIX_SIZE]; | |
27 } DMMatrix; | |
28 | |
29 void dm_vector_mul_by_mat_n(DMVector *list, const int nlist, const DMMatrix *mat); | |
30 | |
31 void dm_matrix_unit(DMMatrix *mat); | |
32 void dm_matrix_transpose(DMMatrix *mat1, const DMMatrix *mat2); | |
33 | |
34 void dm_matrix_mul(DMMatrix *mat1, const DMMatrix *mat2); | |
35 void dm_matrix_mul_n(DMMatrix *list, const int nlist, const DMMatrix *mat); | |
36 | |
37 void dm_matrix_rot(DMMatrix *mat, | |
38 const DMFloat sx, const DMFloat sy, const DMFloat sz, | |
39 const DMFloat cx, const DMFloat cy, const DMFloat cz); | |
40 | |
239
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
41 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
42 static inline void dm_vector_copy(DMVector *vd, DMVector *vs) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
43 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
44 memcpy(vd, vs, sizeof(DMVector)); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
45 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
46 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
47 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
48 /* Basic vector operations |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
49 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
50 static inline void dm_vector_add(DMVector *vr, const DMVector *v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
51 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
52 #ifdef DM_USE_SIMD |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
53 asm("movups %2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
54 "movups %1, %%xmm2\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
55 "addps %%xmm2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
56 "movups %%xmm1, %0\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
57 : "=m" (*vr) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
58 : "m" (*vr), "m" (*v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
59 : "memory", "%xmm1", "%xmm2"); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
60 #else |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
61 vr->x += v2->x; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
62 vr->y += v2->y; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
63 vr->z += v2->z; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
64 #endif |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
65 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
66 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
67 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
68 static inline void dm_vector_add_r(DMVector *vr, const DMVector *v1, const DMVector *v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
69 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
70 #ifdef DM_USE_SIMD |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
71 asm("movups %2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
72 "movups %1, %%xmm2\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
73 "addps %%xmm2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
74 "movups %%xmm1, %0\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
75 : "=m" (*vr) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
76 : "m" (*v1), "m" (*v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
77 : "memory", "%xmm1", "%xmm2"); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
78 #else |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
79 vr->x = v1->x + v2->x; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
80 vr->y = v1->y + v2->y; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
81 vr->z = v1->z + v2->z; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
82 #endif |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
83 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
84 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
85 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
86 static inline void dm_vector_sub(DMVector *vr, const DMVector *v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
87 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
88 #ifdef DM_USE_SIMD |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
89 asm("movups %2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
90 "movups %1, %%xmm2\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
91 "subps %%xmm2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
92 "movups %%xmm1, %0\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
93 : "=m" (*vr) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
94 : "m" (*vr), "m" (*v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
95 : "memory", "%xmm1", "%xmm2"); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
96 #else |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
97 vr->x -= v2->x; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
98 vr->y -= v2->y; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
99 vr->z -= v2->z; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
100 #endif |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
101 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
102 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
103 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
104 static inline void dm_vector_sub_r(DMVector *vr, const DMVector *v1, const DMVector *v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
105 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
106 #ifdef DM_USE_SIMD |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
107 asm("movups %2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
108 "movups %1, %%xmm2\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
109 "subps %%xmm2, %%xmm1\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
110 "movups %%xmm1, %0\n" |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
111 : "=m" (*vr) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
112 : "m" (*v1), "m" (*v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
113 : "memory", "%xmm1", "%xmm2"); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
114 #else |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
115 vr->x = v1->x - v2->x; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
116 vr->y = v1->y - v2->y; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
117 vr->z = v1->z - v2->z; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
118 #endif |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
119 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
120 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
121 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
122 /* Returns dot-product of two given vectors |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
123 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
124 static inline DMFloat dm_vector_dot(const DMVector *v1, const DMVector *v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
125 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
126 return (v1->x * v2->x) + (v1->y * v2->y) + (v1->z * v2->z); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
127 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
128 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
129 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
130 /* Return vector length |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
131 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
132 static inline DMFloat dm_vector_length(const DMVector *vs) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
133 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
134 return sqrt((vs->x * vs->x) + (vs->y * vs->y) + (vs->z * vs->z)); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
135 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
136 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
137 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
138 /* Normalize vector |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
139 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
140 static inline void dm_vector_normalize(DMVector *vec) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
141 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
142 DMFloat l = dm_vector_length(vec); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
143 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
144 if (l > 0.0f) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
145 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
146 l = 1.0f / l; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
147 vec->x *= l; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
148 vec->y *= l; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
149 vec->z *= l; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
150 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
151 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
152 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
153 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
154 /* Scale given vector |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
155 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
156 static inline void dm_vector_scale(DMVector * vec, const DMFloat k) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
157 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
158 vec->x *= k; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
159 vec->y *= k; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
160 vec->z *= k; |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
161 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
162 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
163 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
164 /* Returns cross-product of two given vectors |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
165 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
166 static inline void dm_vector_cross(DMVector *vr, const DMVector *v1, const DMVector *v2) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
167 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
168 vr->x = (v1->y * v2->z) - (v1->z * v2->y); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
169 vr->y = (v1->z * v2->x) - (v1->x * v2->z); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
170 vr->z = (v1->x * v2->y) - (v1->y * v2->x); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
171 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
172 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
173 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
174 /* Multiply given vector with a matrix |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
175 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
176 static inline void dm_vector_mul_by_mat(DMVector *vd, const DMVector *vs, const DMMatrix *mat) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
177 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
178 vd->x = (vs->x * mat->m[0][0]) + (vs->y * mat->m[1][0]) + (vs->z * mat->m[2][0]); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
179 vd->y = (vs->x * mat->m[0][1]) + (vs->y * mat->m[1][1]) + (vs->z * mat->m[2][1]); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
180 vd->z = (vs->x * mat->m[0][2]) + (vs->y * mat->m[1][2]) + (vs->z * mat->m[2][2]); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
181 } |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
182 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
183 |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
184 /* Make rotation matrix from given angles (radians) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
185 */ |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
186 static inline void dm_matrix_rot_a(DMMatrix *mat, const DMFloat ax, const DMFloat ay, const DMFloat az) |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
187 { |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
188 dm_matrix_rot(mat, sin(ax), sin(ay), sin(az), cos(ax), cos(ay), cos(az)); |
07c4f1a7ddc6
Make DMVector 16 bytes in size (4 floats), add SSE optimizations, move some
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
189 } |
0 | 190 |
191 | |
192 #ifdef __cplusplus | |
193 } | |
194 #endif | |
195 #endif // DMVECMAT_H |