[Bf-blender-cvs] [6ee46d5e83f] xr-controller-support: XR: Fix mirror view not matching navigation

Peter Kim noreply at git.blender.org
Sun Jul 4 08:50:15 CEST 2021


Commit: 6ee46d5e83f33206c4b0978914412bfe50779273
Author: Peter Kim
Date:   Sun Jul 4 15:40:38 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB6ee46d5e83f33206c4b0978914412bfe50779273

XR: Fix mirror view not matching navigation

Forgot to update eye poses with viewer pose.

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

M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_event_query.c
M	source/blender/windowmanager/xr/intern/wm_xr_action.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/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index c4507619b8b..ba2b398a5a2 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -882,6 +882,20 @@ static void rna_Event_xr_controller_rotation_other_get(PointerRNA *ptr, float *v
   }
 }
 
+static float rna_Event_xr_focal_length_get(PointerRNA *ptr)
+{
+  const wmEvent *event = ptr->data;
+  if (WM_event_is_xr(event)) {
+    float focal_len;
+    WM_event_xr_data(
+        event, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &focal_len, NULL, NULL);
+    return focal_len;
+  }
+  else {
+    return 0.0f;
+  }
+}
+
 static void rna_Event_xr_view_matrix_get(PointerRNA *ptr, float values[16])
 {
   const wmEvent *event = ptr->data;
@@ -897,8 +911,8 @@ static void rna_Event_xr_view_matrix_get(PointerRNA *ptr, float values[16])
                      NULL,
                      NULL,
                      NULL,
-                     (float(*)[4])values,
                      NULL,
+                     (float(*)[4])values,
                      NULL);
   }
   else {
@@ -906,20 +920,6 @@ static void rna_Event_xr_view_matrix_get(PointerRNA *ptr, float values[16])
   }
 }
 
-static float rna_Event_xr_focal_length_get(PointerRNA *ptr)
-{
-  const wmEvent *event = ptr->data;
-  if (WM_event_is_xr(event)) {
-    float focal_len;
-    WM_event_xr_data(
-        event, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &focal_len, NULL);
-    return focal_len;
-  }
-  else {
-    return 0.0f;
-  }
-}
-
 static bool rna_Event_xr_bimanual_get(PointerRNA *ptr)
 {
   const wmEvent *event = ptr->data;
@@ -2570,17 +2570,17 @@ static void rna_def_event(BlenderRNA *brna)
                            "XR Controller Rotation Other",
                            "Controller rotation of the other user path for bimanual actions");
 
+  prop = RNA_def_property(srna, "xr_focal_length", PROP_FLOAT, PROP_NONE);
+  RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_float_funcs(prop, "rna_Event_xr_focal_length_get", NULL, NULL);
+  RNA_def_property_ui_text(prop, "XR Focal Length", "Focal length of the XR selection eye");
+
   prop = RNA_def_property(srna, "xr_view_matrix", PROP_FLOAT, PROP_MATRIX);
   RNA_def_property_array(prop, 16);
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
   RNA_def_property_float_funcs(prop, "rna_Event_xr_view_matrix_get", NULL, NULL);
   RNA_def_property_ui_text(prop, "XR View Matrix", "View matrix of the XR selection eye");
 
