[Bf-blender-cvs] [16e5b932b75] blender2.8: Manipulator: cage2d initial rotation support

Campbell Barton noreply at git.blender.org
Tue Sep 5 15:59:10 CEST 2017


Commit: 16e5b932b7500e7e98978abbb06cd6a9a423dd9c
Author: Campbell Barton
Date:   Tue Sep 5 23:45:35 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB16e5b932b7500e7e98978abbb06cd6a9a423dd9c

Manipulator: cage2d initial rotation support

===================================================================

M	source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c

===================================================================

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, &params, 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;



More information about the Bf-blender-cvs mailing list