[Bf-blender-cvs] [27774c3e0d7] vr_scene_inspection: Fix division-by-zero on session start with VR mirror enabled

Julian Eisel noreply at git.blender.org
Thu Mar 12 18:49:26 CET 2020


Commit: 27774c3e0d70337e76889945479482171c1f0de1
Author: Julian Eisel
Date:   Thu Mar 12 18:48:50 2020 +0100
Branches: vr_scene_inspection
https://developer.blender.org/rB27774c3e0d70337e76889945479482171c1f0de1

Fix division-by-zero on session start with VR mirror enabled

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

M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_xr.c

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

diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index f47cb4184ba..01de92517c5 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -337,10 +337,11 @@ static void view3d_xr_mirror_setup(const wmWindowManager *wm,
   float viewmat[4][4];
   const float lens_old = v3d->lens;
 
-  /* Ensure valid fallback value. */
-  copy_m4_m4(viewmat, rv3d->viewmat);
-
-  WM_xr_session_state_viewer_matrix_info_get(&wm->xr, viewmat, &v3d->lens);
+  if (!WM_xr_session_state_viewer_matrix_info_get(&wm->xr, viewmat, &v3d->lens)) {
+    /* Can't get info from XR session, use fallback values. */
+    copy_m4_m4(viewmat, rv3d->viewmat);
+    v3d->lens = lens_old;
+  }
   view3d_main_region_setup_view(depsgraph, scene, v3d, region, viewmat, NULL, rect);
 
   /* Reset overridden View3D data */
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 62ec5a491c4..0516982e350 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -875,9 +875,9 @@ void WM_generic_user_data_free(struct wmGenericUserData *user_data);
 /* wm_xr.c */
 bool WM_xr_session_was_started(const wmXrData *xr);
 bool WM_xr_session_is_running(const wmXrData *xr);
-void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float r_location[3]);
-void WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float r_rotation[4]);
-void WM_xr_session_state_viewer_matrix_info_get(const wmXrData *xr,
+bool WM_xr_session_state_viewer_location_get(const wmXrData *xr, float r_location[3]);
+bool WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float r_rotation[4]);
+bool WM_xr_session_state_viewer_matrix_info_get(const wmXrData *xr,
                                                 float r_viewmat[4][4],
                                                 float *r_focal_len);
 #endif
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 1500f16879d..43bb8c27f3b 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -312,38 +312,42 @@ static void wm_xr_runtime_session_state_update(XrRuntimeSessionState *state,
   state->is_initialized = true;
 }
 
-void WM_xr_session_state_viewer_location_get(const wmXrData *xr, float r_location[3])
+bool WM_xr_session_state_viewer_location_get(const wmXrData *xr, float r_location[3])
 {
   if (!WM_xr_session_is_running(xr) || !xr->session_state->is_initialized) {
     zero_v3(r_location);
-    return;
+    return false;
   }
 
   copy_v3_v3(r_location, xr->session_state->viewer_pose.position);
+  return true;
 }
 
-void WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float r_rotation[4])
+bool WM_xr_session_state_viewer_rotation_get(const wmXrData *xr, float r_rotation[4])
 {
   if (!WM_xr_session_is_running(xr) || !xr->session_state->is_initialized) {
     unit_qt(r_rotation);
-    return;
+    return false;
   }
 
   copy_v4_v4(r_rotation, xr->session_state->viewer_pose.orientation_quat);
+  return true;
 }
 
-void WM_xr_session_state_viewer_matrix_info_get(const wmXrData *xr,
+bool WM_xr_session_state_viewer_matrix_info_get(const wmXrData *xr,
                                                 float r_viewmat[4][4],
                                                 float *r_focal_len)
 {
   if (!WM_xr_session_is_running(xr) || !xr->session_state->is_initialized) {
     unit_m4(r_viewmat);
     *r_focal_len = 0.0f;
-    return;
+    return false;
   }
 
   copy_m4_m4(r_viewmat, xr->session_state->viewer_viewmat);
   *r_focal_len = xr->session_state->focal_len;
+
+  return true;
 }
 
 /** \} */ /* XR Runtime Session State */



More information about the Bf-blender-cvs mailing list