-  prop = RNA_def_property(srna, "xr_focal_length", PROP_FLOAT, PROP_NONE);
-  RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-  RNA_def_property_float_funcs(prop, "rna_Event_xr_focal_length_get", NULL, NULL);
-  RNA_def_property_ui_text(prop, "XR Focal Length", "Focal length of the XR selection eye");
-
   prop = RNA_def_property(srna, "xr_bimanual", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
   RNA_def_property_boolean_funcs(prop, "rna_Event_xr_bimanual_get", NULL);
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index e3a0da7ffca..a1b2a28e2bd 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -1856,7 +1856,7 @@ static void rna_def_xr_session_settings(BlenderRNA *brna)
   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
   RNA_def_property_enum_items(prop, selection_eyes);
   RNA_def_property_ui_text(
-      prop, "Selection Eye", "Which eye's perspective to use when selecting in VR");
+      prop, "Selection Eye", "Which eye's perspective to use when selecting in VR (GPU select)");
   RNA_def_property_update(prop, NC_WM | ND_XR_DATA_CHANGED, NULL);
 
   prop = RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_DISTANCE);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 64f588e6609..22d2860ee82 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -917,8 +917,8 @@ void WM_event_xr_data(const struct wmEvent *event,
                       float controller_rot[4],
                       float controller_loc_other[3],
                       float controller_rot_other[4],
-                      float eye_viewmat[4][4],
                       float *eye_lens,
+                      float eye_viewmat[4][4],
                       bool *bimanual);
 bool WM_event_is_xr(const struct wmEvent *event);
 
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index b5b9a36ea18..241fb09651b 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -729,10 +729,10 @@ typedef struct wmXrActionData {
   float controller_loc_other[3];
   float controller_rot_other[4];
 
-  /** Viewmat of the selection eye. */
-  float eye_viewmat[4][4];
   /** Lens (focal length) of the selection eye. */
   float eye_lens;
+  /** Viewmat of the selection eye. */
+  float eye_viewmat[4][4];
 
   /** Operator. */
   struct wmOperatorType *ot;
diff --git a/source/blender/windowmanager/intern/wm_event_query.c b/source/blender/windowmanager/intern/wm_event_query.c
index cb5f39684b4..f3f59c0f126 100644
--- a/source/blender/windowmanager/intern/wm_event_query.c
+++ b/source/blender/windowmanager/intern/wm_event_query.c
@@ -494,8 +494,8 @@ void WM_event_xr_data(const wmEvent *event,
                       float controller_rot[4],
                       float controller_loc_other[3],
                       float controller_rot_other[4],
-                      float eye_viewmat[4][4],
                       float *eye_lens,
+                      float eye_viewmat[4][4],
                       bool *bimanual)
 {
   const wmXrActionData *data = event->customdata;
@@ -530,12 +530,12 @@ void WM_event_xr_data(const wmEvent *event,
   if (controller_rot_other) {
     copy_v4_v4(controller_rot_other, data->controller_rot_other);
   }
-  if (eye_viewmat) {
-    copy_m4_m4(eye_viewmat, data->eye_viewmat);
-  }
   if (eye_lens) {
     *eye_lens = data->eye_lens;
   }
+  if (eye_viewmat) {
+    copy_m4_m4(eye_viewmat, data->eye_viewmat);
+  }
   if (bimanual) {
     *bimanual = data->bimanual;
   }
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_action.c b/source/blender/windowmanager/xr/intern/wm_xr_action.c
index aaaf56a5deb..f98566b02db 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_action.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_action.c
@@ -424,6 +424,9 @@ bool WM_xr_active_action_set_set(wmXrData *xr, const char *action_set_name)
   if (action_set->controller_pose_action) {
     wm_xr_session_controller_data_populate(action_set->controller_pose_action, xr);
   }
+  else {
+    wm_xr_session_controller_data_clear(&xr->runtime->session_state);
+  }
 
   return true;
 }
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_draw.c b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
index bd0ff8c7db1..c1b6e2ad8cf 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_draw.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
@@ -85,11 +85,12 @@ static void wm_xr_draw_matrices_create(const wmXrDrawData *draw_data,
                                        const GHOST_XrDrawViewInfo *draw_view,
                                        const XrSessionSettings *session_settings,
                                        const wmXrSessionState *session_state,
-                                       float r_view_mat[4][4],
-                                       float r_proj_mat[4][4])
+                                       float r_viewmat[4][4],
+                                       float r_viewmat_base[4][4],
+                                       float r_projmat[4][4])
 {
   GHOST_XrPose eye_pose;
-  float eye_inv[4][4], base_inv[4][4], nav_inv[4][4], m[4][4];
+  float eye_inv[4][4], base_inv[4][4], nav_inv[4][4];
 
   /* Calculate inverse eye matrix. */
   copy_qt_qt(eye_pose.orientation_quat, draw_view->eye_pose.orientation_quat);
@@ -105,10 +106,10 @@ static void wm_xr_draw_matrices_create(const wmXrDrawData *draw_data,
   /* Apply base pose and navigation. */
   wm_xr_pose_scale_to_imat(&draw_data->base_pose, draw_data->base_scale, base_inv);
   wm_xr_pose_scale_to_imat(&session_state->nav_pose_prev, session_state->nav_scale_prev, nav_inv);
-  mul_m4_m4m4(m, eye_inv, base_inv);
-  mul_m4_m4m4(r_view_mat, m, nav_inv);
+  mul_m4_m4m4(r_viewmat_base, eye_inv, base_inv);
+  mul_m4_m4m4(r_viewmat, r_viewmat_base, nav_inv);
 
-  perspective_m4_fov(r_proj_mat,
+  perspective_m4_fov(r_projmat,
                      draw_view->fov.angle_left,
                      draw_view->fov.angle_right,
                      draw_view->fov.angle_up,
@@ -151,13 +152,14 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
 
   const int display_flags = V3D_OFSDRAW_OVERRIDE_SCENE_SETTINGS | settings->draw_flags;
 
-  float viewmat[4][4], winmat[4][4];
+  float viewmat[4][4], viewmat_base[4][4], winmat[4][4];
 
   BLI_assert(WM_xr_session_is_ready(xr_data));
 
   wm_xr_session_draw_data_update(session_state, settings, draw_view, draw_data);
-  wm_xr_draw_matrices_create(draw_data, draw_view, settings, session_state, viewmat, winmat);
-  wm_xr_session_state_update(settings, draw_data, draw_view, viewmat, session_state);
+  wm_xr_draw_matrices_create(
+      draw_data, draw_view, settings, session_state, viewmat, viewmat_base, winmat);
+  wm_xr_session_state_update(settings, draw_data, draw_view, viewmat, viewmat_base, session_state);
 
   if (!wm_xr_session_surface_offscreen_ensure(surface_data, draw_view)) {
     return;
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index a8ceb8337d6..5c4a9717ff5 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -27,8 +27,10 @@
 struct wmXrActionSet;
 
 typedef struct wmXrEyeData {
-  float viewmat[4][4];
   float focal_len;
+  float viewmat[4][4];
+  /** Viewmat without navigation applied. */
+  float viewmat_base[4][4];
 } wmXrEye

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list