Cleanup: move 3d manipulators into an array

This commit is contained in:
2017-09-20 17:47:34 +10:00
parent 851228766e
commit 31fc75ef93

View File

@@ -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;
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;
}
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;
}
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);