diff options
author | Richard Antalik <richardantalik@gmail.com> | 2021-10-16 00:02:08 +0300 |
---|---|---|
committer | Richard Antalik <richardantalik@gmail.com> | 2021-10-16 00:20:45 +0300 |
commit | e11b33fec33392640e74b9f180572fc0a504287e (patch) | |
tree | fc5528eeac6e5239b6f48e01ec7db2ba07665db0 /source/blender/sequencer/intern/strip_transform.c | |
parent | 81514b0e913b03ab7fb6aa779d23a1d651ad82b7 (diff) |
Remove math for 2D affine transform
Commit e1665c3d3190 added math to do 2D affine transformations with 3x3
matrices, but these matrices are also used for 3D transformations.
Remove added functions and use 4x4 matrices for 2D transformation.
Reviewed By: campbellbarton
Differential Revision: https://developer.blender.org/D12510
Diffstat (limited to 'source/blender/sequencer/intern/strip_transform.c')
-rw-r--r-- | source/blender/sequencer/intern/strip_transform.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index ec504c0c9b6..c70f8d646af 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -490,36 +490,41 @@ static void seq_image_transform_quad_get_ex(const Scene *scene, image_size[1] = seq->strip->stripdata->orig_height; } - float transform_matrix[3][3]; - loc_rot_size_to_mat3(transform_matrix, - (const float[]){transform->xofs, transform->yofs}, - apply_rotation ? transform->rotation : 0.0f, - (const float[]){transform->scale_x, transform->scale_y}); + float transform_matrix[4][4]; + + float rotation_matrix[3][3]; + axis_angle_to_mat3_single(rotation_matrix, 'Z', apply_rotation ? transform->rotation : 0.0f); + loc_rot_size_to_mat4(transform_matrix, + (const float[]){transform->xofs, transform->yofs, 0.0f}, + rotation_matrix, + (const float[]){transform->scale_x, transform->scale_y, 1.0f}); const float origin[2] = {image_size[0] * transform->origin[0], image_size[1] * transform->origin[1]}; - const float pivot[2] = {origin[0] - (image_size[0] / 2), origin[1] - (image_size[1] / 2)}; - transform_pivot_set_m3(transform_matrix, pivot); - - r_quad[0][0] = (image_size[0] / 2) - crop->right; - r_quad[0][1] = (image_size[1] / 2) - crop->top; - r_quad[1][0] = (image_size[0] / 2) - crop->right; - r_quad[1][1] = (-image_size[1] / 2) + crop->bottom; - r_quad[2][0] = (-image_size[0] / 2) + crop->left; - r_quad[2][1] = (-image_size[1] / 2) + crop->bottom; - r_quad[3][0] = (-image_size[0] / 2) + crop->left; - r_quad[3][1] = (image_size[1] / 2) - crop->top; - - mul_m3_v2(transform_matrix, r_quad[0]); - mul_m3_v2(transform_matrix, r_quad[1]); - mul_m3_v2(transform_matrix, r_quad[2]); - mul_m3_v2(transform_matrix, r_quad[3]); + const float pivot[3] = {origin[0] - (image_size[0] / 2), origin[1] - (image_size[1] / 2), 0.0f}; + transform_pivot_set_m4(transform_matrix, pivot); + + float quad_temp[4][3]; + for (int i = 0; i < 4; i++) { + zero_v2(quad_temp[i]); + } + + quad_temp[0][0] = (image_size[0] / 2) - crop->right; + quad_temp[0][1] = (image_size[1] / 2) - crop->top; + quad_temp[1][0] = (image_size[0] / 2) - crop->right; + quad_temp[1][1] = (-image_size[1] / 2) + crop->bottom; + quad_temp[2][0] = (-image_size[0] / 2) + crop->left; + quad_temp[2][1] = (-image_size[1] / 2) + crop->bottom; + quad_temp[3][0] = (-image_size[0] / 2) + crop->left; + quad_temp[3][1] = (image_size[1] / 2) - crop->top; float mirror[2]; SEQ_image_transform_mirror_factor_get(seq, mirror); - mul_v2_v2(r_quad[0], mirror); - mul_v2_v2(r_quad[1], mirror); - mul_v2_v2(r_quad[2], mirror); - mul_v2_v2(r_quad[3], mirror); + + for (int i = 0; i < 4; i++) { + mul_m4_v3(transform_matrix, quad_temp[i]); + mul_v2_v2(quad_temp[i], mirror); + copy_v2_v2(r_quad[i], quad_temp[i]); + } } void SEQ_image_transform_quad_get(const Scene *scene, |