[Bf-blender-cvs] [3113329f792] HMD_viewport: Fix manipulator interaction not using correct projection matrix

Julian Eisel noreply at git.blender.org
Thu Apr 13 01:26:09 CEST 2017


Commit: 3113329f7924c6c879760c81986581c0fd68eebd
Author: Julian Eisel
Date:   Thu Apr 13 01:21:32 2017 +0200
Branches: HMD_viewport
https://developer.blender.org/rB3113329f7924c6c879760c81986581c0fd68eebd

Fix manipulator interaction not using correct projection matrix

Moved matrix setup for interaction into own util function now. Also did
cleanup in related code.

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

M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/intern/screen.c
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/editors/space_view3d/view3d_view.c
M	source/blender/editors/transform/transform_manipulator.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_window.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 14e978b23f2..968d7b9f2f0 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -285,7 +285,7 @@ struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
 void            BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
 void            BKE_screen_area_free(struct ScrArea *sa);
 
-struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type);
+struct ARegion *BKE_area_find_region_type(const struct ScrArea *sa, int type);
 struct ARegion *BKE_area_find_region_active_win(struct ScrArea *sa);
 struct ARegion *BKE_area_find_region_xy(struct ScrArea *sa, const int regiontype, int x, int y);
 struct ScrArea *BKE_screen_find_area_from_space(struct bScreen *sc, struct SpaceLink *sl) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 65cc82fc86e..60626c301ad 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -404,7 +404,7 @@ unsigned int BKE_screen_visible_layers(bScreen *screen, Scene *scene)
 /* ***************** Utilities ********************** */
 
 /* Find a region of the specified type from the given area */
-ARegion *BKE_area_find_region_type(ScrArea *sa, int type)
+ARegion *BKE_area_find_region_type(const ScrArea *sa, int type)
 {
 	if (sa) {
 		ARegion *ar;
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index ebb32e9dc1f..04214cb4b8e 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -374,6 +374,10 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(
 struct Base *ED_view3d_give_base_under_cursor(struct bContext *C, const int mval[2]);
 void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, bool do_clip);
 void ED_view3d_update_viewmat(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, float viewmat[4][4], float winmat[4][4]);
+void ED_view3d_setup_interaction(
+        const struct wmWindowManager *wm, const struct wmWindow *win,
+        struct ARegion *region, struct View3D *v3d, struct RegionView3D *rv3d,
+        struct Scene *scene, const rcti *viewplane_rect);
 bool ED_view3d_quat_from_axis_view(const char view, float quat[4]);
 char ED_view3d_quat_to_axis_view(const float quat[4], const float epsilon);
 char ED_view3d_lock_view_from_index(int index);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 7b9a09e1f3b..e1ec7538937 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -105,6 +105,15 @@
 #include "view3d_intern.h"  /* own include */
 
 /* prototypes */
+static void view3d_hmd_view_setup(
+        Scene *scene, View3D *v3d, ARegion *region);
+static bool view3d_is_hmd_view_mirror(
+        const wmWindowManager *wm, const View3D *v3d, const RegionView3D *rv3d);
+static void view3d_hmd_view_setup_mirrored(
+        const wmWindowManager *wm, Scene *scene, ARegion *region,
+        const rcti *viewplane_rect);
+static void view3d_hmd_view_setup_interaction(
+        Scene *scene, View3D *v3d, ARegion *region, const rcti *viewplane_rect);
 static void view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar);
 static void view3d_stereo3d_setup_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
                                             float winmat[4][4], const char *viewname);
@@ -2838,6 +2847,30 @@ void ED_view3d_update_viewmat(Scene *scene, View3D *v3d, ARegion *ar, float view
 }
 
 /**
+ * \param viewplane_rect optional for picking (can be NULL).
+ */
+void ED_view3d_setup_interaction(
+        const wmWindowManager *wm, const wmWindow *win,
+        ARegion *region, View3D *v3d, RegionView3D *rv3d,
+        Scene *scene, const rcti *viewplane_rect)
+{
+#ifdef WITH_INPUT_HMD
+	if (WM_window_is_running_hmd_view(win)) {
+		view3d_hmd_view_setup_interaction(scene, v3d, region, viewplane_rect);
+	}
+	else if (view3d_is_hmd_view_mirror(wm, v3d, rv3d)) {
+		view3d_hmd_view_setup_mirrored(wm, scene, region, viewplane_rect);
+	}
+	else
+#endif
+	{
+		/* assume updated viewmat here, calculating it may not be cheap. */
+		view3d_winmatrix_set(region, v3d, viewplane_rect);
+		mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
+	}
+}
+
+/**
  * Shared by #ED_view3d_draw_offscreen and #view3d_main_region_draw_objects
  *
  * \note \a C and \a grid_unit will be NULL when \a draw_offscreen is set.
@@ -3757,7 +3790,7 @@ enum HMDViewMatrixType {
 	HMD_MATRIX_CENTER,
 };
 
-bool view3d_is_hmd_view_mirror(const wmWindowManager *wm, const View3D *v3d, const RegionView3D *rv3d)
+static bool view3d_is_hmd_view_mirror(const wmWindowManager *wm, const View3D *v3d, const RegionView3D *rv3d)
 {
 	return wm->hmd_view.hmd_win &&
 	       WM_window_is_running_hmd_view(wm->hmd_view.hmd_win) &&
@@ -3785,6 +3818,7 @@ static void view3d_hmd_calc_projection_matrix_from_device(
 	const float hmd_znear = WM_device_HMD_projection_z_near_get();
 	const float hmd_zfar = WM_device_HMD_projection_z_far_get();
 	const float hmd_fov = WM_device_HMD_FOV_get(is_left);
+	/* force using View3D settings which were overriden by HMD ones, using camera settings would mess up projection */
 	const char rv3d_persp = rv3d->persp;
 
 
