[Bf-blender-cvs] [5561fbf1f88] xr-actions-D9124: XR: Apply VR clip settings when selecting

Peter Kim noreply at git.blender.org
Sun Oct 18 18:06:42 CEST 2020


Commit: 5561fbf1f883ebca0338cd0278baf4e5d7af978f
Author: Peter Kim
Date:   Mon Oct 19 01:03:15 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB5561fbf1f883ebca0338cd0278baf4e5d7af978f

XR: Apply VR clip settings when selecting

Fixes projection matrix calculation for GPU select.

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

M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_gesture_ops.c
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 32403a98912..19ecb214533 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -331,21 +331,27 @@ static void view3d_xr_mirror_setup(const wmWindowManager *wm,
   RegionView3D *rv3d = region->regiondata;
   float viewmat[4][4];
   const float lens_old = v3d->lens;
+  const float clip_start_old = v3d->clip_start;
+  const float clip_end_old = v3d->clip_end;
   /* Here we need to use the viewmat from the selection eye instead of the eye centroid because
    * this function may be called from a GPU select operation. In that case we need to match the
    * selection eye's view, which was used to project 3D to 2D, for a correct result. */
   const bool from_selection_eye = true;
 
   if (!WM_xr_session_state_viewer_pose_matrix_info_get(
-          &wm->xr, from_selection_eye, viewmat, &v3d->lens)) {
+          &wm->xr, from_selection_eye, viewmat, &v3d->lens, &v3d->clip_start, &v3d->clip_end)) {
     /* Can't get info from XR session, use fallback values. */
     copy_m4_m4(viewmat, rv3d->viewmat);
     v3d->lens = lens_old;
+    v3d->clip_start = clip_start_old;
+    v3d->clip_end = clip_end_old;
   }
   view3d_main_region_setup_view(depsgraph, scene, v3d, region, viewmat, NULL, rect);
 
   /* Reset overridden View3D data */
   v3d->lens = lens_old;
+  v3d->clip_start = clip_start_old;
+  v3d->clip_end = clip_end_old;
 }
 #endif /* WITH_XR_OPENXR */
 
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index e24718c0e77..a9afe73275c 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2518,22 +2518,23 @@ static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *e
   View3D *v3d = CTX_wm_view3d(C);
   ARegion *region = CTX_wm_region(C);
   RegionView3D *rv3d = region->regiondata;
+  wmWindowManager *wm = CTX_wm_manager(C);
+  wmXrData *xr = &wm->xr;
   wmXrActionData *customdata = event->customdata;
   short winx_prev, winy_prev;
   rcti winrct_prev;
   float lens_prev;
+  float clip_start_prev, clip_end_prev;
   float viewmat_prev[4][4];
-  float winmat_prev[4][4];
   int mval[2];
+  int retval;
 
-  map_to_pixel(mval,
-               customdata->controller_loc,
-               customdata->eye_viewmat,
-               customdata->eye_winmat,
-               customdata->eye_width,
-               customdata->eye_height);
-
-  RNA_int_set_array(op->ptr, "location", mval);
+#if 1
+  /* TODO_XR: Currently fails in edit mode. */
+  if (CTX_data_edit_object(C)) {
+    return OPERATOR_FINISHED;
+  }
+#endif
 
   /* Since this function is called in a window context, we need to replace the
    * window view parameters with the XR surface counterparts to get a correct
@@ -2542,25 +2543,39 @@ static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *e
   winy_prev = region->winy;
   winrct_prev = region->winrct;
   lens_prev = v3d->lens;
+  clip_start_prev = v3d->clip_start;
+  clip_end_prev = v3d->clip_end;
   copy_m4_m4(viewmat_prev, rv3d->viewmat);
-  copy_m4_m4(winmat_prev, rv3d->winmat);
 
   region->winrct.xmin = 0;
   region->winrct.ymin = 0;
   region->winrct.xmax = region->winx = customdata->eye_width;
   region->winrct.ymax = region->winy = customdata->eye_height;
   v3d->lens = customdata->eye_lens;
+  v3d->clip_start = xr->session_settings.clip_start;
+  v3d->clip_end = xr->session_settings.clip_end;
   copy_m4_m4(rv3d->viewmat, customdata->eye_viewmat);
-  copy_m4_m4(rv3d->winmat, customdata->eye_winmat);
+  view3d_winmatrix_set(depsgraph, region, v3d, NULL);
+
+  map_to_pixel(mval,
+               customdata->controller_loc,
+               customdata->eye_viewmat,
+               rv3d->winmat,
+               customdata->eye_width,
+               customdata->eye_height);
+
+  RNA_int_set_array(op->ptr, "location", mval);
 
-  int retval = view3d_select_exec(C, op);
+  retval = view3d_select_exec(C, op);
 
   /* Restore window view. */
   region->winx = winx_prev;
   region->winy = winy_prev;
   region->winrct = winrct_prev;
   v3d->lens = lens_prev;
-  ED_view3d_update_viewmat(depsgraph, scene, v3d, region, viewmat_prev, winmat_prev, NULL, false);
+  v3d->clip_start = clip_start_prev;
+  v3d->clip_end = clip_end_prev;
+  ED_view3d_update_viewmat(depsgraph, scene, v3d, region, viewmat_prev, NULL, NULL, false);
 
   return retval;
 }
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 23a45b2a0e9..a71bf879f81 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -934,7 +934,9 @@ bool WM_xr_session_state_viewer_pose_rotation_get(const wmXrData *xr, float r_ro
 bool WM_xr_session_state_viewer_pose_matrix_info_get(const wmXrData *xr,
                                                      bool from_selection_eye,
                                                      float r_viewmat[4][4],
-                                                     float *r_focal_len);
+                                                     float *r_focal_len,
+                                                     float *r_clip_start,
+                                                     float *r_clip_end);
 bool WM_xr_session_state_controller_pose_location_get(const wmXrData *xr,
                                                       unsigned int subaction_idx,
                                                       float r_location[3]);
