Blender V5.0
math_vector_inline.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#ifndef __MATH_VECTOR_INLINE_C__
10#define __MATH_VECTOR_INLINE_C__
11
12#include "BLI_math_base.h"
13#include "BLI_utildefines.h"
14
15/********************************** Init *************************************/
16
17MINLINE void zero_v2(float r[2])
18{
19 r[0] = 0.0f;
20 r[1] = 0.0f;
21}
22
23MINLINE void zero_v3(float r[3])
24{
25 r[0] = 0.0f;
26 r[1] = 0.0f;
27 r[2] = 0.0f;
28}
29
30MINLINE void zero_v4(float r[4])
31{
32 r[0] = 0.0f;
33 r[1] = 0.0f;
34 r[2] = 0.0f;
35 r[3] = 0.0f;
36}
37
38MINLINE void copy_v2_v2(float r[2], const float a[2])
39{
40 r[0] = a[0];
41 r[1] = a[1];
42}
43
44MINLINE void copy_v3_v3(float r[3], const float a[3])
45{
46 r[0] = a[0];
47 r[1] = a[1];
48 r[2] = a[2];
49}
50
51MINLINE void copy_v4_v4(float r[4], const float a[4])
52{
53 r[0] = a[0];
54 r[1] = a[1];
55 r[2] = a[2];
56 r[3] = a[3];
57}
58
59MINLINE void copy_v2_fl(float r[2], float f)
60{
61 r[0] = f;
62 r[1] = f;
63}
64
65MINLINE void copy_v3_fl(float r[3], float f)
66{
67 r[0] = f;
68 r[1] = f;
69 r[2] = f;
70}
71
72MINLINE void copy_v4_fl(float r[4], float f)
73{
74 r[0] = f;
75 r[1] = f;
76 r[2] = f;
77 r[3] = f;
78}
79
80/* unsigned char */
81
82MINLINE void copy_v3_v3_uchar(unsigned char r[3], const unsigned char a[3])
83{
84 r[0] = a[0];
85 r[1] = a[1];
86 r[2] = a[2];
87}
88
89MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
90{
91 r[0] = a[0];
92 r[1] = a[1];
93 r[2] = a[2];
94 r[3] = a[3];
95}
96
97/* short */
98
99MINLINE void copy_v2_v2_short(short r[2], const short a[2])
100{
101 r[0] = a[0];
102 r[1] = a[1];
103}
104
105MINLINE void copy_v3_v3_short(short r[3], const short a[3])
106{
107 r[0] = a[0];
108 r[1] = a[1];
109 r[2] = a[2];
110}
111
112/* int */
113MINLINE void zero_v2_int(int r[2])
114{
115 r[0] = 0;
116 r[1] = 0;
117}
118
119MINLINE void zero_v3_int(int r[3])
120{
121 r[0] = 0;
122 r[1] = 0;
123 r[2] = 0;
124}
125
126MINLINE void copy_v2_v2_int(int r[2], const int a[2])
127{
128 r[0] = a[0];
129 r[1] = a[1];
130}
131
132MINLINE void copy_v3_v3_int(int r[3], const int a[3])
133{
134 r[0] = a[0];
135 r[1] = a[1];
136 r[2] = a[2];
137}
138
139MINLINE void copy_v4_v4_int(int r[4], const int a[4])
140{
141 r[0] = a[0];
142 r[1] = a[1];
143 r[2] = a[2];
144 r[3] = a[3];
145}
146
147/* double */
148
149MINLINE void copy_v2_v2_db(double r[2], const double a[2])
150{
151 r[0] = a[0];
152 r[1] = a[1];
153}
154
155MINLINE void copy_v3_v3_db(double r[3], const double a[3])
156{
157 r[0] = a[0];
158 r[1] = a[1];
159 r[2] = a[2];
160}
161
162MINLINE void copy_v4_v4_db(double r[4], const double a[4])
163{
164 r[0] = a[0];
165 r[1] = a[1];
166 r[2] = a[2];
167 r[3] = a[3];
168}
169
170MINLINE void copy_v2fl_v2i(float r[2], const int a[2])
171{
172 r[0] = (float)a[0];
173 r[1] = (float)a[1];
174}
175
176/* double -> float */
177
178MINLINE void copy_v3fl_v3db(float r[3], const double a[3])
179{
180 r[0] = (float)a[0];
181 r[1] = (float)a[1];
182 r[2] = (float)a[2];
183}
184
185MINLINE void copy_v4fl_v4db(float r[4], const double a[4])
186{
187 r[0] = (float)a[0];
188 r[1] = (float)a[1];
189 r[2] = (float)a[2];
190 r[3] = (float)a[3];
191}
192
193/* float -> double */
194
195MINLINE void copy_v2db_v2fl(double r[2], const float a[2])
196{
197 r[0] = (double)a[0];
198 r[1] = (double)a[1];
199}
200
201MINLINE void copy_v3db_v3fl(double r[3], const float a[3])
202{
203 r[0] = (double)a[0];
204 r[1] = (double)a[1];
205 r[2] = (double)a[2];
206}
207
208MINLINE void swap_v2_v2(float a[2], float b[2])
209{
210 SWAP(float, a[0], b[0]);
211 SWAP(float, a[1], b[1]);
212}
213
214MINLINE void swap_v3_v3(float a[3], float b[3])
215{
216 SWAP(float, a[0], b[0]);
217 SWAP(float, a[1], b[1]);
218 SWAP(float, a[2], b[2]);
219}
220
221MINLINE void swap_v4_v4(float a[4], float b[4])
222{
223 SWAP(float, a[0], b[0]);
224 SWAP(float, a[1], b[1]);
225 SWAP(float, a[2], b[2]);
226 SWAP(float, a[3], b[3]);
227}
228
229/* float args -> vec */
230
231MINLINE void copy_v2_fl2(float v[2], float x, float y)
232{
233 v[0] = x;
234 v[1] = y;
235}
236
237MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
238{
239 v[0] = x;
240 v[1] = y;
241 v[2] = z;
242}
243
244MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
245{
246 v[0] = x;
247 v[1] = y;
248 v[2] = z;
249 v[3] = w;
250}
251
252/********************************* Arithmetic ********************************/
253
254MINLINE void add_v2_fl(float r[2], float f)
255{
256 r[0] += f;
257 r[1] += f;
258}
259
260MINLINE void add_v3_fl(float r[3], float f)
261{
262 r[0] += f;
263 r[1] += f;
264 r[2] += f;
265}
266
267MINLINE void add_v2_v2(float r[2], const float a[2])
268{
269 r[0] += a[0];
270 r[1] += a[1];
271}
272
273MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
274{
275 r[0] = a[0] + b[0];
276 r[1] = a[1] + b[1];
277}
278
279MINLINE void add_v3_v3(float r[3], const float a[3])
280{
281 r[0] += a[0];
282 r[1] += a[1];
283 r[2] += a[2];
284}
285
286MINLINE void add_v3_v3_db(double r[3], const double a[3])
287{
288 r[0] += a[0];
289 r[1] += a[1];
290 r[2] += a[2];
291}
292
293MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
294{
295 r[0] = a[0] + b[0];
296 r[1] = a[1] + b[1];
297 r[2] = a[2] + b[2];
298}
299
300MINLINE void add_v3fl_v3fl_v3i(float r[3], const float a[3], const int b[3])
301{
302 r[0] = a[0] + (float)b[0];
303 r[1] = a[1] + (float)b[1];
304 r[2] = a[2] + (float)b[2];
305}
306
307MINLINE void add_v4_v4(float r[4], const float a[4])
308{
309 r[0] += a[0];
310 r[1] += a[1];
311 r[2] += a[2];
312 r[3] += a[3];
313}
314
316{
317 r[0] = (uchar)clamp_i(r[0] + i, 0, 255);
318 r[1] = (uchar)clamp_i(r[1] + i, 0, 255);
319 r[2] = (uchar)clamp_i(r[2] + i, 0, 255);
320}
321
322MINLINE void sub_v2_v2(float r[2], const float a[2])
323{
324 r[0] -= a[0];
325 r[1] -= a[1];
326}
327
328MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
329{
330 r[0] = a[0] - b[0];
331 r[1] = a[1] - b[1];
332}
333
334MINLINE void sub_v2_v2v2_db(double r[2], const double a[2], const double b[2])
335{
336 r[0] = a[0] - b[0];
337 r[1] = a[1] - b[1];
338}
339
340MINLINE void sub_v2_v2v2_int(int r[2], const int a[2], const int b[2])
341{
342 r[0] = a[0] - b[0];
343 r[1] = a[1] - b[1];
344}
345
346MINLINE void sub_v3_v3(float r[3], const float a[3])
347{
348 r[0] -= a[0];
349 r[1] -= a[1];
350 r[2] -= a[2];
351}
352
353MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
354{
355 r[0] = a[0] - b[0];
356 r[1] = a[1] - b[1];
357 r[2] = a[2] - b[2];
358}
359
360MINLINE void sub_v3_v3v3_int(int r[3], const int a[3], const int b[3])
361{
362 r[0] = a[0] - b[0];
363 r[1] = a[1] - b[1];
364 r[2] = a[2] - b[2];
365}
366
367MINLINE void sub_v3_v3v3_db(double r[3], const double a[3], const double b[3])
368{
369 r[0] = a[0] - b[0];
370 r[1] = a[1] - b[1];
371 r[2] = a[2] - b[2];
372}
373
374MINLINE void sub_v2db_v2fl_v2fl(double r[2], const float a[2], const float b[2])
375{
376 r[0] = (double)a[0] - (double)b[0];
377 r[1] = (double)a[1] - (double)b[1];
378}
379
380MINLINE void sub_v3db_v3fl_v3fl(double r[3], const float a[3], const float b[3])
381{
382 r[0] = (double)a[0] - (double)b[0];
383 r[1] = (double)a[1] - (double)b[1];
384 r[2] = (double)a[2] - (double)b[2];
385}
386
387MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4])
388{
389 r[0] = a[0] - b[0];
390 r[1] = a[1] - b[1];
391 r[2] = a[2] - b[2];
392 r[3] = a[3] - b[3];
393}
394
395MINLINE void mul_v2_fl(float r[2], float f)
396{
397 r[0] *= f;
398 r[1] *= f;
399}
400
401MINLINE void mul_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
407MINLINE void mul_v3_fl(float r[3], float f)
408{
409 r[0] *= f;
410 r[1] *= f;
411 r[2] *= f;
412}
413
414MINLINE void mul_v3db_db(double r[3], double f)
415{
416 r[0] *= f;
417 r[1] *= f;
418 r[2] *= f;
419}
420
421MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
422{
423 r[0] = a[0] * f;
424 r[1] = a[1] * f;
425 r[2] = a[2] * f;
426}
427
428MINLINE void mul_v2_v2(float r[2], const float a[2])
429{
430 r[0] *= a[0];
431 r[1] *= a[1];
432}
433
434MINLINE void mul_v3_v3(float r[3], const float a[3])
435{
436 r[0] *= a[0];
437 r[1] *= a[1];
438 r[2] *= a[2];
439}
440
441MINLINE void mul_v4_fl(float r[4], float f)
442{
443 r[0] *= f;
444 r[1] *= f;
445 r[2] *= f;
446 r[3] *= f;
447}
448
449MINLINE void mul_v4_v4fl(float r[4], const float a[4], float f)
450{
451 r[0] = a[0] * f;
452 r[1] = a[1] * f;
453 r[2] = a[2] * f;
454 r[3] = a[3] * f;
455}
456
457MINLINE float mul_project_m4_v3_zfac(const float mat[4][4], const float co[3])
458{
459 return (mat[0][3] * co[0]) + (mat[1][3] * co[1]) + (mat[2][3] * co[2]) + mat[3][3];
460}
461
462MINLINE float dot_m3_v3_row_x(const float M[3][3], const float a[3])
463{
464 return M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2];
465}
466MINLINE float dot_m3_v3_row_y(const float M[3][3], const float a[3])
467{
468 return M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2];
469}
470MINLINE float dot_m3_v3_row_z(const float M[3][3], const float a[3])
471{
472 return M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2];
473}
474
475MINLINE float dot_m4_v3_row_x(const float M[4][4], const float a[3])
476{
477 return M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2];
478}
479MINLINE float dot_m4_v3_row_y(const float M[4][4], const float a[3])
480{
481 return M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2];
482}
483MINLINE float dot_m4_v3_row_z(const float M[4][4], const float a[3])
484{
485 return M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2];
486}
487
488MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
489{
490 r[0] += a[0] * f;
491 r[1] += a[1] * f;
492}
493
494MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
495{
496 r[0] += a[0] * f;
497 r[1] += a[1] * f;
498 r[2] += a[2] * f;
499}
500
501MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
502{
503 r[0] = a[0] + b[0] * f;
504 r[1] = a[1] + b[1] * f;
505}
506
507MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
508{
509 r[0] = a[0] + b[0] * f;
510 r[1] = a[1] + b[1] * f;
511 r[2] = a[2] + b[2] * f;
512}
513
514MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
515{
516 r[0] = a[0] + b[0] * c[0];
517 r[1] = a[1] + b[1] * c[1];
518 r[2] = a[2] + b[2] * c[2];
519}
520
522 const float a[3],
523 const float b[3],
524 const int c[3])
525{
526 r[0] = a[0] + b[0] * (float)c[0];
527 r[1] = a[1] + b[1] * (float)c[1];
528 r[2] = a[2] + b[2] * (float)c[2];
529}
530
531MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
532{
533 r[0] += a[0] * f;
534 r[1] += a[1] * f;
535 r[2] += a[2] * f;
536 r[3] += a[3] * f;
537}
538
539MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
540{
541 r[0] = v1[0] * v2[0];
542 r[1] = v1[1] * v2[1];
543 r[2] = v1[2] * v2[2];
544}
545
546MINLINE void mul_v2_v2v2(float r[2], const float a[2], const float b[2])
547{
548 r[0] = a[0] * b[0];
549 r[1] = a[1] * b[1];
550}
551
552MINLINE void negate_v2_v2(float r[2], const float a[2])
553{
554 r[0] = -a[0];
555 r[1] = -a[1];
556}
557
558MINLINE void negate_v3(float r[3])
559{
560 r[0] = -r[0];
561 r[1] = -r[1];
562 r[2] = -r[2];
563}
564
565MINLINE void negate_v3_v3(float r[3], const float a[3])
566{
567 r[0] = -a[0];
568 r[1] = -a[1];
569 r[2] = -a[2];
570}
571
572MINLINE void negate_v4(float r[4])
573{
574 r[0] = -r[0];
575 r[1] = -r[1];
576 r[2] = -r[2];
577 r[3] = -r[3];
578}
579
580MINLINE void negate_v4_v4(float r[4], const float a[4])
581{
582 r[0] = -a[0];
583 r[1] = -a[1];
584 r[2] = -a[2];
585 r[3] = -a[3];
586}
587
588MINLINE void negate_v3_db(double r[3])
589{
590 r[0] = -r[0];
591 r[1] = -r[1];
592 r[2] = -r[2];
593}
594
595MINLINE void invert_v2(float r[2])
596{
597 BLI_assert(!ELEM(0.0f, r[0], r[1]));
598 r[0] = 1.0f / r[0];
599 r[1] = 1.0f / r[1];
600}
601
602MINLINE void invert_v3(float r[3])
603{
604 BLI_assert(!ELEM(0.0f, r[0], r[1], r[2]));
605 r[0] = 1.0f / r[0];
606 r[1] = 1.0f / r[1];
607 r[2] = 1.0f / r[2];
608}
609
610MINLINE void invert_v3_safe(float r[3])
611{
612 if (r[0] != 0.0f) {
613 r[0] = 1.0f / r[0];
614 }
615 if (r[1] != 0.0f) {
616 r[1] = 1.0f / r[1];
617 }
618 if (r[2] != 0.0f) {
619 r[2] = 1.0f / r[2];
620 }
621}
622
623MINLINE float dot_v2v2(const float a[2], const float b[2])
624{
625 return a[0] * b[0] + a[1] * b[1];
626}
627
628MINLINE double dot_v2v2_db(const double a[2], const double b[2])
629{
630 return a[0] * b[0] + a[1] * b[1];
631}
632
633MINLINE float dot_v3v3(const float a[3], const float b[3])
634{
635 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
636}
637
638MINLINE bool is_zero_v3(const float v[3]);
639
640MINLINE float dot_v3v3v3(const float p[3], const float a[3], const float b[3])
641{
642 float vec1[3], vec2[3];
643
644 sub_v3_v3v3(vec1, a, p);
645 sub_v3_v3v3(vec2, b, p);
646 if (is_zero_v3(vec1) || is_zero_v3(vec2)) {
647 return 0.0f;
648 }
649 return dot_v3v3(vec1, vec2);
650}
651
652MINLINE float dot_v4v4(const float a[4], const float b[4])
653{
654 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
655}
656
657MINLINE double dot_v3db_v3fl(const double a[3], const float b[3])
658{
659 return a[0] * (double)b[0] + a[1] * (double)b[1] + a[2] * (double)b[2];
660}
661
662MINLINE double dot_v3v3_db(const double a[3], const double b[3])
663{
664 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
665}
666
667MINLINE float cross_v2v2(const float a[2], const float b[2])
668{
669 return a[0] * b[1] - a[1] * b[0];
670}
671
672MINLINE double cross_v2v2_db(const double a[2], const double b[2])
673{
674 return a[0] * b[1] - a[1] * b[0];
675}
676
677MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
678{
679 BLI_assert(r != a && r != b);
680 r[0] = a[1] * b[2] - a[2] * b[1];
681 r[1] = a[2] * b[0] - a[0] * b[2];
682 r[2] = a[0] * b[1] - a[1] * b[0];
683}
684
685MINLINE void cross_v3_v3v3_db(double r[3], const double a[3], const double b[3])
686{
687 BLI_assert(r != a && r != b);
688 r[0] = a[1] * b[2] - a[2] * b[1];
689 r[1] = a[2] * b[0] - a[0] * b[2];
690 r[2] = a[0] * b[1] - a[1] * b[0];
691}
692
693MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
694{
695 n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
696 n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
697 n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
698}
699
700/*********************************** Length **********************************/
701
702MINLINE float len_squared_v2(const float v[2])
703{
704 return v[0] * v[0] + v[1] * v[1];
705}
706
707MINLINE float len_squared_v3(const float v[3])
708{
709 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
710}
711
712MINLINE float len_manhattan_v2(const float v[2])
713{
714 return fabsf(v[0]) + fabsf(v[1]);
715}
716
718{
719 return abs(v[0]) + abs(v[1]);
720}
721
722MINLINE float len_manhattan_v3(const float v[3])
723{
724 return fabsf(v[0]) + fabsf(v[1]) + fabsf(v[2]);
725}
726
727MINLINE float len_v2(const float v[2])
728{
729 return sqrtf(v[0] * v[0] + v[1] * v[1]);
730}
731
732MINLINE double len_v2_db(const double v[2])
733{
734 return sqrt(v[0] * v[0] + v[1] * v[1]);
735}
736
737MINLINE float len_v2v2(const float v1[2], const float v2[2])
738{
739 float x, y;
740
741 x = v1[0] - v2[0];
742 y = v1[1] - v2[1];
743 return sqrtf(x * x + y * y);
744}
745
746MINLINE double len_v2v2_db(const double v1[2], const double v2[2])
747{
748 double x, y;
749
750 x = v1[0] - v2[0];
751 y = v1[1] - v2[1];
752 return sqrt(x * x + y * y);
753}
754
755MINLINE float len_v2v2_int(const int v1[2], const int v2[2])
756{
757 float x, y;
758
759 x = (float)(v1[0] - v2[0]);
760 y = (float)(v1[1] - v2[1]);
761 return sqrtf(x * x + y * y);
762}
763
764MINLINE float len_v3(const float a[3])
765{
766 return sqrtf(dot_v3v3(a, a));
767}
768
769MINLINE float len_squared_v2v2(const float a[2], const float b[2])
770{
771 float d[2];
772
773 sub_v2_v2v2(d, b, a);
774 return dot_v2v2(d, d);
775}
776
777MINLINE float len_squared_v3v3(const float a[3], const float b[3])
778{
779 float d[3];
780
781 sub_v3_v3v3(d, b, a);
782 return dot_v3v3(d, d);
783}
784
785MINLINE float len_squared_v4v4(const float a[4], const float b[4])
786{
787 float d[4];
788
789 sub_v4_v4v4(d, b, a);
790 return dot_v4v4(d, d);
791}
792
793MINLINE float len_manhattan_v2v2(const float a[2], const float b[2])
794{
795 float d[2];
796
797 sub_v2_v2v2(d, b, a);
798 return len_manhattan_v2(d);
799}
800
801MINLINE int len_manhattan_v2v2_int(const int a[2], const int b[2])
802{
803 int d[2];
804
805 sub_v2_v2v2_int(d, b, a);
806 return len_manhattan_v2_int(d);
807}
808
809MINLINE float len_v3v3(const float a[3], const float b[3])
810{
811 float d[3];
812
813 sub_v3_v3v3(d, b, a);
814 return len_v3(d);
815}
816
817MINLINE float len_v4(const float a[4])
818{
819 return sqrtf(dot_v4v4(a, a));
820}
821
822MINLINE float len_v4v4(const float a[4], const float b[4])
823{
824 float d[4];
825
826 sub_v4_v4v4(d, b, a);
827 return len_v4(d);
828}
829
830MINLINE float normalize_v2_v2_length(float r[2], const float a[2], const float unit_length)
831{
832 float d = dot_v2v2(a, a);
833
834 if (d > 1.0e-35f) {
835 d = sqrtf(d);
836 mul_v2_v2fl(r, a, unit_length / d);
837 }
838 else {
839 /* Either the vector is small or one of it's values contained `nan`. */
840 zero_v2(r);
841 d = 0.0f;
842 }
843
844 return d;
845}
846MINLINE float normalize_v2_v2(float r[2], const float a[2])
847{
848 return normalize_v2_v2_length(r, a, 1.0f);
849}
850
851MINLINE float normalize_v2(float n[2])
852{
853 return normalize_v2_v2(n, n);
854}
855
856MINLINE float normalize_v2_length(float n[2], const float unit_length)
857{
858 return normalize_v2_v2_length(n, n, unit_length);
859}
860
861MINLINE float normalize_v3_v3_length(float r[3], const float a[3], const float unit_length)
862{
863 float d = dot_v3v3(a, a);
864
865 /* A larger value causes normalize errors in a scaled down models with camera extreme close. */
866 if (d > 1.0e-35f) {
867 d = sqrtf(d);
868 mul_v3_v3fl(r, a, unit_length / d);
869 }
870 else {
871 /* Either the vector is small or one of it's values contained `nan`. */
872 zero_v3(r);
873 d = 0.0f;
874 }
875
876 return d;
877}
878MINLINE float normalize_v3_v3(float r[3], const float a[3])
879{
880 return normalize_v3_v3_length(r, a, 1.0f);
881}
882
883MINLINE double normalize_v3_length_db(double n[3], const double unit_length)
884{
885 double d = n[0] * n[0] + n[1] * n[1] + n[2] * n[2];
886
887 /* a larger value causes normalize errors in a
888 * scaled down models with camera extreme close */
889 if (d > 1.0e-35) {
890 double mul;
891
892 d = sqrt(d);
893 mul = unit_length / d;
894
895 n[0] *= mul;
896 n[1] *= mul;
897 n[2] *= mul;
898 }
899 else {
900 n[0] = n[1] = n[2] = 0;
901 d = 0.0;
902 }
903
904 return d;
905}
906MINLINE double normalize_v3_db(double n[3])
907{
908 return normalize_v3_length_db(n, 1.0);
909}
910
911MINLINE float normalize_v3_length(float n[3], const float unit_length)
912{
913 return normalize_v3_v3_length(n, n, unit_length);
914}
915
916MINLINE float normalize_v3(float n[3])
917{
918 return normalize_v3_v3(n, n);
919}
920
921MINLINE void normal_short_to_float_v3(float out[3], const short in[3])
922{
923 out[0] = in[0] * (1.0f / 32767.0f);
924 out[1] = in[1] * (1.0f / 32767.0f);
925 out[2] = in[2] * (1.0f / 32767.0f);
926}
927
928MINLINE void normal_float_to_short_v3(short out[3], const float in[3])
929{
930 out[0] = (short)(in[0] * 32767.0f);
931 out[1] = (short)(in[1] * 32767.0f);
932 out[2] = (short)(in[2] * 32767.0f);
933}
934
935/********************************* Comparison ********************************/
936
937MINLINE bool is_zero_v2(const float v[2])
938{
939 return (v[0] == 0.0f && v[1] == 0.0f);
940}
941
942MINLINE bool is_zero_v3(const float v[3])
943{
944 return (v[0] == 0.0f && v[1] == 0.0f && v[2] == 0.0f);
945}
946
947MINLINE bool is_zero_v4(const float v[4])
948{
949 return (v[0] == 0.0f && v[1] == 0.0f && v[2] == 0.0f && v[3] == 0.0f);
950}
951
952MINLINE bool is_finite_v2(const float v[2])
953{
954 return (isfinite(v[0]) && isfinite(v[1]));
955}
956
957MINLINE bool is_finite_v3(const float v[3])
958{
959 return (isfinite(v[0]) && isfinite(v[1]) && isfinite(v[2]));
960}
961
962MINLINE bool is_finite_v4(const float v[4])
963{
964 return (isfinite(v[0]) && isfinite(v[1]) && isfinite(v[2]) && isfinite(v[3]));
965}
966
967MINLINE bool is_one_v3(const float v[3])
968{
969 return (v[0] == 1.0f && v[1] == 1.0f && v[2] == 1.0f);
970}
971
972/* -------------------------------------------------------------------- */
977
978MINLINE bool equals_v2v2(const float v1[2], const float v2[2])
979{
980 return ((v1[0] == v2[0]) && (v1[1] == v2[1]));
981}
982
983MINLINE bool equals_v3v3(const float v1[3], const float v2[3])
984{
985 return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]));
986}
987
988MINLINE bool equals_v4v4(const float v1[4], const float v2[4])
989{
990 return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]) && (v1[3] == v2[3]));
991}
992
993MINLINE bool equals_v4v4_int(const int v1[4], const int v2[4])
994{
995 return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]) && (v1[3] == v2[3]));
996}
997
998MINLINE bool compare_v2v2(const float v1[2], const float v2[2], const float limit)
999{
1000 return (compare_ff(v1[0], v2[0], limit) && compare_ff(v1[1], v2[1], limit));
1001}
1002
1003MINLINE bool compare_v3v3(const float v1[3], const float v2[3], const float limit)
1004{
1005 return (compare_ff(v1[0], v2[0], limit) && compare_ff(v1[1], v2[1], limit) &&
1006 compare_ff(v1[2], v2[2], limit));
1007}
1008
1009MINLINE bool compare_v4v4(const float v1[4], const float v2[4], const float limit)
1010{
1011 return (compare_ff(v1[0], v2[0], limit) && compare_ff(v1[1], v2[1], limit) &&
1012 compare_ff(v1[2], v2[2], limit) && compare_ff(v1[3], v2[3], limit));
1013}
1014
1015MINLINE bool compare_len_v3v3(const float v1[3], const float v2[3], const float limit)
1016{
1017 float d[3];
1018 sub_v3_v3v3(d, v1, v2);
1019 return (dot_v3v3(d, d) <= (limit * limit));
1020}
1021
1022MINLINE bool compare_size_v3v3(const float v1[3], const float v2[3], const float limit)
1023{
1024 for (int i = 0; i < 3; i++) {
1025 if (v2[i] == 0.0f) {
1026 /* Catch division by zero. */
1027 if (v1[i] != v2[i]) {
1028 return false;
1029 }
1030 }
1031 else {
1032 if (fabsf(v1[i] / v2[i] - 1.0f) > limit) {
1033 return false;
1034 }
1035 }
1036 }
1037 return true;
1038}
1039
1040/* -------------------------------------------------------------------- */
1043
1044MINLINE void clamp_v2(float vec[2], const float min, const float max)
1045{
1046 CLAMP(vec[0], min, max);
1047 CLAMP(vec[1], min, max);
1048}
1049
1050MINLINE void clamp_v3(float vec[3], const float min, const float max)
1051{
1052 CLAMP(vec[0], min, max);
1053 CLAMP(vec[1], min, max);
1054 CLAMP(vec[2], min, max);
1055}
1056
1057MINLINE void clamp_v4(float vec[4], const float min, const float max)
1058{
1059 CLAMP(vec[0], min, max);
1060 CLAMP(vec[1], min, max);
1061 CLAMP(vec[2], min, max);
1062 CLAMP(vec[3], min, max);
1063}
1064
1066
1067MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2])
1068{
1069 return (((l1[0] - pt[0]) * (l2[1] - pt[1])) - ((l2[0] - pt[0]) * (l1[1] - pt[1])));
1070}
1071
1073
1074#endif /* __MATH_VECTOR_INLINE_C__ */
#define BLI_assert(a)
Definition BLI_assert.h:46
MINLINE int clamp_i(int value, int min, int max)
MINLINE int compare_ff(float a, float b, float max_diff)
#define MINLINE
unsigned char uchar
#define CLAMP(a, b, c)
#define SWAP(type, a, b)
#define ELEM(...)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
static void mul(btAlignedObjectArray< T > &items, const Q &value)
nullptr float
#define in
#define out
#define abs
#define sqrt
MINLINE bool is_finite_v2(const float v[2])
MINLINE bool is_finite_v4(const float v[4])
MINLINE void sub_v3db_v3fl_v3fl(double r[3], const float a[3], const float b[3])
MINLINE float dot_v2v2(const float a[2], const float b[2])
MINLINE double normalize_v3_db(double n[3])
MINLINE void mul_v4_fl(float r[4], float f)
MINLINE int len_manhattan_v2v2_int(const int a[2], const int b[2])
MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
MINLINE void sub_v2_v2v2_int(int r[2], const int a[2], const int b[2])
MINLINE void add_v4_v4(float r[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v2fl_v2i(float r[2], const int a[2])
MINLINE void swap_v4_v4(float a[4], float b[4])
MINLINE float len_squared_v3v3(const float a[3], const float b[3])
MINLINE void add_v3fl_v3fl_v3i(float r[3], const float a[3], const int b[3])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void add_v3_fl(float r[3], float f)
MINLINE void copy_v2_fl2(float v[2], float x, float y)
MINLINE void mul_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
MINLINE float dot_v4v4(const float a[4], const float b[4])
MINLINE void swap_v2_v2(float a[2], float b[2])
MINLINE void madd_v3fl_v3fl_v3fl_v3i(float r[3], const float a[3], const float b[3], const int c[3])
MINLINE void copy_v2db_v2fl(double r[2], const float a[2])
MINLINE void copy_v2_v2_db(double r[2], const double a[2])
MINLINE float dot_m3_v3_row_x(const float M[3][3], const float a[3])
MINLINE void sub_v2_v2(float r[2], const float a[2])
MINLINE float len_v4v4(const float a[4], const float b[4])
MINLINE bool equals_v4v4_int(const int v1[4], const int v2[4])
MINLINE bool compare_v3v3(const float v1[3], const float v2[3], const float limit)
MINLINE void mul_v3_v3(float r[3], const float a[3])
MINLINE float len_v2v2_int(const int v1[2], const int v2[2])
MINLINE double normalize_v3_length_db(double n[3], const double unit_length)
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float v[3])
MINLINE float dot_m4_v3_row_z(const float M[4][4], const float a[3])
MINLINE void mul_v2_v2(float r[2], const float a[2])
MINLINE float normalize_v2_v2_length(float r[2], const float a[2], const float unit_length)
MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
MINLINE float len_manhattan_v3(const float v[3])
MINLINE bool is_one_v3(const float v[3])
MINLINE float dot_m3_v3_row_z(const float M[3][3], const float a[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void clamp_v3(float vec[3], const float min, const float max)
MINLINE bool compare_len_v3v3(const float v1[3], const float v2[3], const float limit)
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
MINLINE void mul_v3db_db(double r[3], double f)
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE float len_v3(const float a[3])
MINLINE void copy_v3_v3_uchar(unsigned char r[3], const unsigned char a[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
MINLINE void add_v3_v3_db(double r[3], const double a[3])
MINLINE void normal_float_to_short_v3(short out[3], const float in[3])
MINLINE float len_manhattan_v2(const float v[2])
MINLINE void mul_v4_v4fl(float r[4], const float a[4], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v2_length(float n[2], const float unit_length)
MINLINE void zero_v2_int(int r[2])
MINLINE float len_v2(const float v[2])
MINLINE float cross_v2v2(const float a[2], const float b[2])
MINLINE void negate_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3])
MINLINE void normal_short_to_float_v3(float out[3], const short in[3])
MINLINE void copy_v3_v3_int(int r[3], const int a[3])
MINLINE void add_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
MINLINE void invert_v3_safe(float r[3])
MINLINE double dot_v2v2_db(const double a[2], const double b[2])
MINLINE void negate_v2_v2(float r[2], const float a[2])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float len_v4(const float a[4])
MINLINE void clamp_v2(float vec[2], const float min, const float max)
MINLINE void add_v2_fl(float r[2], float f)
MINLINE void zero_v3_int(int r[3])
MINLINE float len_squared_v2(const float v[2])
MINLINE bool compare_size_v3v3(const float v1[3], const float v2[3], const float limit)
MINLINE void copy_v3_v3_short(short r[3], const short a[3])
MINLINE void negate_v4_v4(float r[4], const float a[4])
MINLINE double len_v2v2_db(const double v1[2], const double v2[2])
MINLINE float len_v3v3(const float a[3], const float b[3])
MINLINE void copy_v2_v2_short(short r[2], const short a[2])
MINLINE void negate_v3(float r[3])
MINLINE float dot_m4_v3_row_y(const float M[4][4], const float a[3])
MINLINE void sub_v2db_v2fl_v2fl(double r[2], const float a[2], const float b[2])
MINLINE bool equals_v3v3(const float v1[3], const float v2[3])
MINLINE bool equals_v2v2(const float v1[2], const float v2[2])
MINLINE bool equals_v4v4(const float v1[4], const float v2[4])
MINLINE void copy_v3fl_v3db(float r[3], const double a[3])
MINLINE float mul_project_m4_v3_zfac(const float mat[4][4], const float co[3])
MINLINE void zero_v4(float r[4])
MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
MINLINE void copy_v3db_v3fl(double r[3], const float a[3])
MINLINE float len_squared_v4v4(const float a[4], const float b[4])
MINLINE void invert_v3(float r[3])
MINLINE void clamp_v4(float vec[4], const float min, const float max)
MINLINE double dot_v3v3_db(const double a[3], const double b[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE float len_squared_v2v2(const float a[2], const float b[2])
MINLINE double cross_v2v2_db(const double a[2], const double b[2])
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v3_v3v3_int(int r[3], const int a[3], const int b[3])
MINLINE void zero_v2(float r[2])
MINLINE void copy_v4fl_v4db(float r[4], const double a[4])
MINLINE void cross_v3_v3v3_db(double r[3], const double a[3], const double b[3])
MINLINE float dot_m3_v3_row_y(const float M[3][3], const float a[3])
MINLINE bool compare_v2v2(const float v1[2], const float v2[2], const float limit)
MINLINE void copy_v4_v4_int(int r[4], const int a[4])
MINLINE float normalize_v2(float n[2])
MINLINE double len_v2_db(const double v[2])
MINLINE bool compare_v4v4(const float v1[4], const float v2[4], const float limit)
MINLINE float normalize_v3_v3_length(float r[3], const float a[3], const float unit_length)
MINLINE void swap_v3_v3(float a[3], float b[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
MINLINE void copy_v3_v3_db(double r[3], const double a[3])
MINLINE float dot_v3v3v3(const float p[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE float dot_m4_v3_row_x(const float M[4][4], const float a[3])
MINLINE float len_manhattan_v2v2(const float a[2], const float b[2])
MINLINE void copy_v4_v4_db(double r[4], const double a[4])
MINLINE void negate_v3_db(double r[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2])
MINLINE bool is_zero_v2(const float v[2])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE void invert_v2(float r[2])
MINLINE int len_manhattan_v2_int(const int v[2])
MINLINE void copy_v4_fl(float r[4], float f)
MINLINE float normalize_v2_v2(float r[2], const float a[2])
MINLINE void add_v3_uchar_clamped(uchar r[3], int i)
MINLINE float normalize_v3_length(float n[3], const float unit_length)
MINLINE bool is_finite_v3(const float v[3])
MINLINE double dot_v3db_v3fl(const double a[3], const float b[3])
MINLINE float len_squared_v3(const float v[3])
MINLINE float normalize_v3(float n[3])
MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4])
MINLINE void negate_v4(float r[4])
MINLINE bool is_zero_v4(const float v[4])
MINLINE float len_v2v2(const float v1[2], const float v2[2])
MINLINE void sub_v3_v3v3_db(double r[3], const double a[3], const double b[3])
MINLINE void copy_v2_fl(float r[2], float f)
MINLINE void sub_v2_v2v2_db(double r[2], const double a[2], const double b[2])
#define M
#define fabsf
#define sqrtf
#define min(a, b)
Definition sort.cc:36
i
Definition text_draw.cc:230
max
Definition text_draw.cc:251