diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-09-05 16:45:35 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-09-05 17:06:53 +0300 |
commit | 16e5b932b7500e7e98978abbb06cd6a9a423dd9c (patch) | |
tree | e0c46ea413cdcb7644b6d5d0c5b375e79a497c47 /source/blender/editors/manipulator_library/manipulator_types | |
parent | 0a1a7323e579fe730b64322cf49ba28d85873241 (diff) |
Manipulator: cage2d initial rotation support
Diffstat (limited to 'source/blender/editors/manipulator_library/manipulator_types')
-rw-r--r-- | source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c index 5a3b9d0e794..ec924a32035 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BLI_math.h" +#include "BLI_dial.h" #include "BLI_rect.h" #include "ED_screen.h" @@ -501,6 +502,8 @@ static int manipulator_rect_transform_test_select( typedef struct RectTransformInteraction { float orig_mouse[2]; float orig_matrix_offset[4][4]; + float orig_matrix_final_no_offset[4][4]; + Dial *dial; } RectTransformInteraction; static void manipulator_rect_transform_setup(wmManipulator *mpr) @@ -515,6 +518,14 @@ static int manipulator_rect_transform_invoke( copy_m4_m4(data->orig_matrix_offset, mpr->matrix_offset); + { + float mat_identity[4][4]; + struct WM_ManipulatorMatrixParams params = {NULL}; + unit_m4(mat_identity); + params.matrix_offset = mat_identity; + WM_manipulator_calc_matrix_final_params(mpr, ¶ms, data->orig_matrix_final_no_offset); + } + if (manipulator_window_project_2d( C, mpr, (const float[2]){UNPACK2(event->mval)}, 2, false, data->orig_mouse) == 0) { @@ -571,7 +582,44 @@ static int manipulator_rect_transform_modal( mpr->matrix_offset[3][1] = data->orig_matrix_offset[3][1] + (point_local[1] - data->orig_mouse[1]); } else if (mpr->highlight_part == ED_MANIPULATOR_CAGE2D_PART_ROTATE) { + +#define MUL_V2_V3_M4_FINAL(test_co, mouse_co) \ + mul_v3_m4v3(test_co, data->orig_matrix_final_no_offset, ((const float[3]){UNPACK2(mouse_co), 0.0})) + + float test_co[3]; + + if (data->dial == NULL) { + MUL_V2_V3_M4_FINAL(test_co, data->orig_matrix_offset[3]); + + data->dial = BLI_dial_initialize(test_co, FLT_EPSILON); + + MUL_V2_V3_M4_FINAL(test_co, data->orig_mouse); + BLI_dial_angle(data->dial, test_co); + } + /* rotate */ + MUL_V2_V3_M4_FINAL(test_co, point_local); + const float angle = BLI_dial_angle(data->dial, test_co); + + float matrix_space_inv[4][4]; + float matrix_rotate[4][4]; + float pivot[3]; + + copy_v3_v3(pivot, data->orig_matrix_offset[3]); + + invert_m4_m4(matrix_space_inv, mpr->matrix_space); + + unit_m4(matrix_rotate); + mul_m4_m4m4(matrix_rotate, matrix_rotate, matrix_space_inv); + rotate_m4(matrix_rotate, 'Z', -angle); + mul_m4_m4m4(matrix_rotate, matrix_rotate, mpr->matrix_space); + + zero_v3(matrix_rotate[3]); + transform_pivot_set_m4(matrix_rotate, pivot); + + mul_m4_m4m4(mpr->matrix_offset, matrix_rotate, data->orig_matrix_offset); + +#undef MUL_V2_V3_M4_FINAL } else { /* scale */ @@ -660,6 +708,8 @@ static void manipulator_rect_transform_exit(bContext *C, wmManipulator *mpr, con { RectTransformInteraction *data = mpr->interaction_data; + MEM_SAFE_FREE(data->dial); + if (!cancel) return; |