[Bf-blender-cvs] [8581f9e] epic-navigation: Support for non-modal navigation (arrows)
Dalai Felinto
noreply at git.blender.org
Fri Nov 14 00:00:40 CET 2014
Commit: 8581f9e7f392a360c8d1d3618e6b1ac25dd14a78
Author: Dalai Felinto
Date: Thu Nov 13 20:44:31 2014 -0200
Branches: epic-navigation
https://developer.blender.org/rB8581f9e7f392a360c8d1d3618e6b1ac25dd14a78
Support for non-modal navigation (arrows)
===================================================================
M source/blender/editors/space_view3d/view3d_walk.c
===================================================================
diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c
index e85d4a0..28e693f 100644
--- a/source/blender/editors/space_view3d/view3d_walk.c
+++ b/source/blender/editors/space_view3d/view3d_walk.c
@@ -64,6 +64,7 @@
/* prototypes */
static float getVelocityZeroTime(const float gravity, const float velocity);
+static void walk_non_modal(struct bContext *C, struct wmOperator *op);
/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
enum {
@@ -102,6 +103,17 @@ typedef enum {
WALK_BIT_DOWN = 1 << 5,
} eWalkDirectionFlag;
+typedef enum eWalkKeyMode{
+ WALK_KEY_MODAL = 0,
+ WALK_KEY_FORWARD = 1 << 1,
+ WALK_KEY_BACKWARD = 1 << 2,
+ WALK_KEY_LEFT = 1 << 3,
+ WALK_KEY_RIGHT = 1 << 4,
+ WALK_KEY_UP = 1 << 5,
+ WALK_KEY_DOWN = 1 << 6,
+ WALK_KEY_STOP = 1 << 7,
+} eWalkKeyMode;
+
typedef enum eWalkTeleportState {
WALK_TELEPORT_STATE_OFF = 0,
WALK_TELEPORT_STATE_ON,
@@ -277,6 +289,8 @@ typedef struct WalkInfo {
eWalkMouseMode mouse_mode;
+ bool is_modal;
+
/* teleport */
WalkTeleport teleport;
@@ -379,7 +393,9 @@ static void walk_navigation_mode_set(bContext *C, WalkInfo *walk, eWalkMethod mo
walk->gravity_state = WALK_GRAVITY_STATE_START;
}
- walk_update_header(C, walk);
+ if (walk->is_modal) {
+ walk_update_header(C, walk);
+ }
}
/**
@@ -508,6 +524,9 @@ static bool initWalkInfo(bContext *C, WalkInfo *walk, wmOperator *op, const wmEv
walk->is_slow = false;
walk->grid = 1.f / walk->scene->unit.scale_length;
+ walk->mouse_mode = RNA_enum_get(op->ptr, "mouse_mode");
+ walk->is_modal = RNA_enum_get(op->ptr, "key_mode") == WALK_KEY_MODAL;
+
/* user preference settings */
walk->teleport.duration = U.walk_navigation.teleport_time;
walk->mouse_speed = U.walk_navigation.mouse_speed;
@@ -540,18 +559,16 @@ static bool initWalkInfo(bContext *C, WalkInfo *walk, wmOperator *op, const wmEv
#endif
zero_v3(walk->dvec_prev);
- walk->timer = WM_event_add_timer(CTX_wm_manager(C), win, TIMER, 0.01f);
+ walk->timer = NULL;
walk->ndof = NULL;
walk->time_lastdraw = PIL_check_seconds_timer();
- walk->draw_handle_pixel = ED_region_draw_cb_activate(walk->ar->type, drawWalkPixel, walk, REGION_DRAW_POST_PIXEL);
+ walk->draw_handle_pixel = NULL;
walk->rv3d->rflag |= RV3D_NAVIGATING;
- walk->mouse_mode = RNA_enum_get(op->ptr, "mouse_mode");
-
walk->v3d_camera_control = ED_view3d_cameracontrol_acquire(
walk->scene, walk->v3d, walk->rv3d,
(U.uiflag & USER_CAM_LOCK_NO_PARENT) == 0);
@@ -566,12 +583,18 @@ static bool initWalkInfo(bContext *C, WalkInfo *walk, wmOperator *op, const wmEv
walk->init_mval[0] = event->x;
walk->init_mval[1] = event->y;
- WM_cursor_warp(win,
- walk->ar->winrct.xmin + walk->center_mval[0],
- walk->ar->winrct.ymin + walk->center_mval[1]);
+ if (walk->is_modal) {
+ walk->timer = WM_event_add_timer(CTX_wm_manager(C), win, TIMER, 0.01f);
+
+ walk->draw_handle_pixel = ED_region_draw_cb_activate(walk->ar->type, drawWalkPixel, walk, REGION_DRAW_POST_PIXEL);
- /* remove the mouse cursor temporarily */
- WM_cursor_modal_set(win, CURSOR_NONE);
+ WM_cursor_warp(win,
+ walk->ar->winrct.xmin + walk->center_mval[0],
+ walk->ar->winrct.ymin + walk->center_mval[1]);
+
+ /* remove the mouse cursor temporarily */
+ WM_cursor_modal_set(win, CURSOR_NONE);
+ }
return true;
}
@@ -591,10 +614,6 @@ static int walkEnd(bContext *C, WalkInfo *walk)
win = CTX_wm_window(C);
rv3d = walk->rv3d;
- WM_event_remove_timer(CTX_wm_manager(C), win, walk->timer);
-
- ED_region_draw_cb_exit(walk->ar->type, walk->draw_handle_pixel);
-
ED_view3d_cameracontrol_release(walk->v3d_camera_control, walk->state == WALK_CANCEL);
rv3d->rflag &= ~RV3D_NAVIGATING;
@@ -602,11 +621,18 @@ static int walkEnd(bContext *C, WalkInfo *walk)
if (walk->ndof)
MEM_freeN(walk->ndof);
- /* restore the cursor */
- WM_cursor_modal_restore(win);
- /* center the mouse */
- WM_cursor_warp(win, walk->init_mval[0], walk->init_mval[1]);
+ if (walk->is_modal) {
+ WM_event_remove_timer(CTX_wm_manager(C), win, walk->timer);
+
+ ED_region_draw_cb_exit(walk->ar->type, walk->draw_handle_pixel);
+
+ /* restore the cursor */
+ WM_cursor_modal_restore(win);
+
+ /* center the mouse */
+ WM_cursor_warp(win, walk->init_mval[0], walk->init_mval[1]);
+ }
if (walk->state == WALK_CONFIRM) {
MEM_freeN(walk);
@@ -1067,14 +1093,20 @@ static int walkApply(bContext *C, WalkInfo *walk)
/* time how fast it takes for us to redraw,
* this is so simple scenes don't walk too fast */
double time_current;
- float time_redraw;
+ float time_redraw = 1.0f;
#ifdef NDOF_WALK_DRAW_TOOMUCH
walk->redraw = 1;
#endif
- time_current = PIL_check_seconds_timer();
- time_redraw = (float)(time_current - walk->time_lastdraw);
- walk->time_lastdraw = time_current;
+ if (walk->is_modal) {
+ time_current = PIL_check_seconds_timer();
+ time_redraw = (float)(time_current - walk->time_lastdraw);
+ walk->time_lastdraw = time_current;
+ }
+ else {
+ /* TODO - handle redraw for non-modal */
+ time_redraw = 0.1f;
+ }
/* base speed in m/s */
walk->speed = WALK_MOVE_SPEED;
@@ -1374,6 +1406,11 @@ static int walk_invoke(bContext *C, wmOperator *op, const wmEvent *event)
return OPERATOR_CANCELLED;
}
+ if (walk->is_modal == false) {
+ walk_non_modal(C, op);
+ return OPERATOR_FINISHED;
+ }
+
walkEvent(C, op, walk, event);
WM_event_add_modal_handler(C, op);
@@ -1433,6 +1470,43 @@ static int walk_modal(bContext *C, wmOperator *op, const wmEvent *event)
return exit_code;
}
+static void walk_non_modal(bContext *C, wmOperator *op)
+{
+ WalkInfo *walk = op->customdata;
+
+ RegionView3D *rv3d = walk->rv3d;
+ Object *walk_object = ED_view3d_cameracontrol_object_get(walk->v3d_camera_control);
+
+ eWalkKeyMode keymode = RNA_enum_get(op->ptr, "key_mode");
+ walk->active_directions = 0;
+
+ if ((keymode & WALK_KEY_FORWARD))
+ walk->active_directions |= WALK_BIT_FORWARD;
+ else if ((keymode & WALK_KEY_BACKWARD))
+ walk->active_directions |= WALK_BIT_BACKWARD;
+
+ if ((keymode & WALK_KEY_LEFT))
+ walk->active_directions |= WALK_BIT_LEFT;
+ else if ((keymode & WALK_KEY_RIGHT))
+ walk->active_directions |= WALK_BIT_RIGHT;
+
+ if ((keymode & WALK_KEY_UP))
+ walk->active_directions |= WALK_BIT_UP;
+ else if ((keymode & WALK_KEY_DOWN))
+ walk->active_directions |= WALK_BIT_DOWN;
+
+ walkApply(C, walk);
+ walk->state = WALK_CONFIRM;
+ walkEnd(C, walk);
+
+ if (rv3d->persp == RV3D_CAMOB) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, walk_object);
+ }
+
+ // puts("redraw!"); // too frequent, commented with NDOF_WALK_DRAW_TOOMUCH for now
+ ED_region_tag_redraw(CTX_wm_region(C));
+}
+
static EnumPropertyItem walk_navigation_mouse_mode_items[] = {
{WALK_MOUSE_LOOKAROUND, "LOOK_AROUND", 0, "Look Around", "Rotates the viewport camera"},
{WALK_MOUSE_MOVEHORIZONTAL, "MOVE_HORIZONTAL", 0, "Move Horizontally", "Moves the camera forward and backward and rotates left and right"},
@@ -1440,6 +1514,22 @@ static EnumPropertyItem walk_navigation_mouse_mode_items[] = {
{0, NULL, 0, NULL, NULL}
};
+static EnumPropertyItem walk_navigation_key_mode_items[] = {
+ {WALK_KEY_MODAL, "MODAL", 0, "Modal", ""},
+ {WALK_KEY_FORWARD, "MOVE_FORWARD", 0, "Move Forward", ""},
+ {WALK_KEY_BACKWARD, "MOVE_BACKWARD", 0, "Move Backward", ""},
+ {WALK_KEY_LEFT, "MOVE_LEFT", 0, "Move Left", ""},
+ {WALK_KEY_RIGHT, "MOVE_RIGHT", 0, "Move Right", ""},
+ {WALK_KEY_UP, "MOVE_UP", 0, "Move Up", ""},
+ {WALK_KEY_DOWN, "MOVE_DOWN", 0, "Move Down", ""},
+ {WALK_KEY_FORWARD | WALK_KEY_LEFT, "MOVE_FORWARD_LEFT", 0, "Move Forward Left", ""},
+ {WALK_KEY_FORWARD | WALK_KEY_RIGHT, "MOVE_FORWARD_RIGHT", 0, "Move Forward Right", ""},
+ {WALK_KEY_BACKWARD | WALK_KEY_LEFT, "MOVE_BACKWARD_LEFT", 0, "Move Backward Left", ""},
+ {WALK_KEY_BACKWARD | WALK_KEY_RIGHT, "MOVE_BACKWARD_RIGHT", 0, "Move Backward Right", ""},
+ {WALK_KEY_STOP, "MOVE_STOP", 0, "Move Stop", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
void VIEW3D_OT_walk(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -1458,6 +1548,8 @@ void VIEW3D_OT_walk(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_BLOCKING;
- prop = RNA_def_enum(ot->srna, "mouse_mode", walk_navigation_mouse_mode_items, WALK_MOUSE_LOOKAROUND, "Mode", "");
+ prop = RNA_def_enum(ot->srna, "mouse_mode", walk_navigation_mouse_mode_items, WALK_MOUSE_LOOKAROUND, "Mouse Mode", "");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_enum(ot->srna, "key_mode", walk_navigation_key_mode_items, WALK_KEY_MODAL, "Key Mode", "");
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
More information about the Bf-blender-cvs
mailing list