Math Lib
[blender.git] / source / blender / blenlib / intern / math_vector_inline.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  
23  * The Original Code is: some of this file.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  * */
27
28 #include "BLI_math.h"
29
30 #ifndef BLI_MATH_VECTOR_INLINE
31 #define BLI_MATH_VECTOR_INLINE
32
33 /********************************** Init *************************************/
34
35 MINLINE void zero_v2(float r[2])
36 {
37         r[0]= 0.0f;
38         r[1]= 0.0f;
39 }
40
41 MINLINE void zero_v3(float r[3])
42 {
43         r[0]= 0.0f;
44         r[1]= 0.0f;
45         r[2]= 0.0f;
46 }
47
48 MINLINE void copy_v2_v2(float r[2], float a[2])
49 {
50         r[0]= a[0];
51         r[1]= a[1];
52 }
53
54 MINLINE void copy_v3_v3(float r[3], float a[3])
55 {
56         r[0]= a[0];
57         r[1]= a[1];
58         r[2]= a[2];
59 }
60
61 /********************************* Arithmetic ********************************/
62
63 MINLINE void add_v2_v2(float *r, float *a)
64 {
65         r[0] += a[0];
66         r[1] += a[1];
67 }
68
69 MINLINE void add_v2_v2v2(float *r, float *a, float *b)
70 {
71         r[0]= a[0] + b[0];
72         r[1]= a[1] + b[1];
73 }
74
75 MINLINE void add_v3_v3(float *r, float *a)
76 {
77         r[0] += a[0];
78         r[1] += a[1];
79         r[1] += a[1];
80 }
81
82 MINLINE void add_v3_v3v3(float *r, float *a, float *b)
83 {
84         r[0]= a[0] + b[0];
85         r[1]= a[1] + b[1];
86         r[2]= a[2] + b[2];
87 }
88
89 MINLINE void sub_v2_v2(float *r, float *a)
90 {
91         r[0] -= a[0];
92         r[1] -= a[1];
93 }
94
95 MINLINE void sub_v2_v2v2(float *r, float *a, float *b)
96 {
97         r[0]= a[0] - b[0];
98         r[1]= a[1] - b[1];
99 }
100
101 MINLINE void sub_v3_v3(float *r, float *a)
102 {
103         r[0] -= a[0];
104         r[1] -= a[1];
105         r[1] -= a[1];
106 }
107
108 MINLINE void sub_v3_v3v3(float *r, float *a, float *b)
109 {
110         r[0]= a[0] - b[0];
111         r[1]= a[1] - b[1];
112         r[2]= a[2] - b[2];
113 }
114
115 MINLINE void mul_v2_fl(float *v1, float f)
116 {
117         v1[0]*= f;
118         v1[1]*= f;
119 }
120
121 MINLINE void mul_v3_fl(float r[3], float f)
122 {
123         r[0] *= f;
124         r[1] *= f;
125         r[2] *= f;
126 }
127
128 MINLINE void mul_v3_v3fl(float r[3], float a[3], float f)
129 {
130         r[0]= a[0]*f;
131         r[1]= a[1]*f;
132         r[2]= a[2]*f;
133 }
134
135 MINLINE void mul_v3_v3(float r[3], float a[3])
136 {
137         r[0] *= a[0];
138         r[1] *= a[1];
139         r[2] *= a[2];
140 }
141
142 MINLINE void mul_v3_v3v3(float *v, float *v1, float *v2)
143 {
144         v[0] = v1[0] * v2[0];
145         v[1] = v1[1] * v2[1];
146         v[2] = v1[2] * v2[2];
147 }
148
149 MINLINE void negate_v3(float r[3])
150 {
151         r[0]= -r[0];
152         r[1]= -r[1];
153         r[2]= -r[2];
154 }
155
156 MINLINE void negate_v3_v3(float r[3], float a[3])
157 {
158         r[0]= -a[0];
159         r[1]= -a[1];
160         r[2]= -a[2];
161 }
162
163 MINLINE float dot_v2v2(float *a, float *b)
164 {
165         return a[0]*b[0] + a[1]*b[1];
166 }
167
168 MINLINE float dot_v3v3(float a[3], float b[3])
169 {
170         return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
171 }
172
173 MINLINE float cross_v2v2(float a[2], float b[2])
174 {
175          return a[0]*b[1] - a[1]*b[0];
176 }
177
178 MINLINE void cross_v3_v3v3(float r[3], float a[3], float b[3])
179 {
180         r[0]= a[1]*b[2] - a[2]*b[1];
181         r[1]= a[2]*b[0] - a[0]*b[2];
182         r[2]= a[0]*b[1] - a[1]*b[0];
183 }
184
185 MINLINE void star_m3_v3(float mat[][3], float *vec)
186 {
187         mat[0][0]= mat[1][1]= mat[2][2]= 0.0;
188         mat[0][1]= -vec[2];     
189         mat[0][2]= vec[1];
190         mat[1][0]= vec[2];      
191         mat[1][2]= -vec[0];
192         mat[2][0]= -vec[1];     
193         mat[2][1]= vec[0];
194 }
195
196 /*********************************** Length **********************************/
197
198 MINLINE float len_v2(float *v)
199 {
200         return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
201 }
202
203 MINLINE float len_v2v2(float *v1, float *v2)
204 {
205         float x, y;
206
207         x = v1[0]-v2[0];
208         y = v1[1]-v2[1];
209         return (float)sqrt(x*x+y*y);
210 }
211
212 MINLINE float len_v3(float a[3])
213 {
214         return sqrtf(dot_v3v3(a, a));
215 }
216
217 MINLINE float len_v3v3(float a[3], float b[3])
218 {
219         float d[3];
220
221         sub_v3_v3v3(d, b, a);
222         return len_v3(d);
223 }
224
225 MINLINE float normalize_v2(float n[2])
226 {
227         float d= dot_v2v2(n, n);
228
229         if(d > 1.0e-35f) {
230                 d= sqrtf(d);
231                 mul_v2_fl(n, 1.0f/d);
232         } else {
233                 zero_v2(n);
234                 d= 0.0f;
235         }
236         return d;
237 }
238
239 MINLINE float normalize_v3(float n[3])
240 {
241         float d= dot_v3v3(n, n);
242
243         /* a larger value causes normalize errors in a
244            scaled down models with camera xtreme close */
245         if(d > 1.0e-35f) {
246                 d= sqrtf(d);
247                 mul_v3_fl(n, 1.0f/d);
248         }
249         else {
250                 zero_v3(n);
251                 d= 0.0f;
252         }
253
254         return d;
255 }
256
257 #endif /* BLI_MATH_VECTOR_INLINE */
258