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