Commit: e4bc3bac37dab7ec1bb60e61b04c3629cf9dd837
Author: Julian Eisel
Date:   Fri Mar 11 03:05:14 2016 +0100
Branches: HMD_viewport
https://developer.blender.org/rBe4bc3bac37dab7ec1bb60e61b04c3629cf9dd837

Use modal handler for HMD session

Also some cleanup.

===================================================================

M       source/blender/editors/interface/interface_handlers.c
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
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_event_system.c
M       source/blender/windowmanager/intern/wm_operators.c
M       source/blender/windowmanager/intern/wm_window.c
M       source/blender/windowmanager/wm_event_types.h

===================================================================

diff --git a/source/blender/editors/interface/interface_handlers.c 
b/source/blender/editors/interface/interface_handlers.c
index 671b9a7..89f718b 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -9836,16 +9836,6 @@ static int ui_region_handler(bContext *C, const wmEvent 
*event, void *UNUSED(use
        /* delayed apply callbacks */
        ui_apply_but_funcs_after(C);
 
-       if (event->type == EVT_VR_TRANSFORM) {
-        float* trans = event->customdata;
-/*
-        printf("Got EVT_VR_TRANSFORM event, transform is w x y z %f %f %f 
%f\n",
-               trans[0],
-               trans[1],
-               trans[2],
-               trans[3]);*/
-       }
-
        return retval;
 }
 
diff --git a/source/blender/editors/space_view3d/view3d_edit.c 
b/source/blender/editors/space_view3d/view3d_edit.c
index ede051e..b882ffa 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -4844,53 +4844,77 @@ void VIEW3D_OT_hmd_refresh(wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_INTERNAL;
 }
+static void hmd_run_exit(wmWindow *win, Scene *scene)
+{
+       scene->flag &= ~SCE_HMD_RUNNING;
+       WM_window_fullscreen_toggle(win, false, true);
+}
 
-static int hmd_refresh_exec(bContext *C, wmOperator *op)
+static int hmd_session_run_modal(bContext *C, wmOperator *op, const wmEvent 
*event)
 {
-       wmWindowManager *wm = CTX_wm_manager(C);
-       wmWindow *win;
+       wmWindow *win = op->customdata;
        Scene *scene = CTX_data_scene(C);
 
-       for (win = wm->windows.first; win; win = win->next) {
-               if (win->screen->flag & SCREEN_FLAG_HMD_SCREEN) {
-                       break;
+       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));
+                       }
+                       return OPERATOR_RUNNING_MODAL;
                }
+               case ESCKEY:
+                       hmd_run_exit(win, scene);
+                       return OPERATOR_FINISHED;
        }
-       /* Sanity */
-       if (!win)
-               return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
 
-       wmWindow *winstore = CTX_wm_window(C);
-       ScrArea *sastore = CTX_wm_area(C);
-       ARegion *arstore = CTX_wm_region(C);
-       CTX_wm_window_set(C, win);
-       CTX_wm_area_set(C, win->screen->areabase.first);
-       CTX_wm_region_set(C, 
BKE_area_find_region_type(win->screen->areabase.first, RGN_TYPE_WINDOW));
-       WM_operator_name_call(C, "WM_OT_window_fullscreen_toggle", 
WM_OP_EXEC_DEFAULT, NULL);
-       View3D *v3d = CTX_wm_view3d(C);
-       RegionView3D *rv3d = CTX_wm_region_view3d(C);
-       const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
-       
-       if ((rv3d->viewlock & RV3D_LOCKED) == 0) {
-               if (rv3d->persp != RV3D_CAMOB) {
-                       Object *ob = OBACT;
+       return OPERATOR_PASS_THROUGH;
+}
 
-                       if (!rv3d->smooth_timer) {
-                               /* store settings of current view before 
allowing overwriting with camera view
-                                * only if we're not currently in a view 
transition */
-                               
-                               ED_view3d_lastview_store(rv3d);
-                       }
+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);
+       const bool was_hmd_running = (scene->flag & SCE_HMD_RUNNING);
 
-#if 0
-                       if (G.qual == LR_ALTKEY) {
-                               if (oldcamera && 
is_an_active_object(oldcamera)) {
-                                       v3d->camera = oldcamera;
-                               }
-                               handle_view3d_lock();
+       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;
                        }
-#endif
-                       
+               }
+       }
+       if (!win) {
+               BLI_assert(0);
+               return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
+       }
+
+       scene->flag ^= SCE_HMD_RUNNING;
+       if (was_hmd_running) {
+               WM_window_fullscreen_toggle(win, false, true);
+               BLI_assert(0);
+               return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
+       }
+       else {
+               ScrArea *sa = 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);
+
+               if (rv3d->persp != RV3D_CAMOB) {
+                       Object *ob = OBACT;
                        /* first get the default camera for the view lock type 
*/
                        if (v3d->scenelock) {
                                /* sets the camera view if available */
@@ -4902,47 +4926,32 @@ static int hmd_refresh_exec(bContext *C, wmOperator *op)
                                        v3d->camera = scene->camera;
                                }
                        }
