[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