diff --git a/source/blender/windowmanager/intern/wm_gesture_ops.c b/source/blender/windowmanager/intern/wm_gesture_ops.c
index 632529dccbc..f0599ef3a7f 100644
--- a/source/blender/windowmanager/intern/wm_gesture_ops.c
+++ b/source/blender/windowmanager/intern/wm_gesture_ops.c
@@ -48,6 +48,8 @@
 #include "ED_select_utils.h"
 #include "ED_view3d.h"
 
+#include "../editors/space_view3d/view3d_intern.h"
+
 #include "RNA_access.h"
 #include "RNA_define.h"
 
@@ -207,44 +209,70 @@ int WM_gesture_box_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event)
   BLI_assert(event->custom == EVT_DATA_XR);
   BLI_assert(event->customdata);
 
-  wmEvent event_mut;
-  memcpy(&event_mut, event, sizeof(wmEvent));
-
+  Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+  View3D *v3d = CTX_wm_view3d(C);
   ARegion *region = CTX_wm_region(C);
+  RegionView3D *rv3d = region->regiondata;
+  wmWindowManager *wm = CTX_wm_manager(C);
+  wmXrData *xr = &wm->xr;
   wmXrActionData *customdata = event->customdata;
   short winx_prev, winy_prev;
   rcti winrct_prev;
+  float lens_prev;
+  float clip_start_prev, clip_end_prev;
   int mval[2];
+  int retval;
 
-  map_to_pixel(mval,
-               customdata->controller_loc,
-               customdata->eye_viewmat,
-               customdata->eye_winmat,
-               customdata->eye_width,
-               customdata->eye_height);
-  event_mut.x = mval[0];
-  event_mut.y = mval[1];
+#if 1
+  /* TODO_XR: Currently fails in edit mode. */
+  if (CTX_data_edit_object(C)) {
+    return OPERATOR_RUNNING_MODAL;
+  }
+#endif
+
+  wmEvent event_mut;
+  memcpy(&event_mut, event, sizeof(wmEvent));
 
-  /* Replace window dimensions with XR surface dimensions. */
+  /* Replace window view parameters with XR surface counterparts. */
   winx_prev = region->winx;
   winy_prev = region->winy;
   winrct_prev = region->winrct;
+  lens_prev = v3d->lens;
+  clip_start_prev = v3d->clip_start;
+  clip_end_prev = v3d->clip_end;
 
   region->winrct.xmin = 0;
   region->winrct.ymin = 0;
   region->winrct.xmax = region->winx = customdata->eye_width;
   region->winrct.ymax = region->winy = customdata->eye_height;
+  v3d->lens = customdata->eye_lens;
+  v3d->clip_start = xr->session_settings.clip_start;
+  v3d->clip_end = xr->session_settings.clip_end;
+  view3d_winmatrix_set(depsgraph, region, v3d, NULL);
+
+  map_to_pixel(mval,
+               customdata->controller_loc,
+               customdata->eye_viewmat,
+               rv3d->winmat,
+               customdata->eye_width,
+               customdata->eye_height);
+  event_mut.x = mval[0];
+  event_mut.y = mval[1];
 
   RNA_boolean_set(op->ptr, "wait_for_input", false);
 
-  int ret = WM_gesture_box_invoke(C, op, &event_mut);
+  retval = WM_gesture_box_invoke(C, op, &event_mut);
 
-  /* Restore window dimensions. */
+  /* Restore window view. */
   region->winx = winx_prev;
   region->winy = winy_prev;
   region->winrct = winrct_prev;
+  v3d->lens = lens_prev;
+  v3d->clip_start = clip_start_prev;
+  v3d->clip_end = clip_end_prev;
+  view3d_winmatrix_set(depsgraph, region, v3d, NULL);
 
-  return ret;
+  return retval;
 }
 
 int WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
@@ -316,18 +344,66 @@ int WM_gesture_box_modal_3d(bContext *C, wmOperator *op, const wmEvent *event)
   BLI_assert(event->custom == EVT_DATA_XR);
   BLI_assert(event->customdata);
 
-  wmEvent event_mut;
-  memcpy(&event_mut, event, sizeof(wmEvent));
+  /* XR events currently only support press and release. */
+  BLI_assert(event->val == KM_PRESS || event->val == KM_RELEASE);
+
+  const bool release = (event->val == KM_RELEASE);
 
+  Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+  Scene *scene = CTX_data_scene(C);
+  View3D *v3d = CTX_wm_view3d(C);
   ARegion *region = CTX_wm_region(C);
   RegionView3D *rv3d = region->regiondata;
+  wmWindowManager *wm = CTX_wm_manager(C);
+  wmXrData *xr = &wm->xr;
   wmXrActionData *customdata = event->customdata;
+  short winx_prev, winy_prev;
+  rcti winrct_prev;
+  float lens_prev;
+  float clip_start_prev, clip_end_prev;
+  float viewmat_prev[4][4];
   int mval[2];
+  int retval;
+
+#if 1
+  /* TODO_XR: Currently fails in edit mode. */
+  if (CTX_data_edit_object(C)) {
+    return release ? OPERATOR_FINISHED : OPERATOR_RUNNING_MODAL;
+  }
+#endif
+
+  wmEvent event_mut;
+  memcpy(&event_mut, event, sizeof(wmEvent));
+
+  /* Since this function is called in a window context, we need to replace the
+   * window view parameters with the XR surface counterparts to get a correct


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list