4 * ***** BEGIN GPL LICENSE BLOCK *****
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21 * All rights reserved.
23 * The Original Code is: some of this file.
25 * ***** END GPL LICENSE BLOCK *****
30 #ifndef BLI_MATH_VECTOR_INLINE
31 #define BLI_MATH_VECTOR_INLINE
33 /********************************** Init *************************************/
35 MINLINE void zero_v2(float r[2])
41 MINLINE void zero_v3(float r[3])
48 MINLINE void zero_v4(float r[4])
56 MINLINE void copy_v2_v2(float r[2], const float a[2])
62 MINLINE void copy_v3_v3(float r[3], const float a[3])
69 MINLINE void copy_v4_v4(float r[4], const float a[4])
77 MINLINE void swap_v2_v2(float a[2], float b[2])
79 SWAP(float, a[0], b[0]);
80 SWAP(float, a[1], b[1]);
83 MINLINE void swap_v3_v3(float a[3], float b[3])
85 SWAP(float, a[0], b[0]);
86 SWAP(float, a[1], b[1]);
87 SWAP(float, a[2], b[2]);
90 MINLINE void swap_v4_v4(float a[4], float b[4])
92 SWAP(float, a[0], b[0]);
93 SWAP(float, a[1], b[1]);
94 SWAP(float, a[2], b[2]);
95 SWAP(float, a[3], b[3]);
98 /********************************* Arithmetic ********************************/
100 MINLINE void add_v2_v2(float *r, const float *a)
106 MINLINE void add_v2_v2v2(float *r, const float *a, const float *b)
112 MINLINE void add_v3_v3(float *r, const float *a)
119 MINLINE void add_v3_v3v3(float *r, const float *a, const float *b)
126 MINLINE void sub_v2_v2(float *r, const float *a)
132 MINLINE void sub_v2_v2v2(float *r, const float *a, const float *b)
138 MINLINE void sub_v3_v3(float *r, const float *a)
145 MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
152 MINLINE void mul_v2_fl(float *v1, float f)
158 MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
164 MINLINE void mul_v3_fl(float r[3], float f)
171 MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
178 MINLINE void mul_v2_v2(float r[2], const float a[2])
184 MINLINE void mul_v3_v3(float r[3], const float a[3])
191 MINLINE void mul_v4_fl(float r[4], float f)
199 MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
205 MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
212 MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3])
219 MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
221 r[0] = a[0] + b[0]*f;
222 r[1] = a[1] + b[1]*f;
225 MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
227 r[0] = a[0] + b[0]*f;
228 r[1] = a[1] + b[1]*f;
229 r[2] = a[2] + b[2]*f;
232 MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
234 r[0] = a[0] + b[0]*c[0];
235 r[1] = a[1] + b[1]*c[1];
236 r[2] = a[2] + b[2]*c[2];
239 MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
247 MINLINE void mul_v3_v3v3(float *v, const float *v1, const float *v2)
249 v[0] = v1[0] * v2[0];
250 v[1] = v1[1] * v2[1];
251 v[2] = v1[2] * v2[2];
254 MINLINE void negate_v3(float r[3])
261 MINLINE void negate_v3_v3(float r[3], const float a[3])
268 MINLINE float dot_v2v2(const float a[2], const float b[2])
270 return a[0]*b[0] + a[1]*b[1];
273 MINLINE float dot_v3v3(const float a[3], const float b[3])
275 return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
278 MINLINE float cross_v2v2(const float a[2], const float b[2])
280 return a[0]*b[1] - a[1]*b[0];
283 MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
285 r[0]= a[1]*b[2] - a[2]*b[1];
286 r[1]= a[2]*b[0] - a[0]*b[2];
287 r[2]= a[0]*b[1] - a[1]*b[0];
290 MINLINE void star_m3_v3(float mat[][3], float *vec)
292 mat[0][0]= mat[1][1]= mat[2][2]= 0.0;
301 /*********************************** Length **********************************/
303 MINLINE float len_v2(const float v[2])
305 return (float)sqrtf(v[0]*v[0] + v[1]*v[1]);
308 MINLINE float len_v2v2(const float v1[2], const float v2[2])
314 return (float)sqrtf(x*x+y*y);
317 MINLINE float len_v3(const float a[3])
319 return sqrtf(dot_v3v3(a, a));
322 MINLINE float len_squared_v2v2(const float a[3], const float b[3])
326 sub_v2_v2v2(d, b, a);
327 return dot_v2v2(d, d);
330 MINLINE float len_v3v3(const float a[3], const float b[3])
334 sub_v3_v3v3(d, b, a);
338 MINLINE float len_squared_v3v3(const float a[3], const float b[3])
342 sub_v3_v3v3(d, b, a);
343 return dot_v3v3(d, d);
346 MINLINE float normalize_v2_v2(float r[2], const float a[2])
348 float d= dot_v2v2(a, a);
352 mul_v2_v2fl(r, a, 1.0f/d);
361 MINLINE float normalize_v2(float n[2])
363 return normalize_v2_v2(n, n);
366 MINLINE float normalize_v3_v3(float r[3], const float a[3])
368 float d= dot_v3v3(a, a);
370 /* a larger value causes normalize errors in a
371 scaled down models with camera xtreme close */
374 mul_v3_v3fl(r, a, 1.0f/d);
384 MINLINE float normalize_v3(float n[3])
386 return normalize_v3_v3(n, n);
389 MINLINE void normal_short_to_float_v3(float *out, const short *in)
391 out[0] = in[0]*(1.0f/32767.0f);
392 out[1] = in[1]*(1.0f/32767.0f);
393 out[2] = in[2]*(1.0f/32767.0f);
396 MINLINE void normal_float_to_short_v3(short *out, const float *in)
398 out[0] = (short)(in[0]*32767.0f);
399 out[1] = (short)(in[1]*32767.0f);
400 out[2] = (short)(in[2]*32767.0f);
403 /********************************* Comparison ********************************/
405 MINLINE int is_zero_v3(float *v)
407 return (v[0] == 0 && v[1] == 0 && v[2] == 0);
410 MINLINE int is_one_v3(float *v)
412 return (v[0] == 1 && v[1] == 1 && v[2] == 1);
415 MINLINE int equals_v3v3(float *v1, float *v2)
417 return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]));
420 MINLINE int equals_v4v4(float *v1, float *v2)
422 return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]) && (v1[3]==v2[3]));
425 MINLINE int compare_v3v3(float *v1, float *v2, float limit)
427 if(fabs(v1[0]-v2[0])<limit)
428 if(fabs(v1[1]-v2[1])<limit)
429 if(fabs(v1[2]-v2[2])<limit)
435 MINLINE int compare_len_v3v3(float *v1, float *v2, float limit)
443 return ((x*x + y*y + z*z) < (limit*limit));
446 MINLINE int compare_v4v4(float *v1, float *v2, float limit)
448 if(fabs(v1[0]-v2[0])<limit)
449 if(fabs(v1[1]-v2[1])<limit)
450 if(fabs(v1[2]-v2[2])<limit)
451 if(fabs(v1[3]-v2[3])<limit)
457 #endif /* BLI_MATH_VECTOR_INLINE */