ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenlib / BLI_math_vector.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  *
19  * The Original Code is: some of this file.
20  *
21  * */
22
23 #ifndef __BLI_MATH_VECTOR_H__
24 #define __BLI_MATH_VECTOR_H__
25
26 /** \file
27  * \ingroup bli
28  */
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #include "BLI_compiler_attrs.h"
35 #include "BLI_math_inline.h"
36
37 /************************************* Init ***********************************/
38
39 #ifdef BLI_MATH_GCC_WARN_PRAGMA
40 #  pragma GCC diagnostic push
41 #  pragma GCC diagnostic ignored "-Wredundant-decls"
42 #endif
43
44 MINLINE void zero_v2(float r[2]);
45 MINLINE void zero_v3(float r[3]);
46 MINLINE void zero_v4(float r[4]);
47
48 MINLINE void copy_v2_v2(float r[2], const float a[2]);
49 MINLINE void copy_v3_v3(float r[3], const float a[3]);
50 MINLINE void copy_v4_v4(float r[4], const float a[4]);
51
52 MINLINE void copy_v2_fl(float r[2], float f);
53 MINLINE void copy_v3_fl(float r[3], float f);
54 MINLINE void copy_v4_fl(float r[4], float f);
55
56 MINLINE void swap_v2_v2(float a[2], float b[2]);
57 MINLINE void swap_v3_v3(float a[3], float b[3]);
58 MINLINE void swap_v4_v4(float a[4], float b[4]);
59
60 /* unsigned char */
61 MINLINE void copy_v2_v2_uchar(unsigned char r[2], const unsigned char a[2]);
62 MINLINE void copy_v3_v3_uchar(unsigned char r[3], const unsigned char a[3]);
63 MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4]);
64 /* char */
65 MINLINE void copy_v2_v2_char(char r[2], const char a[2]);
66 MINLINE void copy_v3_v3_char(char r[3], const char a[3]);
67 MINLINE void copy_v4_v4_char(char r[4], const char a[4]);
68 /* short */
69 MINLINE void copy_v2_v2_short(short r[2], const short a[2]);
70 MINLINE void copy_v3_v3_short(short r[3], const short a[3]);
71 MINLINE void copy_v4_v4_short(short r[4], const short a[4]);
72 /* int */
73 MINLINE void zero_v3_int(int r[3]);
74 MINLINE void copy_v2_v2_int(int r[2], const int a[2]);
75 MINLINE void copy_v3_v3_int(int r[3], const int a[3]);
76 MINLINE void copy_v4_v4_int(int r[4], const int a[4]);
77 /* double */
78 MINLINE void zero_v3_db(double r[3]);
79 MINLINE void copy_v2_v2_db(double r[2], const double a[2]);
80 MINLINE void copy_v3_v3_db(double r[3], const double a[3]);
81 MINLINE void copy_v4_v4_db(double r[4], const double a[4]);
82 /* short -> float */
83 MINLINE void copy_v3fl_v3s(float r[3], const short a[3]);
84 /* int <-> float */
85 MINLINE void copy_v2fl_v2i(float r[2], const int a[2]);
86 MINLINE void round_v2i_v2fl(int r[2], const float a[2]);
87 /* double -> float */
88 MINLINE void copy_v2fl_v2db(float r[2], const double a[2]);
89 MINLINE void copy_v3fl_v3db(float r[3], const double a[3]);
90 MINLINE void copy_v4fl_v4db(float r[4], const double a[4]);
91 /* float -> double */
92 MINLINE void copy_v2db_v2fl(double r[2], const float a[2]);
93 MINLINE void copy_v3db_v3fl(double r[3], const float a[3]);
94 MINLINE void copy_v4db_v4fl(double r[4], const float a[4]);
95 /* float args -> vec */
96 MINLINE void copy_v2_fl2(float v[2], float x, float y);
97 MINLINE void copy_v3_fl3(float v[3], float x, float y, float z);
98 MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w);
99
100 /********************************* Arithmetic ********************************/
101
102 MINLINE void add_v2_fl(float r[2], float f);
103 MINLINE void add_v3_fl(float r[3], float f);
104 MINLINE void add_v4_fl(float r[4], float f);
105 MINLINE void add_v2_v2(float r[2], const float a[2]);
106 MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2]);
107 MINLINE void add_v2_v2v2_int(int r[2], const int a[2], const int b[2]);
108 MINLINE void add_v3_v3(float r[3], const float a[3]);
109 MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3]);
110 MINLINE void add_v4_v4(float r[4], const float a[4]);
111 MINLINE void add_v4_v4v4(float r[4], const float a[4], const float b[4]);
112
113 MINLINE void add_v3fl_v3fl_v3i(float r[3], const float a[3], const int b[3]);
114 MINLINE void add_v3fl_v3fl_v3s(float r[3], const float a[3], const short b[3]);
115
116 MINLINE void sub_v2_v2(float r[2], const float a[2]);
117 MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2]);
118 MINLINE void sub_v2_v2v2_int(int r[2], const int a[2], const int b[2]);
119 MINLINE void sub_v3_v3(float r[3], const float a[3]);
120 MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3]);
121 MINLINE void sub_v3_v3v3_int(int r[3], const int a[3], const int b[3]);
122 MINLINE void sub_v4_v4(float r[4], const float a[4]);
123 MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4]);
124
125 MINLINE void sub_v3db_v3fl_v3fl(double r[3], const float a[3], const float b[3]);
126
127 MINLINE void mul_v2_fl(float r[2], float f);
128 MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f);
129 MINLINE void mul_v3_fl(float r[3], float f);
130 MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f);
131 MINLINE void mul_v2_v2(float r[2], const float a[2]);
132 MINLINE void mul_v2_v2v2(float r[2], const float a[2], const float b[2]);
133 MINLINE void mul_v3_v3(float r[3], const float a[3]);
134 MINLINE void mul_v3_v3v3(float r[3], const float a[3], const float b[3]);
135 MINLINE void mul_v4_fl(float r[4], float f);
136 MINLINE void mul_v4_v4(float r[4], const float a[4]);
137 MINLINE void mul_v4_v4fl(float r[3], const float a[3], float f);
138 MINLINE void mul_v2_v2_cw(float r[2], const float mat[2], const float vec[2]);
139 MINLINE void mul_v2_v2_ccw(float r[2], const float mat[2], const float vec[2]);
140 MINLINE float mul_project_m4_v3_zfac(const float mat[4][4],
141                                      const float co[3]) ATTR_WARN_UNUSED_RESULT;
142 MINLINE float dot_m3_v3_row_x(const float M[3][3], const float a[3]) ATTR_WARN_UNUSED_RESULT;
143 MINLINE float dot_m3_v3_row_y(const float M[3][3], const float a[3]) ATTR_WARN_UNUSED_RESULT;
144 MINLINE float dot_m3_v3_row_z(const float M[3][3], const float a[3]) ATTR_WARN_UNUSED_RESULT;
145 MINLINE float dot_m4_v3_row_x(const float M[4][4], const float a[3]) ATTR_WARN_UNUSED_RESULT;
146 MINLINE float dot_m4_v3_row_y(const float M[4][4], const float a[3]) ATTR_WARN_UNUSED_RESULT;
147 MINLINE float dot_m4_v3_row_z(const float M[4][4], const float a[3]) ATTR_WARN_UNUSED_RESULT;
148
149 MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f);
150 MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f);
151 MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3]);
152 MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f);
153 MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f);
154 MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]);
155 MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f);
156 MINLINE void madd_v4_v4v4(float r[4], const float a[4], const float b[4]);
157
158 MINLINE void madd_v3fl_v3fl_v3fl_v3i(float r[3],
159                                      const float a[3],
160                                      const float b[3],
161                                      const int c[3]);
162
163 MINLINE void negate_v2(float r[2]);
164 MINLINE void negate_v2_v2(float r[2], const float a[2]);
165 MINLINE void negate_v3(float r[3]);
166 MINLINE void negate_v3_v3(float r[3], const float a[3]);
167 MINLINE void negate_v4(float r[4]);
168 MINLINE void negate_v4_v4(float r[4], const float a[3]);
169
170 MINLINE void negate_v3_short(short r[3]);
171 MINLINE void negate_v3_db(double r[3]);
172
173 MINLINE void invert_v2(float r[2]);
174 MINLINE void invert_v3(float r[3]);
175
176 MINLINE void abs_v2(float r[2]);
177 MINLINE void abs_v2_v2(float r[2], const float a[2]);
178 MINLINE void abs_v3(float r[3]);
179 MINLINE void abs_v3_v3(float r[3], const float a[3]);
180 MINLINE void abs_v4(float r[4]);
181 MINLINE void abs_v4_v4(float r[4], const float a[4]);
182
183 MINLINE float dot_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT;
184 MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
185 MINLINE float dot_v3v3v3(const float p[3],
186                          const float a[3],
187                          const float b[3]) ATTR_WARN_UNUSED_RESULT;
188 MINLINE float dot_v4v4(const float a[4], const float b[4]) ATTR_WARN_UNUSED_RESULT;
189
190 MINLINE double dot_v3db_v3fl(const double a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
191
192 MINLINE float cross_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT;
193 MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3]);
194 MINLINE void cross_v3_v3v3_hi_prec(float r[3], const float a[3], const float b[3]);
195
196 MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3]);
197
198 MINLINE void star_m3_v3(float rmat[3][3], float a[3]);
199
200 /*********************************** Length **********************************/
201
202 MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT;
203 MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT;
204 MINLINE float len_manhattan_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT;
205 MINLINE int len_manhattan_v2_int(const int v[2]) ATTR_WARN_UNUSED_RESULT;
206 MINLINE float len_manhattan_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT;
207 MINLINE float len_v2(const float a[2]) ATTR_WARN_UNUSED_RESULT;
208 MINLINE float len_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT;
209 MINLINE float len_v2v2_int(const int v1[2], const int v2[2]);
210 MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT;
211 MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
212 MINLINE float len_squared_v4v4(const float a[4], const float b[4]) ATTR_WARN_UNUSED_RESULT;
213 MINLINE float len_manhattan_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT;
214 MINLINE int len_manhattan_v2v2_int(const int a[2], const int b[2]) ATTR_WARN_UNUSED_RESULT;
215 MINLINE float len_manhattan_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
216 MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT;
217 MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
218
219 MINLINE float normalize_v2_length(float r[2], const float unit_scale);
220 MINLINE float normalize_v2_v2_length(float r[2], const float a[2], const float unit_scale);
221 MINLINE float normalize_v3_length(float r[3], const float unit_scale);
222 MINLINE float normalize_v3_v3_length(float r[3], const float a[3], const float unit_scale);
223 MINLINE double normalize_v3_length_d(double n[3], const double unit_scale);
224
225 MINLINE float normalize_v2(float r[2]);
226 MINLINE float normalize_v2_v2(float r[2], const float a[2]);
227 MINLINE float normalize_v3(float r[3]);
228 MINLINE float normalize_v3_v3(float r[3], const float a[3]);
229 MINLINE double normalize_v3_d(double n[3]);
230
231 /******************************* Interpolation *******************************/
232
233 void interp_v2_v2v2(float r[2], const float a[2], const float b[2], const float t);
234 void interp_v2_v2v2v2(
235     float r[2], const float a[2], const float b[2], const float c[2], const float t[3]);
236 void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float t);
237 void interp_v3_v3v3v3(
238     float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3]);
239 void interp_v3_v3v3v3v3(float p[3],
240                         const float v1[3],
241                         const float v2[3],
242                         const float v3[3],
243                         const float v4[3],
244                         const float w[4]);
245 void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t);
246 void interp_v4_v4v4v4(
247     float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]);
248 void interp_v4_v4v4v4v4(float p[4],
249                         const float v1[4],
250                         const float v2[4],
251                         const float v3[4],
252                         const float v4[4],
253                         const float w[4]);
254 void interp_v3_v3v3v3_uv(
255     float p[3], const float v1[3], const float v2[3], const float v3[3], const float uv[2]);
256
257 bool interp_v3_v3v3_slerp(float target[3], const float a[3], const float b[3], const float t)
258     ATTR_WARN_UNUSED_RESULT;
259 bool interp_v2_v2v2_slerp(float target[2], const float a[2], const float b[2], const float t)
260     ATTR_WARN_UNUSED_RESULT;
261
262 void interp_v3_v3v3_slerp_safe(float target[3], const float a[3], const float b[3], const float t);
263 void interp_v2_v2v2_slerp_safe(float target[2], const float a[2], const float b[2], const float t);
264
265 void interp_v2_v2v2v2v2_cubic(float p[2],
266                               const float v1[2],
267                               const float v2[2],
268                               const float v3[2],
269                               const float v4[2],
270                               const float u);
271
272 void interp_v3_v3v3_char(char target[3], const char a[3], const char b[3], const float t);
273 void interp_v3_v3v3_uchar(unsigned char target[3],
274                           const unsigned char a[3],
275                           const unsigned char b[3],
276                           const float t);
277 void interp_v4_v4v4_char(char target[4], const char a[4], const char b[4], const float t);
278 void interp_v4_v4v4_uchar(unsigned char target[4],
279                           const unsigned char a[4],
280                           const unsigned char b[4],
281                           const float t);
282
283 void mid_v3_v3v3(float r[3], const float a[3], const float b[3]);
284 void mid_v2_v2v2(float r[2], const float a[2], const float b[2]);
285 void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3]);
286 void mid_v3_v3v3v3v3(
287     float v[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
288 void mid_v3_v3_array(float r[3], const float (*vec_arr)[3], const unsigned int nbr);
289
290 void mid_v3_v3v3_angle_weighted(float r[3], const float a[3], const float b[3]);
291 void mid_v3_angle_weighted(float r[3]);
292
293 void flip_v4_v4v4(float v[4], const float v1[4], const float v2[4]);
294 void flip_v3_v3v3(float v[3], const float v1[3], const float v2[3]);
295 void flip_v2_v2v2(float v[2], const float v1[2], const float v2[2]);
296
297 /********************************* Comparison ********************************/
298
299 MINLINE bool is_zero_v2(const float a[3]) ATTR_WARN_UNUSED_RESULT;
300 MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT;
301 MINLINE bool is_zero_v4(const float a[4]) ATTR_WARN_UNUSED_RESULT;
302
303 bool is_finite_v2(const float a[3]) ATTR_WARN_UNUSED_RESULT;
304 bool is_finite_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT;
305 bool is_finite_v4(const float a[4]) ATTR_WARN_UNUSED_RESULT;
306
307 MINLINE bool is_one_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT;
308
309 MINLINE bool equals_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT;
310 MINLINE bool equals_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
311 MINLINE bool equals_v4v4(const float a[4], const float b[4]) ATTR_WARN_UNUSED_RESULT;
312
313 MINLINE bool compare_v2v2(const float a[2],
314                           const float b[2],
315                           const float limit) ATTR_WARN_UNUSED_RESULT;
316 MINLINE bool compare_v3v3(const float a[3],
317                           const float b[3],
318                           const float limit) ATTR_WARN_UNUSED_RESULT;
319 MINLINE bool compare_v4v4(const float a[4],
320                           const float b[4],
321                           const float limit) ATTR_WARN_UNUSED_RESULT;
322
323 MINLINE bool compare_v2v2_relative(const float a[2],
324                                    const float b[2],
325                                    const float limit,
326                                    const int max_ulps) ATTR_WARN_UNUSED_RESULT;
327 MINLINE bool compare_v3v3_relative(const float a[3],
328                                    const float b[3],
329                                    const float limit,
330                                    const int max_ulps) ATTR_WARN_UNUSED_RESULT;
331 MINLINE bool compare_v4v4_relative(const float a[4],
332                                    const float b[4],
333                                    const float limit,
334                                    const int max_ulps) ATTR_WARN_UNUSED_RESULT;
335
336 MINLINE bool compare_len_v3v3(const float a[3],
337                               const float b[3],
338                               const float limit) ATTR_WARN_UNUSED_RESULT;
339
340 MINLINE float line_point_side_v2(const float l1[2],
341                                  const float l2[2],
342                                  const float pt[2]) ATTR_WARN_UNUSED_RESULT;
343
344 /********************************** Angles ***********************************/
345 /* - angle with 2 arguments is angle between vector                          */
346 /* - angle with 3 arguments is angle between 3 points at the middle point    */
347 /* - angle_normalized_* is faster equivalent if vectors are normalized       */
348
349 float angle_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT;
350 float angle_signed_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT;
351 float angle_v2v2v2(const float a[2], const float b[2], const float c[2]) ATTR_WARN_UNUSED_RESULT;
352 float angle_normalized_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT;
353 float angle_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT;
354 float angle_v3v3v3(const float a[3], const float b[3], const float c[3]) ATTR_WARN_UNUSED_RESULT;
355 float cos_v3v3v3(const float p1[3], const float p2[3], const float p3[3]) ATTR_WARN_UNUSED_RESULT;
356 float cos_v2v2v2(const float p1[2], const float p2[2], const float p3[2]) ATTR_WARN_UNUSED_RESULT;
357 float angle_on_axis_v3v3_v3(const float v1[3],
358                             const float v2[3],
359                             const float axis[3]) ATTR_WARN_UNUSED_RESULT;
360 float angle_signed_on_axis_v3v3_v3(const float v1[3],
361                                    const float v2[3],
362                                    const float axis[3]) ATTR_WARN_UNUSED_RESULT;
363 float angle_normalized_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT;
364 float angle_on_axis_v3v3v3_v3(const float v1[3],
365                               const float v2[3],
366                               const float v3[3],
367                               const float axis[3]) ATTR_WARN_UNUSED_RESULT;
368 float angle_signed_on_axis_v3v3v3_v3(const float v1[3],
369                                      const float v2[3],
370                                      const float v3[3],
371                                      const float axis[3]) ATTR_WARN_UNUSED_RESULT;
372 void angle_tri_v3(float angles[3], const float v1[3], const float v2[3], const float v3[3]);
373 void angle_quad_v3(
374     float angles[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
375 void angle_poly_v3(float *angles, const float *verts[3], int len);
376
377 /********************************* Geometry **********************************/
378
379 void project_v2_v2v2(float out[2], const float p[2], const float v_proj[2]);
380 void project_v3_v3v3(float out[3], const float p[3], const float v_proj[3]);
381 void project_v2_v2v2_normalized(float out[2], const float p[2], const float v_proj[2]);
382 void project_v3_v3v3_normalized(float out[3], const float p[3], const float v_proj[3]);
383 void project_plane_v3_v3v3(float out[3], const float p[3], const float v_plane[3]);
384 void project_plane_v2_v2v2(float out[2], const float p[2], const float v_plane[2]);
385 void project_plane_normalized_v3_v3v3(float out[3], const float p[3], const float v_plane[3]);
386 void project_plane_normalized_v2_v2v2(float out[2], const float p[2], const float v_plane[2]);
387 void project_v3_plane(float out[3], const float plane_no[3], const float plane_co[3]);
388 void reflect_v3_v3v3(float out[3], const float vec[3], const float normal[3]);
389 void ortho_basis_v3v3_v3(float r_n1[3], float r_n2[3], const float n[3]);
390 void ortho_v3_v3(float out[3], const float v[3]);
391 void ortho_v2_v2(float out[2], const float v[2]);
392 void bisect_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]);
393 void rotate_v2_v2fl(float r[2], const float p[2], const float angle);
394 void rotate_v3_v3v3fl(float v[3], const float p[3], const float axis[3], const float angle);
395 void rotate_normalized_v3_v3v3fl(float out[3],
396                                  const float p[3],
397                                  const float axis[3],
398                                  const float angle);
399
400 /*********************************** Other ***********************************/
401
402 void print_v2(const char *str, const float a[2]);
403 void print_v3(const char *str, const float a[3]);
404 void print_v4(const char *str, const float a[4]);
405 void print_vn(const char *str, const float v[], const int n);
406
407 #define print_v2_id(v) print_v2(STRINGIFY(v), v)
408 #define print_v3_id(v) print_v3(STRINGIFY(v), v)
409 #define print_v4_id(v) print_v4(STRINGIFY(v), v)
410 #define print_vn_id(v, n) print_vn(STRINGIFY(v), v, n)
411
412 MINLINE void normal_float_to_short_v2(short r[2], const float n[2]);
413 MINLINE void normal_short_to_float_v3(float r[3], const short n[3]);
414 MINLINE void normal_float_to_short_v3(short r[3], const float n[3]);
415 MINLINE void normal_float_to_short_v4(short r[4], const float n[4]);
416
417 void minmax_v3v3_v3(float min[3], float max[3], const float vec[3]);
418 void minmax_v2v2_v2(float min[2], float max[2], const float vec[2]);
419
420 void minmax_v3v3_v3_array(float r_min[3], float r_max[3], const float (*vec_arr)[3], int nbr);
421
422 void dist_ensure_v3_v3fl(float v1[3], const float v2[3], const float dist);
423 void dist_ensure_v2_v2fl(float v1[2], const float v2[2], const float dist);
424
425 void axis_sort_v3(const float axis_values[3], int r_axis_order[3]);
426
427 /***************************** Array Functions *******************************/
428 /* follow fixed length vector function conventions. */
429 double dot_vn_vn(const float *array_src_a,
430                  const float *array_src_b,
431                  const int size) ATTR_WARN_UNUSED_RESULT;
432 double len_squared_vn(const float *array, const int size) ATTR_WARN_UNUSED_RESULT;
433 float normalize_vn_vn(float *array_tar, const float *array_src, const int size);
434 float normalize_vn(float *array_tar, const int size);
435 void range_vn_i(int *array_tar, const int size, const int start);
436 void range_vn_u(unsigned int *array_tar, const int size, const unsigned int start);
437 void range_vn_fl(float *array_tar, const int size, const float start, const float step);
438 void negate_vn(float *array_tar, const int size);
439 void negate_vn_vn(float *array_tar, const float *array_src, const int size);
440 void mul_vn_vn(float *array_tar, const float *array_src, const int size);
441 void mul_vn_vnvn(float *array_tar,
442                  const float *array_src_a,
443                  const float *array_src_b,
444                  const int size);
445 void mul_vn_fl(float *array_tar, const int size, const float f);
446 void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f);
447 void add_vn_vn(float *array_tar, const float *array_src, const int size);
448 void add_vn_vnvn(float *array_tar,
449                  const float *array_src_a,
450                  const float *array_src_b,
451                  const int size);
452 void madd_vn_vn(float *array_tar, const float *array_src, const float f, const int size);
453 void madd_vn_vnvn(float *array_tar,
454                   const float *array_src_a,
455                   const float *array_src_b,
456                   const float f,
457                   const int size);
458 void sub_vn_vn(float *array_tar, const float *array_src, const int size);
459 void sub_vn_vnvn(float *array_tar,
460                  const float *array_src_a,
461                  const float *array_src_b,
462                  const int size);
463 void msub_vn_vn(float *array_tar, const float *array_src, const float f, const int size);
464 void msub_vn_vnvn(float *array_tar,
465                   const float *array_src_a,
466                   const float *array_src_b,
467                   const float f,
468                   const int size);
469 void interp_vn_vn(float *array_tar, const float *array_src, const float t, const int size);
470 void copy_vn_i(int *array_tar, const int size, const int val);
471 void copy_vn_short(short *array_tar, const int size, const short val);
472 void copy_vn_ushort(unsigned short *array_tar, const int size, const unsigned short val);
473 void copy_vn_uchar(unsigned char *array_tar, const int size, const unsigned char val);
474 void copy_vn_fl(float *array_tar, const int size, const float val);
475
476 void add_vn_vn_d(double *array_tar, const double *array_src, const int size);
477 void add_vn_vnvn_d(double *array_tar,
478                    const double *array_src_a,
479                    const double *array_src_b,
480                    const int size);
481 void mul_vn_db(double *array_tar, const int size, const double f);
482
483 /**************************** Inline Definitions ******************************/
484
485 #if BLI_MATH_DO_INLINE
486 #  include "intern/math_vector_inline.c"
487 #endif
488
489 #ifdef BLI_MATH_GCC_WARN_PRAGMA
490 #  pragma GCC diagnostic pop
491 #endif
492
493 #ifdef __cplusplus
494 }
495 #endif
496
497 #endif /* __BLI_MATH_VECTOR_H__ */