[Bf-blender-cvs] [b8d2c0d] HMD_viewport: Allow cursor to be in any window without stopping HMD update
Julian Eisel
noreply at git.blender.org
Wed Mar 16 16:11:03 CET 2016
Commit: b8d2c0da47edb3d6f0a8d30f5f71a17ebc9c804a
Author: Julian Eisel
Date: Fri Mar 11 04:18:48 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rBb8d2c0da47edb3d6f0a8d30f5f71a17ebc9c804a
Allow cursor to be in any window without stopping HMD update
===================================================================
M source/blender/editors/space_view3d/view3d_edit.c
M source/blender/editors/space_view3d/view3d_intern.h
M source/blender/editors/space_view3d/view3d_ops.c
===================================================================
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 0fcda48..082717e 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -4806,37 +4806,60 @@ typedef struct HMDData {
float orientation[4];
} HMDData;
-static void hmd_run_exit(wmWindow *win, Scene *scene)
+static void hmd_session_refresh(bContext *C, wmWindow *hmd_win, Scene *scene, HMDData *data)
+{
+ if (scene->r.scemode & R_HMD_IGNORE_ROT)
+ return;
+
+ View3D *v3d = CTX_wm_view3d(C);
+ Object *camera_ob = v3d ? v3d->camera : scene->camera;
+ static float quad[4] = {M_SQRT1_2, M_SQRT1_2, 0.0f, 0.0f};
+
+ mul_qt_qtqt(camera_ob->quat, quad, data->orientation);
+ normalize_qt(camera_ob->quat);
+ loc_quat_size_to_mat4(camera_ob->obmat, camera_ob->loc, camera_ob->quat, camera_ob->size);
+
+ DAG_id_tag_update(&camera_ob->id, 0); /* sets recalc flags */
+ /* tag hmd region for update */
+ ScrArea *sa = hmd_win->screen->areabase.first;
+ ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+ ED_region_tag_redraw(ar);
+}
+
+static wmWindow *hmd_window_find(bContext *C)
+{
+ wmWindowManager *wm = CTX_wm_manager(C);
+ wmWindow *hmd_win = CTX_wm_window(C);
+
+ if (hmd_win->screen->flag & SCREEN_FLAG_HMD_SCREEN)
+ return hmd_win;
+
+ for (hmd_win = wm->windows.first; hmd_win; hmd_win = hmd_win->next) {
+ if (hmd_win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
+ return hmd_win;
+ }
+ }
+
+ return NULL;
+}
+
+static void hmd_run_exit(wmWindow *hmd_win, Scene *scene)
{
scene->flag &= ~SCE_HMD_RUNNING;
- WM_window_fullscreen_toggle(win, false, true);
+ WM_window_fullscreen_toggle(hmd_win, false, true);
}
static int hmd_session_run_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
- wmWindow *win = op->customdata;
+ wmWindow *hmd_win = op->customdata;
Scene *scene = CTX_data_scene(C);
switch (event->type) {
case EVT_HMD_TRANSFORM:
- {
- if ((scene->r.scemode & R_HMD_IGNORE_ROT) == 0) {
- View3D *v3d = CTX_wm_view3d(C);
- Object *camera_ob = v3d ? v3d->camera : scene->camera;
- HMDData *data = event->customdata;
- static float quad[4] = {M_SQRT1_2, M_SQRT1_2, 0.0f, 0.0f};
-
- mul_qt_qtqt(camera_ob->quat, quad, data->orientation);
- normalize_qt(camera_ob->quat);
- loc_quat_size_to_mat4(camera_ob->obmat, camera_ob->loc, camera_ob->quat, camera_ob->size);
-
- DAG_id_tag_update(&camera_ob->id, 0); /* sets recalc flags */
- ED_region_tag_redraw(CTX_wm_region(C));
- }
+ hmd_session_refresh(C, hmd_win, scene, event->customdata);
return OPERATOR_RUNNING_MODAL;
- }
case ESCKEY:
- hmd_run_exit(win, scene);
+ hmd_run_exit(hmd_win, scene);
return OPERATOR_FINISHED;
}
@@ -4846,34 +4869,27 @@ static int hmd_session_run_modal(bContext *C, wmOperator *op, const wmEvent *eve
static int hmd_session_run_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
Scene *scene = CTX_data_scene(C);
- wmWindow *win = CTX_wm_window(C);
+ wmWindow *hmd_win = hmd_window_find(C);
const bool was_hmd_running = (scene->flag & SCE_HMD_RUNNING);
- if (!win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
- wmWindowManager *wm = CTX_wm_manager(C);
- for (win = wm->windows.first; win; win = win->next) {
- if (win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
- break;
- }
- }
- }
- if (!win) {
+ if (!hmd_win) {
return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
}
scene->flag ^= SCE_HMD_RUNNING;
if (was_hmd_running) {
- WM_window_fullscreen_toggle(win, false, true);
+ WM_window_fullscreen_toggle(hmd_win, false, true);
BLI_assert(0);
return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
}
else {
- ScrArea *sa = win->screen->areabase.first;
+ ScrArea *sa = hmd_win->screen->areabase.first;
ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
View3D *v3d = sa->spacedata.first;
RegionView3D *rv3d = ar->regiondata;
BLI_assert(sa->spacetype = SPACE_VIEW3D);
+ /* XXX duplicated code from viewnumpad_exec */
if (rv3d->persp != RV3D_CAMOB) {
Object *ob = OBACT;
/* first get the default camera for the view lock type */
@@ -4896,21 +4912,10 @@ static int hmd_session_run_invoke(bContext *C, wmOperator *op, const wmEvent *UN
rv3d->persp = RV3D_CAMOB;
}
- op->customdata = win;
- WM_window_fullscreen_toggle(win, true, false);
+ op->customdata = hmd_win;
+ WM_window_fullscreen_toggle(hmd_win, true, false);
- {
- wmWindow *win_store = CTX_wm_window(C);
- ScrArea *sa_store = CTX_wm_area(C);
- ARegion *ar_store = CTX_wm_region(C);
- CTX_wm_window_set(C, win);
- CTX_wm_area_set(C, sa);
- CTX_wm_region_set(C, ar);
- WM_event_add_modal_handler(C, op);
- CTX_wm_region_set(C, ar_store);
- CTX_wm_area_set(C, sa_store);
- CTX_wm_window_set(C, win_store);
- }
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
}
@@ -4925,6 +4930,28 @@ void VIEW3D_OT_hmd_session_run(wmOperatorType *ot)
/* api callbacks */
ot->invoke = hmd_session_run_invoke;
ot->modal = hmd_session_run_modal;
+}
+
+static int hmd_session_refresh_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
+{
+ wmWindow *hmd_win = hmd_window_find(C);
+ hmd_session_refresh(C, hmd_win, CTX_data_scene(C), event->customdata);
+ return OPERATOR_FINISHED;
+}
+
+/**
+ * Only needed since VIEW3D_OT_hmd_session_run modal can only update while
+ * mouse is inside initial window. For other windows, this is called.
+ */
+void VIEW3D_OT_hmd_session_refresh(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Refresh HMD Session";
+ ot->description = "Refresh data for a head mounted display (virtual reality) session";
+ ot->idname = "VIEW3D_OT_hmd_session_refresh";
+
+ /* api callbacks */
+ ot->invoke = hmd_session_refresh_invoke;
/* flags */
ot->flag = OPTYPE_INTERNAL;
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index e6f9904..9240952 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -104,6 +104,7 @@ void VIEW3D_OT_render_border(struct wmOperatorType *ot);
void VIEW3D_OT_clear_render_border(struct wmOperatorType *ot);
void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
void VIEW3D_OT_hmd_session_run(struct wmOperatorType *ot);
+void VIEW3D_OT_hmd_session_refresh(struct wmOperatorType *ot);
void view3d_boxview_copy(ScrArea *sa, ARegion *ar);
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index 6dc4894..ec31981 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -219,6 +219,7 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_snap_cursor_to_selected);
WM_operatortype_append(VIEW3D_OT_snap_cursor_to_active);
WM_operatortype_append(VIEW3D_OT_hmd_session_run);
+ WM_operatortype_append(VIEW3D_OT_hmd_session_refresh);
transform_operatortypes();
}
@@ -504,7 +505,9 @@ void view3d_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "VIEW3D_OT_object_as_camera", PAD0, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_menu(keymap, "VIEW3D_MT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
-
+
+ WM_keymap_add_item(keymap, "VIEW3D_OT_hmd_session_refresh", EVT_HMD_TRANSFORM, 0, KM_ANY, 0);
+
#ifdef __APPLE__
WM_keymap_add_item(keymap, "VIEW3D_OT_copybuffer", CKEY, KM_PRESS, KM_OSKEY, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_pastebuffer", VKEY, KM_PRESS, KM_OSKEY, 0);
More information about the Bf-blender-cvs
mailing list