Transform: expose hardcoded 'Rotate Normals' key

"Rotate Normals" is a changeable operation like any other and does not
need to be hardcoded.

An advantage of exposing this modal is that the shortcut key now
appears in the header when rotating an edited mesh.
This commit is contained in:
Germano Cavalcante 2023-03-27 14:38:47 -03:00
parent 040ea1637d
commit bb67d4c298
6 changed files with 22 additions and 17 deletions

@ -76,6 +76,8 @@ def keyconfig_update(keyconfig_data, keyconfig_version):
elif item_modal == 'ROTATE':
km_items.append(('TRACKBALL', item_event, None))
# The modal key for "Rotate Normals" also didn't exist until then.
km_items.append(('ROTATE_NORMALS', {"type": 'N', "value": 'PRESS'}, None))
break
return keyconfig_data

@ -5793,6 +5793,7 @@ def km_transform_modal_map(_params):
("ROTATE", {"type": 'R', "value": 'PRESS'}, None),
("TRACKBALL", {"type": 'R', "value": 'PRESS'}, None),
("RESIZE", {"type": 'S', "value": 'PRESS'}, None),
("ROTATE_NORMALS", {"type": 'N', "value": 'PRESS'}, None),
("SNAP_TOGGLE", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
("SNAP_INV_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),
("SNAP_INV_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),

@ -3975,6 +3975,7 @@ def km_transform_modal_map(_params):
("ROTATE", {"type": 'R', "value": 'PRESS'}, None),
("TRACKBALL", {"type": 'R', "value": 'PRESS'}, None),
("RESIZE", {"type": 'S', "value": 'PRESS'}, None),
("ROTATE_NORMALS", {"type": 'N', "value": 'PRESS'}, None),
("SNAP_TOGGLE", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
("SNAP_INV_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),
("SNAP_INV_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),

@ -620,7 +620,8 @@ static bool transform_modal_item_poll(const wmOperator *op, int value)
case TFM_MODAL_ROTATE:
case TFM_MODAL_RESIZE:
case TFM_MODAL_VERT_EDGE_SLIDE:
case TFM_MODAL_TRACKBALL: {
case TFM_MODAL_TRACKBALL:
case TFM_MODAL_ROTATE_NORMALS: {
if (!transform_mode_is_changeable(t->mode)) {
return false;
}
@ -662,6 +663,9 @@ static bool transform_modal_item_poll(const wmOperator *op, int value)
t->mode != TFM_ROTATION) {
return false;
}
if (value == TFM_MODAL_ROTATE_NORMALS) {
return t->mode == TFM_ROTATION && t->data_type == &TransConvertType_Mesh;
}
break;
}
}
@ -712,6 +716,7 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf)
{TFM_MODAL_ROTATE, "ROTATE", 0, "Rotate", ""},
{TFM_MODAL_TRACKBALL, "TRACKBALL", 0, "TrackBall", ""},
{TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""},
{TFM_MODAL_ROTATE_NORMALS, "ROTATE_NORMALS", 0, "Rotate Normals", ""},
{TFM_MODAL_AUTOCONSTRAINT, "AUTOCONSTRAIN", 0, "Automatic Constraint", ""},
{TFM_MODAL_AUTOCONSTRAINTPLANE, "AUTOCONSTRAINPLANE", 0, "Automatic Constraint Plane", ""},
{TFM_MODAL_PRECISION, "PRECISION", 0, "Precision Mode", ""},
@ -957,6 +962,7 @@ int transformEvent(TransInfo *t, const wmEvent *event)
case TFM_MODAL_ROTATE:
case TFM_MODAL_RESIZE:
case TFM_MODAL_TRACKBALL:
case TFM_MODAL_ROTATE_NORMALS:
case TFM_MODAL_VERT_EDGE_SLIDE:
/* only switch when... */
if (!transform_mode_is_changeable(t->mode)) {
@ -977,11 +983,16 @@ int transformEvent(TransInfo *t, const wmEvent *event)
if ((event->val == TFM_MODAL_ROTATE && t->mode == TFM_ROTATION) ||
(event->val == TFM_MODAL_TRACKBALL && t->mode == TFM_TRACKBALL) ||
(event->val == TFM_MODAL_ROTATE_NORMALS && t->mode == TFM_NORMAL_ROTATION) ||
(event->val == TFM_MODAL_VERT_EDGE_SLIDE &&
ELEM(t->mode, TFM_VERT_SLIDE, TFM_EDGE_SLIDE))) {
break;
}
if (event->val == TFM_MODAL_ROTATE_NORMALS && t->data_type != &TransConvertType_Mesh) {
break;
}
restoreTransObjects(t);
resetTransModal(t);
resetTransRestrictions(t);
@ -995,6 +1006,9 @@ int transformEvent(TransInfo *t, const wmEvent *event)
else if (event->val == TFM_MODAL_TRACKBALL) {
transform_mode_init(t, NULL, TFM_TRACKBALL);
}
else if (event->val == TFM_MODAL_ROTATE_NORMALS) {
transform_mode_init(t, NULL, TFM_NORMAL_ROTATION);
}
else if (event->val == TFM_MODAL_RESIZE) {
/* Scale isn't normally very useful after extrude along normals, see #39756 */
if ((t->con.mode & CON_APPLY) && (t->orient[t->orient_curr].type == V3D_ORIENT_NORMAL)) {
@ -1283,21 +1297,6 @@ int transformEvent(TransInfo *t, const wmEvent *event)
handled = true;
}
break;
case EVT_NKEY:
if (event->flag & WM_EVENT_IS_REPEAT) {
break;
}
if (ELEM(t->mode, TFM_ROTATION)) {
if ((t->flag & T_EDIT) && t->obedit_type == OB_MESH) {
restoreTransObjects(t);
resetTransModal(t);
resetTransRestrictions(t);
transform_mode_init(t, NULL, TFM_NORMAL_ROTATION);
t->redraw = TREDRAW_HARD;
handled = true;
}
}
break;
default:
break;
}

@ -268,6 +268,7 @@ enum {
TFM_MODAL_VERT_EDGE_SLIDE = 31,
TFM_MODAL_TRACKBALL = 32,
TFM_MODAL_ROTATE_NORMALS = 33,
};
/** \} */

@ -72,7 +72,8 @@ bool transform_mode_is_changeable(const int mode)
TFM_TRACKBALL,
TFM_TRANSLATION,
TFM_EDGE_SLIDE,
TFM_VERT_SLIDE);
TFM_VERT_SLIDE,
TFM_NORMAL_ROTATION);
}
/* -------------------------------------------------------------------- */