diff options
Diffstat (limited to 'source/blender/blenlib/intern/math_matrix.c')
-rw-r--r-- | source/blender/blenlib/intern/math_matrix.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index cf6945529f2..9769d2baf9b 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -2223,6 +2223,12 @@ void scale_m4_fl(float R[4][4], float scale) R[3][0] = R[3][1] = R[3][2] = 0.0; } +void translate_m3(float mat[3][3], float tx, float ty) +{ + mat[2][0] += (tx * mat[0][0] + ty * mat[1][0]); + mat[2][1] += (tx * mat[0][1] + ty * mat[1][1]); +} + void translate_m4(float mat[4][4], float Tx, float Ty, float Tz) { mat[3][0] += (Tx * mat[0][0] + Ty * mat[1][0] + Tz * mat[2][0]); @@ -2230,6 +2236,18 @@ void translate_m4(float mat[4][4], float Tx, float Ty, float Tz) mat[3][2] += (Tx * mat[0][2] + Ty * mat[1][2] + Tz * mat[2][2]); } +void rotate_m3(float mat[3][3], const float angle) +{ + const float angle_cos = cosf(angle); + const float angle_sin = sinf(angle); + + for (int col = 0; col < 3; col++) { + float temp = angle_cos * mat[0][col] + angle_sin * mat[1][col]; + mat[1][col] = -angle_sin * mat[0][col] + angle_cos * mat[1][col]; + mat[0][col] = temp; + } +} + /* TODO: enum for axis? */ /** * Rotate a matrix in-place. @@ -2275,6 +2293,12 @@ void rotate_m4(float mat[4][4], const char axis, const float angle) } } +void rescale_m3(float mat[3][3], const float scale[2]) +{ + mul_v3_fl(mat[0], scale[0]); + mul_v3_fl(mat[1], scale[1]); +} + /** Scale a matrix in-place. */ void rescale_m4(float mat[4][4], const float scale[3]) { @@ -2305,6 +2329,20 @@ void transform_pivot_set_m4(float mat[4][4], const float pivot[3]) mul_m4_m4m4(mat, mat, tmat); } +void transform_pivot_set_m3(float mat[3][3], const float pivot[2]) +{ + float tmat[3][3]; + + unit_m3(tmat); + + copy_v2_v2(tmat[2], pivot); + mul_m3_m3m3(mat, tmat, mat); + + /* invert the matrix */ + negate_v2(tmat[2]); + mul_m3_m3m3(mat, mat, tmat); +} + void blend_m3_m3m3(float out[3][3], const float dst[3][3], const float src[3][3], @@ -2485,6 +2523,21 @@ bool equals_m4m4(const float mat1[4][4], const float mat2[4][4]) } /** + * Make a 3x3 matrix out of 3 transform components. + * Matrices are made in the order: `loc * rot * scale` + */ +void loc_rot_size_to_mat3(float R[3][3], + const float loc[2], + const float angle, + const float size[2]) +{ + unit_m3(R); + translate_m3(R, loc[0], loc[1]); + rotate_m3(R, angle); + rescale_m3(R, size); +} + +/** * Make a 4x4 matrix out of 3 transform components. * Matrices are made in the order: `scale * rot * loc` */ |