Blender V4.3
BLI_math_matrix.h
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
5#pragma once
6
11#include "BLI_compiler_attrs.h"
12#include "BLI_sys_types.h"
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/* -------------------------------------------------------------------- */
22void zero_m2(float m[2][2]);
23void zero_m3(float m[3][3]);
24void zero_m4(float m[4][4]);
25
26void unit_m2(float m[2][2]);
27void unit_m3(float m[3][3]);
28void unit_m4(float m[4][4]);
29void unit_m4_db(double m[4][4]);
30
31void copy_m2_m2(float m1[2][2], const float m2[2][2]);
32void copy_m3_m3(float m1[3][3], const float m2[3][3]);
33void copy_m4_m4(float m1[4][4], const float m2[4][4]);
34void copy_m3_m4(float m1[3][3], const float m2[4][4]);
35void copy_m4_m3(float m1[4][4], const float m2[3][3]);
36void copy_m3_m2(float m1[3][3], const float m2[2][2]);
37void copy_m4_m2(float m1[4][4], const float m2[2][2]);
38
39void copy_m4_m4_db(double m1[4][4], const double m2[4][4]);
40
41/* double->float */
42
43void copy_m3_m3d(float m1[3][3], const double m2[3][3]);
44
45/* float->double */
46
47void copy_m3d_m3(double m1[3][3], const float m2[3][3]);
48void copy_m4d_m4(double m1[4][4], const float m2[4][4]);
49
50void swap_m3m3(float m1[3][3], float m2[3][3]);
51void swap_m4m4(float m1[4][4], float m2[4][4]);
52
54void shuffle_m4(float R[4][4], const int index[4]);
55
58/* -------------------------------------------------------------------- */
62void add_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
63void add_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
64
65void madd_m3_m3m3fl(float R[3][3], const float A[3][3], const float B[3][3], float f);
66void madd_m4_m4m4fl(float R[4][4], const float A[4][4], const float B[4][4], float f);
67
68void sub_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
69void sub_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
70
71void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
72void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4]);
73void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3]);
74void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
78void mul_m3_m3m4(float R[3][3], const float A[3][3], const float B[4][4]);
82void mul_m3_m4m3(float R[3][3], const float A[4][4], const float B[3][3]);
83void mul_m3_m4m4(float R[3][3], const float A[4][4], const float B[4][4]);
84
90void mul_m3_m3_pre(float R[3][3], const float A[3][3]);
91void mul_m3_m3_post(float R[3][3], const float B[3][3]);
92void mul_m4db_m4db_m4fl(double R[4][4], const double A[4][4], const float B[4][4]);
93void mul_m4_m4_pre(float R[4][4], const float A[4][4]);
94void mul_m4_m4_post(float R[4][4], const float B[4][4]);
95
96/* Implement #mul_m3_series macro. */
97
98void _va_mul_m3_series_3(float r[3][3], const float m1[3][3], const float m2[3][3]) ATTR_NONNULL();
99void _va_mul_m3_series_4(float r[3][3],
100 const float m1[3][3],
101 const float m2[3][3],
102 const float m3[3][3]) ATTR_NONNULL();
103void _va_mul_m3_series_5(float r[3][3],
104 const float m1[3][3],
105 const float m2[3][3],
106 const float m3[3][3],
107 const float m4[3][3]) ATTR_NONNULL();
108void _va_mul_m3_series_6(float r[3][3],
109 const float m1[3][3],
110 const float m2[3][3],
111 const float m3[3][3],
112 const float m4[3][3],
113 const float m5[3][3]) ATTR_NONNULL();
114void _va_mul_m3_series_7(float r[3][3],
115 const float m1[3][3],
116 const float m2[3][3],
117 const float m3[3][3],
118 const float m4[3][3],
119 const float m5[3][3],
120 const float m6[3][3]) ATTR_NONNULL();
121void _va_mul_m3_series_8(float r[3][3],
122 const float m1[3][3],
123 const float m2[3][3],
124 const float m3[3][3],
125 const float m4[3][3],
126 const float m5[3][3],
127 const float m6[3][3],
128 const float m7[3][3]) ATTR_NONNULL();
129void _va_mul_m3_series_9(float r[3][3],
130 const float m1[3][3],
131 const float m2[3][3],
132 const float m3[3][3],
133 const float m4[3][3],
134 const float m5[3][3],
135 const float m6[3][3],
136 const float m7[3][3],
137 const float m8[3][3]) ATTR_NONNULL();
138
139/* Implement #mul_m4_series macro. */
140
141void _va_mul_m4_series_3(float r[4][4], const float m1[4][4], const float m2[4][4]) ATTR_NONNULL();
142void _va_mul_m4_series_4(float r[4][4],
143 const float m1[4][4],
144 const float m2[4][4],
145 const float m3[4][4]) ATTR_NONNULL();
146void _va_mul_m4_series_5(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]) ATTR_NONNULL();
151void _va_mul_m4_series_6(float r[4][4],
152 const float m1[4][4],
153 const float m2[4][4],
154 const float m3[4][4],
155 const float m4[4][4],
156 const float m5[4][4]) ATTR_NONNULL();
157void _va_mul_m4_series_7(float r[4][4],
158 const float m1[4][4],
159 const float m2[4][4],
160 const float m3[4][4],
161 const float m4[4][4],
162 const float m5[4][4],
163 const float m6[4][4]) ATTR_NONNULL();
164void _va_mul_m4_series_8(float r[4][4],
165 const float m1[4][4],
166 const float m2[4][4],
167 const float m3[4][4],
168 const float m4[4][4],
169 const float m5[4][4],
170 const float m6[4][4],
171 const float m7[4][4]) ATTR_NONNULL();
172void _va_mul_m4_series_9(float r[4][4],
173 const float m1[4][4],
174 const float m2[4][4],
175 const float m3[4][4],
176 const float m4[4][4],
177 const float m5[4][4],
178 const float m6[4][4],
179 const float m7[4][4],
180 const float m8[4][4]) ATTR_NONNULL();
181
182#define mul_m3_series(...) VA_NARGS_CALL_OVERLOAD(_va_mul_m3_series_, __VA_ARGS__)
183#define mul_m4_series(...) VA_NARGS_CALL_OVERLOAD(_va_mul_m4_series_, __VA_ARGS__)
184
185void mul_m4_v3(const float M[4][4], float r[3]);
186void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3]);
187void mul_v3_m4v3_db(double r[3], const double mat[4][4], const double vec[3]);
188void mul_v4_m4v3_db(double r[4], const double mat[4][4], const double vec[3]);
189void mul_v2_m4v3(float r[2], const float mat[4][4], const float vec[3]);
190void mul_v2_m2v2(float r[2], const float mat[2][2], const float vec[2]);
191void mul_m2_v2(const float mat[2][2], float vec[2]);
193void mul_mat3_m4_v3(const float mat[4][4], float r[3]);
194void mul_v3_mat3_m4v3(float r[3], const float mat[4][4], const float vec[3]);
195void mul_v3_mat3_m4v3_db(double r[3], const double mat[4][4], const double vec[3]);
196void mul_m4_v4(const float mat[4][4], float r[4]);
197void mul_v4_m4v4(float r[4], const float mat[4][4], const float v[4]);
198void mul_v4_m4v3(float r[4], const float M[4][4], const float v[3]); /* v has implicit w = 1.0f */
199void mul_project_m4_v3(const float mat[4][4], float vec[3]);
200void mul_v3_project_m4_v3(float r[3], const float mat[4][4], const float vec[3]);
201void mul_v2_project_m4_v3(float r[2], const float mat[4][4], const float vec[3]);
202
203void mul_m3_v2(const float m[3][3], float r[2]);
204void mul_v2_m3v2(float r[2], const float m[3][3], const float v[2]);
205void mul_m3_v3(const float M[3][3], float r[3]);
206void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3]);
207void mul_v2_m3v3(float r[2], const float M[3][3], const float a[3]);
208void mul_transposed_m3_v3(const float M[3][3], float r[3]);
209void mul_transposed_mat3_m4_v3(const float M[4][4], float r[3]);
210void mul_m3_v3_double(const float M[3][3], double r[3]);
211
220void mul_m4_m4m4_aligned_scale(float R[4][4], const float A[4][4], const float B[4][4]);
224void mul_m4_m4m4_split_channels(float R[4][4], const float A[4][4], const float B[4][4]);
225
226void mul_m3_fl(float R[3][3], float f);
227void mul_m4_fl(float R[4][4], float f);
228void mul_mat3_m4_fl(float R[4][4], float f);
229
230void negate_m3(float R[3][3]);
231void negate_mat3_m4(float R[4][4]);
232void negate_m4(float R[4][4]);
233
234bool invert_m3_ex(float mat[3][3], float epsilon);
235bool invert_m3_m3_ex(float inverse[3][3], const float mat[3][3], float epsilon);
236
237bool invert_m3(float mat[3][3]);
238bool invert_m2_m2(float inverse[2][2], const float mat[2][2]);
239bool invert_m3_m3(float inverse[3][3], const float mat[3][3]);
240bool invert_m4(float mat[4][4]);
241bool invert_m4_m4(float inverse[4][4], const float mat[4][4]);
252bool invert_m4_m4_fallback(float inverse[4][4], const float mat[4][4]);
253
254/* Double arithmetic (mixed float/double). */
255
256void mul_m4_v4d(const float mat[4][4], double r[4]);
257void mul_v4d_m4v4d(double r[4], const float mat[4][4], const double v[4]);
258
259/* Double matrix functions (no mixing types). */
260
261void mul_v3_m3v3_db(double r[3], const double M[3][3], const double a[3]);
262void mul_m3_v3_db(const double M[3][3], double r[3]);
263
266/* -------------------------------------------------------------------- */
270void transpose_m3(float R[3][3]);
271void transpose_m3_m3(float R[3][3], const float M[3][3]);
275void transpose_m3_m4(float R[3][3], const float M[4][4]);
276void transpose_m4(float R[4][4]);
277void transpose_m4_m4(float R[4][4], const float M[4][4]);
278
279bool compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit);
280
281void normalize_m2_ex(float R[2][2], float r_scale[2]) ATTR_NONNULL();
282void normalize_m2(float R[2][2]) ATTR_NONNULL();
283void normalize_m2_m2_ex(float R[2][2], const float M[2][2], float r_scale[2]) ATTR_NONNULL();
284void normalize_m2_m2(float R[2][2], const float M[2][2]) ATTR_NONNULL();
285void normalize_m3_ex(float R[3][3], float r_scale[3]) ATTR_NONNULL();
286void normalize_m3(float R[3][3]) ATTR_NONNULL();
287void normalize_m3_m3_ex(float R[3][3], const float M[3][3], float r_scale[3]) ATTR_NONNULL();
288void normalize_m3_m3(float R[3][3], const float M[3][3]) ATTR_NONNULL();
289void normalize_m4_ex(float R[4][4], float r_scale[3]) ATTR_NONNULL();
290void normalize_m4(float R[4][4]) ATTR_NONNULL();
291void normalize_m4_m4_ex(float rmat[4][4], const float mat[4][4], float r_scale[3]) ATTR_NONNULL();
292void normalize_m4_m4(float rmat[4][4], const float mat[4][4]) ATTR_NONNULL();
293
299void orthogonalize_m3(float R[3][3], int axis);
305void orthogonalize_m4(float R[4][4], int axis);
306
315void orthogonalize_m3_stable(float R[3][3], int axis, bool normalize);
324void orthogonalize_m4_stable(float R[4][4], int axis, bool normalize);
325
326bool orthogonalize_m3_zero_axes(float m[3][3], float unit_length);
327bool orthogonalize_m4_zero_axes(float m[4][4], float unit_length);
328
329bool is_orthogonal_m3(const float m[3][3]);
330bool is_orthogonal_m4(const float m[4][4]);
331bool is_orthonormal_m3(const float m[3][3]);
332bool is_orthonormal_m4(const float m[4][4]);
333
334bool is_uniform_scaled_m3(const float m[3][3]);
335bool is_uniform_scaled_m4(const float m[4][4]);
336
337/* NOTE: 'adjoint' here means the adjugate (adjunct, "classical adjoint") matrix!
338 * Nowadays 'adjoint' usually refers to the conjugate transpose,
339 * which for real-valued matrices is simply the transpose. */
340
341void adjoint_m2_m2(float R[2][2], const float M[2][2]);
342void adjoint_m3_m3(float R[3][3], const float M[3][3]);
343void adjoint_m4_m4(float R[4][4], const float M[4][4]);
344
345float determinant_m2(float a, float b, float c, float d);
346float determinant_m3(
347 float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3);
348float determinant_m3_array(const float m[3][3]);
349float determinant_m4_mat3_array(const float m[4][4]);
350double determinant_m3_array_db(const double m[3][3]);
351float determinant_m4(const float m[4][4]);
352
353#define PSEUDOINVERSE_EPSILON 1e-8f
354
362void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4]);
363void pseudoinverse_m4_m4(float inverse[4][4], const float mat[4][4], float epsilon);
364void pseudoinverse_m3_m3(float inverse[3][3], const float mat[3][3], float epsilon);
365
366bool has_zero_axis_m4(const float matrix[4][4]);
368void zero_axis_bias_m4(float mat[4][4]);
369
370void invert_m4_m4_safe(float inverse[4][4], const float mat[4][4]);
371
372void invert_m3_m3_safe_ortho(float inverse[3][3], const float mat[3][3]);
379void invert_m4_m4_safe_ortho(float inverse[4][4], const float mat[4][4]);
380
383/* -------------------------------------------------------------------- */
387void scale_m3_fl(float R[3][3], float scale);
388void scale_m4_fl(float R[4][4], float scale);
389void scale_m4_v2(float R[4][4], const float scale[2]);
390
396float mat3_to_volume_scale(const float mat[3][3]);
397float mat4_to_volume_scale(const float mat[4][4]);
398
404float mat3_to_scale(const float mat[3][3]);
405float mat4_to_scale(const float mat[4][4]);
407float mat4_to_xy_scale(const float mat[4][4]);
408
409void size_to_mat3(float R[3][3], const float size[3]);
410void size_to_mat4(float R[4][4], const float size[3]);
411
413void mat3_to_size_2d(float size[2], const float M[3][3]);
414void mat3_to_size(float size[3], const float M[3][3]);
415void mat4_to_size(float size[3], const float M[4][4]);
416
425float mat3_to_size_max_axis(const float M[3][3]);
429float mat4_to_size_max_axis(const float M[4][4]);
430
435void mat4_to_size_fix_shear(float size[3], const float M[4][4]);
436
437void translate_m4(float mat[4][4], float Tx, float Ty, float Tz);
445void rotate_m4(float mat[4][4], char axis, float angle);
447void rescale_m4(float mat[4][4], const float scale[3]);
456void transform_pivot_set_m4(float mat[4][4], const float pivot[3]);
457
461void mat4_to_rot(float rot[3][3], const float wmat[4][4]);
462
467void mat3_to_rot_size(float rot[3][3], float size[3], const float mat3[3][3]);
472void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], const float wmat[4][4]);
473void mat4_to_loc_quat(float loc[3], float quat[4], const float wmat[4][4]);
474void mat4_decompose(float loc[3], float quat[4], float size[3], const float wmat[4][4]);
475
476void mat3_polar_decompose(const float mat3[3][3], float r_U[3][3], float r_P[3][3]);
477
482void loc_rot_size_to_mat4(float R[4][4],
483 const float loc[3],
484 const float rot[3][3],
485 const float size[3]);
492void loc_eul_size_to_mat4(float R[4][4],
493 const float loc[3],
494 const float eul[3],
495 const float size[3]);
501 float R[4][4], const float loc[3], const float eul[3], const float size[3], short order);
506void loc_quat_size_to_mat4(float R[4][4],
507 const float loc[3],
508 const float quat[4],
509 const float size[3]);
511 float R[4][4], const float loc[3], const float axis[3], float angle, const float size[3]);
512
513void blend_m3_m3m3(float out[3][3], const float dst[3][3], const float src[3][3], float srcweight);
514void blend_m4_m4m4(float out[4][4], const float dst[4][4], const float src[4][4], float srcweight);
515
532void interp_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3], float t);
542void interp_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4], float t);
543
554bool is_negative_m3(const float mat[3][3]);
556bool is_negative_m4(const float mat[4][4]);
557
558bool is_zero_m3(const float mat[3][3]);
559bool is_zero_m4(const float mat[4][4]);
560
561bool equals_m3m3(const float mat1[3][3], const float mat2[3][3]);
562bool equals_m4m4(const float mat1[4][4], const float mat2[4][4]);
563
582typedef struct SpaceTransform {
583 float local2target[4][4];
584 float target2local[4][4];
585
587
601 const float local[4][4],
602 const float target[4][4]);
616 const float local[4][4],
617 const float target[4][4]);
618void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3]);
619void BLI_space_transform_invert(const struct SpaceTransform *data, float co[3]);
620void BLI_space_transform_apply_normal(const struct SpaceTransform *data, float no[3]);
621void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3]);
622
623#define BLI_SPACE_TRANSFORM_SETUP(data, local, target) \
624 BLI_space_transform_from_matrices( \
625 (data), (local)->object_to_world().ptr(), (target)->object_to_world().ptr())
626
629/* -------------------------------------------------------------------- */
633void print_m3(const char *str, const float m[3][3]);
634void print_m4(const char *str, const float m[4][4]);
635
636#define print_m3_id(M) print_m3(STRINGIFY(M), M)
637#define print_m4_id(M) print_m4(STRINGIFY(M), M)
638
641#ifdef __cplusplus
642}
643#endif
#define ATTR_NONNULL(...)
void mul_v4_m4v3(float r[4], const float M[4][4], const float v[3])
bool invert_m2_m2(float inverse[2][2], const float mat[2][2])
void scale_m4_v2(float R[4][4], const float scale[2])
void mul_v2_m4v3(float r[2], const float mat[4][4], const float vec[3])
void orthogonalize_m3_stable(float R[3][3], int axis, bool normalize)
float mat3_to_scale(const float mat[3][3])
float mat4_to_volume_scale(const float mat[4][4])
bool is_negative_m3(const float mat[3][3])
void mul_v2_project_m4_v3(float r[2], const float mat[4][4], const float vec[3])
void BLI_space_transform_from_matrices(struct SpaceTransform *data, const float local[4][4], const float target[4][4])
bool is_orthogonal_m3(const float m[3][3])
void sub_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void unit_m2(float m[2][2])
void mul_v4_m4v3_db(double r[4], const double mat[4][4], const double vec[3])
void negate_m3(float R[3][3])
void interp_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4], float t)
float mat4_to_scale(const float mat[4][4])
bool is_zero_m3(const float mat[3][3])
void orthogonalize_m4(float R[4][4], int axis)
void swap_m3m3(float m1[3][3], float m2[3][3])
void mul_v3_project_m4_v3(float r[3], const float mat[4][4], const float vec[3])
void mul_m3_v3(const float M[3][3], float r[3])
void madd_m4_m4m4fl(float R[4][4], const float A[4][4], const float B[4][4], float f)
void zero_m4(float m[4][4])
void BLI_space_transform_apply_normal(const struct SpaceTransform *data, float no[3])
void normalize_m4_m4_ex(float rmat[4][4], const float mat[4][4], float r_scale[3]) ATTR_NONNULL()
void mul_m4_fl(float R[4][4], float f)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_mat3_m4_fl(float R[4][4], float f)
void mul_v4_m4v4(float r[4], const float mat[4][4], const float v[4])
void mul_m3_m3_pre(float R[3][3], const float A[3][3])
void pseudoinverse_m3_m3(float inverse[3][3], const float mat[3][3], float epsilon)
void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3])
void size_to_mat3(float R[3][3], const float size[3])
void _va_mul_m4_series_7(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4], const float m6[4][4]) ATTR_NONNULL()
bool invert_m3_m3_ex(float inverse[3][3], const float mat[3][3], float epsilon)
void sub_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void normalize_m3_m3(float R[3][3], const float M[3][3]) ATTR_NONNULL()
void mul_v3_m3v3_db(double r[3], const double M[3][3], const double a[3])
void normalize_m2_m2(float R[2][2], const float M[2][2]) ATTR_NONNULL()
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void mat4_decompose(float loc[3], float quat[4], float size[3], const float wmat[4][4])
bool is_orthogonal_m4(const float m[4][4])
void adjoint_m3_m3(float R[3][3], const float M[3][3])
void _va_mul_m3_series_6(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3]) ATTR_NONNULL()
void unit_m3(float m[3][3])
void mul_m3_v2(const float m[3][3], float r[2])
void mat3_to_rot_size(float rot[3][3], float size[3], const float mat3[3][3])
void _va_mul_m3_series_3(float r[3][3], const float m1[3][3], const float m2[3][3]) ATTR_NONNULL()
void blend_m4_m4m4(float out[4][4], const float dst[4][4], const float src[4][4], float srcweight)
void add_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void scale_m3_fl(float R[3][3], float scale)
void copy_m3_m4(float m1[3][3], const float m2[4][4])
float determinant_m4_mat3_array(const float m[4][4])
void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3])
void normalize_m4_m4(float rmat[4][4], const float mat[4][4]) ATTR_NONNULL()
void mul_v3_m4v3_db(double r[3], const double mat[4][4], const double vec[3])
void transpose_m4_m4(float R[4][4], const float M[4][4])
void mul_m4_m4_pre(float R[4][4], const float A[4][4])
void mul_m3_fl(float R[3][3], float f)
void mul_v2_m3v3(float r[2], const float M[3][3], const float a[3])
void normalize_m2_m2_ex(float R[2][2], const float M[2][2], float r_scale[2]) ATTR_NONNULL()
void zero_m2(float m[2][2])
void mul_m4db_m4db_m4fl(double R[4][4], const double A[4][4], const float B[4][4])
void orthogonalize_m3(float R[3][3], int axis)
void copy_m3_m3d(float m1[3][3], const double m2[3][3])
bool invert_m3_m3(float inverse[3][3], const float mat[3][3])
void mul_m3_m3_post(float R[3][3], const float B[3][3])
void unit_m4(float m[4][4])
Definition rct.c:1127
void add_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
bool is_uniform_scaled_m3(const float m[3][3])
void mul_m4_v4d(const float mat[4][4], double r[4])
void loc_rot_size_to_mat4(float R[4][4], const float loc[3], const float rot[3][3], const float size[3])
void mat4_to_rot(float rot[3][3], const float wmat[4][4])
void mat4_to_size_fix_shear(float size[3], const float M[4][4])
bool is_uniform_scaled_m4(const float m[4][4])
void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], const float wmat[4][4])
float mat4_to_xy_scale(const float mat[4][4])
void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4])
bool is_orthonormal_m3(const float m[3][3])
void zero_m3(float m[3][3])
void translate_m4(float mat[4][4], float Tx, float Ty, float Tz)
bool has_zero_axis_m4(const float matrix[4][4])
void normalize_m3(float R[3][3]) ATTR_NONNULL()
void transform_pivot_set_m4(float mat[4][4], const float pivot[3])
void mul_m3_v3_double(const float M[3][3], double r[3])
float determinant_m2(float a, float b, float c, float d)
void _va_mul_m4_series_6(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4]) ATTR_NONNULL()
bool equals_m3m3(const float mat1[3][3], const float mat2[3][3])
void _va_mul_m4_series_5(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4]) ATTR_NONNULL()
void rescale_m4(float mat[4][4], const float scale[3])
void loc_eulO_size_to_mat4(float R[4][4], const float loc[3], const float eul[3], const float size[3], short order)
void size_to_mat4(float R[4][4], const float size[3])
void mul_project_m4_v3(const float mat[4][4], float vec[3])
struct SpaceTransform SpaceTransform
void unit_m4_db(double m[4][4])
void _va_mul_m3_series_4(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3]) ATTR_NONNULL()
void copy_m4d_m4(double m1[4][4], const float m2[4][4])
void mul_v4d_m4v4d(double r[4], const float mat[4][4], const double v[4])
void BLI_space_transform_global_from_matrices(struct SpaceTransform *data, const float local[4][4], const float target[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void invert_m4_m4_safe(float inverse[4][4], const float mat[4][4])
void orthogonalize_m4_stable(float R[4][4], int axis, bool normalize)
void scale_m4_fl(float R[4][4], float scale)
void adjoint_m4_m4(float R[4][4], const float M[4][4])
bool equals_m4m4(const float mat1[4][4], const float mat2[4][4])
void invert_m3_m3_safe_ortho(float inverse[3][3], const float mat[3][3])
void mul_m4_m4m4_split_channels(float R[4][4], const float A[4][4], const float B[4][4])
void normalize_m3_m3_ex(float R[3][3], const float M[3][3], float r_scale[3]) ATTR_NONNULL()
float determinant_m4(const float m[4][4])
void swap_m4m4(float m1[4][4], float m2[4][4])
void loc_axisangle_size_to_mat4(float R[4][4], const float loc[3], const float axis[3], float angle, const float size[3])
void transpose_m3_m4(float R[3][3], const float M[4][4])
void mat3_to_size_2d(float size[2], const float M[3][3])
void _va_mul_m3_series_8(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3], const float m6[3][3], const float m7[3][3]) ATTR_NONNULL()
double determinant_m3_array_db(const double m[3][3])
void copy_m2_m2(float m1[2][2], const float m2[2][2])
void mat3_polar_decompose(const float mat3[3][3], float r_U[3][3], float r_P[3][3])
void mul_v2_m2v2(float r[2], const float mat[2][2], const float vec[2])
void _va_mul_m4_series_4(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4]) ATTR_NONNULL()
void _va_mul_m4_series_9(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4], const float m6[4][4], const float m7[4][4], const float m8[4][4]) ATTR_NONNULL()
void normalize_m4_ex(float R[4][4], float r_scale[3]) ATTR_NONNULL()
void _va_mul_m3_series_9(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3], const float m6[3][3], const float m7[3][3], const float m8[3][3]) ATTR_NONNULL()
void _va_mul_m3_series_7(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3], const float m6[3][3]) ATTR_NONNULL()
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mat4_to_loc_quat(float loc[3], float quat[4], const float wmat[4][4])
void interp_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3], float t)
void mul_transposed_mat3_m4_v3(const float M[4][4], float r[3])
void mul_m3_m3m4(float R[3][3], const float A[3][3], const float B[4][4])
void _va_mul_m4_series_3(float r[4][4], const float m1[4][4], const float m2[4][4]) ATTR_NONNULL()
float mat3_to_size_max_axis(const float M[3][3])
bool is_orthonormal_m4(const float m[4][4])
void mul_m3_v3_db(const double M[3][3], double r[3])
void madd_m3_m3m3fl(float R[3][3], const float A[3][3], const float B[3][3], float f)
bool invert_m3_ex(float mat[3][3], float epsilon)
float mat4_to_size_max_axis(const float M[4][4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
float determinant_m3_array(const float m[3][3])
void copy_m4_m2(float m1[4][4], const float m2[2][2])
void _va_mul_m4_series_8(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4], const float m6[4][4], const float m7[4][4]) ATTR_NONNULL()
void shuffle_m4(float R[4][4], const int index[4])
bool is_negative_m4(const float mat[4][4])
void negate_mat3_m4(float R[4][4])
void copy_m3_m2(float m1[3][3], const float m2[2][2])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void mul_v2_m3v2(float r[2], const float m[3][3], const float v[2])
void mul_m4_m4m4_aligned_scale(float R[4][4], const float A[4][4], const float B[4][4])
void print_m3(const char *str, const float m[3][3])
void zero_axis_bias_m4(float mat[4][4])
void mul_m4_v4(const float mat[4][4], float r[4])
void rotate_m4(float mat[4][4], char axis, float angle)
void loc_quat_size_to_mat4(float R[4][4], const float loc[3], const float quat[4], const float size[3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void loc_eul_size_to_mat4(float R[4][4], const float loc[3], const float eul[3], const float size[3])
bool invert_m4(float mat[4][4])
void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3])
void mat4_to_size(float size[3], const float M[4][4])
void transpose_m3(float R[3][3])
void BLI_space_transform_invert(const struct SpaceTransform *data, float co[3])
void normalize_m3_ex(float R[3][3], float r_scale[3]) ATTR_NONNULL()
float determinant_m3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3)
void mul_m2_v2(const float mat[2][2], float vec[2])
void invert_m4_m4_safe_ortho(float inverse[4][4], const float mat[4][4])
void transpose_m3_m3(float R[3][3], const float M[3][3])
void blend_m3_m3m3(float out[3][3], const float dst[3][3], const float src[3][3], float srcweight)
bool orthogonalize_m3_zero_axes(float m[3][3], float unit_length)
void negate_m4(float R[4][4])
void mul_transposed_m3_v3(const float M[3][3], float r[3])
bool compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit)
void copy_m3d_m3(double m1[3][3], const float m2[3][3])
void normalize_m2(float R[2][2]) ATTR_NONNULL()
void pseudoinverse_m4_m4(float inverse[4][4], const float mat[4][4], float epsilon)
void mul_v3_mat3_m4v3_db(double r[3], const double mat[4][4], const double vec[3])
void _va_mul_m3_series_5(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3]) ATTR_NONNULL()
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void print_m4(const char *str, const float m[4][4])
bool orthogonalize_m4_zero_axes(float m[4][4], float unit_length)
bool is_zero_m4(const float mat[4][4])
void mat3_to_size(float size[3], const float M[3][3])
void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4])
void transpose_m4(float R[4][4])
void mul_m4_m4_post(float R[4][4], const float B[4][4])
void mul_v3_mat3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m3(float mat[3][3])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
void normalize_m2_ex(float R[2][2], float r_scale[2]) ATTR_NONNULL()
void mul_m3_m4m4(float R[3][3], const float A[4][4], const float B[4][4])
void copy_m4_m4_db(double m1[4][4], const double m2[4][4])
bool invert_m4_m4_fallback(float inverse[4][4], const float mat[4][4])
void mul_m3_m4m3(float R[3][3], const float A[4][4], const float B[3][3])
float mat3_to_volume_scale(const float mat[3][3])
void normalize_m4(float R[4][4]) ATTR_NONNULL()
void adjoint_m2_m2(float R[2][2], const float M[2][2])
ATTR_WARN_UNUSED_RESULT const BMVert * v
unsigned int U
Definition btGjkEpa3.h:78
btMatrix3x3 inverse() const
Return the inverse of the matrix.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
Definition btVector3.h:303
local_group_size(16, 16) .push_constant(Type b
#define rot(x, k)
#define str(s)
#define M
#define B
#define R
float local2target[4][4]
float target2local[4][4]
CCL_NAMESPACE_BEGIN struct Window V