ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenlib / BLI_math_matrix.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 #ifndef __BLI_MATH_MATRIX_H__
23 #define __BLI_MATH_MATRIX_H__
24
25 /** \file
26  * \ingroup bli
27  */
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 #include "BLI_compiler_attrs.h"
34
35 /********************************* Init **************************************/
36
37 void zero_m2(float R[2][2]);
38 void zero_m3(float R[3][3]);
39 void zero_m4(float R[4][4]);
40
41 void unit_m2(float R[2][2]);
42 void unit_m3(float R[3][3]);
43 void unit_m4(float R[4][4]);
44
45 void copy_m2_m2(float R[2][2], const float A[2][2]);
46 void copy_m3_m3(float R[3][3], const float A[3][3]);
47 void copy_m4_m4(float R[4][4], const float A[4][4]);
48 void copy_m3_m4(float R[3][3], const float A[4][4]);
49 void copy_m4_m3(float R[4][4], const float A[3][3]);
50
51 /* double->float */
52 void copy_m3_m3d(float R[3][3], const double A[3][3]);
53
54 void swap_m3m3(float A[3][3], float B[3][3]);
55 void swap_m4m4(float A[4][4], float B[4][4]);
56
57 /******************************** Arithmetic *********************************/
58
59 void add_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
60 void add_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
61
62 void madd_m3_m3m3fl(float R[3][3], const float A[3][3], const float B[3][3], const float f);
63 void madd_m4_m4m4fl(float R[4][4], const float A[4][4], const float B[4][4], const float f);
64
65 void sub_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
66 void sub_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
67
68 void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
69 void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4]);
70 void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3]);
71 void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
72 void mul_m3_m3m4(float R[3][3], const float A[3][3], const float B[4][4]);
73 void mul_m3_m4m3(float R[3][3], const float A[4][4], const float B[3][3]);
74 void mul_m3_m4m4(float R[3][3], const float A[4][4], const float B[4][4]);
75
76 /* special matrix multiplies
77  * uniq: R <-- AB, R is neither A nor B
78  * pre:  R <-- AR
79  * post: R <-- RB
80  */
81 void mul_m3_m3m3_uniq(float R[3][3], const float A[3][3], const float B[3][3]);
82 void mul_m3_m3_pre(float R[3][3], const float A[3][3]);
83 void mul_m3_m3_post(float R[3][3], const float B[3][3]);
84 void mul_m4_m4m4_uniq(float R[4][4], const float A[4][4], const float B[4][4]);
85 void mul_m4_m4_pre(float R[4][4], const float A[4][4]);
86 void mul_m4_m4_post(float R[4][4], const float B[4][4]);
87
88 /* mul_m3_series */
89 void _va_mul_m3_series_3(float R[3][3], const float M1[3][3], const float M2[3][3]) ATTR_NONNULL();
90 void _va_mul_m3_series_4(float R[3][3],
91                          const float M1[3][3],
92                          const float M2[3][3],
93                          const float M3[3][3]) ATTR_NONNULL();
94 void _va_mul_m3_series_5(float R[3][3],
95                          const float M1[3][3],
96                          const float M2[3][3],
97                          const float M3[3][3],
98                          const float M4[3][3]) ATTR_NONNULL();
99 void _va_mul_m3_series_6(float R[3][3],
100                          const float M1[3][3],
101                          const float M2[3][3],
102                          const float M3[3][3],
103                          const float M4[3][3],
104                          const float M5[3][3]) ATTR_NONNULL();
105 void _va_mul_m3_series_7(float R[3][3],
106                          const float M1[3][3],
107                          const float M2[3][3],
108                          const float M3[3][3],
109                          const float M4[3][3],
110                          const float M5[3][3],
111                          const float M6[3][3]) ATTR_NONNULL();
112 void _va_mul_m3_series_8(float R[3][3],
113                          const float M1[3][3],
114                          const float M2[3][3],
115                          const float M3[3][3],
116                          const float M4[3][3],
117                          const float M5[3][3],
118                          const float M6[3][3],
119                          const float M7[3][3]) ATTR_NONNULL();
120 void _va_mul_m3_series_9(float R[3][3],
121                          const float M1[3][3],
122                          const float M2[3][3],
123                          const float M3[3][3],
124                          const float M4[3][3],
125                          const float M5[3][3],
126                          const float M6[3][3],
127                          const float M7[3][3],
128                          const float M8[3][3]) ATTR_NONNULL();
129 /* mul_m4_series */
130 void _va_mul_m4_series_3(float R[4][4], const float M1[4][4], const float M2[4][4]) ATTR_NONNULL();
131 void _va_mul_m4_series_4(float R[4][4],
132                          const float M1[4][4],
133                          const float M2[4][4],
134                          const float M3[4][4]) ATTR_NONNULL();
135 void _va_mul_m4_series_5(float R[4][4],
136                          const float M1[4][4],
137                          const float M2[4][4],
138                          const float M3[4][4],
139                          const float M4[4][4]) ATTR_NONNULL();
140 void _va_mul_m4_series_6(float R[4][4],
141                          const float M1[4][4],
142                          const float M2[4][4],
143                          const float M3[4][4],
144                          const float M4[4][4],
145                          const float M5[4][4]) ATTR_NONNULL();
146 void _va_mul_m4_series_7(float R[4][4],
147                          const float M1[4][4],
148                          const float M2[4][4],
149                          const float M3[4][4],
150                          const float M4[4][4],
151                          const float M5[4][4],
152                          const float M6[4][4]) ATTR_NONNULL();
153 void _va_mul_m4_series_8(float R[4][4],
154                          const float M1[4][4],
155                          const float M2[4][4],
156                          const float M3[4][4],
157                          const float M4[4][4],
158                          const float M5[4][4],
159                          const float M6[4][4],
160                          const float M7[4][4]) ATTR_NONNULL();
161 void _va_mul_m4_series_9(float R[4][4],
162                          const float M1[4][4],
163                          const float M2[4][4],
164                          const float M3[4][4],
165                          const float M4[4][4],
166                          const float M5[4][4],
167                          const float M6[4][4],
168                          const float M7[4][4],
169                          const float M8[4][4]) ATTR_NONNULL();
170
171 #define mul_m3_series(...) VA_NARGS_CALL_OVERLOAD(_va_mul_m3_series_, __VA_ARGS__)
172 #define mul_m4_series(...) VA_NARGS_CALL_OVERLOAD(_va_mul_m4_series_, __VA_ARGS__)
173
174 void mul_m4_v3(const float M[4][4], float r[3]);
175 void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3]);
176 void mul_v2_m4v3(float r[2], const float M[4][4], const float v[3]);
177 void mul_v2_m2v2(float r[2], const float M[2][2], const float v[2]);
178 void mul_m2v2(const float M[2][2], float v[2]);
179 void mul_mat3_m4_v3(const float M[4][4], float r[3]);
180 void mul_v3_mat3_m4v3(float r[3], const float M[4][4], const float v[3]);
181 void mul_m4_v4(const float M[4][4], float r[4]);
182 void mul_v4_m4v4(float r[4], const float M[4][4], const float v[4]);
183 void mul_v4_m4v3(float r[4], const float M[4][4], const float v[3]); /* v has implicit w = 1.0f */
184 void mul_project_m4_v3(const float M[4][4], float vec[3]);
185 void mul_v3_project_m4_v3(float r[3], const float mat[4][4], const float vec[3]);
186 void mul_v2_project_m4_v3(float r[2], const float M[4][4], const float vec[3]);
187
188 void mul_m3_v2(const float m[3][3], float r[2]);
189 void mul_v2_m3v2(float r[2], const float m[3][3], const float v[2]);
190 void mul_m3_v3(const float M[3][3], float r[3]);
191 void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3]);
192 void mul_v2_m3v3(float r[2], const float M[3][3], const float a[3]);
193 void mul_transposed_m3_v3(const float M[3][3], float r[3]);
194 void mul_transposed_mat3_m4_v3(const float M[4][4], float r[3]);
195 void mul_m3_v3_double(const float M[3][3], double r[3]);
196
197 void mul_m3_fl(float R[3][3], float f);
198 void mul_m4_fl(float R[4][4], float f);
199 void mul_mat3_m4_fl(float R[4][4], float f);
200
201 void negate_m3(float R[3][3]);
202 void negate_mat3_m4(float R[4][4]);
203 void negate_m4(float R[4][4]);
204
205 bool invert_m3_ex(float m[3][3], const float epsilon);
206 bool invert_m3_m3_ex(float m1[3][3], const float m2[3][3], const float epsilon);
207
208 bool invert_m3(float R[3][3]);
209 bool invert_m3_m3(float R[3][3], const float A[3][3]);
210 bool invert_m4(float R[4][4]);
211 bool invert_m4_m4(float R[4][4], const float A[4][4]);
212
213 /* double arithmetic (mixed float/double) */
214 void mul_m4_v4d(const float M[4][4], double r[4]);
215 void mul_v4d_m4v4d(double r[4], const float M[4][4], const double v[4]);
216
217 /* double matrix functions (no mixing types) */
218 void mul_v3_m3v3_db(double r[3], const double M[3][3], const double a[3]);
219 void mul_m3_v3_db(const double M[3][3], double r[3]);
220
221 /****************************** Linear Algebra *******************************/
222
223 void transpose_m3(float R[3][3]);
224 void transpose_m3_m3(float R[3][3], const float A[3][3]);
225 void transpose_m3_m4(float R[3][3], const float A[4][4]);
226 void transpose_m4(float R[4][4]);
227 void transpose_m4_m4(float R[4][4], const float A[4][4]);
228
229 int compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit);
230
231 void normalize_m3_ex(float R[3][3], float r_scale[3]) ATTR_NONNULL();
232 void normalize_m3(float R[3][3]) ATTR_NONNULL();
233 void normalize_m3_m3_ex(float R[3][3], const float A[3][3], float r_scale[3]) ATTR_NONNULL();
234 void normalize_m3_m3(float R[3][3], const float A[3][3]) ATTR_NONNULL();
235 void normalize_m4_ex(float R[4][4], float r_scale[3]) ATTR_NONNULL();
236 void normalize_m4(float R[4][4]) ATTR_NONNULL();
237 void normalize_m4_m4_ex(float R[4][4], const float A[4][4], float r_scale[3]) ATTR_NONNULL();
238 void normalize_m4_m4(float R[4][4], const float A[4][4]) ATTR_NONNULL();
239
240 void orthogonalize_m3(float R[3][3], int axis);
241 void orthogonalize_m4(float R[4][4], int axis);
242
243 bool is_orthogonal_m3(const float mat[3][3]);
244 bool is_orthogonal_m4(const float mat[4][4]);
245 bool is_orthonormal_m3(const float mat[3][3]);
246 bool is_orthonormal_m4(const float mat[4][4]);
247
248 bool is_uniform_scaled_m3(const float mat[3][3]);
249 bool is_uniform_scaled_m4(const float m[4][4]);
250
251 /* Note: 'adjoint' here means the adjugate (adjunct, "classical adjoint") matrix!
252  * Nowadays 'adjoint' usually refers to the conjugate transpose,
253  * which for real-valued matrices is simply the transpose.
254  */
255 void adjoint_m2_m2(float R[2][2], const float A[2][2]);
256 void adjoint_m3_m3(float R[3][3], const float A[3][3]);
257 void adjoint_m4_m4(float R[4][4], const float A[4][4]);
258
259 float determinant_m2(float a, float b, float c, float d);
260 float determinant_m3(
261     float a, float b, float c, float d, float e, float f, float g, float h, float i);
262 float determinant_m3_array(const float m[3][3]);
263 float determinant_m4(const float A[4][4]);
264
265 #define PSEUDOINVERSE_EPSILON 1e-8f
266
267 void svd_m4(float U[4][4], float s[4], float V[4][4], float A[4][4]);
268 void pseudoinverse_m4_m4(float Ainv[4][4], const float A[4][4], float epsilon);
269 void pseudoinverse_m3_m3(float Ainv[3][3], const float A[3][3], float epsilon);
270
271 bool has_zero_axis_m4(const float matrix[4][4]);
272
273 void invert_m4_m4_safe(float Ainv[4][4], const float A[4][4]);
274
275 /****************************** Transformations ******************************/
276
277 void scale_m3_fl(float R[3][3], float scale);
278 void scale_m4_fl(float R[4][4], float scale);
279
280 float mat3_to_scale(const float M[3][3]);
281 float mat4_to_scale(const float M[4][4]);
282 float mat4_to_xy_scale(const float M[4][4]);
283
284 void size_to_mat3(float R[3][3], const float size[3]);
285 void size_to_mat4(float R[4][4], const float size[3]);
286
287 void mat3_to_size(float r[3], const float M[3][3]);
288 void mat4_to_size(float r[3], const float M[4][4]);
289
290 void translate_m4(float mat[4][4], float tx, float ty, float tz);
291 void rotate_m4(float mat[4][4], const char axis, const float angle);
292 void transform_pivot_set_m4(float mat[4][4], const float pivot[3]);
293
294 void mat3_to_rot_size(float rot[3][3], float size[3], const float mat3[3][3]);
295 void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], const float wmat[4][4]);
296 void mat4_to_loc_quat(float loc[3], float quat[4], const float wmat[4][4]);
297 void mat4_decompose(float loc[3], float quat[4], float size[3], const float wmat[4][4]);
298
299 void mat3_polar_decompose(const float mat3[3][3], float r_U[3][3], float r_P[3][3]);
300
301 void loc_eul_size_to_mat4(float R[4][4],
302                           const float loc[3],
303                           const float eul[3],
304                           const float size[3]);
305 void loc_eulO_size_to_mat4(
306     float R[4][4], const float loc[3], const float eul[3], const float size[3], const short order);
307 void loc_quat_size_to_mat4(float R[4][4],
308                            const float loc[3],
309                            const float quat[4],
310                            const float size[3]);
311 void loc_axisangle_size_to_mat4(float R[4][4],
312                                 const float loc[3],
313                                 const float axis[4],
314                                 const float angle,
315                                 const float size[3]);
316
317 void blend_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3], const float t);
318 void blend_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4], const float t);
319
320 void interp_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3], const float t);
321 void interp_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4], const float t);
322
323 bool is_negative_m3(const float mat[3][3]);
324 bool is_negative_m4(const float mat[4][4]);
325
326 bool is_zero_m3(const float mat[3][3]);
327 bool is_zero_m4(const float mat[4][4]);
328
329 bool equals_m3m3(const float mat1[3][3], const float mat2[3][3]);
330 bool equals_m4m4(const float mat1[4][4], const float mat2[4][4]);
331
332 /* SpaceTransform helper */
333 typedef struct SpaceTransform {
334   float local2target[4][4];
335   float target2local[4][4];
336
337 } SpaceTransform;
338
339 void BLI_space_transform_from_matrices(struct SpaceTransform *data,
340                                        const float local[4][4],
341                                        const float target[4][4]);
342 void BLI_space_transform_global_from_matrices(struct SpaceTransform *data,
343                                               const float local[4][4],
344                                               const float target[4][4]);
345 void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3]);
346 void BLI_space_transform_invert(const struct SpaceTransform *data, float co[3]);
347 void BLI_space_transform_apply_normal(const struct SpaceTransform *data, float no[3]);
348 void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3]);
349
350 #define BLI_SPACE_TRANSFORM_SETUP(data, local, target) \
351   BLI_space_transform_from_matrices((data), (local)->obmat, (target)->obmat)
352
353 /*********************************** Other ***********************************/
354
355 void print_m3(const char *str, const float M[3][3]);
356 void print_m4(const char *str, const float M[4][4]);
357
358 #define print_m3_id(M) print_m3(STRINGIFY(M), M)
359 #define print_m4_id(M) print_m4(STRINGIFY(M), M)
360
361 #ifdef __cplusplus
362 }
363 #endif
364
365 #endif /* __BLI_MATH_MATRIX_H__ */