[Bf-blender-cvs] [e4bc3ba] HMD_viewport: Use modal handler for HMD session

Julian Eisel noreply at git.blender.org
Wed Mar 16 16:10:58 CET 2016


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. @@




More information about the Bf-blender-cvs mailing list