[Bf-blender-cvs] [20e84b0dc1b] soc-2020-xr-input: Fixed issues with graphics.

Peter Klimenko noreply at git.blender.org
Fri Jul 31 15:20:15 CEST 2020


Commit: 20e84b0dc1bdc673e8237ea7329958a430e02de5
Author: Peter Klimenko
Date:   Fri Jul 31 23:20:09 2020 +1000
Branches: soc-2020-xr-input
https://developer.blender.org/rB20e84b0dc1bdc673e8237ea7329958a430e02de5

Fixed issues with graphics.

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

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/windowmanager/xr/intern/wm_xr_draw.c b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
index ed727dfef74..256352ed1d5 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_draw.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
@@ -115,6 +115,25 @@ void apply_world_transform(float viewmat[4][4], GHOST_XrPose world_pose, float s
  * This is the main viewport drawing function for VR sessions. It's assigned to Ghost-XR as a
  * callback (see GHOST_XrDrawViewFunc()) and executed for each view (read: eye).
  */
+
+void wm_xr_session_controller_transform_update(GHOST_XrPose *dst_pose,
+                                               const GHOST_XrPose *base_pose,
+                                               const GHOST_XrPose *pose)
+{
+  copy_v3_v3(dst_pose->position, base_pose->position);
+  dst_pose->position[0] = base_pose->position[0] + pose->position[0];
+  dst_pose->position[1] = base_pose->position[1] - pose->position[2];
+  dst_pose->position[2] = base_pose->position[2] + pose->position[1];
+
+  mul_qt_qtqt(dst_pose->orientation_quat, base_pose->orientation_quat, pose->orientation_quat);
+
+  float invBaseRotation[4];
+  copy_qt_qt(invBaseRotation, base_pose->orientation_quat);
+  invert_qt(invBaseRotation);
+
+  mul_qt_qtqt(dst_pose->orientation_quat, dst_pose->orientation_quat, invBaseRotation);
+}
+
 void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
 {
   wmXrDrawData *draw_data = customdata;
@@ -166,8 +185,19 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)
                                   surface_data->offscreen,
                                   surface_data->viewport);
 
-  GHOST_XrPose leftPose = GHOST_XrGetSpacePose(xr_data->runtime->context, GHOST_SPACE_LEFT_HAND);
-  GHOST_XrPose rightPose = GHOST_XrGetSpacePose(xr_data->runtime->context, GHOST_SPACE_RIGHT_HAND);
+  GHOST_XrPose leftPoseStatic = GHOST_XrGetSpacePose(xr_data->runtime->context, GHOST_SPACE_LEFT_HAND);
+  GHOST_XrPose rightPoseStatic = GHOST_XrGetSpacePose(xr_data->runtime->context, GHOST_SPACE_RIGHT_HAND);
+
+  GHOST_XrPose leftPose;
+  GHOST_XrPose rightPose;
+
+  wm_xr_session_controller_transform_update(&leftPose,
+                                            &draw_data->base_pose,
+                                            &leftPoseStatic);
+
+  wm_xr_session_controller_transform_update(&rightPose,
+                                            &draw_data->base_pose,
+                                            &rightPoseStatic);
 
   /* The draw-manager uses both GPUOffscreen and GPUViewport to manage frame and texture buffers. A
    * call to GPU_viewport_draw_to_screen() is still needed to get the final result from the
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index 794159118c4..e853b2249ca 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -98,5 +98,8 @@ void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle context);
 
 void wm_xr_pose_to_viewmat(const GHOST_XrPose *pose, float r_viewmat[4][4]);
 void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata);
+void wm_xr_session_controller_transform_update(GHOST_XrPose *dst_pose,
+                                               const GHOST_XrPose *base_pose,
+                                               const GHOST_XrPose *pose);
 
 #endif
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index 77728e60e23..a64973c9f01 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -136,6 +136,12 @@ static void wm_xr_session_base_pose_calc(const Scene *scene,
     tmp_eul[0] = M_PI_2;
     tmp_eul[1] = 0;
     eul_to_quat(r_base_pose->orientation_quat, tmp_eul);
+
+    /* TODO: copied code from ubisoft guys, temporary fix. */
+    tmp_eul[0] = M_PI_2;
+    tmp_eul[1] = 0;
+    tmp_eul[2] = 0;
+    eul_to_quat(r_base_pose->orientation_quat, tmp_eul);
   }
   else {
     copy_v3_fl(r_base_pose->position, 0.0f);
@@ -282,10 +288,31 @@ void wm_xr_session_state_update(const XrSessionSettings *settings,
   state->prev_base_pose_type = settings->base_pose_type;
   state->prev_base_pose_object = settings->base_pose_object;
   state->is_view_data_set = true;
+
   /* Assume this was already done through wm_xr_session_draw_data_update(). */
   state->force_reset_to_base_pose = false;
 }
 
+bool WM_xr_session_state_world_matrix_get(const wmXrData *xr,
+                                          float world_matrix[4][4])
+{
+  if (!WM_xr_session_is_ready(xr)) {
+    unit_m4(world_matrix);
+    return false;
+  }
+
+  float scale[3] = {xr->runtime->session_state.world_scale,
+                    xr->runtime->session_state.world_scale,
+                    xr->runtime->session_state.world_scale};
+
+  loc_quat_size_to_mat4(world_matrix,
+                        xr->runtime->session_state.world_pose.position,
+                        xr->runtime->session_state.world_pose.orientation_quat,
+                        scale);
+
+  return true;
+}
+
 wmXrSessionState *WM_xr_session_state_handle_get(const wmXrData *xr)
 {
   return xr->runtime ? &xr->runtime->session_state : NULL;



More information about the Bf-blender-cvs mailing list