Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Klimenko <peterklimk@outlook.com>2020-07-31 16:20:09 +0300
committerPeter Klimenko <peterklimk@outlook.com>2020-07-31 16:20:09 +0300
commit20e84b0dc1bdc673e8237ea7329958a430e02de5 (patch)
treece58606d200dbe3816827270fdad0e13f2e188d5
parent0cb02bf631abee45cb769419504612644de4a2b7 (diff)
Fixed issues with graphics.soc-2020-xr-input
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_draw.c34
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_intern.h3
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_session.c27
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;