[Bf-blender-cvs] [a14d7f3] transform-manipulators: Implement new rotation manipulators

Julian Eisel noreply at git.blender.org
Fri Oct 21 01:58:39 CEST 2016


Commit: a14d7f3009d75e5f15df4f9ea4342634d229ea4f
Author: Julian Eisel
Date:   Fri Oct 21 01:57:40 2016 +0200
Branches: transform-manipulators
https://developer.blender.org/rBa14d7f3009d75e5f15df4f9ea4342634d229ea4f

Implement new rotation manipulators

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

M	source/blender/editors/space_view3d/view3d_transform_manipulators.c

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

diff --git a/source/blender/editors/space_view3d/view3d_transform_manipulators.c b/source/blender/editors/space_view3d/view3d_transform_manipulators.c
index 3691bfc..714499f 100644
--- a/source/blender/editors/space_view3d/view3d_transform_manipulators.c
+++ b/source/blender/editors/space_view3d/view3d_transform_manipulators.c
@@ -92,10 +92,13 @@ enum TransformAxisType {
 typedef struct TransformManipulatorsInfo {
 	struct TranformAxisManipulator *axes; /* Array of axes */
 
+	wmManipulatorGroup *mgroup;
 	float mat[4][4]; /* Cached loc/rot matrix */
 } TransformManipulatorsInfo;
 
-typedef void TransformManipulatorUpdateFunc(const bContext *, const struct TransformManipulatorsInfo *,
+typedef wmManipulator *TransformManipulatorInitFunc(const TransformManipulatorsInfo *,
+                                                    struct TranformAxisManipulator *);
+typedef void TransformManipulatorUpdateFunc(const bContext *, const TransformManipulatorsInfo *,
                                             const struct TranformAxisManipulator *);
 
 typedef struct TranformAxisManipulator {
@@ -105,6 +108,7 @@ typedef struct TranformAxisManipulator {
 	int transform_type; /* View3d->twtype */
 
 	/* per-manipulator callbacks for initializing/updating data */
+	TransformManipulatorInitFunc   (*init);
 	TransformManipulatorUpdateFunc (*refresh);
 	TransformManipulatorUpdateFunc (*draw_prepare);
 
@@ -116,7 +120,7 @@ typedef struct TranformAxisManipulator {
 	float scale;
 	float line_width;
 	int theme_colorid;
-	int manipulator_type;
+	int manipulator_style;
 
 
 	/* -- initialized later -- */
@@ -124,10 +128,11 @@ typedef struct TranformAxisManipulator {
 	wmManipulator *manipulator;
 } TranformAxisManipulator;
 
-static void manipulator_refresh_arrow(
-        const bContext *UNUSED(C), const TransformManipulatorsInfo *info, const TranformAxisManipulator *axis);
-static void manipulator_view_dial_draw_prepare(
-        const bContext *C, const TransformManipulatorsInfo *info, const TranformAxisManipulator *axis);
+static TransformManipulatorInitFunc   manipulator_arrow_init;
+static TransformManipulatorUpdateFunc manipulator_arrow_draw_prepare;
+static TransformManipulatorInitFunc   manipulator_dial_init;
+static TransformManipulatorUpdateFunc manipulator_dial_refresh;
+static TransformManipulatorUpdateFunc manipulator_view_dial_draw_prepare;
 
 /**
  * This TranformAxisManipulator array contains all the info we need to initialize, store and identify all
@@ -138,28 +143,52 @@ static void manipulator_view_dial_draw_prepare(
 static TranformAxisManipulator tman_axes[] = {
 	{
 		MAN_AXIS_TRANS_X, V3D_MANIP_TRANSLATE,
-		manipulator_refresh_arrow, NULL,
+		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
 		"translate_x", {1, 0, 0}, OB_LOCK_LOCX,
 		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_X, MANIPULATOR_ARROW_STYLE_NORMAL,
 	},
 	{
 		MAN_AXIS_TRANS_Y, V3D_MANIP_TRANSLATE,
-		manipulator_refresh_arrow, NULL,
+		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
 		"translate_y", {0, 1, 0}, OB_LOCK_LOCY,
 		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Y, MANIPULATOR_ARROW_STYLE_NORMAL,
 	},
 	{
 		MAN_AXIS_TRANS_Z, V3D_MANIP_TRANSLATE,
-		manipulator_refresh_arrow, NULL,
+		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
 		"translate_z", {0, 0, 1}, OB_LOCK_LOCZ,
 		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Z, MANIPULATOR_ARROW_STYLE_NORMAL,
 	},
 	{
 		MAN_AXIS_TRANS_C, V3D_MANIP_TRANSLATE,
-		NULL, manipulator_view_dial_draw_prepare,
+		manipulator_dial_init, manipulator_dial_refresh, manipulator_view_dial_draw_prepare,
 		"translate_c", {0}, 0,
 		0.2f, TRANSFORM_MAN_AXIS_LINE_WIDTH, -1, MANIPULATOR_DIAL_STYLE_RING,
 	},
+	{
+		MAN_AXIS_ROT_X, V3D_MANIP_ROTATE,
+		manipulator_dial_init, manipulator_dial_refresh, NULL,
+		"rotate_x", {1, 0, 0}, OB_LOCK_ROTX,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH + 1.0f, TH_AXIS_X, MANIPULATOR_DIAL_STYLE_RING_CLIPPED,
+	},
+	{
+		MAN_AXIS_ROT_Y, V3D_MANIP_ROTATE,
+		manipulator_dial_init, manipulator_dial_refresh, NULL,
+		"rotate_y", {0, 1, 0}, OB_LOCK_ROTY,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH + 1.0f, TH_AXIS_Y, MANIPULATOR_DIAL_STYLE_RING_CLIPPED,
+	},
+	{
+		MAN_AXIS_ROT_Z, V3D_MANIP_ROTATE,
+		manipulator_dial_init, manipulator_dial_refresh, NULL,
+		"rotate_y", {0, 0, 1}, OB_LOCK_ROTZ,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH + 1.0f, TH_AXIS_Z, MANIPULATOR_DIAL_STYLE_RING_CLIPPED,
+	},
+	{
+		MAN_AXIS_ROT_C, V3D_MANIP_ROTATE,
+		manipulator_dial_init, NULL, manipulator_view_dial_draw_prepare,
+		"rotate_c", {0}, OB_LOCK_ROTZ,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH + 1.0f, -1, MANIPULATOR_DIAL_STYLE_RING,
+	},
 	{0, 0, NULL}
 };
 
@@ -197,6 +226,17 @@ static unsigned int transform_axis_index_normalize(const int axis_idx)
 /* -------------------------------------------------------------------- */
 /* init callback and helpers */
 
+
+static wmManipulator *manipulator_arrow_init(const TransformManipulatorsInfo *info, TranformAxisManipulator *axis)
+{
+	return WM_arrow_manipulator_new(info->mgroup, axis->name);
+}
+
+static wmManipulator *manipulator_dial_init(const TransformManipulatorsInfo *info, TranformAxisManipulator *axis)
+{
+	return WM_dial_manipulator_new(info->mgroup, axis->name, axis->manipulator_style);
+}
+
 /**
  * Custom handler for transform manipulators to update them while modal transform operator runs.
  */
@@ -239,19 +279,9 @@ static const char *transform_axis_ot_name_get(int transform_type)
 /**
  * Create and initialize a manipulator for \a axis.
  */
-static void transform_axis_manipulator_init(TranformAxisManipulator *axis, wmManipulatorGroup *mgroup)
+static void transform_axis_manipulator_init(TransformManipulatorsInfo *info, TranformAxisManipulator *axis)
 {
-	switch (axis->manipulator_type) {
-		case MANIPULATOR_ARROW_STYLE_NORMAL:
-			axis->manipulator = WM_arrow_manipulator_new(mgroup, axis->name);
-			break;
-		case MANIPULATOR_DIAL_STYLE_RING:
-			axis->manipulator = WM_dial_manipulator_new(mgroup, axis->name, axis->manipulator_type);
-			break;
-		default:
-			BLI_assert(0);
-			break;
-	}
+	axis->manipulator = axis->init(info, axis);
 
 	const char *op_name = transform_axis_ot_name_get(axis->transform_type);
 	PointerRNA *ptr = WM_manipulator_set_operator(axis->manipulator, op_name);
@@ -269,14 +299,12 @@ static void transform_manipulatorgroup_init(const bContext *UNUSED(C), wmManipul
 {
 	TransformManipulatorsInfo *info = MEM_callocN(sizeof(*info), __func__);
 
+	info->mgroup = mgroup;
 	info->axes = MEM_callocN(sizeof(tman_axes), STRINGIFY(TranformAxisManipulator));
 	memcpy(info->axes, tman_axes, sizeof(tman_axes));
 
-	TranformAxisManipulator *axis;
 	for (int i = 0; i < MAN_AXIS_LAST && info->axes[i].name; i++) {
-		axis = &info->axes[i];
-
-		transform_axis_manipulator_init(axis, mgroup);
+		transform_axis_manipulator_init(info, &info->axes[i]);
 	}
 
 	mgroup->customdata = info;
@@ -287,11 +315,12 @@ static void transform_manipulatorgroup_init(const bContext *UNUSED(C), wmManipul
 /* -------------------------------------------------------------------- */
 /* refresh callback and helpers */
 
-static void manipulator_refresh_arrow(
+
+static void manipulator_dial_refresh(
         const bContext *UNUSED(C), const TransformManipulatorsInfo *info, const TranformAxisManipulator *axis)
 {
 	const int idx_normalized = transform_axis_index_normalize(axis->index);
-	WM_arrow_manipulator_set_direction(axis->manipulator, info->mat[idx_normalized]);
+	WM_dial_manipulator_set_up_vector(axis->manipulator, info->mat[idx_normalized]);
 }
 
 static bool transform_axis_manipulator_is_visible(TranformAxisManipulator *axis, char transform_type, int protectflag)
@@ -472,14 +501,9 @@ static void transform_manipulatorgroup_refresh(const bContext *C, wmManipulatorG
 /* -------------------------------------------------------------------- */
 /* draw_prepare callback and helpers */
 
-static void manipulator_view_dial_draw_prepare(
-        const bContext *C, const TransformManipulatorsInfo *UNUSED(info), const TranformAxisManipulator *axis)
-{
-	RegionView3D *rv3d = CTX_wm_region_view3d(C);
-	WM_dial_manipulator_set_up_vector(axis->manipulator, rv3d->viewinv[2]);
-}
 
-static float transform_axis_view_alpha_fac_get(TranformAxisManipulator *axis, RegionView3D *rv3d, float mat[4][4])
+static float transform_axis_view_alpha_fac_get(
+        const TranformAxisManipulator *axis, const RegionView3D *rv3d, const float mat[4][4])
 {
 	const int axis_idx_norm = transform_axis_index_normalize(axis->index);
 	const float dot_min = TRANSFORM_MAN_AXIS_DOT_MIN;
@@ -500,7 +524,8 @@ static float transform_axis_view_alpha_fac_get(TranformAxisManipulator *axis, Re
 	        0.0f : ((idot_axis - dot_min) / (dot_max - dot_min)));
 }
 
-static void transform_axis_manipulator_set_color(TranformAxisManipulator *axis, RegionView3D *rv3d, float mat[4][4])
+static void transform_axis_manipulator_set_color(
+        const TranformAxisManipulator *axis, const RegionView3D *rv3d, const float mat[4][4])
 {
 	/* alpha values for normal/highlighted states */
 	const float alpha = 0.6f;
@@ -523,14 +548,29 @@ static void transform_axis_manipulator_set_color(TranformAxisManipulator *axis,
 	WM_manipulator_set_colors(axis->manipulator, col, col_hi);
 }
 
+static void manipulator_arrow_draw_prepare(
+        const bContext *UNUSED(C), const TransformManipulatorsInfo *info, const TranformAxisManipulator *axis)
+{
+	const int axis_idx_norm = transform_axis_index_normalize(axis->index);
+
+	WM_arrow_manipulator_set_direction(axis->manipulator, info->mat[axis_idx_norm]);
+}
+
+static void manipulator_view_dial_draw_prepare(
+        const bContext *C, const TransformManipulatorsInfo *UNUSED(info), const TranformAxisManipulator *axis)
+{
+	RegionView3D *rv3d = CTX_wm_region_view3d(C);
+	WM_dial_manipulator_set_up_vector(axis->manipulator, rv3d->viewinv[2]);
+}
+
 /**
  * Some transform orientation modes require updating the transform manipulators rotation matrix every redraw.
  * \return If manipulators need to update their rotation.
  */
-static bool transform_manipulators_draw_rotmatrix_get(const bContext *C, const View3D *v3d, float r_mat[3][3])
+static bool transform_manipulators_draw_rotmatrix

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list