[Bf-blender-cvs] [36463a16bbd] xr-controller-support: XR: Add initial navigation support
Peter Kim
noreply at git.blender.org
Fri Jun 4 12:19:39 CEST 2021
Commit: 36463a16bbd917705d5daaa5ada4202e5488fb45
Author: Peter Kim
Date: Fri Jun 4 19:01:50 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB36463a16bbd917705d5daaa5ada4202e5488fb45
XR: Add initial navigation support
Adds navigation transforms (pose, scale) to the XR session state
that will be applied to the viewer/controller poses.
Users can access these transforms via Python
(xr_session_state.navigation_location/rotation/scale) to use with
custom operators.
===================================================================
M source/blender/draw/engines/overlay/overlay_grid.c
M source/blender/draw/intern/draw_manager_data.c
M source/blender/editors/include/ED_view3d.h
M source/blender/editors/space_view3d/view3d_select.c
M source/blender/editors/transform/CMakeLists.txt
M source/blender/editors/transform/transform_ops.c
M source/blender/makesdna/DNA_xr_types.h
M source/blender/makesrna/intern/rna_xr.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_draw.c
M source/blender/windowmanager/xr/intern/wm_xr_intern.h
M source/blender/windowmanager/xr/intern/wm_xr_session.c
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_grid.c b/source/blender/draw/engines/overlay/overlay_grid.c
index 5bb157ed081..ac6e42b1669 100644
--- a/source/blender/draw/engines/overlay/overlay_grid.c
+++ b/source/blender/draw/engines/overlay/overlay_grid.c
@@ -182,6 +182,15 @@ void OVERLAY_grid_init(OVERLAY_Data *vedata)
shd->grid_distance = dist / 2.0f;
ED_view3d_grid_steps(scene, v3d, rv3d, shd->grid_steps);
+
+ if (((v3d->flag & V3D_XR_SESSION_SURFACE) != 0) || ((v3d->flag & V3D_XR_SESSION_MIRROR) != 0)) {
+ /* The calculations for the grid parameters assume that the view matrix has no scale component,
+ * which may not be correct if the user is "shrunk" or "enlarged" by zooming in or out.
+ * Therefore, we need to compensate the values here. */
+ float viewinvscale = len_v3(
+ viewinv[0]); /* Assumption is uniform scaling (all column vectors are of same length). */
+ shd->grid_distance *= viewinvscale;
+ }
}
void OVERLAY_grid_cache_init(OVERLAY_Data *vedata)
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 6bdc5305fed..253b2d168c4 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -1653,10 +1653,12 @@ static void draw_frustum_bound_sphere_calc(const BoundBox *bbox,
bsphere->center[0] = farcenter[0] * z / e;
bsphere->center[1] = farcenter[1] * z / e;
bsphere->center[2] = z;
- bsphere->radius = len_v3v3(bsphere->center, farpoint);
- /* Transform to world space. */
- mul_m4_v3(viewinv, bsphere->center);
+ /* For XR, the view matrix may contain a scale factor. Then, transforming only the center
+ * into world space after calculating the radius will result in incorrect behavior. */
+ mul_m4_v3(viewinv, bsphere->center); /* Transform to world space. */
+ mul_m4_v3(viewinv, farpoint);
+ bsphere->radius = len_v3v3(bsphere->center, farpoint);
}
}
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index e273cc6cb97..814f23d47e9 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -755,7 +755,7 @@ void ED_view3d_xr_mirror_update(const struct ScrArea *area,
const struct View3D *v3d,
const bool enable);
void ED_view3d_xr_shading_update(struct wmWindowManager *wm,
- const View3D *v3d,
+ const struct View3D *v3d,
const struct Scene *scene);
bool ED_view3d_is_region_xr_mirror_active(const struct wmWindowManager *wm,
const struct View3D *v3d,
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 215cc030f46..c6da8f41c76 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2770,6 +2770,12 @@ static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *e
int mval[2];
int retval;
+ /* Scale to apply to clip distances. */
+ float viewer_scale = 1.0f;
+#ifdef WITH_XR_OPENXR
+ WM_xr_session_state_viewer_scale_get(xr, &viewer_scale);
+#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
* result for GPU select. */
@@ -2779,8 +2785,8 @@ static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *e
v3d,
region,
actiondata->eye_lens,
- xr->session_settings.clip_start,
- xr->session_settings.clip_end,
+ xr->session_settings.clip_start * viewer_scale,
+ xr->session_settings.clip_end * viewer_scale,
actiondata->eye_viewmat);
map_to_pixel(mval,
diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index b0bc5c6abda..9db20ec2526 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -126,5 +126,8 @@ if(WITH_INTERNATIONAL)
add_definitions(-DWITH_INTERNATIONAL)
endif()
+if(WITH_XR_OPENXR)
+ add_definitions(-DWITH_XR_OPENXR)
+endif()
blender_add_lib(bf_editor_transform "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index bebdf47bd12..86d15c33439 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -491,6 +491,12 @@ static int transform_modal_3d(bContext *C, wmOperator *op, const wmEvent *event)
float viewmat_prev[4][4];
int retval;
+ /* Scale to apply to clip distances. */
+ float viewer_scale = 1.0f;
+#ifdef WITH_XR_OPENXR
+ WM_xr_session_state_viewer_scale_get(xr, &viewer_scale);
+#endif
+
wmEvent event_mut;
memcpy(&event_mut, event, sizeof(wmEvent));
@@ -502,8 +508,8 @@ static int transform_modal_3d(bContext *C, wmOperator *op, const wmEvent *event)
v3d,
region,
actiondata->eye_lens,
- xr->session_settings.clip_start,
- xr->session_settings.clip_end,
+ xr->session_settings.clip_start * viewer_scale,
+ xr->session_settings.clip_end * viewer_scale,
t->viewmat); /* Use viewmat from when transform was invoked instead of latest XR viewmat. */
map_to_pixel(event_mut.mval,
@@ -611,6 +617,12 @@ static int transform_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event
float viewmat_prev[4][4];
int retval;
+ /* Scale to apply to clip distances. */
+ float viewer_scale = 1.0f;
+#ifdef WITH_XR_OPENXR
+ WM_xr_session_state_viewer_scale_get(xr, &viewer_scale);
+#endif
+
wmEvent event_mut;
memcpy(&event_mut, event, sizeof(wmEvent));
event_mut.type = LEFTMOUSE;
@@ -622,8 +634,8 @@ static int transform_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event
v3d,
region,
actiondata->eye_lens,
- xr->session_settings.clip_start,
- xr->session_settings.clip_end,
+ xr->session_settings.clip_start * viewer_scale,
+ xr->session_settings.clip_end * viewer_scale,
actiondata->eye_viewmat);
map_to_pixel(event_mut.mval,
diff --git a/source/blender/makesdna/DNA_xr_types.h b/source/blender/makesdna/DNA_xr_types.h
index 7ba66503c10..9eced3ab034 100644
--- a/source/blender/makesdna/DNA_xr_types.h
+++ b/source/blender/makesdna/DNA_xr_types.h
@@ -34,8 +34,8 @@ typedef struct XrSessionSettings {
/** Shading settings, struct shared with 3D-View so settings are the same. */
struct View3DShading shading;
- char _pad[7];
-
+ float base_scale;
+ char _pad[3];
char base_pose_type; /* eXRSessionBasePoseType */
/** Object to take the location and rotation as base position from. */
Object *base_pose_object;
@@ -69,7 +69,6 @@ typedef struct XrSessionSettings {
Object *headset_object;
Object *controller0_object;
Object *controller1_object;
-
char headset_flag;
char controller0_flag;
char controller1_flag;
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index 6cb6627da4f..a48a073f03d 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -666,6 +666,19 @@ static void rna_XrSessionState_reset_to_base_pose(bContext *C)
# endif
}
+static void rna_XrSessionState_reset_navigation(bContext *C)
+{
+# ifdef WITH_XR_OPENXR
+ wmWindowManager *wm = CTX_wm_manager(C);
+ if (WM_xr_session_exists(&wm->xr)) {
+ struct wmXrSessionState *state = WM_xr_session_state_handle_get(&wm->xr);
+ WM_xr_session_state_navigation_reset(state);
+ }
+# else
+ UNUSED_VARS(C);
+# endif
+}
+
static bool rna_XrSessionState_action_set_create(bContext *C, const char *action_set_name)
{
# ifdef WITH_XR_OPENXR
@@ -988,6 +1001,71 @@ static void rna_XrSessionState_controller_pose1_rotation_get(PointerRNA *ptr, fl
# endif
}
+static void rna_XrSessionState_nav_location_get(PointerRNA *ptr, float *r_values)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ WM_xr_session_state_nav_location_get(xr, r_values);
+# else
+ UNUSED_VARS(ptr);
+ zero_v3(r_values);
+# endif
+}
+
+static void rna_XrSessionState_nav_location_set(PointerRNA *ptr, const float *values)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ WM_xr_session_state_nav_location_set(xr, values);
+# else
+ UNUSED_VARS(ptr, values);
+# endif
+}
+
+static void rna_XrSessionState_nav_rotation_get(PointerRNA *ptr, float *r_values)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ WM_xr_session_state_nav_rotation_get(xr, r_values);
+# else
+ UNUSED_VARS(ptr);
+ unit_qt(r_values);
+# endif
+}
+
+static void rna_XrSessionState_nav_rotation_set(PointerRNA *ptr, const float *values)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ WM_xr_session_state_nav_rotation_set(xr, values);
+# else
+ UNUSED_VARS(ptr, values);
+# endif
+}
+
+static float rna_XrSessionState_nav_scale_get(PointerRNA *ptr)
+{
+ float value;
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ WM_xr_session_state_nav_scale_get(xr, &value);
+# else
+ UNUSED_VARS(ptr);
+ value = 1.0f;
+# endif
+ return value;
+}
+
+static void rna_XrSessionState_nav_scale_set(PointerRNA *ptr, float value)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ WM_xr_session_state_nav_scale_set(xr, value);
+# else
+ UNUSED_VARS(ptr, value);
+# endif
+}
+
/** \} */
#else /* RNA_RUNTIME */
@@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list