Blender V4.3
math_vector_inline.c
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
9#ifndef __MATH_VECTOR_INLINE_C__
10#define __MATH_VECTOR_INLINE_C__
11
12#include "BLI_math_base.h"
13
14/********************************** Init *************************************/
15
16MINLINE void zero_v2(float r[2])
17{
18 r[0] = 0.0f;
19 r[1] = 0.0f;
20}
21
22MINLINE void zero_v3(float r[3])
23{
24 r[0] = 0.0f;
25 r[1] = 0.0f;
26 r[2] = 0.0f;
27}
28
29MINLINE void zero_v4(float r[4])
30{
31 r[0] = 0.0f;
32 r[1] = 0.0f;
33 r[2] = 0.0f;
34 r[3] = 0.0f;
35}
36
37MINLINE void copy_v2_v2(float r[2], const float a[2])
38{
39 r[0] = a[0];
40 r[1] = a[1];
41}
42
43MINLINE void copy_v3_v3(float r[3], const float a[3])
44{
45 r[0] = a[0];
46 r[1] = a[1];
47 r[2] = a[2];
48}
49
50MINLINE void copy_v3fl_v3s(float r[3], const short a[3])
51{
52 r[0] = (float)a[0];
53 r[1] = (float)a[1];
54 r[2] = (float)a[2];
55}
56
57MINLINE void copy_v4_v4(float r[4], const float a[4])
58{
59 r[0] = a[0];
60 r[1] = a[1];
61 r[2] = a[2];
62 r[3] = a[3];
63}
64
65MINLINE void copy_v2_fl(float r[2], float f)
66{
67 r[0] = f;
68 r[1] = f;
69}
70
71MINLINE void copy_v3_fl(float r[3], float f)
72{
73 r[0] = f;
74 r[1] = f;
75 r[2] = f;
76}
77
78MINLINE void copy_v4_fl(float r[4], float f)
79{
80 r[0] = f;
81 r[1] = f;
82 r[2] = f;
83 r[3] = f;
84}
85
86/* unsigned char */
87
88MINLINE void copy_v2_v2_uchar(unsigned char r[2], const unsigned char a[2])
89{
90 r[0] = a[0];
91 r[1] = a[1];
92}
93
94MINLINE void copy_v3_v3_uchar(unsigned char r[3], const unsigned char a[3])
95{
96 r[0] = a[0];
97 r[1] = a[1];
98 r[2] = a[2];
99}
100
101MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
102{
103 r[0] = a[0];
104 r[1] = a[1];
105 r[2] = a[2];
106 r[3] = a[3];
107}
108
109MINLINE void copy_v2_uchar(unsigned char r[2], const unsigned char a)
110{
111 r[0] = a;
112 r[1] = a;
113}
114
115MINLINE void copy_v3_uchar(unsigned char r[3], const unsigned char a)
116{
117 r[0] = a;
118 r[1] = a;
119 r[2] = a;
120}
121
122MINLINE void copy_v4_uchar(unsigned char r[4], const unsigned char a)
123{
124 r[0] = a;
125 r[1] = a;
126 r[2] = a;
127 r[3] = a;
128}
129
130/* char */
131
132MINLINE void copy_v2_v2_char(char r[2], const char a[2])
133{
134 r[0] = a[0];
135 r[1] = a[1];
136}
137
138MINLINE void copy_v3_v3_char(char r[3], const char a[3])
139{
140 r[0] = a[0];
141 r[1] = a[1];
142 r[2] = a[2];
143}
144
145MINLINE void copy_v4_v4_char(char r[4], const char a[4])
146{
147 r[0] = a[0];
148 r[1] = a[1];
149 r[2] = a[2];
150 r[3] = a[3];
151}
152
153/* short */
154
155MINLINE void copy_v2_v2_short(short r[2], const short a[2])
156{
157 r[0] = a[0];
158 r[1] = a[1];
159}
160
161MINLINE void copy_v3_v3_short(short r[3], const short a[3])
162{
163 r[0] = a[0];
164 r[1] = a[1];
165 r[2] = a[2];
166}
167
168MINLINE void copy_v4_v4_short(short r[4], const short a[4])
169{
170 r[0] = a[0];
171 r[1] = a[1];
172 r[2] = a[2];
173 r[3] = a[3];
174}
175
176/* int */
177MINLINE void zero_v2_int(int r[2])
178{
179 r[0] = 0;
180 r[1] = 0;
181}
182
183MINLINE void zero_v3_int(int r[3])
184{
185 r[0] = 0;
186 r[1] = 0;
187 r[2] = 0;
188}
189
190MINLINE void copy_v2_v2_int(int r[2], const int a[2])
191{
192 r[0] = a[0];
193 r[1] = a[1];
194}
195
196MINLINE void copy_v3_v3_int(int r[3], const int a[3])
197{
198 r[0] = a[0];
199 r[1] = a[1];
200 r[2] = a[2];
201}
202
203MINLINE void copy_v4_v4_int(int r[4], const int a[4])
204{
205 r[0] = a[0];
206 r[1] = a[1];
207 r[2] = a[2];
208 r[3] = a[3];
209}
210
211/* double */
212
213MINLINE void zero_v3_db(double r[3])
214{
215 r[0] = 0.0;
216 r[1] = 0.0;
217 r[2] = 0.0;
218}
219
220MINLINE void copy_v2_v2_db(double r[2], const double a[2])
221{
222 r[0] = a[0];
223 r[1] = a[1];
224}
225
226MINLINE void copy_v3_v3_db(double r[3], const double a[3])
227{
228 r[0] = a[0];
229 r[1] = a[1];
230 r[2] = a[2];
231}
232
233MINLINE void copy_v4_v4_db(double r[4], const double a[4])
234{
235 r[0] = a[0];
236 r[1] = a[1];
237 r[2] = a[2];
238 r[3] = a[3];
239}
240
241MINLINE void round_v2i_v2fl(int r[2], const float a[2])
242{
243 r[0] = (int)roundf(a[0]);
244 r[1] = (int)roundf(a[1]);
245}
246
247MINLINE void copy_v2fl_v2i(float r[2], const int a[2])
248{
249 r[0] = (float)a[0];
250 r[1] = (float)a[1];
251}
252
253/* double -> float */
254
255MINLINE void copy_v2fl_v2db(float r[2], const double a[2])
256{
257 r[0] = (float)a[0];
258 r[1] = (float)a[1];
259}
260
261MINLINE void copy_v3fl_v3db(float r[3], const double a[3])
262{
263 r[0] = (float)a[0];
264 r[1] = (float)a[1];
265 r[2] = (float)a[2];
266}
267
268MINLINE void copy_v4fl_v4db(float r[4], const double a[4])
269{
270 r[0] = (float)a[0];
271 r[1] = (float)a[1];
272 r[2] = (float)a[2];
273 r[3] = (float)a[3];
274}
275
276/* float -> double */
277
278MINLINE void copy_v2db_v2fl(double r[2], const float a[2])
279{
280 r[0] = (double)a[0];
281 r[1] = (double)a[1];
282}
283
284MINLINE void copy_v3db_v3fl(double r[3], const float a[3])
285{
286 r[0] = (double)a[0];
287 r[1] = (double)a[1];
288 r[2] = (double)a[2];
289}
290
291MINLINE void copy_v4db_v4fl(double r[4], const float a[4])
292{
293 r[0] = (double)a[0];
294 r[1] = (double)a[1];
295 r[2] = (double)a[2];
296 r[3] = (double)a[3];
297}
298
299MINLINE void swap_v2_v2(float a[2], float b[2])
300{
301 SWAP(float, a[0], b[0]);
302 SWAP(float, a[1], b[1]);
303}
304
305MINLINE void swap_v3_v3(float a[3], float b[3])
306{
307 SWAP(float, a[0], b[0]);
308 SWAP(float, a[1], b[1]);
309 SWAP(float, a[2], b[2]);
310}
311
312MINLINE void swap_v4_v4(float a[4], float b[4])
313{
314 SWAP(float, a[0], b[0]);
315 SWAP(float, a[1], b[1]);
316 SWAP(float, a[2], b[2]);
317 SWAP(float, a[3], b[3]);
318}
319
320/* float args -> vec */
321
322MINLINE void copy_v2_fl2(float v[2], float x, float y)
323{
324 v[0] = x;
325 v[1] = y;
326}
327
328MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
329{
330 v[0] = x;
331 v[1] = y;
332 v[2] = z;
333}
334
335MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
336{
337 v[0] = x;
338 v[1] = y;
339 v[2] = z;
340 v[3] = w;
341}
342
343/********************************* Arithmetic ********************************/
344
345MINLINE void add_v2_fl(float r[2], float f)
346{
347 r[0] += f;
348 r[1] += f;
349}
350
351MINLINE void add_v3_fl(float r[3], float f)
352{
353 r[0] += f;
354 r[1] += f;
355 r[2] += f;
356}
357
358MINLINE void add_v4_fl(float r[4], float f)
359{
360 r[0] += f;
361 r[1] += f;
362 r[2] += f;
363 r[3] += f;
364}
365
366MINLINE void add_v2_v2(float r[2], const float a[2])
367{
368 r[0] += a[0];
369 r[1] += a[1];
370}
371
372MINLINE void add_v2_v2_db(double r[2], const double a[2])
373{
374 r[0] += a[0];
375 r[1] += a[1];
376}
377
378MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
379{
380 r[0] = a[0] + b[0];
381 r[1] = a[1] + b[1];
382}
383
384MINLINE void add_v2_v2_int(int r[2], const int a[2])
385{
386 r[0] = r[0] + a[0];
387 r[1] = r[1] + a[1];
388}
389
390MINLINE void add_v2_v2v2_int(int r[2], const int a[2], const int b[2])
391{
392 r[0] = a[0] + b[0];
393 r[1] = a[1] + b[1];
394}
395
396MINLINE void add_v3_v3(float r[3], const float a[3])
397{
398 r[0] += a[0];
399 r[1] += a[1];
400 r[2] += a[2];
401}
402
403MINLINE void add_v3_v3_db(double r[3], const double a[3])
404{
405 r[0] += a[0];
406 r[1] += a[1];
407 r[2] += a[2];
408}
409
410MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
411{
412 r[0] = a[0] + b[0];
413 r[1] = a[1] + b[1];
414 r[2] = a[2] + b[2];
415}
416
417MINLINE void add_v3fl_v3fl_v3i(float r[3], const float a[3], const int b[3])
418{
419 r[0] = a[0] + (float)b[0];
420 r[1] = a[1] + (float)b[1];
421 r[2] = a[2] + (float)b[2];
422}
423
424MINLINE void add_v4_v4(float r[4], const float a[4])
425{
426 r[0] += a[0];
427 r[1] += a[1];
428 r[2] += a[2];
429 r[3] += a[3];
430}
431
432MINLINE void add_v4_v4v4(float r[4], const float a[4], const float b[4])
433{
434 r[0] = a[0] + b[0];
435 r[1] = a[1] + b[1];
436 r[2] = a[2] + b[2];
437 r[3] = a[3] + b[3];
438}
439
441{
442 r[0] = (uchar)clamp_i(r[0] + i, 0, 255);
443 r[1] = (uchar)clamp_i(r[1] + i, 0, 255);
444 r[2] = (uchar)clamp_i(r[2] + i, 0, 255);
445}
446
447MINLINE void sub_v2_v2(float r[2], const float a[2])
448{
449 r[0] -= a[0];
450 r[1] -= a[1];
451}
452
453MINLINE void sub_v2_v2_db(double r[2], const double a[2])
454{
455 r[0] -= a[0];
456 r[1] -= a[1];
457}
458
459MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
460{
461 r[0] = a[0] - b[0];
462 r[1] = a[1] - b[1];
463}
464
465MINLINE void sub_v2_v2v2_db(double r[2], const double a[2], const double b[2])
466{
467 r[0] = a[0] - b[0];
468 r[1] = a[1] - b[1];
469}
470
471MINLINE void sub_v2_v2v2_int(int r[2], const int a[2], const int b[2])
472{
473 r[0] = a[0] - b[0];
474 r[1] = a[1] - b[1];
475}
476
477MINLINE void sub_v3_v3(float r[3], const float a[3])
478{
479 r[0] -= a[0];
480 r[1] -= a[1];
481 r[2] -= a[2];
482}
483
484MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
485{
486 r[0] = a[0] - b[0];
487 r[1] = a[1] - b[1];
488 r[2] = a[2] - b[2];
489}
490
491MINLINE void sub_v3_v3v3_int(int r[3], const int a[3], const int b[3])
492{
493 r[0] = a[0] - b[0];
494 r[1] = a[1] - b[1];
495 r[2] = a[2] - b[2];
496}
497
498MINLINE void sub_v3_v3v3_db(double r[3], const double a[3], const double b[3])
499{
500 r[0] = a[0] - b[0];
501 r[1] = a[1] - b[1];
502 r[2] = a[2] - b[2];
503}
504
505MINLINE void sub_v2db_v2fl_v2fl(double r[2], const float a[2], const float b[2])
506{
507 r[0] = (double)a[0] - (double)b[0];
508 r[1] = (double)a[1] - (double)b[1];
509}
510
511MINLINE void sub_v3db_v3fl_v3fl(double r[3], const float a[3], const float b[3])
512{
513 r[0] = (double)a[0] - (double)b[0];
514 r[1] = (double)a[1] - (double)b[1];
515 r[2] = (double)a[2] - (double)b[2];
516}
517
518MINLINE void sub_v4_v4(float r[4], const float a[4])
519{
520 r[0] -= a[0];
521 r[1] -= a[1];
522 r[2] -= a[2];
523 r[3] -= a[3];
524}
525
526MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4])
527{
528 r[0] = a[0] - b[0];
529 r[1] = a[1] - b[1];
530 r[2] = a[2] - b[2];
531 r[3] = a[3] - b[3];
532}
533
534MINLINE void mul_v2_fl(float r[2], float f)
535{
536 r[0] *= f;
537 r[1] *= f;
538}
539
540MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
541{
542 r[0] = a[0] * f;
543 r[1] = a[1] * f;
544}
545
546MINLINE void mul_v3_fl(float r[3], float f)
547{
548 r[0] *= f;
549 r[1] *= f;
550 r[2] *= f;
551}
552
553MINLINE void mul_v3db_db(double r[3], double f)
554{
555 r[0] *= f;
556 r[1] *= f;
557 r[2] *= f;
558}
559
560MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
561{
562 r[0] = a[0] * f;
563 r[1] = a[1] * f;
564 r[2] = a[2] * f;
565}
566
567MINLINE void mul_v3_v3db_db(double r[3], const double a[3], double f)
568{
569 r[0] = a[0] * f;
570 r[1] = a[1] * f;
571 r[2] = a[2] * f;
572}
573
574MINLINE void mul_v2_v2(float r[2], const float a[2])
575{
576 r[0] *= a[0];
577 r[1] *= a[1];
578}
579
580MINLINE void mul_v3_v3(float r[3], const float a[3])
581{
582 r[0] *= a[0];
583 r[1] *= a[1];
584 r[2] *= a[2];
585}
586
587MINLINE void mul_v4_fl(float r[4], float f)
588{
589 r[0] *= f;
590 r[1] *= f;
591 r[2] *= f;
592 r[3] *= f;
593}
594
595MINLINE void mul_v4_v4(float r[4], const float a[4])
596{
597 r[0] *= a[0];
598 r[1] *= a[1];
599 r[2] *= a[2];
600 r[3] *= a[3];
601}
602
603MINLINE void mul_v4_v4fl(float r[4], const float a[4], float f)
604{
605 r[0] = a[0] * f;
606 r[1] = a[1] * f;
607 r[2] = a[2] * f;
608 r[3] = a[3] * f;
609}
610
620MINLINE void mul_v2_v2_cw(float r[2], const float mat[2], const float vec[2])
621{
622 BLI_assert(r != vec);
623
624 r[0] = mat[0] * vec[0] + (+mat[1]) * vec[1];
625 r[1] = mat[1] * vec[0] + (-mat[0]) * vec[1];
626}
627
628MINLINE void mul_v2_v2_ccw(float r[2], const float mat[2], const float vec[2])
629{
630 float r0 = mat[0] * vec[0] + (-mat[1]) * vec[1];
631 float r1 = mat[1] * vec[0] + (+mat[0]) * vec[1];
632 r[0] = r0;
633 r[1] = r1;
634}
635
636MINLINE float mul_project_m4_v3_zfac(const float mat[4][4], const float co[3])
637{
638 return (mat[0][3] * co[0]) + (mat[1][3] * co[1]) + (mat[2][3] * co[2]) + mat[3][3];
639}
640
641MINLINE float dot_m3_v3_row_x(const float M[3][3], const float a[3])
642{
643 return M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2];
644}
645MINLINE float dot_m3_v3_row_y(const float M[3][3], const float a[3])
646{
647 return M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2];
648}
649MINLINE float dot_m3_v3_row_z(const float M[3][3], const float a[3])
650{
651 return M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2];
652}
653
654MINLINE float dot_m4_v3_row_x(const float M[4][4], const float a[3])
655{
656 return M[0][0] * a[0] + M[1][0] * a[1] + M[2][0] * a[2];
657}
658MINLINE float dot_m4_v3_row_y(const float M[4][4], const float a[3])
659{
660 return M[0][1] * a[0] + M[1][1] * a[1] + M[2][1] * a[2];
661}
662MINLINE float dot_m4_v3_row_z(const float M[4][4], const float a[3])
663{
664 return M[0][2] * a[0] + M[1][2] * a[1] + M[2][2] * a[2];
665}
666
667MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
668{
669 r[0] += a[0] * f;
670 r[1] += a[1] * f;
671}
672
673MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
674{
675 r[0] += a[0] * f;
676 r[1] += a[1] * f;
677 r[2] += a[2] * f;
678}
679
680MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3])
681{
682 r[0] += a[0] * b[0];
683 r[1] += a[1] * b[1];
684 r[2] += a[2] * b[2];
685}
686
687MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
688{
689 r[0] = a[0] + b[0] * f;
690 r[1] = a[1] + b[1] * f;
691}
692
693MINLINE void madd_v2_v2db_db(double r[2], const double a[2], const double b[2], double f)
694{
695 r[0] = a[0] + b[0] * f;
696 r[1] = a[1] + b[1] * f;
697}
698
699MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
700{
701 r[0] = a[0] + b[0] * f;
702 r[1] = a[1] + b[1] * f;
703 r[2] = a[2] + b[2] * f;
704}
705
706MINLINE void madd_v3_v3v3db_db(double r[3], const double a[3], const double b[3], double f)
707{
708 r[0] = a[0] + b[0] * f;
709 r[1] = a[1] + b[1] * f;
710 r[2] = a[2] + b[2] * f;
711}
712
713MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
714{
715 r[0] = a[0] + b[0] * c[0];
716 r[1] = a[1] + b[1] * c[1];
717 r[2] = a[2] + b[2] * c[2];
718}
719
721 const float a[3],
722 const float b[3],
723 const int c[3])
724{
725 r[0] = a[0] + b[0] * (float)c[0];
726 r[1] = a[1] + b[1] * (float)c[1];
727 r[2] = a[2] + b[2] * (float)c[2];
728}
729
730MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
731{
732 r[0] += a[0] * f;
733 r[1] += a[1] * f;
734 r[2] += a[2] * f;
735 r[3] += a[3] * f;
736}
737
738MINLINE void madd_v4_v4v4(float r[4], const float a[4], const float b[4])
739{
740 r[0] += a[0] * b[0];
741 r[1] += a[1] * b[1];
742 r[2] += a[2] * b[2];
743 r[3] += a[3] * b[3];
744}
745
746MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
747{
748 r[0] = v1[0] * v2[0];
749 r[1] = v1[1] * v2[1];
750 r[2] = v1[2] * v2[2];
751}
752
753MINLINE void mul_v2_v2v2(float r[2], const float a[2], const float b[2])
754{
755 r[0] = a[0] * b[0];
756 r[1] = a[1] * b[1];
757}
758
759MINLINE void negate_v2(float r[2])
760{
761 r[0] = -r[0];
762 r[1] = -r[1];
763}
764
765MINLINE void negate_v2_v2(float r[2], const float a[2])
766{
767 r[0] = -a[0];
768 r[1] = -a[1];
769}
770
771MINLINE void negate_v3(float r[3])
772{
773 r[0] = -r[0];
774 r[1] = -r[1];
775 r[2] = -r[2];
776}
777
778MINLINE void negate_v3_v3(float r[3], const float a[3])
779{
780 r[0] = -a[0];
781 r[1] = -a[1];
782 r[2] = -a[2];
783}
784
785MINLINE void negate_v4(float r[4])
786{
787 r[0] = -r[0];
788 r[1] = -r[1];
789 r[2] = -r[2];
790 r[3] = -r[3];
791}
792
793MINLINE void negate_v4_v4(float r[4], const float a[4])
794{
795 r[0] = -a[0];
796 r[1] = -a[1];
797 r[2] = -a[2];
798 r[3] = -a[3];
799}
800
801MINLINE void negate_v3_short(short r[3])
802{
803 r[0] = (short)-r[0];
804 r[1] = (short)-r[1];
805 r[2] = (short)-r[2];
806}
807
808MINLINE void negate_v3_db(double r[3])
809{
810 r[0] = -r[0];
811 r[1] = -r[1];
812 r[2] = -r[2];
813}
814
815MINLINE void invert_v2(float r[2])
816{
817 BLI_assert(!ELEM(0.0f, r[0], r[1]));
818 r[0] = 1.0f / r[0];
819 r[1] = 1.0f / r[1];
820}
821
822MINLINE void invert_v3(float r[3])
823{
824 BLI_assert(!ELEM(0.0f, r[0], r[1], r[2]));
825 r[0] = 1.0f / r[0];
826 r[1] = 1.0f / r[1];
827 r[2] = 1.0f / r[2];
828}
829
830MINLINE void invert_v3_safe(float r[3])
831{
832 if (r[0] != 0.0f) {
833 r[0] = 1.0f / r[0];
834 }
835 if (r[1] != 0.0f) {
836 r[1] = 1.0f / r[1];
837 }
838 if (r[2] != 0.0f) {
839 r[2] = 1.0f / r[2];
840 }
841}
842
843MINLINE void abs_v2(float r[2])
844{
845 r[0] = fabsf(r[0]);
846 r[1] = fabsf(r[1]);
847}
848
849MINLINE void abs_v2_v2(float r[2], const float a[2])
850{
851 r[0] = fabsf(a[0]);
852 r[1] = fabsf(a[1]);
853}
854
855MINLINE void abs_v3(float r[3])
856{
857 r[0] = fabsf(r[0]);
858 r[1] = fabsf(r[1]);
859 r[2] = fabsf(r[2]);
860}
861
862MINLINE void abs_v3_v3(float r[3], const float a[3])
863{
864 r[0] = fabsf(a[0]);
865 r[1] = fabsf(a[1]);
866 r[2] = fabsf(a[2]);
867}
868
869MINLINE void abs_v4(float r[4])
870{
871 r[0] = fabsf(r[0]);
872 r[1] = fabsf(r[1]);
873 r[2] = fabsf(r[2]);
874 r[3] = fabsf(r[3]);
875}
876
877MINLINE void abs_v4_v4(float r[4], const float a[4])
878{
879 r[0] = fabsf(a[0]);
880 r[1] = fabsf(a[1]);
881 r[2] = fabsf(a[2]);
882 r[3] = fabsf(a[3]);
883}
884
885MINLINE float dot_v2v2(const float a[2], const float b[2])
886{
887 return a[0] * b[0] + a[1] * b[1];
888}
889
890MINLINE double dot_v2v2_db(const double a[2], const double b[2])
891{
892 return a[0] * b[0] + a[1] * b[1];
893}
894
895MINLINE float dot_v3v3(const float a[3], const float b[3])
896{
897 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
898}
899
900MINLINE float dot_v3v3v3(const float p[3], const float a[3], const float b[3])
901{
902 float vec1[3], vec2[3];
903
904 sub_v3_v3v3(vec1, a, p);
905 sub_v3_v3v3(vec2, b, p);
906 if (is_zero_v3(vec1) || is_zero_v3(vec2)) {
907 return 0.0f;
908 }
909 return dot_v3v3(vec1, vec2);
910}
911
912MINLINE float dot_v4v4(const float a[4], const float b[4])
913{
914 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
915}
916
917MINLINE double dot_v3db_v3fl(const double a[3], const float b[3])
918{
919 return a[0] * (double)b[0] + a[1] * (double)b[1] + a[2] * (double)b[2];
920}
921
922MINLINE double dot_v3v3_db(const double a[3], const double b[3])
923{
924 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
925}
926
927MINLINE float cross_v2v2(const float a[2], const float b[2])
928{
929 return a[0] * b[1] - a[1] * b[0];
930}
931
932MINLINE double cross_v2v2_db(const double a[2], const double b[2])
933{
934 return a[0] * b[1] - a[1] * b[0];
935}
936
937MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
938{
939 BLI_assert(r != a && r != b);
940 r[0] = a[1] * b[2] - a[2] * b[1];
941 r[1] = a[2] * b[0] - a[0] * b[2];
942 r[2] = a[0] * b[1] - a[1] * b[0];
943}
944
945MINLINE void cross_v3_v3v3_hi_prec(float r[3], const float a[3], const float b[3])
946{
947 BLI_assert(r != a && r != b);
948 r[0] = (float)((double)a[1] * (double)b[2] - (double)a[2] * (double)b[1]);
949 r[1] = (float)((double)a[2] * (double)b[0] - (double)a[0] * (double)b[2]);
950 r[2] = (float)((double)a[0] * (double)b[1] - (double)a[1] * (double)b[0]);
951}
952
953MINLINE void cross_v3_v3v3_db(double r[3], const double a[3], const double b[3])
954{
955 BLI_assert(r != a && r != b);
956 r[0] = a[1] * b[2] - a[2] * b[1];
957 r[1] = a[2] * b[0] - a[0] * b[2];
958 r[2] = a[0] * b[1] - a[1] * b[0];
959}
960
961MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
962{
963 n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
964 n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
965 n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
966}
967
968MINLINE void star_m3_v3(float rmat[3][3], const float a[3])
969{
970 rmat[0][0] = rmat[1][1] = rmat[2][2] = 0.0;
971 rmat[0][1] = -a[2];
972 rmat[0][2] = a[1];
973 rmat[1][0] = a[2];
974 rmat[1][2] = -a[0];
975 rmat[2][0] = -a[1];
976 rmat[2][1] = a[0];
977}
978
979/*********************************** Length **********************************/
980
981MINLINE float len_squared_v2(const float v[2])
982{
983 return v[0] * v[0] + v[1] * v[1];
984}
985
986MINLINE float len_squared_v3(const float v[3])
987{
988 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
989}
990
991MINLINE double len_squared_v3_db(const double v[3])
992{
993 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
994}
995
996MINLINE float len_manhattan_v2(const float v[2])
997{
998 return fabsf(v[0]) + fabsf(v[1]);
999}
1000
1002{
1003 return abs(v[0]) + abs(v[1]);
1004}
1005
1006MINLINE float len_manhattan_v3(const float v[3])
1007{
1008 return fabsf(v[0]) + fabsf(v[1]) + fabsf(v[2]);
1009}
1010
1011MINLINE float len_v2(const float v[2])
1012{
1013 return sqrtf(v[0] * v[0] + v[1] * v[1]);
1014}
1015
1016MINLINE double len_v2_db(const double v[2])
1017{
1018 return sqrt(v[0] * v[0] + v[1] * v[1]);
1019}
1020
1021MINLINE float len_v2v2(const float v1[2], const float v2[2])
1022{
1023 float x, y;
1024
1025 x = v1[0] - v2[0];
1026 y = v1[1] - v2[1];
1027 return sqrtf(x * x + y * y);
1028}
1029
1030MINLINE double len_v2v2_db(const double v1[2], const double v2[2])
1031{
1032 double x, y;
1033
1034 x = v1[0] - v2[0];
1035 y = v1[1] - v2[1];
1036 return sqrt(x * x + y * y);
1037}
1038
1039MINLINE float len_v2v2_int(const int v1[2], const int v2[2])
1040{
1041 float x, y;
1042
1043 x = (float)(v1[0] - v2[0]);
1044 y = (float)(v1[1] - v2[1]);
1045 return sqrtf(x * x + y * y);
1046}
1047
1048MINLINE float len_v3(const float a[3])
1049{
1050 return sqrtf(dot_v3v3(a, a));
1051}
1052
1053MINLINE double len_v3_db(const double a[3])
1054{
1055 return sqrt(dot_v3v3_db(a, a));
1056}
1057
1058MINLINE float len_squared_v2v2(const float a[2], const float b[2])
1059{
1060 float d[2];
1061
1062 sub_v2_v2v2(d, b, a);
1063 return dot_v2v2(d, d);
1064}
1065
1066MINLINE double len_squared_v2v2_db(const double a[2], const double b[2])
1067{
1068 double d[2];
1069
1070 sub_v2_v2v2_db(d, b, a);
1071 return dot_v2v2_db(d, d);
1072}
1073
1074MINLINE float len_squared_v3v3(const float a[3], const float b[3])
1075{
1076 float d[3];
1077
1078 sub_v3_v3v3(d, b, a);
1079 return dot_v3v3(d, d);
1080}
1081
1082MINLINE float len_squared_v4v4(const float a[4], const float b[4])
1083{
1084 float d[4];
1085
1086 sub_v4_v4v4(d, b, a);
1087 return dot_v4v4(d, d);
1088}
1089
1090MINLINE float len_manhattan_v2v2(const float a[2], const float b[2])
1091{
1092 float d[2];
1093
1094 sub_v2_v2v2(d, b, a);
1095 return len_manhattan_v2(d);
1096}
1097
1098MINLINE int len_manhattan_v2v2_int(const int a[2], const int b[2])
1099{
1100 int d[2];
1101
1102 sub_v2_v2v2_int(d, b, a);
1103 return len_manhattan_v2_int(d);
1104}
1105
1106MINLINE float len_manhattan_v3v3(const float a[3], const float b[3])
1107{
1108 float d[3];
1109
1110 sub_v3_v3v3(d, b, a);
1111 return len_manhattan_v3(d);
1112}
1113
1114MINLINE float len_v3v3(const float a[3], const float b[3])
1115{
1116 float d[3];
1117
1118 sub_v3_v3v3(d, b, a);
1119 return len_v3(d);
1120}
1121
1122MINLINE float len_v4(const float a[4])
1123{
1124 return sqrtf(dot_v4v4(a, a));
1125}
1126
1127MINLINE float len_v4v4(const float a[4], const float b[4])
1128{
1129 float d[4];
1130
1131 sub_v4_v4v4(d, b, a);
1132 return len_v4(d);
1133}
1134
1135MINLINE float normalize_v2_v2_length(float r[2], const float a[2], const float unit_length)
1136{
1137 float d = dot_v2v2(a, a);
1138
1139 if (d > 1.0e-35f) {
1140 d = sqrtf(d);
1141 mul_v2_v2fl(r, a, unit_length / d);
1142 }
1143 else {
1144 /* Either the vector is small or one of it's values contained `nan`. */
1145 zero_v2(r);
1146 d = 0.0f;
1147 }
1148
1149 return d;
1150}
1151MINLINE float normalize_v2_v2(float r[2], const float a[2])
1152{
1153 return normalize_v2_v2_length(r, a, 1.0f);
1154}
1155
1156MINLINE float normalize_v2(float n[2])
1157{
1158 return normalize_v2_v2(n, n);
1159}
1160
1161MINLINE float normalize_v2_length(float n[2], const float unit_length)
1162{
1163 return normalize_v2_v2_length(n, n, unit_length);
1164}
1165
1166MINLINE float normalize_v3_v3_length(float r[3], const float a[3], const float unit_length)
1167{
1168 float d = dot_v3v3(a, a);
1169
1170 /* A larger value causes normalize errors in a scaled down models with camera extreme close. */
1171 if (d > 1.0e-35f) {
1172 d = sqrtf(d);
1173 mul_v3_v3fl(r, a, unit_length / d);
1174 }
1175 else {
1176 /* Either the vector is small or one of it's values contained `nan`. */
1177 zero_v3(r);
1178 d = 0.0f;
1179 }
1180
1181 return d;
1182}
1183MINLINE float normalize_v3_v3(float r[3], const float a[3])
1184{
1185 return normalize_v3_v3_length(r, a, 1.0f);
1186}
1187
1188MINLINE double normalize_v3_v3_length_db(double r[3], const double a[3], double const unit_length)
1189{
1190 double d = dot_v3v3_db(a, a);
1191
1192 /* a larger value causes normalize errors in a
1193 * scaled down models with camera extreme close */
1194 if (d > 1.0e-70) {
1195 d = sqrt(d);
1196 mul_v3_v3db_db(r, a, unit_length / d);
1197 }
1198 else {
1199 zero_v3_db(r);
1200 d = 0.0;
1201 }
1202
1203 return d;
1204}
1205MINLINE double normalize_v3_v3_db(double r[3], const double a[3])
1206{
1207 return normalize_v3_v3_length_db(r, a, 1.0);
1208}
1209
1210MINLINE double normalize_v3_length_db(double n[3], const double unit_length)
1211{
1212 double d = n[0] * n[0] + n[1] * n[1] + n[2] * n[2];
1213
1214 /* a larger value causes normalize errors in a
1215 * scaled down models with camera extreme close */
1216 if (d > 1.0e-35) {
1217 double mul;
1218
1219 d = sqrt(d);
1220 mul = unit_length / d;
1221
1222 n[0] *= mul;
1223 n[1] *= mul;
1224 n[2] *= mul;
1225 }
1226 else {
1227 n[0] = n[1] = n[2] = 0;
1228 d = 0.0;
1229 }
1230
1231 return d;
1232}
1233MINLINE double normalize_v3_db(double n[3])
1234{
1235 return normalize_v3_length_db(n, 1.0);
1236}
1237
1238MINLINE float normalize_v3_length(float n[3], const float unit_length)
1239{
1240 return normalize_v3_v3_length(n, n, unit_length);
1241}
1242
1243MINLINE float normalize_v3(float n[3])
1244{
1245 return normalize_v3_v3(n, n);
1246}
1247
1248MINLINE void normal_float_to_short_v2(short out[2], const float in[2])
1249{
1250 out[0] = (short)(in[0] * 32767.0f);
1251 out[1] = (short)(in[1] * 32767.0f);
1252}
1253
1254MINLINE void normal_short_to_float_v3(float out[3], const short in[3])
1255{
1256 out[0] = in[0] * (1.0f / 32767.0f);
1257 out[1] = in[1] * (1.0f / 32767.0f);
1258 out[2] = in[2] * (1.0f / 32767.0f);
1259}
1260
1261MINLINE void normal_float_to_short_v3(short out[3], const float in[3])
1262{
1263 out[0] = (short)(in[0] * 32767.0f);
1264 out[1] = (short)(in[1] * 32767.0f);
1265 out[2] = (short)(in[2] * 32767.0f);
1266}
1267
1268MINLINE void normal_float_to_short_v4(short out[4], const float in[4])
1269{
1270 out[0] = (short)(in[0] * 32767.0f);
1271 out[1] = (short)(in[1] * 32767.0f);
1272 out[2] = (short)(in[2] * 32767.0f);
1273 out[3] = (short)(in[3] * 32767.0f);
1274}
1275
1276/********************************* Comparison ********************************/
1277
1278MINLINE bool is_zero_v2(const float v[2])
1279{
1280 return (v[0] == 0.0f && v[1] == 0.0f);
1281}
1282
1283MINLINE bool is_zero_v3(const float v[3])
1284{
1285 return (v[0] == 0.0f && v[1] == 0.0f && v[2] == 0.0f);
1286}
1287
1288MINLINE bool is_zero_v4(const float v[4])
1289{
1290 return (v[0] == 0.0f && v[1] == 0.0f && v[2] == 0.0f && v[3] == 0.0f);
1291}
1292
1293MINLINE bool is_zero_v2_db(const double v[2])
1294{
1295 return (v[0] == 0.0 && v[1] == 0.0);
1296}
1297
1298MINLINE bool is_zero_v3_db(const double v[3])
1299{
1300 return (v[0] == 0.0 && v[1] == 0.0 && v[2] == 0.0);
1301}
1302
1303MINLINE bool is_zero_v4_db(const double v[4])
1304{
1305 return (v[0] == 0.0 && v[1] == 0.0 && v[2] == 0.0 && v[3] == 0.0);
1306}
1307
1308MINLINE bool is_one_v3(const float v[3])
1309{
1310 return (v[0] == 1.0f && v[1] == 1.0f && v[2] == 1.0f);
1311}
1312
1313/* -------------------------------------------------------------------- */
1319MINLINE bool equals_v2v2(const float v1[2], const float v2[2])
1320{
1321 return ((v1[0] == v2[0]) && (v1[1] == v2[1]));
1322}
1323
1324MINLINE bool equals_v3v3(const float v1[3], const float v2[3])
1325{
1326 return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]));
1327}
1328
1329MINLINE bool equals_v4v4(const float v1[4], const float v2[4])
1330{
1331 return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]) && (v1[3] == v2[3]));
1332}
1333
1334MINLINE bool equals_v2v2_int(const int v1[2], const int v2[2])
1335{
1336 return ((v1[0] == v2[0]) && (v1[1] == v2[1]));
1337}
1338
1339MINLINE bool equals_v3v3_int(const int v1[3], const int v2[3])
1340{
1341 return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]));
1342}
1343
1344MINLINE bool equals_v4v4_int(const int v1[4], const int v2[4])
1345{
1346 return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]) && (v1[3] == v2[3]));
1347}
1348
1349MINLINE bool compare_v2v2(const float v1[2], const float v2[2], const float limit)
1350{
1351 return (compare_ff(v1[0], v2[0], limit) && compare_ff(v1[1], v2[1], limit));
1352}
1353
1354MINLINE bool compare_v3v3(const float v1[3], const float v2[3], const float limit)
1355{
1356 return (compare_ff(v1[0], v2[0], limit) && compare_ff(v1[1], v2[1], limit) &&
1357 compare_ff(v1[2], v2[2], limit));
1358}
1359
1360MINLINE bool compare_v4v4(const float v1[4], const float v2[4], const float limit)
1361{
1362 return (compare_ff(v1[0], v2[0], limit) && compare_ff(v1[1], v2[1], limit) &&
1363 compare_ff(v1[2], v2[2], limit) && compare_ff(v1[3], v2[3], limit));
1364}
1365
1366MINLINE bool compare_v2v2_relative(const float v1[2],
1367 const float v2[2],
1368 const float limit,
1369 const int max_ulps)
1370{
1371 return (compare_ff_relative(v1[0], v2[0], limit, max_ulps) &&
1372 compare_ff_relative(v1[1], v2[1], limit, max_ulps));
1373}
1374
1375MINLINE bool compare_v3v3_relative(const float v1[3],
1376 const float v2[3],
1377 const float limit,
1378 const int max_ulps)
1379{
1380 return (compare_ff_relative(v1[0], v2[0], limit, max_ulps) &&
1381 compare_ff_relative(v1[1], v2[1], limit, max_ulps) &&
1382 compare_ff_relative(v1[2], v2[2], limit, max_ulps));
1383}
1384
1385MINLINE bool compare_v4v4_relative(const float v1[4],
1386 const float v2[4],
1387 const float limit,
1388 const int max_ulps)
1389{
1390 return (compare_ff_relative(v1[0], v2[0], limit, max_ulps) &&
1391 compare_ff_relative(v1[1], v2[1], limit, max_ulps) &&
1392 compare_ff_relative(v1[2], v2[2], limit, max_ulps) &&
1393 compare_ff_relative(v1[3], v2[3], limit, max_ulps));
1394}
1395
1396MINLINE bool compare_len_v3v3(const float v1[3], const float v2[3], const float limit)
1397{
1398 float d[3];
1399 sub_v3_v3v3(d, v1, v2);
1400 return (dot_v3v3(d, d) <= (limit * limit));
1401}
1402
1403MINLINE bool compare_size_v3v3(const float v1[3], const float v2[3], const float limit)
1404{
1405 for (int i = 0; i < 3; i++) {
1406 if (v2[i] == 0.0f) {
1407 /* Catch division by zero. */
1408 if (v1[i] != v2[i]) {
1409 return false;
1410 }
1411 }
1412 else {
1413 if (fabsf(v1[i] / v2[i] - 1.0f) > limit) {
1414 return false;
1415 }
1416 }
1417 }
1418 return true;
1419}
1420
1421/* -------------------------------------------------------------------- */
1425MINLINE void clamp_v2(float vec[2], const float min, const float max)
1426{
1427 CLAMP(vec[0], min, max);
1428 CLAMP(vec[1], min, max);
1429}
1430
1431MINLINE void clamp_v3(float vec[3], const float min, const float max)
1432{
1433 CLAMP(vec[0], min, max);
1434 CLAMP(vec[1], min, max);
1435 CLAMP(vec[2], min, max);
1436}
1437
1438MINLINE void clamp_v4(float vec[4], const float min, const float max)
1439{
1440 CLAMP(vec[0], min, max);
1441 CLAMP(vec[1], min, max);
1442 CLAMP(vec[2], min, max);
1443 CLAMP(vec[3], min, max);
1444}
1445
1446MINLINE void clamp_v2_v2v2(float vec[2], const float min[2], const float max[2])
1447{
1448 CLAMP(vec[0], min[0], max[0]);
1449 CLAMP(vec[1], min[1], max[1]);
1450}
1451
1452MINLINE void clamp_v3_v3v3(float vec[3], const float min[3], const float max[3])
1453{
1454 CLAMP(vec[0], min[0], max[0]);
1455 CLAMP(vec[1], min[1], max[1]);
1456 CLAMP(vec[2], min[2], max[2]);
1457}
1458
1459MINLINE void clamp_v4_v4v4(float vec[4], const float min[4], const float max[4])
1460{
1461 CLAMP(vec[0], min[0], max[0]);
1462 CLAMP(vec[1], min[1], max[1]);
1463 CLAMP(vec[2], min[2], max[2]);
1464 CLAMP(vec[3], min[3], max[3]);
1465}
1466
1469MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2])
1470{
1471 return (((l1[0] - pt[0]) * (l2[1] - pt[1])) - ((l2[0] - pt[0]) * (l1[1] - pt[1])));
1472}
1473
1476#endif /* __MATH_VECTOR_INLINE_C__ */
#define BLI_assert(a)
Definition BLI_assert.h:50
sqrt(x)+1/max(0
MINLINE int clamp_i(int value, int min, int max)
MINLINE int compare_ff_relative(float a, float b, float max_diff, int max_ulps)
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(...)
typedef double(DMatrix)[4][4]
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)
local_group_size(16, 16) .push_constant(Type b
#define fabsf(x)
#define sqrtf(x)
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
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 double normalize_v3_v3_length_db(double r[3], const double a[3], double const unit_length)
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 double normalize_v3_v3_db(double r[3], const double a[3])
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 round_v2i_v2fl(int r[2], const float a[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 void copy_v3fl_v3s(float r[3], const short a[3])
MINLINE void abs_v4(float r[4])
MINLINE float len_squared_v3v3(const float a[3], const float b[3])
MINLINE void copy_v3_uchar(unsigned char r[3], const unsigned char a)
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 mul_v2_v2_cw(float r[2], const float mat[2], const float vec[2])
MINLINE void clamp_v4_v4v4(float vec[4], const float min[4], const float max[4])
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 add_v4_v4v4(float r[4], const float a[4], const float b[4])
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 bool equals_v3v3_int(const int v1[3], const int v2[3])
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 mul_v4_v4(float r[4], const float a[4])
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 void madd_v2_v2db_db(double r[2], const double a[2], const double b[2], double f)
MINLINE void copy_v4_v4_char(char r[4], const char a[4])
MINLINE void madd_v3_v3v3db_db(double r[3], const double a[3], const double b[3], double f)
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 copy_v4_uchar(unsigned char r[4], const unsigned char a)
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_ccw(float r[2], const float mat[2], const float vec[2])
MINLINE double len_squared_v3_db(const double v[3])
MINLINE void cross_v3_v3v3_hi_prec(float r[3], const float a[3], const float b[3])
MINLINE void add_v2_v2v2_int(int r[2], const int a[2], const int b[2])
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 double len_squared_v2v2_db(const double a[2], const double b[2])
MINLINE double len_v3_db(const double a[3])
MINLINE void abs_v2(float r[2])
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 void sub_v2_v2_db(double r[2], const double a[2])
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 copy_v3_v3_char(char r[3], const char a[3])
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 bool is_zero_v4_db(const double v[4])
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 madd_v4_v4v4(float r[4], const float a[4], const float b[4])
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 void mul_v3_v3db_db(double r[3], const double a[3], double f)
MINLINE float len_manhattan_v2(const float v[2])
MINLINE void copy_v4db_v4fl(double r[4], const float a[4])
MINLINE void negate_v2(float r[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 float len_manhattan_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 copy_v2_v2_char(char r[2], const char a[2])
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 bool compare_v3v3_relative(const float v1[3], const float v2[3], const float limit, const int max_ulps)
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 normal_float_to_short_v4(short out[4], const float in[4])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool equals_v2v2_int(const int v1[2], const int v2[2])
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 copy_v4_v4_short(short r[4], const short a[4])
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 abs_v3(float r[3])
MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3_short(short r[3], const short a[3])
MINLINE void copy_v2_uchar(unsigned char r[2], const unsigned char a)
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 bool is_zero_v2_db(const double v[2])
MINLINE void clamp_v2_v2v2(float vec[2], const float min[2], const float max[2])
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 void star_m3_v3(float rmat[3][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 negate_v3_short(short r[3])
MINLINE void copy_v2fl_v2db(float r[2], const double a[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_relative(const float v1[2], const float v2[2], const float limit, const int max_ulps)
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 void abs_v4_v4(float r[4], const float a[4])
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 abs_v2_v2(float r[2], const float a[2])
MINLINE void swap_v3_v3(float a[3], float b[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void abs_v3_v3(float r[3], const float a[3])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void sub_v4_v4(float r[4], const float a[4])
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 void clamp_v3_v3v3(float vec[3], const float min[3], const float max[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 add_v4_fl(float r[4], float f)
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f)
MINLINE bool compare_v4v4_relative(const float v1[4], const float v2[4], const float limit, const int max_ulps)
MINLINE void add_v2_v2_int(int r[2], const int a[2])
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_v2_v2_db(double r[2], const double a[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 double dot_v3db_v3fl(const double a[3], const float b[3])
MINLINE void copy_v2_v2_uchar(unsigned char r[2], const unsigned char a[2])
MINLINE void zero_v3_db(double r[3])
MINLINE float len_squared_v3(const float v[3])
MINLINE float normalize_v3(float n[3])
MINLINE void normal_float_to_short_v2(short out[2], const float in[2])
MINLINE bool is_zero_v3_db(const double v[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 min(a, b)
Definition sort.c:32
ccl_device_inline int abs(int x)
Definition util/math.h:120