[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