/* Not ported yet. Rename? */
void orthogonalize_m3(float R[3][3], int axis);
void orthogonalize_m4(float R[4][4], int axis);
void orthogonalize_m3_stable(float R[3][3], int axis, bool normalize);
void orthogonalize_m4_stable(float R[4][4], int axis, bool normalize);
bool orthogonalize_m3_zero_axes(float m[3][3], float unit_length);
bool orthogonalize_m4_zero_axes(float m[4][4], float unit_length);
/* Do not return success. Can be replaced with is_zero(mat) but this is rather expensive. */
bool invert_m3(float mat[3][3]);
bool invert_m2_m2(float inverse[2][2], const float mat[2][2]);
bool invert_m3_m3(float inverse[3][3], const float mat[3][3]);
bool invert_m4(float mat[4][4]);
bool invert_m4_m4(float inverse[4][4], const float mat[4][4]);
/* Not ported. */
bool invert_m4_m4_fallback(float inverse[4][4], const float mat[4][4]);
/* Not ported. */
void invert_m4_m4_safe(float inverse[4][4], const float mat[4][4]);
void invert_m3_m3_safe_ortho(float inverse[3][3], const float mat[3][3]);
void invert_m4_m4_safe_ortho(float inverse[4][4], const float mat[4][4]);
/* Not ported. Might want to use eigen here. */
void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4]);
void pseudoinverse_m4_m4(float inverse[4][4], const float mat[4][4], float epsilon);
void pseudoinverse_m3_m3(float inverse[3][3], const float mat[3][3], float epsilon);
/* ------ Not Worth Porting to new API ------- */
/* Not ported. Used only once. Easier with vector assignement. */
void shuffle_m4(float R[4][4], const int index[4]);
/* Only used in one file (constraint.c). Move to this file. */
void mul_m4_m4m4_aligned_scale(float R[4][4], const float A[4][4], const float B[4][4]);
void mul_m4_m4m4_split_channels(float R[4][4], const float A[4][4], const float B[4][4]);
/* Only used in one file (armature.c). Move to this file. */
void mat4_to_size_fix_shear(float size[3], const float M[4][4]);
/* Only used by mball. */
bool has_zero_axis_m4(const float matrix[4][4]);
/* Not ported yet. Only used by gpencil. */
void zero_axis_bias_m4(float mat[4][4]);
/* Replaced by math::abs(determinant(mat)). */
float mat3_to_volume_scale(const float mat[3][3]);
float mat4_to_volume_scale(const float mat[4][4]);
/* Not ported. Can be replaced by length(to_scale(mat)) * M_SQRT1_3. */
float mat3_to_scale(const float mat[3][3]);
float mat4_to_scale(const float mat[4][4]);
/* Not ported. Might not be a bottleneck. */
float mat3_to_size_max_axis(const float M[3][3]);
float mat4_to_size_max_axis(const float M[4][4]);
/* Not ported. Could be a matrix util? */
void transform_pivot_set_m4(float mat[4][4], const float pivot[3]);
/* Move to own lib. */
void BLI_space_transform_from_matrices(struct SpaceTransform *data,
const float local[4][4],
const float target[4][4]);
void BLI_space_transform_global_from_matrices(struct SpaceTransform *data,
const float local[4][4],
const float target[4][4]);
void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3]);
void BLI_space_transform_invert(const struct SpaceTransform *data, float co[3]);
void BLI_space_transform_apply_normal(const struct SpaceTransform *data, float no[3]);
void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3]);