Commit: 2f0d8e799aa264267c5dbaf3a48b6b2375b11ace
Author: Julian Eisel
Date:   Sun Mar 5 18:31:17 2017 +0100
Branches: HMD_viewport
https://developer.blender.org/rB2f0d8e799aa264267c5dbaf3a48b6b2375b11ace

Use view orientation data from current 3D view for creating HMD view

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

M       source/blender/editors/include/ED_view3d.h
M       source/blender/editors/space_view3d/view3d_view.c
M       source/blender/windowmanager/intern/wm_operators.c

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

diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index 79176d9e9c..fd69a911b7 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -360,6 +360,7 @@ char ED_view3d_quat_to_axis_view(const float quat[4], const 
float epsilon);
 char ED_view3d_lock_view_from_index(int index);
 char ED_view3d_axis_view_opposite(char view);
 bool ED_view3d_lock(struct RegionView3D *rv3d);
+void ED_view3d_copy_region_view_data(const struct RegionView3D *src, struct 
RegionView3D *dst);
 
 uint64_t ED_view3d_datamask(const struct Scene *scene, const struct View3D 
*v3d);
 uint64_t ED_view3d_screen_datamask(const struct bScreen *screen);
diff --git a/source/blender/editors/space_view3d/view3d_view.c 
b/source/blender/editors/space_view3d/view3d_view.c
index 8582952d1a..8c2b342b35 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -1024,6 +1024,25 @@ bool ED_view3d_lock(RegionView3D *rv3d)
        return ED_view3d_quat_from_axis_view(rv3d->view, rv3d->viewquat);
 }
 
+/**
+ * Copy all view navigation/orientation related data from \a src into \a dst. 
Local view data is not included.
+ */
+void ED_view3d_copy_region_view_data(const RegionView3D *src, RegionView3D 
*dst)
+{
+       copy_v4_v4(dst->viewquat, src->viewquat);
+       copy_v3_v3(dst->ofs, src->ofs);
+       copy_v4_v4(dst->lviewquat, src->lviewquat);
+       dst->dist = src->dist;
+       dst->camdx = src->camdx;
+       dst->camdy = src->camdy;
+       dst->pixsize = src->pixsize;
+       dst->camzoom = src->camzoom;
+       dst->persp = src->persp;
+       dst->view = src->view;
+       dst->lpersp = src->lpersp;
+       dst->lview = src->lview;
+}
+
 /* don't set windows active in here, is used by renderwin too */
 void view3d_viewmatrix_set(Scene *scene, const View3D *v3d, RegionView3D *rv3d)
 {
diff --git a/source/blender/windowmanager/intern/wm_operators.c 
b/source/blender/windowmanager/intern/wm_operators.c
index 2a3f333e44..14b01bfc1e 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -4130,25 +4130,25 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
 /* ******************************************************* */
 /* Head Mounted Display */
 
-static void hmd_view_prepare_screen(wmWindowManager *wm, wmWindow *win)
+static void hmd_view_prepare_screen(wmWindowManager *wm, wmWindow *win, const 
RegionView3D *rv3d_current)
 {
-       ScrArea *sa = win->screen->areabase.first;
-       View3D *v3d = sa->spacedata.first;
-       RegionView3D *rv3d = BKE_area_find_region_type(sa, 
RGN_TYPE_WINDOW)->regiondata;
+       ScrArea *sa_hmd = win->screen->areabase.first;
+       View3D *v3d_hmd = sa_hmd->spacedata.first;
+       RegionView3D *rv3d_hmd = BKE_area_find_region_type(sa_hmd, 
RGN_TYPE_WINDOW)->regiondata;
 
-       BLI_assert(sa->spacetype == SPACE_VIEW3D);
+       BLI_assert(sa_hmd->spacetype == SPACE_VIEW3D);
 
        /* sync view options */
-       v3d->drawtype = wm->hmd_view.view_shade;
+       v3d_hmd->drawtype = wm->hmd_view.view_shade;
        if (U.hmd_settings.lensdist_shader != GPU_FX_LENSDIST_NONE) {
-               v3d->fx_settings.fx_flag |= GPU_FX_FLAG_LensDist;
+               v3d_hmd->fx_settings.fx_flag |= GPU_FX_FLAG_LensDist;
                /* Set distortion type for 3D View but first we need to 
validate fx settings. */
-               BKE_screen_gpu_fx_validate(&v3d->fx_settings);
-               v3d->fx_settings.lensdist->type = 
U.hmd_settings.lensdist_shader;
+               BKE_screen_gpu_fx_validate(&v3d_hmd->fx_settings);
+               v3d_hmd->fx_settings.lensdist->type = 
U.hmd_settings.lensdist_shader;
        }
 
-       rv3d->persp = RV3D_CAMOB;
-       rv3d->camzoom = BKE_screen_view3d_zoom_from_fac(1.0f);
+       /* copy view orientation from current 3D view to newly opened HMD view 
*/
+       ED_view3d_copy_region_view_data(rv3d_current, rv3d_hmd);
 }
 
 static int wm_hmd_view_toggle_invoke(bContext *C, wmOperator *UNUSED(op), 
const wmEvent *UNUSED(event))
@@ -4167,12 +4167,22 @@ static int wm_hmd_view_toggle_invoke(bContext *C, 
wmOperator *UNUSED(op), const
        }
        /* open */
        else {
+               ARegion *ar_current;
+               View3D *v3d_current;
+               RegionView3D *rv3d_current;
+
                rcti rect = {prevwin->posx, prevwin->posx + 
(int)(prevwin->sizex * 0.9f),
                             prevwin->posy, prevwin->posy + 
(int)(prevwin->sizey * 0.9f)};
+
+               /* WM_window_open_restricted changes context, so get current 
context data first */
+               ED_view3d_context_user_region(C, &v3d_current, &ar_current);
+               rv3d_current = ar_current->regiondata;
+               BLI_assert(v3d_current && ar_current && rv3d_current);
+
                win = WM_window_open_restricted(C, &rect, WM_WINDOW_HMD);
                wm->hmd_view.hmd_win = win;
 
-               hmd_view_prepare_screen(wm, win);
+               hmd_view_prepare_screen(wm, win, rv3d_current);
        }
 
        return OPERATOR_FINISHED;

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

Reply via email to