-                       
                        /* if the camera isn't found, check a number of options 
*/
                        if (v3d->camera == NULL && ob && ob->type == OB_CAMERA)
                                v3d->camera = ob;
-                       
                        if (v3d->camera == NULL)
                                v3d->camera = BKE_scene_camera_find(scene);
-                       
-                       /* couldnt find any useful camera, bail out */
-                       if (v3d->camera == NULL)
-                               return OPERATOR_CANCELLED;
-                       
-                       /* important these don't get out of sync for locked 
scenes */
-                       if (v3d->scenelock)
-                               scene->camera = v3d->camera;
-                       
-                       /* finally do snazzy view zooming */
-                       rv3d->persp = RV3D_CAMOB;
-                       ED_view3d_smooth_view(
-                                   C, v3d, CTX_wm_region(C), smooth_viewtx,
-                                   &(const V3D_SmoothParams) {
-                                       .camera = v3d->camera, .ofs = 
rv3d->ofs, .quat = rv3d->viewquat,
-                                       .dist = &rv3d->dist, .lens = 
&v3d->lens});
+                       if (v3d->camera)
+                               rv3d->persp = RV3D_CAMOB;
                }
+
+               op->customdata = win;
+               WM_window_fullscreen_toggle(win, true, false);
+               WM_event_add_modal_handler(C, op);
+               return OPERATOR_RUNNING_MODAL;
        }
-       CTX_wm_region_set(C, arstore);
-       CTX_wm_area_set(C, sastore);
-       CTX_wm_window_set(C, winstore);
-       scene->flag ^= SCE_HMD_RUNNING;
-       return OPERATOR_FINISHED;
 }
 
-void VIEW3D_OT_hmd_run(wmOperatorType *ot)
+void VIEW3D_OT_hmd_session_run(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name = "Run HMD Session";
        ot->description = "Start/Stop a head mounted display (virtual reality) 
session";
-       ot->idname = "VIEW3D_OT_hmd_run";
+       ot->idname = "VIEW3D_OT_hmd_session_run";
 
        /* api callbacks */
-       ot->exec = hmd_refresh_exec;
+       ot->invoke = hmd_session_run_invoke;
+       ot->modal = hmd_session_run_modal;
 
        /* 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 f00a111..e6f9904 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -103,8 +103,7 @@ void VIEW3D_OT_enable_manipulator(struct wmOperatorType 
*ot);
 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_refresh(struct wmOperatorType *ot);
-void VIEW3D_OT_hmd_run(struct wmOperatorType *ot);
+void VIEW3D_OT_hmd_session_run(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 a5d9212..6dc4894 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -218,8 +218,7 @@ void view3d_operatortypes(void)
        WM_operatortype_append(VIEW3D_OT_snap_cursor_to_center);
        WM_operatortype_append(VIEW3D_OT_snap_cursor_to_selected);
        WM_operatortype_append(VIEW3D_OT_snap_cursor_to_active);
-       WM_operatortype_append(VIEW3D_OT_hmd_refresh);
-       WM_operatortype_append(VIEW3D_OT_hmd_run);
+       WM_operatortype_append(VIEW3D_OT_hmd_session_run);
 
        transform_operatortypes();
 }
@@ -506,8 +505,6 @@ void view3d_keymap(wmKeyConfig *keyconf)
        
        WM_keymap_add_menu(keymap, "VIEW3D_MT_snap", SKEY, KM_PRESS, KM_SHIFT, 
0);
        
-       WM_keymap_add_item(keymap, "VIEW3D_OT_hmd_refresh", EVT_VR_TRANSFORM, 
KM_ANY, 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);
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index eba411b..8386ce2 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -100,7 +100,9 @@ enum {
 
 struct wmWindow        *WM_window_open(struct bContext *C, const struct rcti 
*rect);
 struct wmWindow *WM_window_open_temp(struct bContext *C, const struct rcti 
*rect_init, int type);
-                       
+
+void WM_window_fullscreen_toggle(const struct wmWindow *win, const bool 
force_full, const bool force_normal);
+
                        /* returns true if draw method is triple buffer */
 bool           WM_is_draw_triple(struct wmWindow *win);
 
diff --git a/source/blender/windowmanager/intern/wm_event_system.c 
b/source/blender/windowmanager/intern/wm_event_system.c
index 906f9b2..60ec983 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -3504,7 +3504,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, 
wmWindow *win, int type, int U
         {
             GHOST_TEventOpenHMDData *e = customdata;
 
-            event.type = EVT_VR_TRANSFORM;
+            event.type = EVT_HMD_TRANSFORM;
             event.customdata = e->orientation;
 
             wm_event_add(win, &event);
diff --git a/source/blender/windowmanager/intern/wm_operators.c 
b/source/blender/windowmanager/intern/wm_operators.c
index e7bbb5b..b96dfc3 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -5097,7 +5097,7 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
-static int wm_md_view_open_invoke(bContext *C, wmOperator *UNUSED(op), const 
wmEvent *UNUSED(event))
+static int wm_hmd_view_open_invoke(bContext *C, wmOperator *UNUSED

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to