Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-09-20 10:47:34 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-09-20 10:47:34 +0300
commit31fc75ef9332566c084763307c8fa717c6165770 (patch)
tree3c78ccb2641447c6786a987bd2d221d27be2cc3d /source/blender/editors/transform/transform_manipulator.c
parent851228766e375928d31683decb89ca1c9613b938 (diff)
Cleanup: move 3d manipulators into an array
Diffstat (limited to 'source/blender/editors/transform/transform_manipulator.c')
-rw-r--r--source/blender/editors/transform/transform_manipulator.c185
1 files changed, 67 insertions, 118 deletions
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 9a4be46855f..cd1dcde564b 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -114,27 +114,31 @@ enum {
MAN_AXIS_TRANS_Z,
MAN_AXIS_TRANS_C,
+ MAN_AXIS_TRANS_XY,
+ MAN_AXIS_TRANS_YZ,
+ MAN_AXIS_TRANS_ZX,
+#define MAN_AXIS_RANGE_TRANS_START MAN_AXIS_TRANS_X
+#define MAN_AXIS_RANGE_TRANS_END (MAN_AXIS_TRANS_ZX + 1)
+
MAN_AXIS_ROT_X,
MAN_AXIS_ROT_Y,
MAN_AXIS_ROT_Z,
MAN_AXIS_ROT_C,
MAN_AXIS_ROT_T, /* trackball rotation */
+#define MAN_AXIS_RANGE_ROT_START MAN_AXIS_ROT_X
+#define MAN_AXIS_RANGE_ROT_END (MAN_AXIS_ROT_T + 1)
MAN_AXIS_SCALE_X,
MAN_AXIS_SCALE_Y,
MAN_AXIS_SCALE_Z,
MAN_AXIS_SCALE_C,
-
- /* special */
- MAN_AXIS_TRANS_XY,
- MAN_AXIS_TRANS_YZ,
- MAN_AXIS_TRANS_ZX,
-
MAN_AXIS_SCALE_XY,
MAN_AXIS_SCALE_YZ,
MAN_AXIS_SCALE_ZX,
+#define MAN_AXIS_RANGE_SCALE_START MAN_AXIS_SCALE_X
+#define MAN_AXIS_RANGE_SCALE_END (MAN_AXIS_SCALE_ZX + 1)
- MAN_AXIS_LAST,
+ MAN_AXIS_LAST = MAN_AXIS_RANGE_SCALE_END,
};
/* axis types */
@@ -148,27 +152,7 @@ enum {
typedef struct ManipulatorGroup {
bool all_hidden;
- struct wmManipulator *translate_x,
- *translate_y,
- *translate_z,
- *translate_xy,
- *translate_yz,
- *translate_zx,
- *translate_c,
-
- *rotate_x,
- *rotate_y,
- *rotate_z,
- *rotate_c,
- *rotate_t, /* trackball rotation */
-
- *scale_x,
- *scale_y,
- *scale_z,
- *scale_xy,
- *scale_yz,
- *scale_zx,
- *scale_c;
+ struct wmManipulator *manipulators[MAN_AXIS_LAST];
} ManipulatorGroup;
@@ -189,83 +173,48 @@ typedef struct ManipulatorGroup {
static wmManipulator *manipulator_get_axis_from_index(const ManipulatorGroup *man, const short axis_idx)
{
BLI_assert(IN_RANGE_INCL(axis_idx, (float)MAN_AXIS_TRANS_X, (float)MAN_AXIS_LAST));
-
- switch (axis_idx) {
- case MAN_AXIS_TRANS_X:
- return man->translate_x;
- case MAN_AXIS_TRANS_Y:
- return man->translate_y;
- case MAN_AXIS_TRANS_Z:
- return man->translate_z;
- case MAN_AXIS_TRANS_XY:
- return man->translate_xy;
- case MAN_AXIS_TRANS_YZ:
- return man->translate_yz;
- case MAN_AXIS_TRANS_ZX:
- return man->translate_zx;
- case MAN_AXIS_TRANS_C:
- return man->translate_c;
- case MAN_AXIS_ROT_X:
- return man->rotate_x;
- case MAN_AXIS_ROT_Y:
- return man->rotate_y;
- case MAN_AXIS_ROT_Z:
- return man->rotate_z;
- case MAN_AXIS_ROT_C:
- return man->rotate_c;
- case MAN_AXIS_ROT_T:
- return man->rotate_t;
- case MAN_AXIS_SCALE_X:
- return man->scale_x;
- case MAN_AXIS_SCALE_Y:
- return man->scale_y;
- case MAN_AXIS_SCALE_Z:
- return man->scale_z;
- case MAN_AXIS_SCALE_XY:
- return man->scale_xy;
- case MAN_AXIS_SCALE_YZ:
- return man->scale_yz;
- case MAN_AXIS_SCALE_ZX:
- return man->scale_zx;
- case MAN_AXIS_SCALE_C:
- return man->scale_c;
- }
-
- return NULL;
+ return man->manipulators[axis_idx];
}
-static short manipulator_get_axis_type(const ManipulatorGroup *man, const wmManipulator *axis)
+static short manipulator_get_axis_type(const int axis_idx)
{
- if (ELEM(axis, man->translate_x, man->translate_y, man->translate_z, man->translate_c,
- man->translate_xy, man->translate_yz, man->translate_zx))
- {
+ if (axis_idx >= MAN_AXIS_RANGE_TRANS_START && axis_idx < MAN_AXIS_RANGE_TRANS_END) {
return MAN_AXES_TRANSLATE;
}
- else if (ELEM(axis, man->rotate_x, man->rotate_y, man->rotate_z, man->rotate_c, man->rotate_t)) {
+ if (axis_idx >= MAN_AXIS_RANGE_ROT_START && axis_idx < MAN_AXIS_RANGE_ROT_END) {
return MAN_AXES_ROTATE;
}
- else {
+ if (axis_idx >= MAN_AXIS_RANGE_SCALE_START && axis_idx < MAN_AXIS_RANGE_SCALE_END) {
return MAN_AXES_SCALE;
}
+ BLI_assert(0);
+ return -1;
}
/* get index within axis type, so that x == 0, y == 1 and z == 2, no matter which axis type */
static uint manipulator_index_normalize(const int axis_idx)
{
- if (axis_idx > MAN_AXIS_TRANS_ZX) {
- return axis_idx - 16;
- }
- else if (axis_idx > MAN_AXIS_SCALE_C) {
- return axis_idx - 13;
- }
- else if (axis_idx > MAN_AXIS_ROT_T) {
- return axis_idx - 9;
- }
- else if (axis_idx > MAN_AXIS_TRANS_C) {
- return axis_idx - 4;
+ switch (axis_idx) {
+ case MAN_AXIS_TRANS_X:
+ case MAN_AXIS_ROT_X:
+ case MAN_AXIS_SCALE_X:
+ case MAN_AXIS_TRANS_XY:
+ case MAN_AXIS_SCALE_XY:
+ return 0;
+ case MAN_AXIS_TRANS_Y:
+ case MAN_AXIS_ROT_Y:
+ case MAN_AXIS_SCALE_Y:
+ case MAN_AXIS_TRANS_YZ:
+ case MAN_AXIS_SCALE_YZ:
+ return 1;
+ case MAN_AXIS_TRANS_Z:
+ case MAN_AXIS_ROT_Z:
+ case MAN_AXIS_SCALE_Z:
+ case MAN_AXIS_TRANS_ZX:
+ case MAN_AXIS_SCALE_ZX:
+ return 2;
}
-
- return axis_idx;
+ return 3;
}
static bool manipulator_is_axis_visible(
@@ -1091,47 +1040,47 @@ static ManipulatorGroup *manipulatorgroup_init(wmManipulatorGroup *mgroup)
const wmManipulatorType *wt_prim = WM_manipulatortype_find("MANIPULATOR_WT_primitive_3d", true);
#define MANIPULATOR_NEW_ARROW(v, draw_style) { \
- v = WM_manipulator_new_ptr(wt_arrow, mgroup, NULL); \
- RNA_enum_set((v)->ptr, "draw_style", draw_style); \
+ man->manipulators[v] = WM_manipulator_new_ptr(wt_arrow, mgroup, NULL); \
+ RNA_enum_set(man->manipulators[v]->ptr, "draw_style", draw_style); \
} ((void)0)
#define MANIPULATOR_NEW_DIAL(v, draw_options) { \
- v = WM_manipulator_new_ptr(wt_dial, mgroup, NULL); \
- RNA_enum_set((v)->ptr, "draw_options", draw_options); \
+ man->manipulators[v] = WM_manipulator_new_ptr(wt_dial, mgroup, NULL); \
+ RNA_enum_set(man->manipulators[v]->ptr, "draw_options", draw_options); \
} ((void)0)
#define MANIPULATOR_NEW_PRIM(v, draw_style) { \
- v = WM_manipulator_new_ptr(wt_prim, mgroup, NULL); \
- RNA_enum_set((v)->ptr, "draw_style", draw_style); \
+ man->manipulators[v] = WM_manipulator_new_ptr(wt_prim, mgroup, NULL); \
+ RNA_enum_set(man->manipulators[v]->ptr, "draw_style", draw_style); \
} ((void)0)
/* add/init widgets - order matters! */
- MANIPULATOR_NEW_DIAL(man->rotate_t, ED_MANIPULATOR_DIAL_DRAW_FLAG_FILL);
+ MANIPULATOR_NEW_DIAL(MAN_AXIS_ROT_T, ED_MANIPULATOR_DIAL_DRAW_FLAG_FILL);
- MANIPULATOR_NEW_DIAL(man->scale_c, ED_MANIPULATOR_DIAL_DRAW_FLAG_NOP);
+ MANIPULATOR_NEW_DIAL(MAN_AXIS_SCALE_C, ED_MANIPULATOR_DIAL_DRAW_FLAG_NOP);
- MANIPULATOR_NEW_ARROW(man->scale_x, ED_MANIPULATOR_ARROW_STYLE_BOX);
- MANIPULATOR_NEW_ARROW(man->scale_y, ED_MANIPULATOR_ARROW_STYLE_BOX);
- MANIPULATOR_NEW_ARROW(man->scale_z, ED_MANIPULATOR_ARROW_STYLE_BOX);
+ MANIPULATOR_NEW_ARROW(MAN_AXIS_SCALE_X, ED_MANIPULATOR_ARROW_STYLE_BOX);
+ MANIPULATOR_NEW_ARROW(MAN_AXIS_SCALE_Y, ED_MANIPULATOR_ARROW_STYLE_BOX);
+ MANIPULATOR_NEW_ARROW(MAN_AXIS_SCALE_Z, ED_MANIPULATOR_ARROW_STYLE_BOX);
- MANIPULATOR_NEW_PRIM(man->scale_xy, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
- MANIPULATOR_NEW_PRIM(man->scale_yz, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
- MANIPULATOR_NEW_PRIM(man->scale_zx, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
+ MANIPULATOR_NEW_PRIM(MAN_AXIS_SCALE_XY, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
+ MANIPULATOR_NEW_PRIM(MAN_AXIS_SCALE_YZ, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
+ MANIPULATOR_NEW_PRIM(MAN_AXIS_SCALE_ZX, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
- MANIPULATOR_NEW_DIAL(man->rotate_x, ED_MANIPULATOR_DIAL_DRAW_FLAG_CLIP);
- MANIPULATOR_NEW_DIAL(man->rotate_y, ED_MANIPULATOR_DIAL_DRAW_FLAG_CLIP);
- MANIPULATOR_NEW_DIAL(man->rotate_z, ED_MANIPULATOR_DIAL_DRAW_FLAG_CLIP);
+ MANIPULATOR_NEW_DIAL(MAN_AXIS_ROT_X, ED_MANIPULATOR_DIAL_DRAW_FLAG_CLIP);
+ MANIPULATOR_NEW_DIAL(MAN_AXIS_ROT_Y, ED_MANIPULATOR_DIAL_DRAW_FLAG_CLIP);
+ MANIPULATOR_NEW_DIAL(MAN_AXIS_ROT_Z, ED_MANIPULATOR_DIAL_DRAW_FLAG_CLIP);
/* init screen aligned widget last here, looks better, behaves better */
- MANIPULATOR_NEW_DIAL(man->rotate_c, ED_MANIPULATOR_DIAL_DRAW_FLAG_NOP);
+ MANIPULATOR_NEW_DIAL(MAN_AXIS_ROT_C, ED_MANIPULATOR_DIAL_DRAW_FLAG_NOP);
- MANIPULATOR_NEW_DIAL(man->translate_c, ED_MANIPULATOR_DIAL_DRAW_FLAG_NOP);
+ MANIPULATOR_NEW_DIAL(MAN_AXIS_TRANS_C, ED_MANIPULATOR_DIAL_DRAW_FLAG_NOP);
- MANIPULATOR_NEW_ARROW(man->translate_x, ED_MANIPULATOR_ARROW_STYLE_NORMAL);
- MANIPULATOR_NEW_ARROW(man->translate_y, ED_MANIPULATOR_ARROW_STYLE_NORMAL);
- MANIPULATOR_NEW_ARROW(man->translate_z, ED_MANIPULATOR_ARROW_STYLE_NORMAL);
+ MANIPULATOR_NEW_ARROW(MAN_AXIS_TRANS_X, ED_MANIPULATOR_ARROW_STYLE_NORMAL);
+ MANIPULATOR_NEW_ARROW(MAN_AXIS_TRANS_Y, ED_MANIPULATOR_ARROW_STYLE_NORMAL);
+ MANIPULATOR_NEW_ARROW(MAN_AXIS_TRANS_Z, ED_MANIPULATOR_ARROW_STYLE_NORMAL);
- MANIPULATOR_NEW_PRIM(man->translate_xy, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
- MANIPULATOR_NEW_PRIM(man->translate_yz, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
- MANIPULATOR_NEW_PRIM(man->translate_zx, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
+ MANIPULATOR_NEW_PRIM(MAN_AXIS_TRANS_XY, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
+ MANIPULATOR_NEW_PRIM(MAN_AXIS_TRANS_YZ, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
+ MANIPULATOR_NEW_PRIM(MAN_AXIS_TRANS_ZX, ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE);
return man;
}
@@ -1171,7 +1120,7 @@ static void WIDGETGROUP_manipulator_setup(const bContext *UNUSED(C), wmManipulat
MAN_ITER_AXES_BEGIN(axis, axis_idx)
{
- const short axis_type = manipulator_get_axis_type(man, axis);
+ const short axis_type = manipulator_get_axis_type(axis_idx);
int constraint_axis[3] = {1, 0, 0};
PointerRNA *ptr;
@@ -1292,7 +1241,7 @@ static void WIDGETGROUP_manipulator_refresh(const bContext *C, wmManipulatorGrou
MAN_ITER_AXES_BEGIN(axis, axis_idx)
{
- const short axis_type = manipulator_get_axis_type(man, axis);
+ const short axis_type = manipulator_get_axis_type(axis_idx);
const int aidx_norm = manipulator_index_normalize(axis_idx);
WM_manipulator_set_matrix_location(axis, rv3d->twmat[3]);
@@ -1363,7 +1312,7 @@ static void WIDGETGROUP_manipulator_draw_prepare(const bContext *C, wmManipulato
MAN_ITER_AXES_BEGIN(axis, axis_idx)
{
- const short axis_type = manipulator_get_axis_type(man, axis);
+ const short axis_type = manipulator_get_axis_type(axis_idx);
/* XXX maybe unset _HIDDEN flag on redraw? */
if (manipulator_is_axis_visible(v3d, rv3d, idot, axis_type, axis_idx)) {
WM_manipulator_set_flag(axis, WM_MANIPULATOR_HIDDEN, false);