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:
committed by
Campbell Barton
parent
b177f27e6f
commit
c62009a6ac
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user