diff options
author | Peter Klimenko <peterklimk@outlook.com> | 2020-07-31 16:20:09 +0300 |
---|---|---|
committer | Peter Klimenko <peterklimk@outlook.com> | 2020-07-31 16:20:09 +0300 |
commit | 20e84b0dc1bdc673e8237ea7329958a430e02de5 (patch) | |
tree | ce58606d200dbe3816827270fdad0e13f2e188d5 | |
parent | 0cb02bf631abee45cb769419504612644de4a2b7 (diff) |
Fixed issues with graphics.soc-2020-xr-input
-rw-r--r-- | source/blender/windowmanager/xr/intern/wm_xr_draw.c | 34 | ||||
-rw-r--r-- | source/blender/windowmanager/xr/intern/wm_xr_intern.h | 3 | ||||
-rw-r--r-- | source/blender/windowmanager/xr/intern/wm_xr_session.c | 27 |
3 files changed, 62 insertions, 2 deletions
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; |