@@ -3916,7 +3950,7 @@ static void view3d_hmd_view_setup_ex(
 	view3d_main_region_setup_view(scene, v3d, region, modelviewmat, projmat);
 }
 
-void view3d_hmd_view_setup(Scene *scene, View3D *v3d, ARegion *region)
+static void view3d_hmd_view_setup(Scene *scene, View3D *v3d, ARegion *region)
 {
 	enum HMDViewMatrixType mat_type = (v3d->multiview_eye == STEREO_LEFT_ID) ?
 	                                      HMD_MATRIX_LEFT_EYE : HMD_MATRIX_RIGHT_EYE;
@@ -3931,7 +3965,7 @@ void view3d_hmd_view_setup(Scene *scene, View3D *v3d, ARegion *region)
  *
  * \param viewplane: Optional for picking (can be NULL).
  */
-void view3d_hmd_view_setup_interaction(Scene *scene, View3D *v3d, ARegion *region, const rcti *viewplane_rect)
+static void view3d_hmd_view_setup_interaction(Scene *scene, View3D *v3d, ARegion *region, const rcti *viewplane_rect)
 {
 	view3d_hmd_view_setup_ex(scene, v3d, region->regiondata, region, viewplane_rect, HMD_MATRIX_CENTER);
 }
@@ -3939,10 +3973,12 @@ void view3d_hmd_view_setup_interaction(Scene *scene, View3D *v3d, ARegion *regio
 /*
  * \param viewplane: Optional for picking (can be NULL).
  */
-void view3d_hmd_view_setup_mirrored(wmWindowManager *wm, Scene *scene, ARegion *region, const rcti *viewplane_rect)
+static void view3d_hmd_view_setup_mirrored(
+        const wmWindowManager *wm, Scene *scene, ARegion *region,
+        const rcti *viewplane_rect)
 {
-	wmWindow *hmd_win = wm->hmd_view.hmd_win;
-	ScrArea *sa = hmd_win->screen->areabase.first;
+	const wmWindow *hmd_win = wm->hmd_view.hmd_win;
+	const ScrArea *sa = hmd_win->screen->areabase.first;
 	View3D *v3d_hmd = sa->spacedata.first;
 	ARegion *region_hmd = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
 
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index d7a17a92f0a..68e184469a3 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -208,18 +208,6 @@ void circ(float x, float y, float rad);
 void view3d_update_depths_rect(struct ARegion *ar, struct ViewDepths *d, struct rcti *rect);
 float view3d_depth_near(struct ViewDepths *d);
 
-void view3d_hmd_view_setup(
-        Scene *scene, View3D *v3d, ARegion *ar);
-void view3d_hmd_view_setup_interaction(
-        Scene *scene, View3D *v3d, ARegion *region,
-        const struct rcti *viewplane_rect);
-void view3d_hmd_view_setup_mirrored(
-        struct wmWindowManager *wm, Scene *scene, ARegion *region,
-        const struct rcti *viewplane_rect);
-bool view3d_is_hmd_view_mirror(
-        const struct wmWindowManager *wm, const View3D *v3d,
-        const RegionView3D *rv3d);
-
 /* view3d_select.c */
 void VIEW3D_OT_select(struct wmOperatorType *ot);
 void VIEW3D_OT_select_circle(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 8108e9c402d..03604b77323 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -1150,6 +1150,7 @@ int view3d_opengl_select(
         eV3DSelectMode select_mode)
 {
 	Scene *scene = vc->scene;
+	wmWindowManager *wm = G.main->wm.first;
 	View3D *v3d = vc->v3d;
 	ARegion *ar = vc->ar;
 	rcti rect;
@@ -1204,20 +1205,7 @@ int view3d_opengl_select(
 
 	G.f |= G_PICKSEL;
 
-#ifdef WITH_INPUT_HMD
-	wmWindowManager *wm = G.main->wm.first;
-	if (WM_window_is_running_hmd_view(vc->win)) {
-		view3d_hmd_view_setup_interaction(scene, v3d, ar, &rect);
-	}
-	else if (view3d_is_hmd_view_mirror(wm, v3d, vc->rv3d)) {
-		view3d_hmd_view_setup_mirrored(wm, scene, ar, &rect);
-	}
-	else
-#endif
-	{
-		view3d_winmatrix_set(ar, v3d, &rect);
-		mul_m4_m4m4(vc->rv3d->persmat, vc->rv3d->winmat, vc->rv3d->viewmat);
-	}
+	ED_view3d_setup_interaction(wm, vc->win, ar, v3d, vc->rv3d, scene, &rect);
 
 	if (v3d->drawtype > OB_WIRE) {
 		v3d->zbuf = true;
@@ -1243,8 +1231,7 @@ int view3d_opengl_select(
 	}
 
 	G.f &= ~G_PICKSEL;
-	view3d_winmatrix_set(ar, v3d, NULL);
-	mul_m4_m4m4(vc->rv3d->persmat, vc->rv3d->winmat, vc->rv3d->viewmat);
+	ED_view3d_setup_interaction(wm, vc->win, ar, v3d, vc->rv3d, scene, NULL);
 	
 	if (v3d->drawtype > OB_WIRE) {
 		v3d->zbuf = 0;
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 0a984d90ae3..06aae4084dc 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1720,7 +1720,10 @@ void BIF_draw_manipulator(const bContext *C)
 	}
 }
 
-static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const int mval[2], float 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list