3D View: add local up/down movement to walk navigation

Minor usability enhancement for the walk navigation mode. Previously
walk navigation had local movement for forward/back/left/right,
but only global movement for up/down.
This PR adds local up/down movement, bound to the R and F keys.

Ref: !111682
This commit is contained in:
Aaron Franke
2023-08-29 20:24:22 -05:00
committed by Campbell Barton
parent b177f27e6f
commit c62009a6ac
2 changed files with 49 additions and 7 deletions
@@ -6541,12 +6541,16 @@ def km_view3d_walk_modal(_params):
("RIGHT", {"type": 'D', "value": 'PRESS', "any": True}, None),
("UP", {"type": 'E', "value": 'PRESS', "any": True}, None),
("DOWN", {"type": 'Q', "value": 'PRESS', "any": True}, None),
("LOCAL_UP", {"type": 'R', "value": 'PRESS', "any": True}, None),
("LOCAL_DOWN", {"type": 'F', "value": 'PRESS', "any": True}, None),
("FORWARD_STOP", {"type": 'W', "value": 'RELEASE', "any": True}, None),
("BACKWARD_STOP", {"type": 'S', "value": 'RELEASE', "any": True}, None),
("LEFT_STOP", {"type": 'A', "value": 'RELEASE', "any": True}, None),
("RIGHT_STOP", {"type": 'D', "value": 'RELEASE', "any": True}, None),
("UP_STOP", {"type": 'E', "value": 'RELEASE', "any": True}, None),
("DOWN_STOP", {"type": 'Q', "value": 'RELEASE', "any": True}, None),
("LOCAL_UP_STOP", {"type": 'R', "value": 'RELEASE', "any": True}, None),
("LOCAL_DOWN_STOP", {"type": 'F', "value": 'RELEASE', "any": True}, None),
("FORWARD", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
("BACKWARD", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
("LEFT", {"type": 'LEFT_ARROW', "value": 'PRESS'}, None),
@@ -92,6 +92,10 @@ enum {
WALK_MODAL_AXIS_LOCK_Z,
WALK_MODAL_INCREASE_JUMP,
WALK_MODAL_DECREASE_JUMP,
WALK_MODAL_DIR_LOCAL_UP,
WALK_MODAL_DIR_LOCAL_UP_STOP,
WALK_MODAL_DIR_LOCAL_DOWN,
WALK_MODAL_DIR_LOCAL_DOWN_STOP,
};
enum {
@@ -101,6 +105,8 @@ enum {
WALK_BIT_RIGHT = 1 << 3,
WALK_BIT_UP = 1 << 4,
WALK_BIT_DOWN = 1 << 5,
WALK_BIT_LOCAL_UP = 1 << 6,
WALK_BIT_LOCAL_DOWN = 1 << 7,
};
enum eWalkTeleportState {
@@ -142,15 +148,19 @@ void walk_modal_keymap(wmKeyConfig *keyconf)
{WALK_MODAL_DIR_BACKWARD, "BACKWARD", 0, "Backward", ""},
{WALK_MODAL_DIR_LEFT, "LEFT", 0, "Left", ""},
{WALK_MODAL_DIR_RIGHT, "RIGHT", 0, "Right", ""},
{WALK_MODAL_DIR_UP, "UP", 0, "Up", ""},
{WALK_MODAL_DIR_DOWN, "DOWN", 0, "Down", ""},
{WALK_MODAL_DIR_UP, "UP", 0, "Global Up", ""},
{WALK_MODAL_DIR_DOWN, "DOWN", 0, "Global Down", ""},
{WALK_MODAL_DIR_LOCAL_UP, "LOCAL_UP", 0, "Local Up", ""},
{WALK_MODAL_DIR_LOCAL_DOWN, "LOCAL_DOWN", 0, "Local Down", ""},
{WALK_MODAL_DIR_FORWARD_STOP, "FORWARD_STOP", 0, "Stop Move Forward", ""},
{WALK_MODAL_DIR_BACKWARD_STOP, "BACKWARD_STOP", 0, "Stop Move Backward", ""},
{WALK_MODAL_DIR_LEFT_STOP, "LEFT_STOP", 0, "Stop Move Left", ""},
{WALK_MODAL_DIR_RIGHT_STOP, "RIGHT_STOP", 0, "Stop Mode Right", ""},
{WALK_MODAL_DIR_UP_STOP, "UP_STOP", 0, "Stop Move Up", ""},
{WALK_MODAL_DIR_DOWN_STOP, "DOWN_STOP", 0, "Stop Mode Down", ""},
{WALK_MODAL_DIR_UP_STOP, "UP_STOP", 0, "Stop Move Global Up", ""},
{WALK_MODAL_DIR_DOWN_STOP, "DOWN_STOP", 0, "Stop Mode Global Down", ""},
{WALK_MODAL_DIR_LOCAL_UP_STOP, "LOCAL_UP_STOP", 0, "Stop Move Local Up", ""},
{WALK_MODAL_DIR_LOCAL_DOWN_STOP, "LOCAL_DOWN_STOP", 0, "Stop Move Local Down", ""},
{WALK_MODAL_TELEPORT, "TELEPORT", 0, "Teleport", "Move forward a few units at once"},
@@ -788,6 +798,12 @@ static void walkEvent(WalkInfo *walk, const wmEvent *event)
case WALK_MODAL_DIR_DOWN:
walk->active_directions |= WALK_BIT_DOWN;
break;
case WALK_MODAL_DIR_LOCAL_UP:
walk->active_directions |= WALK_BIT_LOCAL_UP;
break;
case WALK_MODAL_DIR_LOCAL_DOWN:
walk->active_directions |= WALK_BIT_LOCAL_DOWN;
break;
case WALK_MODAL_DIR_FORWARD_STOP:
walk->active_directions &= ~WALK_BIT_FORWARD;
@@ -807,6 +823,12 @@ static void walkEvent(WalkInfo *walk, const wmEvent *event)
case WALK_MODAL_DIR_DOWN_STOP:
walk->active_directions &= ~WALK_BIT_DOWN;
break;
case WALK_MODAL_DIR_LOCAL_UP_STOP:
walk->active_directions &= ~WALK_BIT_LOCAL_UP;
break;
case WALK_MODAL_DIR_LOCAL_DOWN_STOP:
walk->active_directions &= ~WALK_BIT_LOCAL_DOWN;
break;
case WALK_MODAL_FAST_ENABLE:
walk->is_fast = true;
@@ -1204,9 +1226,10 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm)
add_v3_v3(dvec, dvec_tmp);
}
if ((walk->active_directions & WALK_BIT_UP) || (walk->active_directions & WALK_BIT_DOWN)) {
/* Up and down movement is only available in free mode, not gravity mode. */
if (walk->navigation_mode == WALK_MODE_FREE) {
if (walk->navigation_mode == WALK_MODE_FREE) {
if (walk->active_directions & (WALK_BIT_UP | WALK_BIT_DOWN)) {
direction = 0;
@@ -1215,12 +1238,27 @@ static int walkApply(bContext *C, WalkInfo *walk, bool is_confirm)
}
if (walk->active_directions & WALK_BIT_DOWN) {
direction = 1;
direction += 1;
}
copy_v3_fl3(dvec_tmp, 0.0f, 0.0f, direction);
add_v3_v3(dvec, dvec_tmp);
}
if (walk->active_directions & (WALK_BIT_LOCAL_UP | WALK_BIT_LOCAL_DOWN)) {
direction = 0;
if (walk->active_directions & WALK_BIT_LOCAL_UP) {
direction -= 1;
}
if (walk->active_directions & WALK_BIT_LOCAL_DOWN) {
direction += 1;
}
madd_v3_v3fl(dvec, rv3d->viewinv[1], direction);
}
}
normalize_v3(dvec);