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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to