GPencil: Interpolate pressure in active Smooth
[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 bool invert_m4_m4_fallback(float R[4][4], const float A[4][4]);
213
214 /* double arithmetic (mixed float/double) */
215 void mul_m4_v4d(const float M[4][4], double r[4]);
216 void mul_v4d_m4v4d(double r[4], const float M[4][4], const double v[4]);
217
218 /* double matrix functions (no mixing types) */
219 void mul_v3_m3v3_db(double r[3], const double M[3][3], const double a[3]);
220 void mul_m3_v3_db(const double M[3][3], double r[3]);
221
222 /****************************** Linear Algebra *******************************/
223
224 void transpose_m3(float R[3][3]);
225 void transpose_m3_m3(float R[3][3], const float A[3][3]);
226 void transpose_m3_m4(float R[3][3], const float A[4][4]);
227 void transpose_m4(float R[4][4]);
228 void transpose_m4_m4(float R[4][4], const float A[4][4]);
229
230 int compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit);
231
232 void normalize_m3_ex(float R[3][3], float r_scale[3]) ATTR_NONNULL();
233 void normalize_m3(float R[3][3]) ATTR_NONNULL();
234 void normalize_m3_m3_ex(float R[3][3], const float A[3][3], float r_scale[3]) ATTR_NONNULL();
235 void normalize_m3_m3(float R[3][3], const float A[3][3]) ATTR_NONNULL();
236 void normalize_m4_ex(float R[4][4], float r_scale[3]) ATTR_NONNULL();
237 void normalize_m4(float R[4][4]) ATTR_NONNULL();
238 void normalize_m4_m4_ex(float R[4][4], const float A[4][4], float r_scale[3]) ATTR_NONNULL();
239 void normalize_m4_m4(float R[4][4], const float A[4][4]) ATTR_NONNULL();
240
241 void orthogonalize_m3(float R[3][3], int axis);
242 void orthogonalize_m4(float R[4][4], int axis);
243
244 bool is_orthogonal_m3(const float mat[3][3]);
245 bool is_orthogonal_m4(const float mat[4][4]);
246 bool is_orthonormal_m3(const float mat[3][3]);
247 bool is_orthonormal_m4(const float mat[4][4]);
248
249 bool is_uniform_scaled_m3(const float mat[3][3]);
250 bool is_uniform_scaled_m4(const float m[4][4]);
251
252 /* Note: 'adjoint' here means the adjugate (adjunct, "classical adjoint") matrix!
253  * Nowadays 'adjoint' usually refers to the conjugate transpose,
254  * which for real-valued matrices is simply the transpose.
255  */
256 void adjoint_m2_m2(float R[2][2], const float A[2][2]);
257 void adjoint_m3_m3(float R[3][3], const float A[3][3]);
258 void adjoint_m4_m4(float R[4][4], const float A[4][4]);
259
260 float determinant_m2(float a, float b, float c, float d);
261 float determinant_m3(
262     float a, float b, float c, float d, float e, float f, float g, float h, float i);
263 float determinant_m3_array(const float m[3][3]);
264 float determinant_m4_mat3_array(const float m[4][4]);
265 float determinant_m4(const float A[4][4]);
266
267 #define PSEUDOINVERSE_EPSILON 1e-8f
268
269 void svd_m4(float U[4][4], float s[4], float V[4][4], float A[4][4]);
270 void pseudoinverse_m4_m4(float Ainv[4][4], const float A[4][4], float epsilon);
271 void pseudoinverse_m3_m3(float Ainv[3][3], const float A[3][3], float epsilon);
272
273 bool has_zero_axis_m4(const float matrix[4][4]);
274
275 void invert_m4_m4_safe(float Ainv[4][4], const float A[4][4]);
276
277 /****************************** Transformations ******************************/
278
279 void scale_m3_fl(float R[3][3], float scale);
280 void scale_m4_fl(float R[4][4], float scale);
281
282 float mat3_to_volume_scale(const float M[3][3]);
283 float mat4_to_volume_scale(const float M[4][4]);
284
285 float mat3_to_scale(const float M[3][3]);
286 float mat4_to_scale(const float M[4][4]);
287 float mat4_to_xy_scale(const float M[4][4]);
288
289 void size_to_mat3(float R[3][3], const float size[3]);
290 void size_to_mat4(float R[4][4], const float size[3]);
291
292 void mat3_to_size(float r[3], const float M[3][3]);
293 void mat4_to_size(float r[3], const float M[4][4]);
294
295 void translate_m4(float mat[4][4], float tx, float ty, float tz);
296 void rotate_m4(float mat[4][4], const char axis, const float angle);
297 void transform_pivot_set_m4(float mat[4][4], const float pivot[3]);
298
299 void mat3_to_rot_size(float rot[3][3], float size[3], const float mat3[3][3]);
300 void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], const float wmat[4][4]);
301 void mat4_to_loc_quat(float loc[3], float quat[4], const float wmat[4][4]);
302 void mat4_decompose(float loc[3], float quat[4], float size[3], const float wmat[4][4]);
303
304 void mat3_polar_decompose(const float mat3[3][3], float r_U[3][3], float r_P[3][3]);
305
306 void loc_eul_size_to_mat4(float R[4][4],
307                           const float loc[3],
308                           const float eul[3],
309                           const float size[3]);
310 void loc_eulO_size_to_mat4(
311     float R[4][4], const float loc[3], const float eul[3], const float size[3], const short order);
312 void loc_quat_size_to_mat4(float R[4][4],
313                            const float loc[3],
314                            const float quat[4],
315                            const float size[3]);
316 void loc_axisangle_size_to_mat4(float R[4][4],
317                                 const float loc[3],
318                                 const float axis[4],
319                                 const float angle,
320                                 const float size[3]);
321
322 void blend_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3], const float t);
323 void blend_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4], const float t);
324
325 void interp_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3], const float t);
326 void interp_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4], const float t);
327
328 bool is_negative_m3(const float mat[3][3]);
329 bool is_negative_m4(const float mat[4][4]);
330
331 bool is_zero_m3(const float mat[3][3]);
332 bool is_zero_m4(const float mat[4][4]);
333
334 bool equals_m3m3(const float mat1[3][3], const float mat2[3][3]);
335 bool equals_m4m4(const float mat1[4][4], const float mat2[4][4]);
336
337 /* SpaceTransform helper */
338 typedef struct SpaceTransform {
339   float local2target[4][4];
340   float target2local[4][4];
341
342 } SpaceTransform;
343
344 void BLI_space_transform_from_matrices(struct SpaceTransform *data,
345                                        const float local[4][4],
346                                        const float target[4][4]);
347 void BLI_space_transform_global_from_matrices(struct SpaceTransform *data,
348                                               const float local[4][4],
349                                               const float target[4][4]);
350 void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3]);
351 void BLI_space_transform_invert(const struct SpaceTransform *data, float co[3]);
352 void BLI_space_transform_apply_normal(const struct SpaceTransform *data, float no[3]);
353 void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3]);
354
355 #define BLI_SPACE_TRANSFORM_SETUP(data, local, target) \
356   BLI_space_transform_from_matrices((data), (local)->obmat, (target)->obmat)
357
358 /*********************************** Other ***********************************/
359
360 void print_m3(const char *str, const float M[3][3]);
361 void print_m4(const char *str, const float M[4][4]);
362
363 #define print_m3_id(M) print_m3(STRINGIFY(M), M)
364 #define print_m4_id(M) print_m4(STRINGIFY(M), M)
365
366 #ifdef __cplusplus
367 }
368 #endif
369
370 #endif /* __BLI_MATH_MATRIX_H__ */