[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