[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