Patch [#33196] Warning Fixes 11-16-2012
[blender.git] / source / blender / blenlib / intern / math_vector_inline.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: some of this file.
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  * */
25
26 /** \file blender/blenlib/intern/math_vector_inline.c
27  *  \ingroup bli
28  */
29
30 #ifndef __MATH_VECTOR_INLINE_C__
31 #define __MATH_VECTOR_INLINE_C__
32
33 #include "BLI_math.h"
34
35 /********************************** Init *************************************/
36
37 MINLINE void zero_v2(float r[2])
38 {
39         r[0] = 0.0f;
40         r[1] = 0.0f;
41 }
42
43 MINLINE void zero_v3(float r[3])
44 {
45         r[0] = 0.0f;
46         r[1] = 0.0f;
47         r[2] = 0.0f;
48 }
49
50 MINLINE void zero_v4(float r[4])
51 {
52         r[0] = 0.0f;
53         r[1] = 0.0f;
54         r[2] = 0.0f;
55         r[3] = 0.0f;
56 }
57
58 MINLINE void copy_v2_v2(float r[2], const float a[2])
59 {
60         r[0] = a[0];
61         r[1] = a[1];
62 }
63
64 MINLINE void copy_v3_v3(float r[3], const float a[3])
65 {
66         r[0] = a[0];
67         r[1] = a[1];
68         r[2] = a[2];
69 }
70
71 MINLINE void copy_v4_v4(float r[4], const float a[4])
72 {
73         r[0] = a[0];
74         r[1] = a[1];
75         r[2] = a[2];
76         r[3] = a[3];
77 }
78
79 MINLINE void copy_v2_fl(float r[2], float f)
80 {
81         r[0] = f;
82         r[1] = f;
83 }
84
85 MINLINE void copy_v3_fl(float r[3], float f)
86 {
87         r[0] = f;
88         r[1] = f;
89         r[2] = f;
90 }
91
92 MINLINE void copy_v4_fl(float r[4], float f)
93 {
94         r[0] = f;
95         r[1] = f;
96         r[2] = f;
97         r[3] = f;
98 }
99
100 /* short */
101 MINLINE void copy_v2_v2_char(char r[2], const char a[2])
102 {
103         r[0] = a[0];
104         r[1] = a[1];
105 }
106
107 MINLINE void copy_v3_v3_char(char r[3], const char a[3])
108 {
109         r[0] = a[0];
110         r[1] = a[1];
111         r[2] = a[2];
112 }
113
114 MINLINE void copy_v4_v4_char(char r[4], const char a[4])
115 {
116         r[0] = a[0];
117         r[1] = a[1];
118         r[2] = a[2];
119         r[3] = a[3];
120 }
121
122 /* short */
123 MINLINE void zero_v3_int(int r[3])
124 {
125         r[0] = 0;
126         r[1] = 0;
127         r[2] = 0;
128 }
129
130 MINLINE void copy_v2_v2_short(short r[2], const short a[2])
131 {
132         r[0] = a[0];
133         r[1] = a[1];
134 }
135
136 MINLINE void copy_v3_v3_short(short r[3], const short a[3])
137 {
138         r[0] = a[0];
139         r[1] = a[1];
140         r[2] = a[2];
141 }
142
143 MINLINE void copy_v4_v4_short(short r[4], const short a[4])
144 {
145         r[0] = a[0];
146         r[1] = a[1];
147         r[2] = a[2];
148         r[3] = a[3];
149 }
150
151 /* int */
152 MINLINE void copy_v2_v2_int(int r[2], const int a[2])
153 {
154         r[0] = a[0];
155         r[1] = a[1];
156 }
157
158 MINLINE void copy_v3_v3_int(int r[3], const int a[3])
159 {
160         r[0] = a[0];
161         r[1] = a[1];
162         r[2] = a[2];
163 }
164
165 MINLINE void copy_v4_v4_int(int r[4], const int a[4])
166 {
167         r[0] = a[0];
168         r[1] = a[1];
169         r[2] = a[2];
170         r[3] = a[3];
171 }
172
173 /* double -> float */
174 MINLINE void copy_v2fl_v2db(float r[2], const double a[2])
175 {
176         r[0] = (float)a[0];
177         r[1] = (float)a[1];
178 }
179
180 MINLINE void copy_v3fl_v3db(float r[3], const double a[3])
181 {
182         r[0] = (float)a[0];
183         r[1] = (float)a[1];
184         r[2] = (float)a[2];
185 }
186
187 MINLINE void copy_v4fl_v4db(float r[4], const double a[4])
188 {
189         r[0] = (float)a[0];
190         r[1] = (float)a[1];
191         r[2] = (float)a[2];
192         r[3] = (float)a[3];
193 }
194
195 /* float -> double */
196 MINLINE void copy_v2db_v2fl(double r[2], const float a[2])
197 {
198         r[0] = (double)a[0];
199         r[1] = (double)a[1];
200 }
201
202 MINLINE void copy_v3db_v3fl(double r[3], const float a[3])
203 {
204         r[0] = (double)a[0];
205         r[1] = (double)a[1];
206         r[2] = (double)a[2];
207 }
208
209 MINLINE void copy_v4db_v4fl(double r[4], const float a[4])
210 {
211         r[0] = (double)a[0];
212         r[1] = (double)a[1];
213         r[2] = (double)a[2];
214         r[3] = (double)a[3];
215 }
216
217 MINLINE void swap_v2_v2(float a[2], float b[2])
218 {
219         SWAP(float, a[0], b[0]);
220         SWAP(float, a[1], b[1]);
221 }
222
223 MINLINE void swap_v3_v3(float a[3], float b[3])
224 {
225         SWAP(float, a[0], b[0]);
226         SWAP(float, a[1], b[1]);
227         SWAP(float, a[2], b[2]);
228 }
229
230 MINLINE void swap_v4_v4(float a[4], float b[4])
231 {
232         SWAP(float, a[0], b[0]);
233         SWAP(float, a[1], b[1]);
234         SWAP(float, a[2], b[2]);
235         SWAP(float, a[3], b[3]);
236 }
237
238 /********************************* Arithmetic ********************************/
239
240 MINLINE void add_v2_fl(float r[2], float f)
241 {
242         r[0] += f;
243         r[1] += f;
244 }
245
246
247 MINLINE void add_v3_fl(float r[3], float f)
248 {
249         r[0] += f;
250         r[1] += f;
251         r[2] += f;
252 }
253
254 MINLINE void add_v4_fl(float r[4], float f)
255 {
256         r[0] += f;
257         r[1] += f;
258         r[2] += f;
259         r[3] += f;
260 }
261
262 MINLINE void add_v2_v2(float r[2], const float a[2])
263 {
264         r[0] += a[0];
265         r[1] += a[1];
266 }
267
268 MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
269 {
270         r[0] = a[0] + b[0];
271         r[1] = a[1] + b[1];
272 }
273
274 MINLINE void add_v3_v3(float r[3], const float a[3])
275 {
276         r[0] += a[0];
277         r[1] += a[1];
278         r[2] += a[2];
279 }
280
281 MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
282 {
283         r[0] = a[0] + b[0];
284         r[1] = a[1] + b[1];
285         r[2] = a[2] + b[2];
286 }
287
288 MINLINE void add_v4_v4(float r[4], const float a[4])
289 {
290         r[0] += a[0];
291         r[1] += a[1];
292         r[2] += a[2];
293         r[3] += a[3];
294 }
295
296 MINLINE void add_v4_v4v4(float r[4], const float a[4], const float b[4])
297 {
298         r[0] = a[0] + b[0];
299         r[1] = a[1] + b[1];
300         r[2] = a[2] + b[2];
301         r[3] = a[3] + b[3];
302 }
303
304 MINLINE void sub_v2_v2(float r[2], const float a[2])
305 {
306         r[0] -= a[0];
307         r[1] -= a[1];
308 }
309
310 MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
311 {
312         r[0] = a[0] - b[0];
313         r[1] = a[1] - b[1];
314 }
315
316 MINLINE void sub_v3_v3(float r[3], const float a[3])
317 {
318         r[0] -= a[0];
319         r[1] -= a[1];
320         r[2] -= a[2];
321 }
322
323 MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
324 {
325         r[0] = a[0] - b[0];
326         r[1] = a[1] - b[1];
327         r[2] = a[2] - b[2];
328 }
329
330 MINLINE void sub_v4_v4(float r[4], const float a[4])
331 {
332         r[0] -= a[0];
333         r[1] -= a[1];
334         r[2] -= a[2];
335         r[3] -= a[3];
336 }
337
338 MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4])
339 {
340         r[0] = a[0] - b[0];
341         r[1] = a[1] - b[1];
342         r[2] = a[2] - b[2];
343         r[3] = a[3] - b[3];
344 }
345
346 MINLINE void mul_v2_fl(float r[2], float f)
347 {
348         r[0] *= f;
349         r[1] *= f;
350 }
351
352 MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
353 {
354         r[0] = a[0] * f;
355         r[1] = a[1] * f;
356 }
357
358 MINLINE void mul_v3_fl(float r[3], float f)
359 {
360         r[0] *= f;
361         r[1] *= f;
362         r[2] *= f;
363 }
364
365 MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
366 {
367         r[0] = a[0] * f;
368         r[1] = a[1] * f;
369         r[2] = a[2] * f;
370 }
371
372 MINLINE void mul_v2_v2(float r[2], const float a[2])
373 {
374         r[0] *= a[0];
375         r[1] *= a[1];
376 }
377
378 MINLINE void mul_v3_v3(float r[3], const float a[3])
379 {
380         r[0] *= a[0];
381         r[1] *= a[1];
382         r[2] *= a[2];
383 }
384
385 MINLINE void mul_v4_fl(float r[4], float f)
386 {
387         r[0] *= f;
388         r[1] *= f;
389         r[2] *= f;
390         r[3] *= f;
391 }
392
393 MINLINE void mul_v4_v4fl(float r[4], const float a[4], float f)
394 {
395         r[0] = a[0] * f;
396         r[1] = a[1] * f;
397         r[2] = a[2] * f;
398         r[3] = a[3] * f;
399 }
400
401 MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
402 {
403         r[0] += a[0] * f;
404         r[1] += a[1] * f;
405 }
406
407 MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
408 {
409         r[0] += a[0] * f;
410         r[1] += a[1] * f;
411         r[2] += a[2] * f;
412 }
413
414 MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3])
415 {
416         r[0] += a[0] * b[0];
417         r[1] += a[1] * b[1];
418         r[2] += a[2] * b[2];
419 }
420
421 MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
422 {
423         r[0] = a[0] + b[0] * f;
424         r[1] = a[1] + b[1] * f;
425 }
426
427 MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
428 {
429         r[0] = a[0] + b[0] * f;
430         r[1] = a[1] + b[1] * f;
431         r[2] = a[2] + b[2] * f;
432 }
433
434 MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
435 {
436         r[0] = a[0] + b[0] * c[0];
437         r[1] = a[1] + b[1] * c[1];
438         r[2] = a[2] + b[2] * c[2];
439 }
440
441 MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
442 {
443         r[0] += a[0] * f;
444         r[1] += a[1] * f;
445         r[2] += a[2] * f;
446         r[3] += a[3] * f;
447 }
448
449 MINLINE void madd_v4_v4v4(float r[4], const float a[4], const float b[4])
450 {
451         r[0] += a[0] * b[0];
452         r[1] += a[1] * b[1];
453         r[2] += a[2] * b[2];
454         r[3] += a[3] * b[3];
455 }
456
457 MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
458 {
459         r[0] = v1[0] * v2[0];
460         r[1] = v1[1] * v2[1];
461         r[2] = v1[2] * v2[2];
462 }
463
464 MINLINE void negate_v2(float r[3])
465 {
466         r[0] = -r[0];
467         r[1] = -r[1];
468 }
469
470 MINLINE void negate_v2_v2(float r[2], const float a[2])
471 {
472         r[0] = -a[0];
473         r[1] = -a[1];
474 }
475
476 MINLINE void negate_v3(float r[3])
477 {
478         r[0] = -r[0];
479         r[1] = -r[1];
480         r[2] = -r[2];
481 }
482
483 MINLINE void negate_v3_v3(float r[3], const float a[3])
484 {
485         r[0] = -a[0];
486         r[1] = -a[1];
487         r[2] = -a[2];
488 }
489
490 MINLINE void negate_v4(float r[4])
491 {
492         r[0] = -r[0];
493         r[1] = -r[1];
494         r[2] = -r[2];
495         r[3] = -r[3];
496 }
497
498 MINLINE void negate_v4_v4(float r[4], const float a[4])
499 {
500         r[0] = -a[0];
501         r[1] = -a[1];
502         r[2] = -a[2];
503         r[3] = -a[3];
504 }
505
506 /* could add more... */
507 MINLINE void negate_v3_short(short r[3])
508 {
509         r[0] = -r[0];
510         r[1] = -r[1];
511         r[2] = -r[2];
512 }
513
514 MINLINE float dot_v2v2(const float a[2], const float b[2])
515 {
516         return a[0] * b[0] + a[1] * b[1];
517 }
518
519 MINLINE float dot_v3v3(const float a[3], const float b[3])
520 {
521         return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
522 }
523
524 MINLINE float cross_v2v2(const float a[2], const float b[2])
525 {
526         return a[0] * b[1] - a[1] * b[0];
527 }
528
529 MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
530 {
531         r[0] = a[1] * b[2] - a[2] * b[1];
532         r[1] = a[2] * b[0] - a[0] * b[2];
533         r[2] = a[0] * b[1] - a[1] * b[0];
534 }
535
536 /* Newell's Method */
537 /* excuse this fairly specific function,
538  * its used for polygon normals all over the place
539  * could use a better name */
540 MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
541 {
542         n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
543         n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
544         n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
545 }
546
547 MINLINE void star_m3_v3(float rmat[][3], float a[3])
548 {
549         rmat[0][0] = rmat[1][1] = rmat[2][2] = 0.0;
550         rmat[0][1] = -a[2];
551         rmat[0][2] = a[1];
552         rmat[1][0] = a[2];
553         rmat[1][2] = -a[0];
554         rmat[2][0] = -a[1];
555         rmat[2][1] = a[0];
556 }
557
558 /*********************************** Length **********************************/
559
560 MINLINE float len_squared_v2(const float v[2])
561 {
562         return v[0] * v[0] + v[1] * v[1];
563 }
564
565 MINLINE float len_squared_v3(const float v[3])
566 {
567         return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
568 }
569
570 MINLINE float len_manhattan_v2(const float v[2])
571 {
572         return fabsf(v[0]) + fabsf(v[1]);
573 }
574
575 MINLINE float len_manhattan_v3(const float v[3])
576 {
577         return fabsf(v[0]) + fabsf(v[1]) + fabsf(v[2]);
578 }
579
580 MINLINE float len_v2(const float v[2])
581 {
582         return sqrtf(v[0] * v[0] + v[1] * v[1]);
583 }
584
585 MINLINE float len_v2v2(const float v1[2], const float v2[2])
586 {
587         float x, y;
588
589         x = v1[0] - v2[0];
590         y = v1[1] - v2[1];
591         return sqrtf(x * x + y * y);
592 }
593
594 MINLINE float len_v3(const float a[3])
595 {
596         return sqrtf(dot_v3v3(a, a));
597 }
598
599 MINLINE float len_squared_v2v2(const float a[2], const float b[2])
600 {
601         float d[2];
602
603         sub_v2_v2v2(d, b, a);
604         return dot_v2v2(d, d);
605 }
606
607 MINLINE float len_squared_v3v3(const float a[3], const float b[3])
608 {
609         float d[3];
610
611         sub_v3_v3v3(d, b, a);
612         return dot_v3v3(d, d);
613 }
614
615 MINLINE float len_manhattan_v2v2(const float a[2], const float b[2])
616 {
617         float d[2];
618
619         sub_v2_v2v2(d, b, a);
620         return len_manhattan_v2(d);
621 }
622
623 MINLINE float len_manhattan_v3v3(const float a[3], const float b[3])
624 {
625         float d[3];
626
627         sub_v3_v3v3(d, b, a);
628         return len_manhattan_v3(d);
629 }
630
631 MINLINE float len_v3v3(const float a[3], const float b[3])
632 {
633         float d[3];
634
635         sub_v3_v3v3(d, b, a);
636         return len_v3(d);
637 }
638
639 MINLINE float normalize_v2_v2(float r[2], const float a[2])
640 {
641         float d = dot_v2v2(a, a);
642
643         if (d > 1.0e-35f) {
644                 d = sqrtf(d);
645                 mul_v2_v2fl(r, a, 1.0f / d);
646         }
647         else {
648                 zero_v2(r);
649                 d = 0.0f;
650         }
651
652         return d;
653 }
654
655 MINLINE float normalize_v2(float n[2])
656 {
657         return normalize_v2_v2(n, n);
658 }
659
660 MINLINE float normalize_v3_v3(float r[3], const float a[3])
661 {
662         float d = dot_v3v3(a, a);
663
664         /* a larger value causes normalize errors in a
665          * scaled down models with camera xtreme close */
666         if (d > 1.0e-35f) {
667                 d = sqrtf(d);
668                 mul_v3_v3fl(r, a, 1.0f / d);
669         }
670         else {
671                 zero_v3(r);
672                 d = 0.0f;
673         }
674
675         return d;
676 }
677
678 MINLINE double normalize_v3_d(double n[3])
679 {
680         double d = n[0] * n[0] + n[1] * n[1] + n[2] * n[2];
681
682         /* a larger value causes normalize errors in a
683          * scaled down models with camera xtreme close */
684         if (d > 1.0e-35) {
685                 double mul;
686
687                 d = sqrt(d);
688                 mul = 1.0 / d;
689
690                 n[0] *= mul;
691                 n[1] *= mul;
692                 n[2] *= mul;
693         }
694         else {
695                 n[0] = n[1] = n[2] = 0;
696                 d = 0.0;
697         }
698
699         return d;
700 }
701
702 MINLINE float normalize_v3(float n[3])
703 {
704         return normalize_v3_v3(n, n);
705 }
706
707 MINLINE void normal_short_to_float_v3(float out[3], const short in[3])
708 {
709         out[0] = in[0] * (1.0f / 32767.0f);
710         out[1] = in[1] * (1.0f / 32767.0f);
711         out[2] = in[2] * (1.0f / 32767.0f);
712 }
713
714 MINLINE void normal_float_to_short_v3(short out[3], const float in[3])
715 {
716         out[0] = (short) (in[0] * 32767.0f);
717         out[1] = (short) (in[1] * 32767.0f);
718         out[2] = (short) (in[2] * 32767.0f);
719 }
720
721 /********************************* Comparison ********************************/
722
723
724 MINLINE int is_zero_v2(const float v[2])
725 {
726         return (v[0] == 0 && v[1] == 0);
727 }
728
729 MINLINE int is_zero_v3(const float v[3])
730 {
731         return (v[0] == 0 && v[1] == 0 && v[2] == 0);
732 }
733
734 MINLINE int is_zero_v4(const float v[4])
735 {
736         return (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0);
737 }
738
739 MINLINE int is_one_v3(const float v[3])
740 {
741         return (v[0] == 1 && v[1] == 1 && v[2] == 1);
742 }
743
744 MINLINE int equals_v2v2(const float v1[2], const float v2[2])
745 {
746         return ((v1[0] == v2[0]) && (v1[1] == v2[1]));
747 }
748
749 MINLINE int equals_v3v3(const float v1[3], const float v2[3])
750 {
751         return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]));
752 }
753
754 MINLINE int equals_v4v4(const float v1[4], const float v2[4])
755 {
756         return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]) && (v1[3] == v2[3]));
757 }
758
759 MINLINE int compare_v2v2(const float v1[2], const float v2[2], const float limit)
760 {
761         if (fabsf(v1[0] - v2[0]) < limit)
762                 if (fabsf(v1[1] - v2[1]) < limit)
763                         return 1;
764
765         return 0;
766 }
767
768 MINLINE int compare_v3v3(const float v1[3], const float v2[3], const float limit)
769 {
770         if (fabsf(v1[0] - v2[0]) < limit)
771                 if (fabsf(v1[1] - v2[1]) < limit)
772                         if (fabsf(v1[2] - v2[2]) < limit)
773                                 return 1;
774
775         return 0;
776 }
777
778 MINLINE int compare_len_v3v3(const float v1[3], const float v2[3], const float limit)
779 {
780         float x, y, z;
781
782         x = v1[0] - v2[0];
783         y = v1[1] - v2[1];
784         z = v1[2] - v2[2];
785
786         return ((x * x + y * y + z * z) < (limit * limit));
787 }
788
789 MINLINE int compare_v4v4(const float v1[4], const float v2[4], const float limit)
790 {
791         if (fabsf(v1[0] - v2[0]) < limit)
792                 if (fabsf(v1[1] - v2[1]) < limit)
793                         if (fabsf(v1[2] - v2[2]) < limit)
794                                 if (fabsf(v1[3] - v2[3]) < limit)
795                                         return 1;
796
797         return 0;
798 }
799
800 MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2])
801 {
802         return (((l1[0] - pt[0]) * (l2[1] - pt[1])) -
803                 ((l2[0] - pt[0]) * (l1[1] - pt[1])));
804 }
805
806 #endif /* __MATH_VECTOR_INLINE_C__ */